mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
411 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f964209589 | |||
| 2e699d392e | |||
| 431ecee509 | |||
| 90696215ae | |||
| 5b55261700 | |||
| 727ff90acf | |||
| 0060fdacd8 | |||
| 85ad1fa988 | |||
| 56c022ca41 | |||
| f68e0989ea | |||
| 7381117bb8 | |||
| c9209ebb3d | |||
| 35345d11f5 | |||
| 6ee17b4c26 | |||
| 86267f93a1 | |||
| 50642e7069 | |||
| 8349f291d2 | |||
| 1aad21382e | |||
| 686ee087a5 | |||
| f137ba213a | |||
| 5ae51010cc | |||
| 29d8e7f670 | |||
| 5be3e0ce52 | |||
| ddde30a12e | |||
| 2db5578998 | |||
| 290250836f | |||
| 0ff4df4dc3 | |||
| 9177aa2c08 | |||
| ad791dc7f8 | |||
| 6b298ff7f3 | |||
| 01e30e938c | |||
| e81632e05e | |||
| 4ab3358851 | |||
| 4ded988907 | |||
| 8637dc05c0 | |||
| 6f65ad0b97 | |||
| c5ec378ea7 | |||
| 37013c2eca | |||
| 54a8a6407e | |||
| 69360fb804 | |||
| 92d296ec24 | |||
| 99557332a0 | |||
| a3d9c5a1b2 | |||
| 235ff64a38 | |||
| 0f7fca9e03 | |||
| 161bf49a3a | |||
| 7ac90f19dd | |||
| 90cc426c82 | |||
| 550a239553 | |||
| 57fea1bd6f | |||
| d758545164 | |||
| 5935632b8b | |||
| 8f3a7b7947 | |||
| 2f47bd12fd | |||
| 86fb607dd4 | |||
| 80823b1e16 | |||
| ff6f56b8c5 | |||
| 5393ba3cb4 | |||
| 4ade6c0457 | |||
| e5c389e677 | |||
| ea27b5a77c | |||
| 18c19e4466 | |||
| 0ea950ee52 | |||
| 2d3033fc71 | |||
| 1687f1cffe | |||
| 2f0263a5b8 | |||
| dfbf20acd2 | |||
| 0b9019ab71 | |||
| b0fc2245f4 | |||
| 113c669041 | |||
| b8b5e12a4a | |||
| bece3de495 | |||
| 89120f7797 | |||
| 99e035495b | |||
| 0c56b0c35c | |||
| 111f92e368 | |||
| 03e666ffea | |||
| 40598be9d4 | |||
| 8f057f3c9b | |||
| 972e6f8054 | |||
| aeb7ef392a | |||
| 930a63d55c | |||
| 544de727a0 | |||
| 466e6b5fe3 | |||
| 1abaaf6cf1 | |||
| 48bd910207 | |||
| 87c580f819 | |||
| db1df1ac67 | |||
| 4005d7ea50 | |||
| d29d4404c3 | |||
| 33779576bd | |||
| 3bddd66637 | |||
| e00a407c91 | |||
| 117dcff4e1 | |||
| 7243afd5b5 | |||
| 0a75bc9744 | |||
| ca3b3808b9 | |||
| 287b398826 | |||
| 76d2eda80e | |||
| 880c498c3f | |||
| 12f053ef7f | |||
| 35ee2f60bd | |||
| 3e480e9aea | |||
| 46ba98a4ee | |||
| 958de9441a | |||
| 74312f5487 | |||
| ecf5278679 | |||
| 863abfb00e | |||
| f782693537 | |||
| a2c2411109 | |||
| 712f02e359 | |||
| 61477e515a | |||
| be9343534a | |||
| 2b4e9be4ad | |||
| 382dff7e3b | |||
| 6f2012c1c9 | |||
| c71fe81f8d | |||
| 91586d6690 | |||
| 046726b864 | |||
| ddf353cff5 | |||
| 160497cb64 | |||
| 6194f94aa7 | |||
| e288332f0e | |||
| e4979f33e3 | |||
| 03c3aebca8 | |||
| 487a5ffb95 | |||
| 01d15d4d0e | |||
| 6655794b4d | |||
| 4beb57a5a0 | |||
| bac517e755 | |||
| 62b68cfcd9 | |||
| 481e800a7c | |||
| 9a7c6c339d | |||
| 23340bcfee | |||
| 102979e985 | |||
| ab9a4fbe5f | |||
| aad72f8e81 | |||
| 72295bf186 | |||
| c45a2c14b2 | |||
| ee177b28ff | |||
| 2e0f2f59a0 | |||
| 9856efa7c4 | |||
| 34878b9638 | |||
| 27abdfe7d7 | |||
| 3b0bdba799 | |||
| b547d8c30c | |||
| 1bd317cd50 | |||
| 60b57fd368 | |||
| 27a22e8ccb | |||
| 0378bbb491 | |||
| bccec5cee9 | |||
| d6fbb29977 | |||
| 9d0bf98a52 | |||
| 795272d625 | |||
| c3866f80b6 | |||
| 580a662f36 | |||
| 5767e0df04 | |||
| eeb63f215a | |||
| 5a6e4e49b4 | |||
| b6eada4e67 | |||
| bbe0acf001 | |||
| 05e65801fa | |||
| 08338a4a26 | |||
| bf913e0016 | |||
| 774ceb3367 | |||
| 335a14c714 | |||
| 4dea56d4a0 | |||
| c9916dd2e3 | |||
| 662a311f95 | |||
| bfd6ea22ca | |||
| c5d7991468 | |||
| c4404694e1 | |||
| e914736956 | |||
| 23833dda9b | |||
| 15573b9d3f | |||
| 86661c1cda | |||
| 9cbace7f76 | |||
| 74cb870488 | |||
| ae9b83f07c | |||
| d70c681c32 | |||
| c312d917a1 | |||
| 5d2ecd2f1f | |||
| a1e1dbd865 | |||
| 12f28894ce | |||
| 538ef6e378 | |||
| 1588ea44b2 | |||
| 3cc9098e25 | |||
| 436e945a91 | |||
| f9b83a4e95 | |||
| b1f8bf9f5e | |||
| 7af5175942 | |||
| c24a9096de | |||
| 36d27c46ed | |||
| 713fa36bca | |||
| 20249f9672 | |||
| 8b55e73f77 | |||
| 2058b3c5bf | |||
| 4eb17eb9a9 | |||
| 7138b7afb2 | |||
| fe9b9401d3 | |||
| 8c870cabfb | |||
| b8182c077a | |||
| fbbdadd347 | |||
| b54faf36f5 | |||
| a0dc2a6f33 | |||
| f775fca31c | |||
| efebff4ce8 | |||
| 94b2ab43a5 | |||
| a21dbc2da1 | |||
| cf5a9d26d1 | |||
| ef4772b87a | |||
| ffda318476 | |||
| 6aff0d0197 | |||
| b9ebd33703 | |||
| 61e17df22d | |||
| b88d0ad800 | |||
| 7e24f94164 | |||
| 3a239aa71a | |||
| 0e1ae7a798 | |||
| 133c308796 | |||
| 7ea8c861a2 | |||
| 20e0af2bf4 | |||
| 5d0ed4e7cd | |||
| 144629d7dc | |||
| cf36e8c7cb | |||
| 233df5d59d | |||
| 375796063b | |||
| d8a70de8a8 | |||
| f1ee7fc04f | |||
| e8585fb4a7 | |||
| e10cc01f7e | |||
| 79d6db74b1 | |||
| 69d607a76e | |||
| 2c03d89213 | |||
| 11bf9833da | |||
| d2d37255d5 | |||
| bea5b4919e | |||
| b67a040474 | |||
| d40199ec00 | |||
| 6f7390921c | |||
| e5fa0473de | |||
| 889b777eeb | |||
| 8d4626ef81 | |||
| 7c7d2bc959 | |||
| d76a7c5ea2 | |||
| 3641a97b5f | |||
| 5e818e85f3 | |||
| c9d10077af | |||
| 6394214b55 | |||
| bfa26b8b05 | |||
| 15172c86b9 | |||
| daa85630c7 | |||
| 9914e50d8a | |||
| ef59b5ad6b | |||
| 98741a0606 | |||
| 6aadf1683a | |||
| e10cb6bfb1 | |||
| 2fd6d7e1f8 | |||
| 30c12d9c63 | |||
| 3313891205 | |||
| 1e914b8558 | |||
| b9fc30f592 | |||
| e8e67fe093 | |||
| 66e49c764c | |||
| 322d19689f | |||
| 07a6853585 | |||
| f34599c5ad | |||
| 97c5f0944d | |||
| 1e598e2511 | |||
| 966a5e35db | |||
| d760946828 | |||
| 3dda7c3731 | |||
| 3441833521 | |||
| 603950ca65 | |||
| a946ce09c0 | |||
| c196347e58 | |||
| 979491a631 | |||
| fef3581417 | |||
| f6d948b0e0 | |||
| 2f42fdb282 | |||
| b16261c158 | |||
| 3e1d657888 | |||
| 06946d3632 | |||
| cd8530a5c2 | |||
| 91015bd2c1 | |||
| 907b66624b | |||
| 193352c616 | |||
| 2e551e9c4e | |||
| 58c625affd | |||
| b13702972d | |||
| 8c16776d72 | |||
| 7e4405989a | |||
| 15b819703a | |||
| bf2372101f | |||
| d87f88ee4d | |||
| 24266be8db | |||
| 3187d73b64 | |||
| 48f52668be | |||
| f7ef15d7d0 | |||
| d084ac8a58 | |||
| 077d93e283 | |||
| 71409e7712 | |||
| 61a7ad7116 | |||
| d1ab3939e9 | |||
| 0f2f10557c | |||
| ad748743cd | |||
| 844a8daad6 | |||
| 93cc65adfc | |||
| 3a1aa3f6af | |||
| 5b5f124082 | |||
| cd17d3948c | |||
| 7c49ceaf2c | |||
| a156996d61 | |||
| 9438005891 | |||
| aefde88d24 | |||
| 347bca0de4 | |||
| a0f2073eb1 | |||
| 1b0fd2e4b6 | |||
| 4be3d87e04 | |||
| 5ffe9203d3 | |||
| 24cd70dc95 | |||
| 6e9b241fb2 | |||
| 4cc660a3a7 | |||
| 7c48f6d17b | |||
| c4d7ae49ba | |||
| 26dd3828df | |||
| ead7b1a04a | |||
| 1ddd5c2515 | |||
| e1fcbc067a | |||
| 9bf33597c3 | |||
| 17a8e05a90 | |||
| 7a01a6850c | |||
| 6fdcc392dd | |||
| 3e5bea876d | |||
| 976089104b | |||
| a8220a20ba | |||
| 123639b436 | |||
| 7b1b24860a | |||
| 2e192e79a6 | |||
| 9662b9a2f0 | |||
| 8f5385f9ca | |||
| 0b46e1d807 | |||
| 35a1b8dd62 | |||
| 760b17431a | |||
| 4d3a352889 | |||
| 3fa65989ea | |||
| 1553d4dbc3 | |||
| ac766e2615 | |||
| fee800cb21 | |||
| 7fd0e8de3c | |||
| 1dd1afc972 | |||
| c1e8b1d80c | |||
| fb19d5fec2 | |||
| b2f01679a5 | |||
| c5703462c2 | |||
| deeea09e5d | |||
| b39ffa8fa3 | |||
| 0b1926f089 | |||
| f05fc7b559 | |||
| 37590bf0e0 | |||
| fd25ce1a0d | |||
| f581e1c685 | |||
| 977c4816ed | |||
| 7a022245d4 | |||
| 503377a00b | |||
| a624be1e20 | |||
| 41ad52e495 | |||
| eaae6b90d4 | |||
| 746ba06894 | |||
| faa349ca19 | |||
| 825d41695d | |||
| de0b6556b6 | |||
| 8486015d7c | |||
| ce268a3c8f | |||
| 8072330640 | |||
| 327b1dea25 | |||
| 8f29269e41 | |||
| 1b4d14e24c | |||
| 710f932184 | |||
| 02e410fd20 | |||
| c90128faf6 | |||
| c5ff543a69 | |||
| 639d1dc9cc | |||
| 118cc029fb | |||
| 54545df970 | |||
| 4c94607882 | |||
| ff893b7a72 | |||
| 034fbc1c8f | |||
| 2eb941b077 | |||
| bedd8ea111 | |||
| 9ed91cd53a | |||
| 17d97cde49 | |||
| 09eff5f4d7 | |||
| 3400cebfd2 | |||
| ac4fb2ad9d | |||
| 13186e4674 | |||
| aaa3f1ee1a | |||
| 74cad013b9 | |||
| 8ec956758e | |||
| c0b4a0e3c7 | |||
| 8566a65067 | |||
| 9c82d44129 | |||
| 4e2dd4b6cf | |||
| f9f9ae54fa | |||
| a00b4900cd | |||
| cd01dc0c17 | |||
| 2750238a0c | |||
| f2596e4cbc | |||
| b6955dd9b6 | |||
| 36994d02b3 | |||
| 9902caea79 |
@@ -1 +1,2 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
|
site
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- 2.7
|
||||||
|
script: make tests
|
||||||
|
notifications:
|
||||||
|
email: false
|
||||||
+112
-1
@@ -1,9 +1,119 @@
|
|||||||
|
## v14
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Full removal of Django settings injection for new apps.
|
||||||
|
* Support for profile.d
|
||||||
|
* Fresh app detection.
|
||||||
|
* Update to Virtualenv v1.7.2
|
||||||
|
* Updated to Pip v1.1 (patched)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Default pip path exists action.
|
||||||
|
|
||||||
|
## v13
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Fix pip quoting error.
|
||||||
|
* Only talk about collectstatic in buildpack output when it's configured.
|
||||||
|
|
||||||
|
## v12
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Catch database setting corner case.
|
||||||
|
|
||||||
|
## v11
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Cleanup collectstatic output.
|
||||||
|
|
||||||
|
|
||||||
|
## v10
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Check for collectstatic validity with --dry-run instead of --help for Django 1.4.
|
||||||
|
|
||||||
|
## v9
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Unset PYTHONHOME in buildpack for [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
||||||
|
|
||||||
|
## v8
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Disable Django collectstatic with `$DISABLE_COLLECTSTATIC` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Don't disbable injection for new Django apps.
|
||||||
|
* Inform user of July 1, 2012 deprecation of Django injection.
|
||||||
|
|
||||||
|
## v7
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Full removal of Django setting injection for new apps.
|
||||||
|
* Automatic execution of collectstatic.
|
||||||
|
* Suppress collectstatic errors via env SILENCE_COLLECTSTATIC.
|
||||||
|
* Increase settings.py search depth to 3.
|
||||||
|
* Search recursively from included requirements.txt files.
|
||||||
|
|
||||||
|
|
||||||
|
## v6 (03/23/2012)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Dist packages (setup.py) support.
|
||||||
|
* Move new virtualenvs to `/app/.heroku/venv`.
|
||||||
|
* Heavily improved Django app detection, accounting for `Django` in `requirements.txt`.
|
||||||
|
* Literate [documentation](http://python-buildpack.herokuapp.com).
|
||||||
|
* Default `$PYTHONHOME`, `$PYTHONPATH`, and `$LANG` configurations.
|
||||||
|
* Disable Django setting injection with `$DISABLE_INJECTION` + [user_env_compile](http://devcenter.heroku.com/articles/labs-user-env-compile).
|
||||||
|
* General code refactor and improved messaging.
|
||||||
|
* Unit tests.
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Django 1.4 startproject template layout support.
|
||||||
|
* Django `manage.py` location can now be independent from `settings.py`.
|
||||||
|
|
||||||
|
## v5 (02/01/2012)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Git requirements 100% work.
|
||||||
|
|
||||||
|
|
||||||
|
## v4 (01/20/2012)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Updated to virtualenv v1.7 with patched pip v1.2.
|
||||||
|
* Actually activate created virtualenv within compile process.
|
||||||
|
* Use distribute instead of deprecated setuptools.
|
||||||
|
* Automatically destroy and rebuild corrupt virtualenvs.
|
||||||
|
* Refactor django and pylibmc detection.
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
* Fixed `package==dev` in requirements with patched pip embedded within virtualenv. Patch upstreamed.
|
||||||
|
* Minor curl/rm flag fixes (thanks, contributors!)
|
||||||
|
|
||||||
|
|
||||||
## v3 (12/07/2011)
|
## v3 (12/07/2011)
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
|
||||||
* Better django setup.py injection.
|
* Better django setup.py injection.
|
||||||
|
|
||||||
|
|
||||||
## v2 (11/15/2011)
|
## v2 (11/15/2011)
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
@@ -14,6 +124,7 @@ Bugfixes:
|
|||||||
|
|
||||||
* Detect when virtualenv is checked in and alert user.
|
* Detect when virtualenv is checked in and alert user.
|
||||||
|
|
||||||
|
|
||||||
## v1 (10/01/2011)
|
## v1 (10/01/2011)
|
||||||
|
|
||||||
* Conception.
|
* Conception.
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
MIT License:
|
||||||
|
|
||||||
|
Copyright (C) 2013 Heroku, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
tests:
|
||||||
|
./bin/test
|
||||||
|
|
||||||
|
docs:
|
||||||
|
mkdir -p site
|
||||||
|
shocco -t 'Python Buildpack Compiler' ./bin/compile > site/index.html
|
||||||
|
shocco -t 'Django Buildpack Compiler' ./bin/steps/django > site/django.html
|
||||||
|
shocco -t 'Python Buildpack Detector' ./bin/detect > site/detect.html
|
||||||
|
shocco -t 'Pylibmc Buildpack Compiler' ./bin/steps/pylibmc > site/pylibmc.html
|
||||||
|
shocco -t 'Python Buildpack Changelog' ./Changelog.md > site/changelog.html
|
||||||
|
|
||||||
|
site: docs
|
||||||
|
cd site && git add -A && git commit -m 'update' && git push heroku master
|
||||||
|
|
||||||
|
pip:
|
||||||
|
git clone git@github.com:kennethreitz/pip.git --branch heroku --depth 1
|
||||||
|
rm -fr vendor/virtualenv-1.8.4/virtualenv_support/pip-1.2.1.tar.gz
|
||||||
|
rm -fr pip/.git
|
||||||
|
tar -pczf vendor/virtualenv-1.8.4/virtualenv_support/pip-1.2.1.tar.gz pip
|
||||||
|
rm -fr pip
|
||||||
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
Heroku buildpack: Python
|
Heroku buildpack: Python
|
||||||
========================
|
========================
|
||||||
|
|
||||||
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpack) for Python apps.
|
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/).
|
||||||
It uses [virtualenv](http://www.virtualenv.org/) and [pip](http://www.pip-installer.org/).
|
|
||||||
|
[](http://travis-ci.org/heroku/heroku-buildpack-python)
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
@@ -12,18 +13,17 @@ Example usage:
|
|||||||
$ ls
|
$ ls
|
||||||
Procfile requirements.txt web.py
|
Procfile requirements.txt web.py
|
||||||
|
|
||||||
$ heroku create --stack cedar --buildpack git@github.com:heroku/heroku-buildpack-python.git
|
$ heroku create --stack cedar --buildpack git://github.com/heroku/heroku-buildpack-python.git
|
||||||
|
|
||||||
$ git push heroku master
|
$ git push heroku master
|
||||||
...
|
...
|
||||||
-----> Heroku receiving push
|
-----> Fetching custom git buildpack... done
|
||||||
-----> Fetching custom build pack... done
|
|
||||||
-----> Python app detected
|
-----> Python app detected
|
||||||
-----> Preparing virtualenv version 1.6.4
|
-----> No runtime.txt provided; assuming python-2.7.3.
|
||||||
New python executable in ./bin/python
|
-----> Preparing Python runtime (python-2.7.3)
|
||||||
Installing setuptools............done.
|
-----> Installing Distribute (0.6.34)
|
||||||
Installing pip...............done.
|
-----> Installing Pip (1.2.1)
|
||||||
-----> Installing dependencies using pip version 1.0.2
|
-----> Installing dependencies using Pip (1.2.1)
|
||||||
Downloading/unpacking Flask==0.7.2 (from -r requirements.txt (line 1))
|
Downloading/unpacking Flask==0.7.2 (from -r requirements.txt (line 1))
|
||||||
Downloading/unpacking Werkzeug>=0.6.1 (from Flask==0.7.2->-r requirements.txt (line 1))
|
Downloading/unpacking Werkzeug>=0.6.1 (from Flask==0.7.2->-r requirements.txt (line 1))
|
||||||
Downloading/unpacking Jinja2>=2.4 (from Flask==0.7.2->-r requirements.txt (line 1))
|
Downloading/unpacking Jinja2>=2.4 (from Flask==0.7.2->-r requirements.txt (line 1))
|
||||||
@@ -31,13 +31,24 @@ Example usage:
|
|||||||
Successfully installed Flask Werkzeug Jinja2
|
Successfully installed Flask Werkzeug Jinja2
|
||||||
Cleaning up...
|
Cleaning up...
|
||||||
|
|
||||||
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root. It will detect your app as Python/Django if there is an additional `settings.py` in a project subdirectory.
|
You can also add it to upcoming builds of an existing application:
|
||||||
|
|
||||||
It will use virtualenv and pip to install your dependencies, vendoring a copy of the Python runtime into your slug. The `bin/`, `include/` and `lib/` directories will be cached between builds to allow for faster pip install time.
|
$ heroku config:add BUILDPACK_URL=git://github.com/heroku/heroku-buildpack-python.git
|
||||||
|
|
||||||
Hacking
|
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root.
|
||||||
-------
|
|
||||||
|
|
||||||
To use this buildpack, fork it on Github. Push up changes to your fork, then create a test app with `--buildpack <your-github-url>` and push to it.
|
It will use Pip to install your dependencies, vendoring a copy of the Python runtime into your slug.
|
||||||
|
|
||||||
To change the vendored virtualenv, unpack the desired version to the `src/` folder, and update the virtualenv() function in `bin/compile` to prepend the virtualenv module directory to the path. The virtualenv release vendors its own versions of pip and setuptools.
|
Specify a Runtime
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
You can also provide arbitrary releases Python with a `runtime.txt` file.
|
||||||
|
|
||||||
|
$ cat runtime.txt
|
||||||
|
python-3.3.0
|
||||||
|
|
||||||
|
Runtime options include:
|
||||||
|
|
||||||
|
- python-2.7.3
|
||||||
|
- python-3.3.0
|
||||||
|
- pypy-1.9 (experimental)
|
||||||
|
|||||||
+167
-125
@@ -1,153 +1,195 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# bin/compile <build-dir> <cache-dir>
|
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# $ bin/compile <build-dir> <cache-dir>
|
||||||
|
|
||||||
|
|
||||||
|
# Fail fast and fail hard.
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
|
# Prepend proper path for virtualenv hackery. This will be deprecated soon.
|
||||||
|
export PATH=:/usr/local/bin:$PATH
|
||||||
|
|
||||||
|
# Paths.
|
||||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
||||||
ROOT_DIR=$(dirname $BIN_DIR)
|
ROOT_DIR=$(dirname $BIN_DIR)
|
||||||
BUILD_DIR=$1
|
BUILD_DIR=$1
|
||||||
CACHE_DIR=$2
|
CACHE_DIR=$2
|
||||||
|
|
||||||
NAME=$($BIN_DIR/detect $BUILD_DIR)
|
CACHED_DIRS=".heroku"
|
||||||
PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-$CACHE_DIR/pip_downloads}
|
|
||||||
VIRTUALENV_DIRS="bin include lib"
|
|
||||||
VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
|
|
||||||
|
|
||||||
indent() {
|
# Static configurations for virtualenv caches.
|
||||||
RE="s/^/ /"
|
VIRTUALENV_LOC=".heroku/venv"
|
||||||
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE"
|
LEGACY_TRIGGER="lib/python2.7"
|
||||||
}
|
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
||||||
|
|
||||||
virtualenv() {
|
# Python version. This will be used in the future to specify custom Pythons.
|
||||||
python - "$@" <<EOF
|
DEFAULT_PYTHON_VERSION="python-2.7.4"
|
||||||
import sys
|
PYTHON_EXE="/app/.heroku/python/bin/python"
|
||||||
sys.path.insert(0, "$ROOT_DIR/src/virtualenv-1.6.4")
|
PIP_VERSION="1.3.1"
|
||||||
import virtualenv
|
DISTRIBUTE_VERSION="0.6.36"
|
||||||
virtualenv.main()
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# Sanitizing environment variables.
|
||||||
|
unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH
|
||||||
|
|
||||||
|
# We'll need to send these statics to other scripts we `source`.
|
||||||
|
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
# Directory Hacks for path consistiency.
|
||||||
|
APP_DIR='/app'
|
||||||
|
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
||||||
|
|
||||||
|
# Copy Anvil app dir to temporary storage...
|
||||||
|
mkdir -p $TMP_APP_DIR
|
||||||
|
deep-mv $APP_DIR $TMP_APP_DIR
|
||||||
|
|
||||||
|
# Copy Application code in.
|
||||||
|
deep-mv $BUILD_DIR $APP_DIR
|
||||||
|
|
||||||
|
# Set new context.
|
||||||
|
ORIG_BUILD_DIR=$BUILD_DIR
|
||||||
|
BUILD_DIR=$APP_DIR
|
||||||
|
|
||||||
|
# Prepend proper path buildpack use.
|
||||||
|
export PATH=$BUILD_DIR/.heroku/python/bin:$PATH
|
||||||
|
export PYTHONUNBUFFERED=1
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export LIBRARY_PATH=/app/.heroku/vendor/lib
|
||||||
|
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib
|
||||||
|
|
||||||
|
# Switch to the repo's context.
|
||||||
cd $BUILD_DIR
|
cd $BUILD_DIR
|
||||||
|
|
||||||
# reject a non-packaged Django app
|
# Experimental pre_compile hook.
|
||||||
if [ "$NAME" = "Python" ]; then
|
source $BIN_DIR/steps/hooks/pre_compile
|
||||||
[ -f manage.py ] && [ -f settings.py ] && { echo " ! Django app must be in a package subdirectory"; exit 1; }
|
|
||||||
|
# If no requirements given, assume `setup.py develop`.
|
||||||
|
if [ ! -f requirements.txt ]; then
|
||||||
|
puts-step "No requirements.txt provided; assuming dist package."
|
||||||
|
echo "-e ." > requirements.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# warn a checked-in virtualenv
|
# If no runtime given, assume default version.
|
||||||
if [ -d "lib" ] || [ -d "bin" ]; then
|
if [ ! -f runtime.txt ]; then
|
||||||
echo " ! You have a virtualenv checked in. You should ignore the appropriate paths in your repo. See http://devcenter.heroku.com/articles/gitignore for more info.";
|
puts-step "No runtime.txt provided; assuming $DEFAULT_PYTHON_VERSION."
|
||||||
|
echo $DEFAULT_PYTHON_VERSION > runtime.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# reject a conflicting checked-in virtualenv
|
# ### The Cache
|
||||||
if [ -f "lib/python2.7" ]; then
|
|
||||||
echo " ! Checked-in virtualenv conflict."
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# copy artifacts out of cache if exists
|
|
||||||
mkdir -p $CACHE_DIR
|
mkdir -p $CACHE_DIR
|
||||||
for dir in $VIRTUALENV_DIRS; do
|
|
||||||
|
# Purge "old-style" virtualenvs.
|
||||||
|
[ -d $CACHE_DIR/$LEGACY_TRIGGER ] && rm -fr $CACHE_DIR/.heroku/bin $CACHE_DIR/.heroku/lib $CACHE_DIR/.heroku/include
|
||||||
|
[ -d $CACHE_DIR/$VIRTUALENV_LOC ] && rm -fr $CACHE_DIR/.heroku/venv $CACHE_DIR/.heroku/src
|
||||||
|
|
||||||
|
# Restore old artifacts from the cache.
|
||||||
|
for dir in $CACHED_DIRS; do
|
||||||
cp -R $CACHE_DIR/$dir . &> /dev/null || true
|
cp -R $CACHE_DIR/$dir . &> /dev/null || true
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "-----> Preparing virtualenv version $(virtualenv --version)"
|
|
||||||
virtualenv --no-site-packages . | indent
|
|
||||||
|
|
||||||
# create set-aside .heroku folder.
|
|
||||||
mkdir .heroku
|
|
||||||
|
|
||||||
|
|
||||||
# if pylibmc within requirements, use vendored libmemcached
|
|
||||||
if (grep -Fxiq "pylibmc" requirements.txt) || (grep -Fiq "pylibmc=" requirements.txt)
|
|
||||||
then
|
|
||||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
|
||||||
cd .heroku
|
|
||||||
|
|
||||||
if [ -d "vendor/lib/sasl2" ]; then
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
|
||||||
else
|
|
||||||
curl -s -L -O $VENDORED_MEMCACHED
|
|
||||||
tar -zxvf vendor-libmemcached.tar.gz > /dev/null
|
|
||||||
rm vendor-libmemcached.tar.gz
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
|
||||||
fi
|
|
||||||
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# if Django, append settings
|
|
||||||
if [ "$NAME" = "Python/Django" ]; then
|
|
||||||
echo "-----> Django settings injection"
|
|
||||||
|
|
||||||
SETTINGS_FILE=$(ls **/settings.py | head -1)
|
|
||||||
PROJECT=$(dirname $SETTINGS_FILE)
|
|
||||||
echo "Injecting code into $SETTINGS_FILE to read from DATABASE_URL" | indent
|
|
||||||
|
|
||||||
cat >>$SETTINGS_FILE <<EOF
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import urlparse
|
|
||||||
urlparse.uses_netloc.append('postgres')
|
|
||||||
urlparse.uses_netloc.append('mysql')
|
|
||||||
|
|
||||||
try:
|
|
||||||
|
|
||||||
# Check to make sure DATABASES is set in settings.py file.
|
|
||||||
# If not default to {}
|
|
||||||
|
|
||||||
if 'DATABASES' not in locals():
|
|
||||||
DATABASES = {}
|
|
||||||
|
|
||||||
if 'DATABASE_URL' in os.environ:
|
|
||||||
url = urlparse.urlparse(os.environ['DATABASE_URL'])
|
|
||||||
|
|
||||||
# Ensure default database exists.
|
|
||||||
DATABASES['default'] = DATABASES.get('default', {})
|
|
||||||
|
|
||||||
# Update with environment configuration.
|
|
||||||
DATABASES['default'].update({
|
|
||||||
'NAME': url.path[1:],
|
|
||||||
'USER': url.username,
|
|
||||||
'PASSWORD': url.password,
|
|
||||||
'HOST': url.hostname,
|
|
||||||
'PORT': url.port,
|
|
||||||
})
|
|
||||||
if url.scheme == 'postgres':
|
|
||||||
DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
|
|
||||||
|
|
||||||
if url.scheme == 'mysql':
|
|
||||||
DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
|
|
||||||
except:
|
|
||||||
print 'Unexpected error:', sys.exc_info()
|
|
||||||
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
if (grep -Fiq "hg+" requirements.txt) then
|
|
||||||
PIP_DOWNLOAD_CACHE=$PIP_DOWNLOAD_CACHE bin/pip install --use-mirrors mercurial | indent
|
|
||||||
source bin/activate
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "-----> Installing dependencies using pip version $(bin/pip --version | awk '{print $2}')"
|
|
||||||
PIP_DOWNLOAD_CACHE=$PIP_DOWNLOAD_CACHE bin/pip install --use-mirrors -r requirements.txt | indent
|
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
OUT=$(virtualenv --relocatable .)
|
# Create set-aside `.heroku` folder.
|
||||||
[ $? -ne 0 ] && {
|
mkdir .heroku &> /dev/null
|
||||||
echo " ! Error making virtualenv relocatable"
|
|
||||||
echo "$OUT" | indent
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# store new artifacts in cache
|
mkdir -p $(dirname $PROFILE_PATH)
|
||||||
for dir in $VIRTUALENV_DIRS; do
|
|
||||||
|
set +e
|
||||||
|
PYTHON_VERSION=$(cat runtime.txt)
|
||||||
|
|
||||||
|
# Install Python.
|
||||||
|
if [ -f .heroku/python-version ]; then
|
||||||
|
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
|
||||||
|
puts-step "Found $(cat .heroku/python-version), removing."
|
||||||
|
rm -fr .heroku/python
|
||||||
|
else
|
||||||
|
SKIP_INSTALL=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! "$SKIP_INSTALL" ]; then
|
||||||
|
puts-step "Preparing Python runtime ($PYTHON_VERSION)"
|
||||||
|
curl http://envy-versions.s3.amazonaws.com/$PYTHON_VERSION.tar.bz2 -s | tar jx &> /dev/null
|
||||||
|
if [[ $? != 0 ]] ; then
|
||||||
|
puts-warn "Requested runtime ($PYTHON_VERSION) was not found."
|
||||||
|
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mv python .heroku/python
|
||||||
|
|
||||||
|
# Record for future reference.
|
||||||
|
echo $PYTHON_VERSION > .heroku/python-version
|
||||||
|
FRESH_PYTHON=true
|
||||||
|
|
||||||
|
hash -r
|
||||||
|
else
|
||||||
|
puts-step "Using Python runtime ($PYTHON_VERSION)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If Pip isn't up to date:
|
||||||
|
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_VERSION* ]]; then
|
||||||
|
WORKING_DIR=$(pwd)
|
||||||
|
|
||||||
|
# Prepare it for the real world
|
||||||
|
puts-step "Installing Distribute ($DISTRIBUTE_VERSION)"
|
||||||
|
cd $ROOT_DIR/vendor/distribute-$DISTRIBUTE_VERSION/
|
||||||
|
python setup.py install &> /dev/null
|
||||||
|
cd $WORKING_DIR
|
||||||
|
|
||||||
|
puts-step "Installing Pip ($PIP_VERSION)"
|
||||||
|
cd $ROOT_DIR/vendor/pip-$PIP_VERSION/
|
||||||
|
python setup.py install &> /dev/null
|
||||||
|
cd $WORKING_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e
|
||||||
|
hash -r
|
||||||
|
|
||||||
|
# Pylibmc support.
|
||||||
|
# See [`bin/steps/pylibmc`](pylibmc.html).
|
||||||
|
source $BIN_DIR/steps/pylibmc
|
||||||
|
|
||||||
|
# Install Mercurial if it appears to be required.
|
||||||
|
if (grep -Fiq "hg+" requirements.txt) then
|
||||||
|
/app/.heroku/python/bin/pip install --use-mirrors mercurial | cleanup | indent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install dependencies with Pip.
|
||||||
|
puts-step "Installing dependencies using Pip ($PIP_VERSION)"
|
||||||
|
/app/.heroku/python/bin/pip install --use-mirrors -r requirements.txt --exists-action=w --src=./.heroku/src | cleanup | indent
|
||||||
|
|
||||||
|
# Django collectstatic support.
|
||||||
|
source $BIN_DIR/steps/collectstatic
|
||||||
|
|
||||||
|
# ### Finalize
|
||||||
|
#
|
||||||
|
|
||||||
|
# Store new artifacts in cache.
|
||||||
|
for dir in $CACHED_DIRS; do
|
||||||
rm -rf $CACHE_DIR/$dir
|
rm -rf $CACHE_DIR/$dir
|
||||||
cp -R $dir $CACHE_DIR/
|
cp -R $dir $CACHE_DIR/
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Set context environment variables.
|
||||||
|
set-env PATH '$HOME/.heroku/python/bin:$PATH'
|
||||||
|
set-env PYTHONUNBUFFERED true
|
||||||
|
set-env PYTHONHOME /app/.heroku/python
|
||||||
|
set-default-env LIBRARY_PATH /app/.heroku/vendor/lib
|
||||||
|
set-default-env LD_LIBRARY_PATH /app/.heroku/vendor/lib
|
||||||
|
set-default-env LANG en_US.UTF-8
|
||||||
|
set-default-env PYTHONHASHSEED random
|
||||||
|
set-default-env PYTHONPATH /app/
|
||||||
|
|
||||||
|
|
||||||
|
# Experimental post_compile hook.
|
||||||
|
source $BIN_DIR/steps/hooks/post_compile
|
||||||
|
|
||||||
|
# ### Fin.
|
||||||
|
|
||||||
|
deep-mv $BUILD_DIR $ORIG_BUILD_DIR
|
||||||
|
deep-mv $TMP_APP_DIR $APP_DIR
|
||||||
|
|||||||
+18
-4
@@ -1,8 +1,22 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# bin/detect <build-dir>
|
|
||||||
|
# This script serves as the
|
||||||
|
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||||
|
# detector.
|
||||||
|
#
|
||||||
|
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||||
|
# adapter between a Python application and Heroku's runtime.
|
||||||
|
|
||||||
|
# ## Usage
|
||||||
|
# Compiling an app into a slug is simple:
|
||||||
|
#
|
||||||
|
# $ bin/detect <build-dir> <cache-dir>
|
||||||
|
|
||||||
BUILD_DIR=$1
|
BUILD_DIR=$1
|
||||||
[ -f $BUILD_DIR/requirements.txt ] || exit 1 # fail fast if no requirements.txt
|
|
||||||
|
|
||||||
# 'Python/Django' if there is a [mysite]/settings.py file present; otherwise 'Python'
|
# Exit early if app is clearly not Python.
|
||||||
ls $BUILD_DIR/**/settings.py &> /dev/null && echo Python/Django || echo Python
|
if [ ! -f $BUILD_DIR/requirements.txt ] && [ ! -f $BUILD_DIR/setup.py ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Python
|
||||||
|
|||||||
+6
-13
@@ -3,28 +3,21 @@
|
|||||||
|
|
||||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
||||||
BUILD_DIR=$1
|
BUILD_DIR=$1
|
||||||
NAME=$($BIN_DIR/detect $BUILD_DIR) || exit 1
|
|
||||||
|
MANAGE_FILE=$(cd $BUILD_DIR && find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
||||||
|
MANAGE_FILE=${MANAGE_FILE:2}
|
||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
---
|
---
|
||||||
config_vars:
|
config_vars:
|
||||||
PATH: bin:/usr/local/bin:/usr/bin:/bin
|
|
||||||
PYTHONUNBUFFERED: true
|
|
||||||
LIBRARY_PATH: .heroku/vendor/lib
|
|
||||||
LD_LIBRARY_PATH: .heroku/vendor/lib
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
||||||
[ "$NAME" = "Python/Django" ] || exit 0
|
if [[ $MANAGE_FILE ]]; then
|
||||||
|
|
||||||
SETTINGS_FILE=$(cd $BUILD_DIR && ls **/settings.py | head -1)
|
|
||||||
PROJECT=$(dirname $SETTINGS_FILE)
|
|
||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
shared-database:5mb
|
shared-database:5mb
|
||||||
|
|
||||||
default_process_types:
|
|
||||||
web: python $PROJECT/manage.py runserver 0.0.0.0:\$PORT --noreload
|
|
||||||
EOF
|
EOF
|
||||||
|
fi
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
indent() {
|
||||||
|
RE="s/^/ /"
|
||||||
|
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE"
|
||||||
|
}
|
||||||
|
|
||||||
|
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
||||||
|
MANAGE_FILE=${MANAGE_FILE:2}
|
||||||
|
|
||||||
|
if [ -f .heroku/collectstatic_disabled ]; then
|
||||||
|
DISABLE_COLLECTSTATIC=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! "$DISABLE_COLLECTSTATIC" ]; then
|
||||||
|
set +e
|
||||||
|
|
||||||
|
# Check if collectstatic is configured properly.
|
||||||
|
python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null && RUN_COLLECTSTATIC=true
|
||||||
|
|
||||||
|
# Compile assets if collectstatic appears to be kosher.
|
||||||
|
if [ "$RUN_COLLECTSTATIC" ]; then
|
||||||
|
|
||||||
|
echo "-----> Collecting static files"
|
||||||
|
python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d' | indent
|
||||||
|
|
||||||
|
[ $? -ne 0 ] && {
|
||||||
|
echo " ! Error running manage.py collectstatic. More info:"
|
||||||
|
echo " http://devcenter.heroku.com/articles/django-assets"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ -f bin/post_compile ]; then
|
||||||
|
echo "-----> Running post-compile hook"
|
||||||
|
chmod +x bin/post_compile
|
||||||
|
bin/post_compile
|
||||||
|
fi
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ -f bin/pre_compile ]; then
|
||||||
|
echo "-----> Running pre-compile hook"
|
||||||
|
chmod +x bin/pre_compile
|
||||||
|
bin/pre_compile
|
||||||
|
fi
|
||||||
Executable
+38
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This script serves as the Pylibmc build step of the
|
||||||
|
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||||
|
# compiler.
|
||||||
|
#
|
||||||
|
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||||
|
# adapter between a Python application and Heroku's runtime.
|
||||||
|
#
|
||||||
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
|
# The location of the pre-compiled libmemcached binary.
|
||||||
|
VENDORED_MEMCACHED="http://cl.ly/0a191R3K160t1w1P0N25/vendor-libmemcached.tar.gz"
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
|
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||||
|
if (grep -Eiq "^\s*pylibmc" requirements.txt) then
|
||||||
|
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||||
|
cd .heroku
|
||||||
|
|
||||||
|
if [ -d "vendor/lib/sasl2" ]; then
|
||||||
|
export LIBMEMCACHED=$(pwd)/vendor
|
||||||
|
else
|
||||||
|
# Download and extract libmemcached into target vendor directory.
|
||||||
|
curl -s -L -o tmp-libmemcached.tar.gz $VENDORED_MEMCACHED
|
||||||
|
tar -zxvf tmp-libmemcached.tar.gz > /dev/null
|
||||||
|
rm tmp-libmemcached.tar.gz
|
||||||
|
export LIBMEMCACHED=$(pwd)/vendor
|
||||||
|
fi
|
||||||
|
|
||||||
|
export LIBMEMCACHED=$(pwd)/vendor
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create a Heroku app with the following buildpack:
|
||||||
|
# https://github.com/ddollar/buildpack-tet
|
||||||
|
#
|
||||||
|
# Push this Python buildpack to that Heroku app to
|
||||||
|
# run the tests.
|
||||||
|
#
|
||||||
|
|
||||||
|
testDetectWithReqs() {
|
||||||
|
detect "simple-requirements"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectWithEmptyReqs() {
|
||||||
|
detect "empty-requirements"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectDjango14() {
|
||||||
|
detect "django-1.4-skeleton"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectDjango13() {
|
||||||
|
detect "django-1.3-skeleton"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectNotDjangoWithSettings() {
|
||||||
|
detect "not-django"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectWithSetupPy() {
|
||||||
|
detect "distutils"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectWithSetupRequires() {
|
||||||
|
detect "no-requirements"
|
||||||
|
assertCapturedEquals "Python"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectNotPython() {
|
||||||
|
detect "not-python"
|
||||||
|
assertNotCaptured "Python"
|
||||||
|
assertEquals "1" "${RETURN}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## utils ########################################
|
||||||
|
|
||||||
|
pushd $(dirname 0) >/dev/null
|
||||||
|
BASE=$(pwd)
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
source ${BASE}/vendor/test-utils
|
||||||
|
|
||||||
|
detect() {
|
||||||
|
capture ${BASE}/bin/detect ${BASE}/test/$1
|
||||||
|
}
|
||||||
|
|
||||||
|
compile() {
|
||||||
|
capture ${BASE}/bin/compile ${BASE}/test/$1
|
||||||
|
}
|
||||||
|
|
||||||
|
source ${BASE}/vendor/shunit2
|
||||||
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
[ $(uname) == "Darwin" ] && SED_FLAG='-l' || SED_FLAG='-u'
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
|
indent() {
|
||||||
|
RE="s/^/ /"
|
||||||
|
sed $SED_FLAG "$RE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clean up pip output
|
||||||
|
cleanup() {
|
||||||
|
sed $SED_FLAG -e 's/\.\.\.\+/.../g' | sed $SED_FLAG '/already satisfied/Id' | sed $SED_FLAG -e '/Overwriting/Id' | sed $SED_FLAG -e '/python executable/Id' | sed $SED_FLAG -e '/no previously-included files/Id'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Steps.
|
||||||
|
function puts-step (){
|
||||||
|
echo "-----> $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Warnings.
|
||||||
|
function puts-warn (){
|
||||||
|
echo " ! $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ set-env key value
|
||||||
|
function set-env (){
|
||||||
|
echo "export $1=$2" >> $PROFILE_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ set-default-env key value
|
||||||
|
function set-default-env (){
|
||||||
|
echo "export $1=\${$1:-$2}" >> $PROFILE_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ set-default-env key value
|
||||||
|
function un-set-env (){
|
||||||
|
echo "unset $1" >> $PROFILE_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
# Does some serious copying.
|
||||||
|
function deep-cp (){
|
||||||
|
find -H $1 -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' $2 \;
|
||||||
|
cp -r $1/!(tmp) $2
|
||||||
|
# echo copying $1 to $2
|
||||||
|
}
|
||||||
|
|
||||||
|
# Does some serious moving.
|
||||||
|
function deep-mv (){
|
||||||
|
deep-cp $1 $2
|
||||||
|
|
||||||
|
rm -fr $1/!(tmp)
|
||||||
|
find -H $1 -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec rm -fr '{}' \;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
Author
|
|
||||||
------
|
|
||||||
|
|
||||||
Ian Bicking
|
|
||||||
|
|
||||||
Maintainers
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Brian Rosner
|
|
||||||
Carl Meyer
|
|
||||||
Jannis Leidel
|
|
||||||
|
|
||||||
Contributors
|
|
||||||
------------
|
|
||||||
|
|
||||||
Antonio Cuni
|
|
||||||
Armin Ronacher
|
|
||||||
Christopher Nilsson
|
|
||||||
Curt Micol
|
|
||||||
Douglas Creager
|
|
||||||
Jeff Hammel
|
|
||||||
Jorge Vargas
|
|
||||||
Josh Bronson
|
|
||||||
Kumar McMillan
|
|
||||||
Lars Francke
|
|
||||||
Philip Jenvey
|
|
||||||
Ronny Pfannschmidt
|
|
||||||
Tarek Ziadé
|
|
||||||
Vinay Sajip
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
recursive-include docs *.txt
|
|
||||||
recursive-include scripts *
|
|
||||||
recursive-include virtualenv_support *.egg *.tar.gz
|
|
||||||
recursive-exclude virtualenv_support *.py
|
|
||||||
recursive-exclude docs/_templates *.*
|
|
||||||
include virtualenv_support/__init__.py
|
|
||||||
include *.py
|
|
||||||
include AUTHORS.txt
|
|
||||||
include LICENSE.txt
|
|
||||||
@@ -1,827 +0,0 @@
|
|||||||
Metadata-Version: 1.0
|
|
||||||
Name: virtualenv
|
|
||||||
Version: 1.6.4
|
|
||||||
Summary: Virtual Python Environment builder
|
|
||||||
Home-page: http://www.virtualenv.org
|
|
||||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
|
||||||
Author-email: python-virtualenv@groups.google.com
|
|
||||||
License: MIT
|
|
||||||
Description:
|
|
||||||
|
|
||||||
Status and License
|
|
||||||
------------------
|
|
||||||
|
|
||||||
``virtualenv`` is a successor to `workingenv
|
|
||||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
|
||||||
of `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
|
||||||
|
|
||||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
|
||||||
Project <http://openplans.org>`_ and is now maintained by a
|
|
||||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
|
||||||
It is licensed under an
|
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
|
||||||
with ``easy_install virtualenv==dev``.
|
|
||||||
|
|
||||||
What It Does
|
|
||||||
------------
|
|
||||||
|
|
||||||
``virtualenv`` is a tool to create isolated Python environments.
|
|
||||||
|
|
||||||
The basic problem being addressed is one of dependencies and versions,
|
|
||||||
and indirectly permissions. Imagine you have an application that
|
|
||||||
needs version 1 of LibFoo, but another application requires version
|
|
||||||
2. How can you use both these applications? If you install
|
|
||||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
|
||||||
platform's standard location is), it's easy to end up in a situation
|
|
||||||
where you unintentionally upgrade an application that shouldn't be
|
|
||||||
upgraded.
|
|
||||||
|
|
||||||
Or more generally, what if you want to install an application *and
|
|
||||||
leave it be*? If an application works, any change in its libraries or
|
|
||||||
the versions of those libraries can break the application.
|
|
||||||
|
|
||||||
Also, what if you can't install packages into the global
|
|
||||||
``site-packages`` directory? For instance, on a shared host.
|
|
||||||
|
|
||||||
In all these cases, ``virtualenv`` can help you. It creates an
|
|
||||||
environment that has its own installation directories, that doesn't
|
|
||||||
share libraries with other virtualenv environments (and optionally
|
|
||||||
doesn't access the globally installed libraries either).
|
|
||||||
|
|
||||||
The basic usage is::
|
|
||||||
|
|
||||||
$ python virtualenv.py ENV
|
|
||||||
|
|
||||||
If you install it you can also just do ``virtualenv ENV``.
|
|
||||||
|
|
||||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
|
||||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
|
||||||
interpreter that uses this environment. Anytime you use that interpreter
|
|
||||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
|
||||||
in that environment will be used.
|
|
||||||
|
|
||||||
It also installs either `Setuptools
|
|
||||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
|
||||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
|
||||||
Distribute instead of setuptools, just call virtualenv like this::
|
|
||||||
|
|
||||||
$ python virtualenv.py --distribute ENV
|
|
||||||
|
|
||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
|
||||||
installer, so you can use `ENV/bin/pip`` to install additional packages into
|
|
||||||
the environment.
|
|
||||||
|
|
||||||
Windows Notes
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
|
||||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
|
||||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
|
||||||
|
|
||||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
|
||||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
|
||||||
|
|
||||||
PyPy Support
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
|
||||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
|
||||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
|
||||||
|
|
||||||
Creating Your Own Bootstrap Scripts
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
While this creates an environment, it doesn't put anything into the
|
|
||||||
environment. Developers may find it useful to distribute a script
|
|
||||||
that sets up a particular environment, for example a script that
|
|
||||||
installs a particular web application.
|
|
||||||
|
|
||||||
To create a script like this, call
|
|
||||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
|
||||||
result to your new bootstrapping script. Here's the documentation
|
|
||||||
from the docstring:
|
|
||||||
|
|
||||||
Creates a bootstrap script, which is like this script but with
|
|
||||||
extend_parser, adjust_options, and after_install hooks.
|
|
||||||
|
|
||||||
This returns a string that (written to disk of course) can be used
|
|
||||||
as a bootstrap script with your own customizations. The script
|
|
||||||
will be the standard virtualenv.py script, with your extra text
|
|
||||||
added (your extra text should be Python code).
|
|
||||||
|
|
||||||
If you include these functions, they will be called:
|
|
||||||
|
|
||||||
``extend_parser(optparse_parser)``:
|
|
||||||
You can add or remove options from the parser here.
|
|
||||||
|
|
||||||
``adjust_options(options, args)``:
|
|
||||||
You can change options here, or change the args (if you accept
|
|
||||||
different kinds of arguments, be sure you modify ``args`` so it is
|
|
||||||
only ``[DEST_DIR]``).
|
|
||||||
|
|
||||||
``after_install(options, home_dir)``:
|
|
||||||
|
|
||||||
After everything is installed, this function is called. This
|
|
||||||
is probably the function you are most likely to use. An
|
|
||||||
example would be::
|
|
||||||
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
bin = 'Scripts'
|
|
||||||
else:
|
|
||||||
bin = 'bin'
|
|
||||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
|
||||||
'MyPackage'])
|
|
||||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
|
||||||
'setup', home_dir])
|
|
||||||
|
|
||||||
This example immediately installs a package, and runs a setup
|
|
||||||
script from that package.
|
|
||||||
|
|
||||||
Bootstrap Example
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Here's a more concrete example of how you could use this::
|
|
||||||
|
|
||||||
import virtualenv, textwrap
|
|
||||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
|
||||||
import os, subprocess
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
etc = join(home_dir, 'etc')
|
|
||||||
if not os.path.exists(etc):
|
|
||||||
os.makedirs(etc)
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
|
||||||
'BlogApplication'])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'make-config', 'BlogApplication',
|
|
||||||
join(etc, 'blog.ini')])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'setup-app', join(etc, 'blog.ini')])
|
|
||||||
"""))
|
|
||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
|
||||||
|
|
||||||
Another example is available `here
|
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
|
||||||
|
|
||||||
activate script
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
|
||||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
|
||||||
|
|
||||||
On Posix systems you can do::
|
|
||||||
|
|
||||||
$ source bin/activate
|
|
||||||
|
|
||||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
|
||||||
directory. (You have to use ``source`` because it changes your shell
|
|
||||||
environment in-place.) This is all it does; it's purely a convenience. If
|
|
||||||
you directly run a script or the python interpreter from the virtualenv's
|
|
||||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
|
||||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
|
||||||
|
|
||||||
After activating an environment you can use the function ``deactivate`` to
|
|
||||||
undo the changes to your ``$PATH``.
|
|
||||||
|
|
||||||
The ``activate`` script will also modify your shell prompt to indicate
|
|
||||||
which environment is currently active. You can disable this behavior,
|
|
||||||
which can be useful if you have your own custom prompt that already
|
|
||||||
displays the active environment name. To do so, set the
|
|
||||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
|
||||||
value before running the ``activate`` script.
|
|
||||||
|
|
||||||
On Windows you just do::
|
|
||||||
|
|
||||||
> \path\to\env\Scripts\activate.bat
|
|
||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
|
||||||
wherever your global site-packages directory is). This can be used if
|
|
||||||
you don't have control over site-packages and don't want to depend on
|
|
||||||
the packages there, or you just want more isolation from the global
|
|
||||||
system.
|
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Sometimes you can't or don't want to use the Python interpreter
|
|
||||||
created by the virtualenv. For instance, in a `mod_python
|
|
||||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
|
||||||
environment, there is only one interpreter.
|
|
||||||
|
|
||||||
Luckily, it's easy. You must use the custom Python interpreter to
|
|
||||||
*install* libraries. But to *use* libraries, you just have to be sure
|
|
||||||
the path is correct. A script is available to correct the path. You
|
|
||||||
can setup the environment like::
|
|
||||||
|
|
||||||
activate_this = '/path/to/env/bin/activate_this.py'
|
|
||||||
execfile(activate_this, dict(__file__=activate_this))
|
|
||||||
|
|
||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
|
||||||
you to use an existing interpreter. Items in your environment will show up
|
|
||||||
first on ``sys.path``, before global items. However, global items will
|
|
||||||
always be accessible -- this technique does not support the
|
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
|
||||||
instance, activate an environment before a web request; you should activate
|
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
|
||||||
|
|
||||||
Making Environments Relocatable
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Note: this option is somewhat experimental, and there are probably
|
|
||||||
caveats that have not yet been identified. Also this does not
|
|
||||||
currently work on Windows.
|
|
||||||
|
|
||||||
Normally environments are tied to a specific path. That means that
|
|
||||||
you cannot move an environment around or copy it to another computer.
|
|
||||||
You can fix up an environment to make it relocatable with the
|
|
||||||
command::
|
|
||||||
|
|
||||||
$ virtualenv --relocatable ENV
|
|
||||||
|
|
||||||
This will make some of the files created by setuptools or distribute
|
|
||||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
|
||||||
instead of using the location of the Python interpreter to select the
|
|
||||||
environment.
|
|
||||||
|
|
||||||
**Note:** you must run this after you've installed *any* packages into
|
|
||||||
the environment. If you make an environment relocatable, then
|
|
||||||
install a new package, you must run ``virtualenv --relocatable``
|
|
||||||
again.
|
|
||||||
|
|
||||||
Also, this **does not make your packages cross-platform**. You can
|
|
||||||
move the directory around, but it can only be used on other similar
|
|
||||||
computers. Some known environmental differences that can cause
|
|
||||||
incompatibilities: a different version of Python, when one platform
|
|
||||||
uses UCS2 for its internal unicode representation and another uses
|
|
||||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
|
||||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
|
||||||
libraries on the system, if those C libraries are located somewhere
|
|
||||||
different (either different versions, or a different filesystem
|
|
||||||
layout).
|
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
|
||||||
use this on an environment.
|
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When it creates a new environment, virtualenv installs either
|
|
||||||
setuptools or distribute, and pip. In normal operation, the latest
|
|
||||||
releases of these packages are fetched from the `Python Package Index
|
|
||||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
|
||||||
behavior may not be wanted, for example if you are using virtualenv
|
|
||||||
during a deployment and do not want to depend on Internet access and
|
|
||||||
PyPI availability.
|
|
||||||
|
|
||||||
As an alternative, you can provide your own versions of setuptools,
|
|
||||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
|
||||||
those distributions instead of downloading them from the Internet. To
|
|
||||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
|
||||||
virtualenv like this::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
|
||||||
|
|
||||||
The ``/path/to/distributions`` path should point to a directory that
|
|
||||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
|
||||||
distributions must be ``.egg`` files; distribute and pip distributions
|
|
||||||
should be `.tar.gz` source distributions.
|
|
||||||
|
|
||||||
Virtualenv will still download these packages if no satisfactory local
|
|
||||||
distributions are found.
|
|
||||||
|
|
||||||
If you are really concerned about virtualenv fetching these packages
|
|
||||||
from the Internet and want to ensure that it never will, you can also
|
|
||||||
provide an option ``--never-download`` like so::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
|
||||||
|
|
||||||
If this option is provided, virtualenv will never try to download
|
|
||||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
|
||||||
if it fails to find local distributions for any of these required
|
|
||||||
packages.
|
|
||||||
|
|
||||||
Compare & Contrast with Alternatives
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
There are several alternatives that create isolated environments:
|
|
||||||
|
|
||||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
|
||||||
predecessor to this library. It used the main Python interpreter,
|
|
||||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
|
||||||
This causes problems when running Python scripts that aren't part of
|
|
||||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
|
||||||
also conflicted a lot with Setuptools.
|
|
||||||
|
|
||||||
* `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
|
||||||
is also a predecessor to this library. It uses only symlinks, so it
|
|
||||||
couldn't work on Windows. It also symlinks over the *entire*
|
|
||||||
standard library and global ``site-packages``. As a result, it
|
|
||||||
won't see new additions to the global ``site-packages``.
|
|
||||||
|
|
||||||
This script only symlinks a small portion of the standard library
|
|
||||||
into the environment, and so on Windows it is feasible to simply
|
|
||||||
copy these files over. Also, it creates a new/empty
|
|
||||||
``site-packages`` and also adds the global ``site-packages`` to the
|
|
||||||
path, so updates are tracked separately. This script also installs
|
|
||||||
Setuptools automatically, saving a step and avoiding the need for
|
|
||||||
network access.
|
|
||||||
|
|
||||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
|
||||||
create an isolated Python environment in the same style, but
|
|
||||||
achieves similar results through a declarative config file that sets
|
|
||||||
up scripts with very particular packages. As a declarative system,
|
|
||||||
it is somewhat easier to repeat and manage, but more difficult to
|
|
||||||
experiment with. ``zc.buildout`` includes the ability to setup
|
|
||||||
non-Python systems (e.g., a database server or an Apache instance).
|
|
||||||
|
|
||||||
I *strongly* recommend anyone doing application development or
|
|
||||||
deployment use one of these tools.
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
|
||||||
virtualenv.
|
|
||||||
|
|
||||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
|
||||||
release, there will be a new virtualenv release that bundles the new version of
|
|
||||||
pip.
|
|
||||||
|
|
||||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
|
||||||
|
|
||||||
Running the tests
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
|
||||||
to grow it.
|
|
||||||
|
|
||||||
The easy way to run tests (handles test dependencies automatically)::
|
|
||||||
|
|
||||||
$ python setup.py test
|
|
||||||
|
|
||||||
If you want to run only a selection of the tests, you'll need to run them
|
|
||||||
directly with nose instead. Create a virtualenv, and install required
|
|
||||||
packages::
|
|
||||||
|
|
||||||
$ pip install nose mock
|
|
||||||
|
|
||||||
Run nosetests::
|
|
||||||
|
|
||||||
$ nosetests
|
|
||||||
|
|
||||||
Or select just a single test file to run::
|
|
||||||
|
|
||||||
$ nosetests tests.test_virtualenv
|
|
||||||
|
|
||||||
|
|
||||||
Other Documentation and Links
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
* James Gardner has written a tutorial on using `virtualenv with
|
|
||||||
Pylons
|
|
||||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
|
||||||
|
|
||||||
* `Blog announcement
|
|
||||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
|
||||||
|
|
||||||
* Doug Hellmann wrote a description of his `command-line work flow
|
|
||||||
using virtualenv (virtualenvwrapper)
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
|
||||||
including some handy scripts to make working with multiple
|
|
||||||
environments easier. He also wrote `an example of using virtualenv
|
|
||||||
to try IPython
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
|
||||||
|
|
||||||
* Chris Perkins created a `showmedo video including virtualenv
|
|
||||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
|
||||||
|
|
||||||
* `Using virtualenv with mod_wsgi
|
|
||||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
|
|
||||||
* `virtualenv commands
|
|
||||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
|
||||||
workflow-related tools around virtualenv.
|
|
||||||
|
|
||||||
Changes & News
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Next release (1.7) schedule
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python 2.4, too.
|
|
||||||
|
|
||||||
1.6.3 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python < 2.7.
|
|
||||||
|
|
||||||
1.6.2 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Updated embedded distribute release to 0.6.19.
|
|
||||||
|
|
||||||
* Updated embedded pip release to 1.0.2.
|
|
||||||
|
|
||||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
|
||||||
non-default Python intepreter (by using the ``-p`` option).
|
|
||||||
|
|
||||||
* Fixed #112 - Fixed path in docs.
|
|
||||||
|
|
||||||
* Fixed #109 - Corrected doctests of a Logger method.
|
|
||||||
|
|
||||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
|
||||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
|
||||||
|
|
||||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
|
||||||
|
|
||||||
|
|
||||||
1.6.1 (2011-04-30)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Start to use git-flow.
|
|
||||||
|
|
||||||
* Added support for PyPy 1.5
|
|
||||||
|
|
||||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
|
||||||
|
|
||||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
|
||||||
Jucovy.
|
|
||||||
|
|
||||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
|
||||||
|
|
||||||
1.6
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
|
||||||
|
|
||||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
|
||||||
(readline) are installed outside the standard library.
|
|
||||||
|
|
||||||
* Updated bundled pip to 1.0.
|
|
||||||
|
|
||||||
1.5.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
|
||||||
|
|
||||||
* Fixed a few more pypy related bugs.
|
|
||||||
|
|
||||||
* Updated bundled pip to 0.8.2.
|
|
||||||
|
|
||||||
* Handed project over to new team of maintainers.
|
|
||||||
|
|
||||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
1.5.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
|
||||||
|
|
||||||
* Fixed Windows regression in 1.5
|
|
||||||
|
|
||||||
1.5
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Include pip 0.8.1.
|
|
||||||
|
|
||||||
* Add support for PyPy.
|
|
||||||
|
|
||||||
* Uses a proper temporary dir when installing environment requirements.
|
|
||||||
|
|
||||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
|
||||||
|
|
||||||
* Fix an issue with ``--relocatable`` on Windows.
|
|
||||||
|
|
||||||
* Fix issue with installing the wrong version of distribute.
|
|
||||||
|
|
||||||
* Add fish and csh activate scripts.
|
|
||||||
|
|
||||||
1.4.9
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7.2
|
|
||||||
|
|
||||||
1.4.8
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix for Mac OS X Framework builds that use
|
|
||||||
``--universal-archs=intel``
|
|
||||||
|
|
||||||
* Fix ``activate_this.py`` on Windows.
|
|
||||||
|
|
||||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
|
||||||
bin/activate`` it will get unset; if you leave it set and do not
|
|
||||||
activate the environment it will still break the environment.
|
|
||||||
|
|
||||||
* Include pip 0.7.1
|
|
||||||
|
|
||||||
1.4.7
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7
|
|
||||||
|
|
||||||
1.4.6
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
|
||||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
|
||||||
|
|
||||||
1.4.5
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.3
|
|
||||||
|
|
||||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
|
||||||
``PATH`` contained a parenthesis
|
|
||||||
|
|
||||||
1.4.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.2 and Distribute 0.6.10
|
|
||||||
|
|
||||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
|
||||||
installed
|
|
||||||
|
|
||||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
|
||||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
|
||||||
|
|
||||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
|
||||||
Distribute by default (so you don't have to remember to use
|
|
||||||
``--distribute``).
|
|
||||||
|
|
||||||
1.4.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.1
|
|
||||||
|
|
||||||
1.4.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix pip installation on Windows
|
|
||||||
|
|
||||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
|
||||||
|
|
||||||
* Exclude ~/.local (user site-packages) from environments when using
|
|
||||||
``--no-site-packages``
|
|
||||||
|
|
||||||
1.4.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6
|
|
||||||
|
|
||||||
1.4
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Updated setuptools to 0.6c11
|
|
||||||
|
|
||||||
* Added the --distribute option
|
|
||||||
|
|
||||||
* Fixed packaging problem of support-files
|
|
||||||
|
|
||||||
1.3.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Virtualenv now copies the actual embedded Python binary on
|
|
||||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
|
||||||
|
|
||||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
|
||||||
|
|
||||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
|
||||||
and also specially handle the new ``__pyclasspath__`` entry in
|
|
||||||
``sys.path``.
|
|
||||||
|
|
||||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
|
||||||
|
|
||||||
* Better find libraries when compiling extensions on Windows.
|
|
||||||
|
|
||||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
|
||||||
|
|
||||||
* Added support for the Debian/Ubuntu
|
|
||||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
|
||||||
|
|
||||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
|
||||||
``sys.real_prefix``) which is reported to help building on Windows.
|
|
||||||
|
|
||||||
* Make ``deactivate`` work on ksh
|
|
||||||
|
|
||||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
|
||||||
symlink created to the exact Python version.
|
|
||||||
|
|
||||||
1.3.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
|
||||||
when using non-ASCII directory names.
|
|
||||||
|
|
||||||
* Fixed compatibility with Jython 2.5b1.
|
|
||||||
|
|
||||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
|
||||||
access to what ``virtualenv.create_environment`` does.
|
|
||||||
|
|
||||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
|
||||||
with Windows and paths that contain spaces.
|
|
||||||
|
|
||||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
|
||||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
|
||||||
``~/.pydistutils.cfg`` and use that other file instead.
|
|
||||||
|
|
||||||
* Fix ` a problem
|
|
||||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
|
||||||
some ``.so`` libraries in ``/usr/local``.
|
|
||||||
|
|
||||||
1.3.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
|
||||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
|
||||||
people, in rather obscure ways.
|
|
||||||
|
|
||||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
|
||||||
and find a pre-downloaded Setuptools egg using that.
|
|
||||||
|
|
||||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
|
||||||
|
|
||||||
1.3.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
|
||||||
``site.py``, including `user directories
|
|
||||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
|
||||||
(this means older versions of Python will support user directories,
|
|
||||||
whether intended or not).
|
|
||||||
|
|
||||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
|
||||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
|
||||||
with a ``prefix`` setting, packages would be installed globally
|
|
||||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
|
||||||
|
|
||||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
|
||||||
workaround is added.
|
|
||||||
|
|
||||||
* Fix ``--python`` option.
|
|
||||||
|
|
||||||
* Fixed handling of Jython environments that use a
|
|
||||||
jython-complete.jar.
|
|
||||||
|
|
||||||
1.3
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Update to Setuptools 0.6c9
|
|
||||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
|
||||||
will make an existing environment "relocatable" -- the paths will
|
|
||||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
|
||||||
may assist in building environments that can be moved and copied.
|
|
||||||
You have to run this *after* any new packages installed.
|
|
||||||
* Added ``bin/activate_this.py``, a file you can use like
|
|
||||||
``execfile("path_to/activate_this.py",
|
|
||||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
|
||||||
the environment in place, similar to what `the mod_wsgi example
|
|
||||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
* For Mac framework builds of Python, the site-packages directory
|
|
||||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
|
||||||
Andrea Rech.
|
|
||||||
* Some platform-specific modules in Macs are added to the path now
|
|
||||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
|
||||||
from Andrea Rech.
|
|
||||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
|
||||||
* Added ``__future__`` to the list of required modules, for Python
|
|
||||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
|
||||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
|
||||||
precedent over virtualenv's libs.
|
|
||||||
|
|
||||||
1.2
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added a ``--python`` option to select the Python interpreter.
|
|
||||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
|
||||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
|
||||||
2.3 still probably doesn't work).
|
|
||||||
|
|
||||||
1.1.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Jython 2.5.
|
|
||||||
|
|
||||||
1.1
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added support for Python 2.6.
|
|
||||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
|
||||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
|
||||||
with an interpreter named, e.g., ``python2.4``
|
|
||||||
* Fix MacPorts Python
|
|
||||||
* Added --unzip-setuptools option
|
|
||||||
* Update to Setuptools 0.6c8
|
|
||||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
|
||||||
* Copy or symlink over the ``include`` directory so that packages will
|
|
||||||
more consistently compile.
|
|
||||||
|
|
||||||
1.0
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
|
||||||
``/usr/lib`` (specifically CentOS x64).
|
|
||||||
* Fixed bug in ``--clear``.
|
|
||||||
* Fixed typos in ``deactivate.bat``.
|
|
||||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
|
||||||
|
|
||||||
0.9.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix include dir copying on Windows (makes compiling possible).
|
|
||||||
* Include the main ``lib-tk`` in the path.
|
|
||||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
|
||||||
``get_python_lib`` to point to the global locations.
|
|
||||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
|
||||||
customizations of ``distutils.cfg`` won't effect the installation.
|
|
||||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
|
||||||
``bin/python``).
|
|
||||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
|
||||||
(from Ronald Oussoren).
|
|
||||||
|
|
||||||
0.9.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
|
||||||
* Fix a little bug in ``bin/activate``.
|
|
||||||
* Actually get ``distutils.cfg`` to work reliably.
|
|
||||||
|
|
||||||
0.9
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
|
||||||
copied over in an environment.
|
|
||||||
* Copy over or symlink the ``include`` directory, so that you can
|
|
||||||
build packages that need the C headers.
|
|
||||||
* Include a ``distutils`` package, so you can locally update
|
|
||||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
|
||||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
|
||||||
creation.
|
|
||||||
* Fix a problem creating a ``lib64/`` directory.
|
|
||||||
* Should work on MacOSX Framework builds (the default Python
|
|
||||||
installations on Mac). Thanks to Ronald Oussoren.
|
|
||||||
|
|
||||||
0.8.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
|
||||||
were inaccurate.
|
|
||||||
* Slightly prettier output.
|
|
||||||
|
|
||||||
0.8.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Windows.
|
|
||||||
|
|
||||||
0.8.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Give a better warning if you are on an unsupported platform (Mac
|
|
||||||
Framework Pythons, and Windows).
|
|
||||||
* Give error about running while inside a workingenv.
|
|
||||||
* Give better error message about Python 2.3.
|
|
||||||
|
|
||||||
0.8.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
Fixed packaging of the library.
|
|
||||||
|
|
||||||
0.8
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Initial release. Everything is changed and new!
|
|
||||||
|
|
||||||
Keywords: setuptools deployment installation distutils
|
|
||||||
Platform: UNKNOWN
|
|
||||||
Classifier: Development Status :: 4 - Beta
|
|
||||||
Classifier: Intended Audience :: Developers
|
|
||||||
Classifier: License :: OSI Approved :: MIT License
|
|
||||||
Classifier: Programming Language :: Python :: 2
|
|
||||||
Classifier: Programming Language :: Python :: 2.4
|
|
||||||
Classifier: Programming Language :: Python :: 2.5
|
|
||||||
Classifier: Programming Language :: Python :: 2.6
|
|
||||||
Classifier: Programming Language :: Python :: 2.7
|
|
||||||
Classifier: Programming Language :: Python :: 3
|
|
||||||
Classifier: Programming Language :: Python :: 3.1
|
|
||||||
Classifier: Programming Language :: Python :: 3.2
|
|
||||||
@@ -1,422 +0,0 @@
|
|||||||
virtualenv
|
|
||||||
==========
|
|
||||||
|
|
||||||
* `Discussion list <http://groups.google.com/group/python-virtualenv/>`_
|
|
||||||
* `Bugs <https://github.com/pypa/virtualenv/issues/>`_
|
|
||||||
|
|
||||||
.. contents::
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
news
|
|
||||||
|
|
||||||
.. comment: split here
|
|
||||||
|
|
||||||
Status and License
|
|
||||||
------------------
|
|
||||||
|
|
||||||
``virtualenv`` is a successor to `workingenv
|
|
||||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
|
||||||
of `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
|
||||||
|
|
||||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
|
||||||
Project <http://openplans.org>`_ and is now maintained by a
|
|
||||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
|
||||||
It is licensed under an
|
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
|
||||||
with ``easy_install virtualenv==dev``.
|
|
||||||
|
|
||||||
What It Does
|
|
||||||
------------
|
|
||||||
|
|
||||||
``virtualenv`` is a tool to create isolated Python environments.
|
|
||||||
|
|
||||||
The basic problem being addressed is one of dependencies and versions,
|
|
||||||
and indirectly permissions. Imagine you have an application that
|
|
||||||
needs version 1 of LibFoo, but another application requires version
|
|
||||||
2. How can you use both these applications? If you install
|
|
||||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
|
||||||
platform's standard location is), it's easy to end up in a situation
|
|
||||||
where you unintentionally upgrade an application that shouldn't be
|
|
||||||
upgraded.
|
|
||||||
|
|
||||||
Or more generally, what if you want to install an application *and
|
|
||||||
leave it be*? If an application works, any change in its libraries or
|
|
||||||
the versions of those libraries can break the application.
|
|
||||||
|
|
||||||
Also, what if you can't install packages into the global
|
|
||||||
``site-packages`` directory? For instance, on a shared host.
|
|
||||||
|
|
||||||
In all these cases, ``virtualenv`` can help you. It creates an
|
|
||||||
environment that has its own installation directories, that doesn't
|
|
||||||
share libraries with other virtualenv environments (and optionally
|
|
||||||
doesn't access the globally installed libraries either).
|
|
||||||
|
|
||||||
The basic usage is::
|
|
||||||
|
|
||||||
$ python virtualenv.py ENV
|
|
||||||
|
|
||||||
If you install it you can also just do ``virtualenv ENV``.
|
|
||||||
|
|
||||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
|
||||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
|
||||||
interpreter that uses this environment. Anytime you use that interpreter
|
|
||||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
|
||||||
in that environment will be used.
|
|
||||||
|
|
||||||
It also installs either `Setuptools
|
|
||||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
|
||||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
|
||||||
Distribute instead of setuptools, just call virtualenv like this::
|
|
||||||
|
|
||||||
$ python virtualenv.py --distribute ENV
|
|
||||||
|
|
||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
|
||||||
installer, so you can use `ENV/bin/pip`` to install additional packages into
|
|
||||||
the environment.
|
|
||||||
|
|
||||||
Windows Notes
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
|
||||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
|
||||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
|
||||||
|
|
||||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
|
||||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
|
||||||
|
|
||||||
PyPy Support
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
|
||||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
|
||||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
|
||||||
|
|
||||||
Creating Your Own Bootstrap Scripts
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
While this creates an environment, it doesn't put anything into the
|
|
||||||
environment. Developers may find it useful to distribute a script
|
|
||||||
that sets up a particular environment, for example a script that
|
|
||||||
installs a particular web application.
|
|
||||||
|
|
||||||
To create a script like this, call
|
|
||||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
|
||||||
result to your new bootstrapping script. Here's the documentation
|
|
||||||
from the docstring:
|
|
||||||
|
|
||||||
Creates a bootstrap script, which is like this script but with
|
|
||||||
extend_parser, adjust_options, and after_install hooks.
|
|
||||||
|
|
||||||
This returns a string that (written to disk of course) can be used
|
|
||||||
as a bootstrap script with your own customizations. The script
|
|
||||||
will be the standard virtualenv.py script, with your extra text
|
|
||||||
added (your extra text should be Python code).
|
|
||||||
|
|
||||||
If you include these functions, they will be called:
|
|
||||||
|
|
||||||
``extend_parser(optparse_parser)``:
|
|
||||||
You can add or remove options from the parser here.
|
|
||||||
|
|
||||||
``adjust_options(options, args)``:
|
|
||||||
You can change options here, or change the args (if you accept
|
|
||||||
different kinds of arguments, be sure you modify ``args`` so it is
|
|
||||||
only ``[DEST_DIR]``).
|
|
||||||
|
|
||||||
``after_install(options, home_dir)``:
|
|
||||||
|
|
||||||
After everything is installed, this function is called. This
|
|
||||||
is probably the function you are most likely to use. An
|
|
||||||
example would be::
|
|
||||||
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
bin = 'Scripts'
|
|
||||||
else:
|
|
||||||
bin = 'bin'
|
|
||||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
|
||||||
'MyPackage'])
|
|
||||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
|
||||||
'setup', home_dir])
|
|
||||||
|
|
||||||
This example immediately installs a package, and runs a setup
|
|
||||||
script from that package.
|
|
||||||
|
|
||||||
Bootstrap Example
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Here's a more concrete example of how you could use this::
|
|
||||||
|
|
||||||
import virtualenv, textwrap
|
|
||||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
|
||||||
import os, subprocess
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
etc = join(home_dir, 'etc')
|
|
||||||
if not os.path.exists(etc):
|
|
||||||
os.makedirs(etc)
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
|
||||||
'BlogApplication'])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'make-config', 'BlogApplication',
|
|
||||||
join(etc, 'blog.ini')])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'setup-app', join(etc, 'blog.ini')])
|
|
||||||
"""))
|
|
||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
|
||||||
|
|
||||||
Another example is available `here
|
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
|
||||||
|
|
||||||
activate script
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
|
||||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
|
||||||
|
|
||||||
On Posix systems you can do::
|
|
||||||
|
|
||||||
$ source bin/activate
|
|
||||||
|
|
||||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
|
||||||
directory. (You have to use ``source`` because it changes your shell
|
|
||||||
environment in-place.) This is all it does; it's purely a convenience. If
|
|
||||||
you directly run a script or the python interpreter from the virtualenv's
|
|
||||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
|
||||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
|
||||||
|
|
||||||
After activating an environment you can use the function ``deactivate`` to
|
|
||||||
undo the changes to your ``$PATH``.
|
|
||||||
|
|
||||||
The ``activate`` script will also modify your shell prompt to indicate
|
|
||||||
which environment is currently active. You can disable this behavior,
|
|
||||||
which can be useful if you have your own custom prompt that already
|
|
||||||
displays the active environment name. To do so, set the
|
|
||||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
|
||||||
value before running the ``activate`` script.
|
|
||||||
|
|
||||||
On Windows you just do::
|
|
||||||
|
|
||||||
> \path\to\env\Scripts\activate.bat
|
|
||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
|
||||||
wherever your global site-packages directory is). This can be used if
|
|
||||||
you don't have control over site-packages and don't want to depend on
|
|
||||||
the packages there, or you just want more isolation from the global
|
|
||||||
system.
|
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Sometimes you can't or don't want to use the Python interpreter
|
|
||||||
created by the virtualenv. For instance, in a `mod_python
|
|
||||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
|
||||||
environment, there is only one interpreter.
|
|
||||||
|
|
||||||
Luckily, it's easy. You must use the custom Python interpreter to
|
|
||||||
*install* libraries. But to *use* libraries, you just have to be sure
|
|
||||||
the path is correct. A script is available to correct the path. You
|
|
||||||
can setup the environment like::
|
|
||||||
|
|
||||||
activate_this = '/path/to/env/bin/activate_this.py'
|
|
||||||
execfile(activate_this, dict(__file__=activate_this))
|
|
||||||
|
|
||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
|
||||||
you to use an existing interpreter. Items in your environment will show up
|
|
||||||
first on ``sys.path``, before global items. However, global items will
|
|
||||||
always be accessible -- this technique does not support the
|
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
|
||||||
instance, activate an environment before a web request; you should activate
|
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
|
||||||
|
|
||||||
Making Environments Relocatable
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Note: this option is somewhat experimental, and there are probably
|
|
||||||
caveats that have not yet been identified. Also this does not
|
|
||||||
currently work on Windows.
|
|
||||||
|
|
||||||
Normally environments are tied to a specific path. That means that
|
|
||||||
you cannot move an environment around or copy it to another computer.
|
|
||||||
You can fix up an environment to make it relocatable with the
|
|
||||||
command::
|
|
||||||
|
|
||||||
$ virtualenv --relocatable ENV
|
|
||||||
|
|
||||||
This will make some of the files created by setuptools or distribute
|
|
||||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
|
||||||
instead of using the location of the Python interpreter to select the
|
|
||||||
environment.
|
|
||||||
|
|
||||||
**Note:** you must run this after you've installed *any* packages into
|
|
||||||
the environment. If you make an environment relocatable, then
|
|
||||||
install a new package, you must run ``virtualenv --relocatable``
|
|
||||||
again.
|
|
||||||
|
|
||||||
Also, this **does not make your packages cross-platform**. You can
|
|
||||||
move the directory around, but it can only be used on other similar
|
|
||||||
computers. Some known environmental differences that can cause
|
|
||||||
incompatibilities: a different version of Python, when one platform
|
|
||||||
uses UCS2 for its internal unicode representation and another uses
|
|
||||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
|
||||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
|
||||||
libraries on the system, if those C libraries are located somewhere
|
|
||||||
different (either different versions, or a different filesystem
|
|
||||||
layout).
|
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
|
||||||
use this on an environment.
|
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When it creates a new environment, virtualenv installs either
|
|
||||||
setuptools or distribute, and pip. In normal operation, the latest
|
|
||||||
releases of these packages are fetched from the `Python Package Index
|
|
||||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
|
||||||
behavior may not be wanted, for example if you are using virtualenv
|
|
||||||
during a deployment and do not want to depend on Internet access and
|
|
||||||
PyPI availability.
|
|
||||||
|
|
||||||
As an alternative, you can provide your own versions of setuptools,
|
|
||||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
|
||||||
those distributions instead of downloading them from the Internet. To
|
|
||||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
|
||||||
virtualenv like this::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
|
||||||
|
|
||||||
The ``/path/to/distributions`` path should point to a directory that
|
|
||||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
|
||||||
distributions must be ``.egg`` files; distribute and pip distributions
|
|
||||||
should be `.tar.gz` source distributions.
|
|
||||||
|
|
||||||
Virtualenv will still download these packages if no satisfactory local
|
|
||||||
distributions are found.
|
|
||||||
|
|
||||||
If you are really concerned about virtualenv fetching these packages
|
|
||||||
from the Internet and want to ensure that it never will, you can also
|
|
||||||
provide an option ``--never-download`` like so::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
|
||||||
|
|
||||||
If this option is provided, virtualenv will never try to download
|
|
||||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
|
||||||
if it fails to find local distributions for any of these required
|
|
||||||
packages.
|
|
||||||
|
|
||||||
Compare & Contrast with Alternatives
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
There are several alternatives that create isolated environments:
|
|
||||||
|
|
||||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
|
||||||
predecessor to this library. It used the main Python interpreter,
|
|
||||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
|
||||||
This causes problems when running Python scripts that aren't part of
|
|
||||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
|
||||||
also conflicted a lot with Setuptools.
|
|
||||||
|
|
||||||
* `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
|
||||||
is also a predecessor to this library. It uses only symlinks, so it
|
|
||||||
couldn't work on Windows. It also symlinks over the *entire*
|
|
||||||
standard library and global ``site-packages``. As a result, it
|
|
||||||
won't see new additions to the global ``site-packages``.
|
|
||||||
|
|
||||||
This script only symlinks a small portion of the standard library
|
|
||||||
into the environment, and so on Windows it is feasible to simply
|
|
||||||
copy these files over. Also, it creates a new/empty
|
|
||||||
``site-packages`` and also adds the global ``site-packages`` to the
|
|
||||||
path, so updates are tracked separately. This script also installs
|
|
||||||
Setuptools automatically, saving a step and avoiding the need for
|
|
||||||
network access.
|
|
||||||
|
|
||||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
|
||||||
create an isolated Python environment in the same style, but
|
|
||||||
achieves similar results through a declarative config file that sets
|
|
||||||
up scripts with very particular packages. As a declarative system,
|
|
||||||
it is somewhat easier to repeat and manage, but more difficult to
|
|
||||||
experiment with. ``zc.buildout`` includes the ability to setup
|
|
||||||
non-Python systems (e.g., a database server or an Apache instance).
|
|
||||||
|
|
||||||
I *strongly* recommend anyone doing application development or
|
|
||||||
deployment use one of these tools.
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
|
||||||
virtualenv.
|
|
||||||
|
|
||||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
|
||||||
release, there will be a new virtualenv release that bundles the new version of
|
|
||||||
pip.
|
|
||||||
|
|
||||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
|
||||||
|
|
||||||
Running the tests
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
|
||||||
to grow it.
|
|
||||||
|
|
||||||
The easy way to run tests (handles test dependencies automatically)::
|
|
||||||
|
|
||||||
$ python setup.py test
|
|
||||||
|
|
||||||
If you want to run only a selection of the tests, you'll need to run them
|
|
||||||
directly with nose instead. Create a virtualenv, and install required
|
|
||||||
packages::
|
|
||||||
|
|
||||||
$ pip install nose mock
|
|
||||||
|
|
||||||
Run nosetests::
|
|
||||||
|
|
||||||
$ nosetests
|
|
||||||
|
|
||||||
Or select just a single test file to run::
|
|
||||||
|
|
||||||
$ nosetests tests.test_virtualenv
|
|
||||||
|
|
||||||
|
|
||||||
Other Documentation and Links
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
* James Gardner has written a tutorial on using `virtualenv with
|
|
||||||
Pylons
|
|
||||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
|
||||||
|
|
||||||
* `Blog announcement
|
|
||||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
|
||||||
|
|
||||||
* Doug Hellmann wrote a description of his `command-line work flow
|
|
||||||
using virtualenv (virtualenvwrapper)
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
|
||||||
including some handy scripts to make working with multiple
|
|
||||||
environments easier. He also wrote `an example of using virtualenv
|
|
||||||
to try IPython
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
|
||||||
|
|
||||||
* Chris Perkins created a `showmedo video including virtualenv
|
|
||||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
|
||||||
|
|
||||||
* `Using virtualenv with mod_wsgi
|
|
||||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
|
|
||||||
* `virtualenv commands
|
|
||||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
|
||||||
workflow-related tools around virtualenv.
|
|
||||||
@@ -1,395 +0,0 @@
|
|||||||
Changes & News
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Next release (1.7) schedule
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python 2.4, too.
|
|
||||||
|
|
||||||
1.6.3 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python < 2.7.
|
|
||||||
|
|
||||||
1.6.2 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Updated embedded distribute release to 0.6.19.
|
|
||||||
|
|
||||||
* Updated embedded pip release to 1.0.2.
|
|
||||||
|
|
||||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
|
||||||
non-default Python intepreter (by using the ``-p`` option).
|
|
||||||
|
|
||||||
* Fixed #112 - Fixed path in docs.
|
|
||||||
|
|
||||||
* Fixed #109 - Corrected doctests of a Logger method.
|
|
||||||
|
|
||||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
|
||||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
|
||||||
|
|
||||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
|
||||||
|
|
||||||
|
|
||||||
1.6.1 (2011-04-30)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Start to use git-flow.
|
|
||||||
|
|
||||||
* Added support for PyPy 1.5
|
|
||||||
|
|
||||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
|
||||||
|
|
||||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
|
||||||
Jucovy.
|
|
||||||
|
|
||||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
|
||||||
|
|
||||||
1.6
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
|
||||||
|
|
||||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
|
||||||
(readline) are installed outside the standard library.
|
|
||||||
|
|
||||||
* Updated bundled pip to 1.0.
|
|
||||||
|
|
||||||
1.5.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
|
||||||
|
|
||||||
* Fixed a few more pypy related bugs.
|
|
||||||
|
|
||||||
* Updated bundled pip to 0.8.2.
|
|
||||||
|
|
||||||
* Handed project over to new team of maintainers.
|
|
||||||
|
|
||||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
1.5.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
|
||||||
|
|
||||||
* Fixed Windows regression in 1.5
|
|
||||||
|
|
||||||
1.5
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Include pip 0.8.1.
|
|
||||||
|
|
||||||
* Add support for PyPy.
|
|
||||||
|
|
||||||
* Uses a proper temporary dir when installing environment requirements.
|
|
||||||
|
|
||||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
|
||||||
|
|
||||||
* Fix an issue with ``--relocatable`` on Windows.
|
|
||||||
|
|
||||||
* Fix issue with installing the wrong version of distribute.
|
|
||||||
|
|
||||||
* Add fish and csh activate scripts.
|
|
||||||
|
|
||||||
1.4.9
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7.2
|
|
||||||
|
|
||||||
1.4.8
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix for Mac OS X Framework builds that use
|
|
||||||
``--universal-archs=intel``
|
|
||||||
|
|
||||||
* Fix ``activate_this.py`` on Windows.
|
|
||||||
|
|
||||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
|
||||||
bin/activate`` it will get unset; if you leave it set and do not
|
|
||||||
activate the environment it will still break the environment.
|
|
||||||
|
|
||||||
* Include pip 0.7.1
|
|
||||||
|
|
||||||
1.4.7
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7
|
|
||||||
|
|
||||||
1.4.6
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
|
||||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
|
||||||
|
|
||||||
1.4.5
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.3
|
|
||||||
|
|
||||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
|
||||||
``PATH`` contained a parenthesis
|
|
||||||
|
|
||||||
1.4.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.2 and Distribute 0.6.10
|
|
||||||
|
|
||||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
|
||||||
installed
|
|
||||||
|
|
||||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
|
||||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
|
||||||
|
|
||||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
|
||||||
Distribute by default (so you don't have to remember to use
|
|
||||||
``--distribute``).
|
|
||||||
|
|
||||||
1.4.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.1
|
|
||||||
|
|
||||||
1.4.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix pip installation on Windows
|
|
||||||
|
|
||||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
|
||||||
|
|
||||||
* Exclude ~/.local (user site-packages) from environments when using
|
|
||||||
``--no-site-packages``
|
|
||||||
|
|
||||||
1.4.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6
|
|
||||||
|
|
||||||
1.4
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Updated setuptools to 0.6c11
|
|
||||||
|
|
||||||
* Added the --distribute option
|
|
||||||
|
|
||||||
* Fixed packaging problem of support-files
|
|
||||||
|
|
||||||
1.3.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Virtualenv now copies the actual embedded Python binary on
|
|
||||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
|
||||||
|
|
||||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
|
||||||
|
|
||||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
|
||||||
and also specially handle the new ``__pyclasspath__`` entry in
|
|
||||||
``sys.path``.
|
|
||||||
|
|
||||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
|
||||||
|
|
||||||
* Better find libraries when compiling extensions on Windows.
|
|
||||||
|
|
||||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
|
||||||
|
|
||||||
* Added support for the Debian/Ubuntu
|
|
||||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
|
||||||
|
|
||||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
|
||||||
``sys.real_prefix``) which is reported to help building on Windows.
|
|
||||||
|
|
||||||
* Make ``deactivate`` work on ksh
|
|
||||||
|
|
||||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
|
||||||
symlink created to the exact Python version.
|
|
||||||
|
|
||||||
1.3.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
|
||||||
when using non-ASCII directory names.
|
|
||||||
|
|
||||||
* Fixed compatibility with Jython 2.5b1.
|
|
||||||
|
|
||||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
|
||||||
access to what ``virtualenv.create_environment`` does.
|
|
||||||
|
|
||||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
|
||||||
with Windows and paths that contain spaces.
|
|
||||||
|
|
||||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
|
||||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
|
||||||
``~/.pydistutils.cfg`` and use that other file instead.
|
|
||||||
|
|
||||||
* Fix ` a problem
|
|
||||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
|
||||||
some ``.so`` libraries in ``/usr/local``.
|
|
||||||
|
|
||||||
1.3.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
|
||||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
|
||||||
people, in rather obscure ways.
|
|
||||||
|
|
||||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
|
||||||
and find a pre-downloaded Setuptools egg using that.
|
|
||||||
|
|
||||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
|
||||||
|
|
||||||
1.3.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
|
||||||
``site.py``, including `user directories
|
|
||||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
|
||||||
(this means older versions of Python will support user directories,
|
|
||||||
whether intended or not).
|
|
||||||
|
|
||||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
|
||||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
|
||||||
with a ``prefix`` setting, packages would be installed globally
|
|
||||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
|
||||||
|
|
||||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
|
||||||
workaround is added.
|
|
||||||
|
|
||||||
* Fix ``--python`` option.
|
|
||||||
|
|
||||||
* Fixed handling of Jython environments that use a
|
|
||||||
jython-complete.jar.
|
|
||||||
|
|
||||||
1.3
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Update to Setuptools 0.6c9
|
|
||||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
|
||||||
will make an existing environment "relocatable" -- the paths will
|
|
||||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
|
||||||
may assist in building environments that can be moved and copied.
|
|
||||||
You have to run this *after* any new packages installed.
|
|
||||||
* Added ``bin/activate_this.py``, a file you can use like
|
|
||||||
``execfile("path_to/activate_this.py",
|
|
||||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
|
||||||
the environment in place, similar to what `the mod_wsgi example
|
|
||||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
* For Mac framework builds of Python, the site-packages directory
|
|
||||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
|
||||||
Andrea Rech.
|
|
||||||
* Some platform-specific modules in Macs are added to the path now
|
|
||||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
|
||||||
from Andrea Rech.
|
|
||||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
|
||||||
* Added ``__future__`` to the list of required modules, for Python
|
|
||||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
|
||||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
|
||||||
precedent over virtualenv's libs.
|
|
||||||
|
|
||||||
1.2
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added a ``--python`` option to select the Python interpreter.
|
|
||||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
|
||||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
|
||||||
2.3 still probably doesn't work).
|
|
||||||
|
|
||||||
1.1.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Jython 2.5.
|
|
||||||
|
|
||||||
1.1
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added support for Python 2.6.
|
|
||||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
|
||||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
|
||||||
with an interpreter named, e.g., ``python2.4``
|
|
||||||
* Fix MacPorts Python
|
|
||||||
* Added --unzip-setuptools option
|
|
||||||
* Update to Setuptools 0.6c8
|
|
||||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
|
||||||
* Copy or symlink over the ``include`` directory so that packages will
|
|
||||||
more consistently compile.
|
|
||||||
|
|
||||||
1.0
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
|
||||||
``/usr/lib`` (specifically CentOS x64).
|
|
||||||
* Fixed bug in ``--clear``.
|
|
||||||
* Fixed typos in ``deactivate.bat``.
|
|
||||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
|
||||||
|
|
||||||
0.9.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix include dir copying on Windows (makes compiling possible).
|
|
||||||
* Include the main ``lib-tk`` in the path.
|
|
||||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
|
||||||
``get_python_lib`` to point to the global locations.
|
|
||||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
|
||||||
customizations of ``distutils.cfg`` won't effect the installation.
|
|
||||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
|
||||||
``bin/python``).
|
|
||||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
|
||||||
(from Ronald Oussoren).
|
|
||||||
|
|
||||||
0.9.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
|
||||||
* Fix a little bug in ``bin/activate``.
|
|
||||||
* Actually get ``distutils.cfg`` to work reliably.
|
|
||||||
|
|
||||||
0.9
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
|
||||||
copied over in an environment.
|
|
||||||
* Copy over or symlink the ``include`` directory, so that you can
|
|
||||||
build packages that need the C headers.
|
|
||||||
* Include a ``distutils`` package, so you can locally update
|
|
||||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
|
||||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
|
||||||
creation.
|
|
||||||
* Fix a problem creating a ``lib64/`` directory.
|
|
||||||
* Should work on MacOSX Framework builds (the default Python
|
|
||||||
installations on Mac). Thanks to Ronald Oussoren.
|
|
||||||
|
|
||||||
0.8.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
|
||||||
were inaccurate.
|
|
||||||
* Slightly prettier output.
|
|
||||||
|
|
||||||
0.8.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Windows.
|
|
||||||
|
|
||||||
0.8.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Give a better warning if you are on an unsupported platform (Mac
|
|
||||||
Framework Pythons, and Windows).
|
|
||||||
* Give error about running while inside a workingenv.
|
|
||||||
* Give better error message about Python 2.3.
|
|
||||||
|
|
||||||
0.8.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
Fixed packaging of the library.
|
|
||||||
|
|
||||||
0.8
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Initial release. Everything is changed and new!
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
import virtualenv
|
|
||||||
virtualenv.main()
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
[egg_info]
|
|
||||||
tag_build =
|
|
||||||
tag_date = 0
|
|
||||||
tag_svn_revision = 0
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import sys, os
|
|
||||||
try:
|
|
||||||
from setuptools import setup
|
|
||||||
kw = {'entry_points':
|
|
||||||
"""[console_scripts]\nvirtualenv = virtualenv:main\n""",
|
|
||||||
'zip_safe': False}
|
|
||||||
except ImportError:
|
|
||||||
from distutils.core import setup
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
print('Note: without Setuptools installed you will have to use "python -m virtualenv ENV"')
|
|
||||||
kw = {}
|
|
||||||
else:
|
|
||||||
kw = {'scripts': ['scripts/virtualenv']}
|
|
||||||
|
|
||||||
here = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
|
|
||||||
## Get long_description from index.txt:
|
|
||||||
f = open(os.path.join(here, 'docs', 'index.txt'))
|
|
||||||
long_description = f.read().strip()
|
|
||||||
long_description = long_description.split('split here', 1)[1]
|
|
||||||
f.close()
|
|
||||||
f = open(os.path.join(here, 'docs', 'news.txt'))
|
|
||||||
long_description += "\n\n" + f.read()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
setup(name='virtualenv',
|
|
||||||
# If you change the version here, change it in virtualenv.py and
|
|
||||||
# docs/conf.py as well
|
|
||||||
version="1.6.4",
|
|
||||||
description="Virtual Python Environment builder",
|
|
||||||
long_description=long_description,
|
|
||||||
classifiers=[
|
|
||||||
'Development Status :: 4 - Beta',
|
|
||||||
'Intended Audience :: Developers',
|
|
||||||
'License :: OSI Approved :: MIT License',
|
|
||||||
'Programming Language :: Python :: 2',
|
|
||||||
'Programming Language :: Python :: 2.4',
|
|
||||||
'Programming Language :: Python :: 2.5',
|
|
||||||
'Programming Language :: Python :: 2.6',
|
|
||||||
'Programming Language :: Python :: 2.7',
|
|
||||||
'Programming Language :: Python :: 3',
|
|
||||||
'Programming Language :: Python :: 3.1',
|
|
||||||
'Programming Language :: Python :: 3.2',
|
|
||||||
],
|
|
||||||
keywords='setuptools deployment installation distutils',
|
|
||||||
author='Ian Bicking',
|
|
||||||
author_email='ianb@colorstudy.com',
|
|
||||||
maintainer='Jannis Leidel, Carl Meyer and Brian Rosner',
|
|
||||||
maintainer_email='python-virtualenv@groups.google.com',
|
|
||||||
url='http://www.virtualenv.org',
|
|
||||||
license='MIT',
|
|
||||||
py_modules=['virtualenv'],
|
|
||||||
packages=['virtualenv_support'],
|
|
||||||
package_data={'virtualenv_support': ['*-py%s.egg' % sys.version[:3], '*.tar.gz']},
|
|
||||||
test_suite='nose.collector',
|
|
||||||
tests_require=['nose', 'Mock'],
|
|
||||||
**kw
|
|
||||||
)
|
|
||||||
@@ -1,827 +0,0 @@
|
|||||||
Metadata-Version: 1.0
|
|
||||||
Name: virtualenv
|
|
||||||
Version: 1.6.4
|
|
||||||
Summary: Virtual Python Environment builder
|
|
||||||
Home-page: http://www.virtualenv.org
|
|
||||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
|
||||||
Author-email: python-virtualenv@groups.google.com
|
|
||||||
License: MIT
|
|
||||||
Description:
|
|
||||||
|
|
||||||
Status and License
|
|
||||||
------------------
|
|
||||||
|
|
||||||
``virtualenv`` is a successor to `workingenv
|
|
||||||
<http://cheeseshop.python.org/pypi/workingenv.py>`_, and an extension
|
|
||||||
of `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_.
|
|
||||||
|
|
||||||
It was written by Ian Bicking, sponsored by the `Open Planning
|
|
||||||
Project <http://openplans.org>`_ and is now maintained by a
|
|
||||||
`group of developers <https://github.com/pypa/virtualenv/raw/master/AUTHORS.txt>`_.
|
|
||||||
It is licensed under an
|
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
|
||||||
with ``easy_install virtualenv==dev``.
|
|
||||||
|
|
||||||
What It Does
|
|
||||||
------------
|
|
||||||
|
|
||||||
``virtualenv`` is a tool to create isolated Python environments.
|
|
||||||
|
|
||||||
The basic problem being addressed is one of dependencies and versions,
|
|
||||||
and indirectly permissions. Imagine you have an application that
|
|
||||||
needs version 1 of LibFoo, but another application requires version
|
|
||||||
2. How can you use both these applications? If you install
|
|
||||||
everything into ``/usr/lib/python2.7/site-packages`` (or whatever your
|
|
||||||
platform's standard location is), it's easy to end up in a situation
|
|
||||||
where you unintentionally upgrade an application that shouldn't be
|
|
||||||
upgraded.
|
|
||||||
|
|
||||||
Or more generally, what if you want to install an application *and
|
|
||||||
leave it be*? If an application works, any change in its libraries or
|
|
||||||
the versions of those libraries can break the application.
|
|
||||||
|
|
||||||
Also, what if you can't install packages into the global
|
|
||||||
``site-packages`` directory? For instance, on a shared host.
|
|
||||||
|
|
||||||
In all these cases, ``virtualenv`` can help you. It creates an
|
|
||||||
environment that has its own installation directories, that doesn't
|
|
||||||
share libraries with other virtualenv environments (and optionally
|
|
||||||
doesn't access the globally installed libraries either).
|
|
||||||
|
|
||||||
The basic usage is::
|
|
||||||
|
|
||||||
$ python virtualenv.py ENV
|
|
||||||
|
|
||||||
If you install it you can also just do ``virtualenv ENV``.
|
|
||||||
|
|
||||||
This creates ``ENV/lib/pythonX.X/site-packages``, where any libraries you
|
|
||||||
install will go. It also creates ``ENV/bin/python``, which is a Python
|
|
||||||
interpreter that uses this environment. Anytime you use that interpreter
|
|
||||||
(including when a script has ``#!/path/to/ENV/bin/python`` in it) the libraries
|
|
||||||
in that environment will be used.
|
|
||||||
|
|
||||||
It also installs either `Setuptools
|
|
||||||
<http://peak.telecommunity.com/DevCenter/setuptools>`_ or `distribute
|
|
||||||
<http://pypi.python.org/pypi/distribute>`_ into the environment. To use
|
|
||||||
Distribute instead of setuptools, just call virtualenv like this::
|
|
||||||
|
|
||||||
$ python virtualenv.py --distribute ENV
|
|
||||||
|
|
||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
|
||||||
installer, so you can use `ENV/bin/pip`` to install additional packages into
|
|
||||||
the environment.
|
|
||||||
|
|
||||||
Windows Notes
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Some paths within the virtualenv are slightly different on Windows: scripts and
|
|
||||||
executables on Windows go in ``ENV\Scripts\`` instead of ``ENV/bin/`` and
|
|
||||||
libraries go in ``ENV\Lib\`` rather than ``ENV/lib/``.
|
|
||||||
|
|
||||||
To create a virtualenv under a path with spaces in it on Windows, you'll need
|
|
||||||
the `win32api <http://sourceforge.net/projects/pywin32/>`_ library installed.
|
|
||||||
|
|
||||||
PyPy Support
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beginning with virtualenv version 1.5 `PyPy <http://pypy.org>`_ is
|
|
||||||
supported. To use PyPy 1.4 or 1.4.1, you need a version of virtualenv >= 1.5.
|
|
||||||
To use PyPy 1.5, you need a version of virtualenv >= 1.6.1.
|
|
||||||
|
|
||||||
Creating Your Own Bootstrap Scripts
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
While this creates an environment, it doesn't put anything into the
|
|
||||||
environment. Developers may find it useful to distribute a script
|
|
||||||
that sets up a particular environment, for example a script that
|
|
||||||
installs a particular web application.
|
|
||||||
|
|
||||||
To create a script like this, call
|
|
||||||
``virtualenv.create_bootstrap_script(extra_text)``, and write the
|
|
||||||
result to your new bootstrapping script. Here's the documentation
|
|
||||||
from the docstring:
|
|
||||||
|
|
||||||
Creates a bootstrap script, which is like this script but with
|
|
||||||
extend_parser, adjust_options, and after_install hooks.
|
|
||||||
|
|
||||||
This returns a string that (written to disk of course) can be used
|
|
||||||
as a bootstrap script with your own customizations. The script
|
|
||||||
will be the standard virtualenv.py script, with your extra text
|
|
||||||
added (your extra text should be Python code).
|
|
||||||
|
|
||||||
If you include these functions, they will be called:
|
|
||||||
|
|
||||||
``extend_parser(optparse_parser)``:
|
|
||||||
You can add or remove options from the parser here.
|
|
||||||
|
|
||||||
``adjust_options(options, args)``:
|
|
||||||
You can change options here, or change the args (if you accept
|
|
||||||
different kinds of arguments, be sure you modify ``args`` so it is
|
|
||||||
only ``[DEST_DIR]``).
|
|
||||||
|
|
||||||
``after_install(options, home_dir)``:
|
|
||||||
|
|
||||||
After everything is installed, this function is called. This
|
|
||||||
is probably the function you are most likely to use. An
|
|
||||||
example would be::
|
|
||||||
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
bin = 'Scripts'
|
|
||||||
else:
|
|
||||||
bin = 'bin'
|
|
||||||
subprocess.call([join(home_dir, bin, 'easy_install'),
|
|
||||||
'MyPackage'])
|
|
||||||
subprocess.call([join(home_dir, bin, 'my-package-script'),
|
|
||||||
'setup', home_dir])
|
|
||||||
|
|
||||||
This example immediately installs a package, and runs a setup
|
|
||||||
script from that package.
|
|
||||||
|
|
||||||
Bootstrap Example
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Here's a more concrete example of how you could use this::
|
|
||||||
|
|
||||||
import virtualenv, textwrap
|
|
||||||
output = virtualenv.create_bootstrap_script(textwrap.dedent("""
|
|
||||||
import os, subprocess
|
|
||||||
def after_install(options, home_dir):
|
|
||||||
etc = join(home_dir, 'etc')
|
|
||||||
if not os.path.exists(etc):
|
|
||||||
os.makedirs(etc)
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'easy_install'),
|
|
||||||
'BlogApplication'])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'make-config', 'BlogApplication',
|
|
||||||
join(etc, 'blog.ini')])
|
|
||||||
subprocess.call([join(home_dir, 'bin', 'paster'),
|
|
||||||
'setup-app', join(etc, 'blog.ini')])
|
|
||||||
"""))
|
|
||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
|
||||||
|
|
||||||
Another example is available `here
|
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
|
||||||
|
|
||||||
activate script
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
In a newly created virtualenv there will be a ``bin/activate`` shell
|
|
||||||
script, or a ``Scripts/activate.bat`` batch file on Windows.
|
|
||||||
|
|
||||||
On Posix systems you can do::
|
|
||||||
|
|
||||||
$ source bin/activate
|
|
||||||
|
|
||||||
This will change your ``$PATH`` to point to the virtualenv's ``bin/``
|
|
||||||
directory. (You have to use ``source`` because it changes your shell
|
|
||||||
environment in-place.) This is all it does; it's purely a convenience. If
|
|
||||||
you directly run a script or the python interpreter from the virtualenv's
|
|
||||||
``bin/`` directory (e.g. ``path/to/env/bin/pip`` or
|
|
||||||
``/path/to/env/bin/python script.py``) there's no need for activation.
|
|
||||||
|
|
||||||
After activating an environment you can use the function ``deactivate`` to
|
|
||||||
undo the changes to your ``$PATH``.
|
|
||||||
|
|
||||||
The ``activate`` script will also modify your shell prompt to indicate
|
|
||||||
which environment is currently active. You can disable this behavior,
|
|
||||||
which can be useful if you have your own custom prompt that already
|
|
||||||
displays the active environment name. To do so, set the
|
|
||||||
``VIRTUAL_ENV_DISABLE_PROMPT`` environment variable to any non-empty
|
|
||||||
value before running the ``activate`` script.
|
|
||||||
|
|
||||||
On Windows you just do::
|
|
||||||
|
|
||||||
> \path\to\env\Scripts\activate.bat
|
|
||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
|
||||||
wherever your global site-packages directory is). This can be used if
|
|
||||||
you don't have control over site-packages and don't want to depend on
|
|
||||||
the packages there, or you just want more isolation from the global
|
|
||||||
system.
|
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Sometimes you can't or don't want to use the Python interpreter
|
|
||||||
created by the virtualenv. For instance, in a `mod_python
|
|
||||||
<http://www.modpython.org/>`_ or `mod_wsgi <http://www.modwsgi.org/>`_
|
|
||||||
environment, there is only one interpreter.
|
|
||||||
|
|
||||||
Luckily, it's easy. You must use the custom Python interpreter to
|
|
||||||
*install* libraries. But to *use* libraries, you just have to be sure
|
|
||||||
the path is correct. A script is available to correct the path. You
|
|
||||||
can setup the environment like::
|
|
||||||
|
|
||||||
activate_this = '/path/to/env/bin/activate_this.py'
|
|
||||||
execfile(activate_this, dict(__file__=activate_this))
|
|
||||||
|
|
||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
|
||||||
you to use an existing interpreter. Items in your environment will show up
|
|
||||||
first on ``sys.path``, before global items. However, global items will
|
|
||||||
always be accessible -- this technique does not support the
|
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
|
||||||
instance, activate an environment before a web request; you should activate
|
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
|
||||||
|
|
||||||
Making Environments Relocatable
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Note: this option is somewhat experimental, and there are probably
|
|
||||||
caveats that have not yet been identified. Also this does not
|
|
||||||
currently work on Windows.
|
|
||||||
|
|
||||||
Normally environments are tied to a specific path. That means that
|
|
||||||
you cannot move an environment around or copy it to another computer.
|
|
||||||
You can fix up an environment to make it relocatable with the
|
|
||||||
command::
|
|
||||||
|
|
||||||
$ virtualenv --relocatable ENV
|
|
||||||
|
|
||||||
This will make some of the files created by setuptools or distribute
|
|
||||||
use relative paths, and will change all the scripts to use ``activate_this.py``
|
|
||||||
instead of using the location of the Python interpreter to select the
|
|
||||||
environment.
|
|
||||||
|
|
||||||
**Note:** you must run this after you've installed *any* packages into
|
|
||||||
the environment. If you make an environment relocatable, then
|
|
||||||
install a new package, you must run ``virtualenv --relocatable``
|
|
||||||
again.
|
|
||||||
|
|
||||||
Also, this **does not make your packages cross-platform**. You can
|
|
||||||
move the directory around, but it can only be used on other similar
|
|
||||||
computers. Some known environmental differences that can cause
|
|
||||||
incompatibilities: a different version of Python, when one platform
|
|
||||||
uses UCS2 for its internal unicode representation and another uses
|
|
||||||
UCS4 (a compile-time option), obvious platform changes like Windows
|
|
||||||
vs. Linux, or Intel vs. ARM, and if you have libraries that bind to C
|
|
||||||
libraries on the system, if those C libraries are located somewhere
|
|
||||||
different (either different versions, or a different filesystem
|
|
||||||
layout).
|
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
|
||||||
use this on an environment.
|
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When it creates a new environment, virtualenv installs either
|
|
||||||
setuptools or distribute, and pip. In normal operation, the latest
|
|
||||||
releases of these packages are fetched from the `Python Package Index
|
|
||||||
<http://pypi.python.org>`_ (PyPI). In some circumstances, this
|
|
||||||
behavior may not be wanted, for example if you are using virtualenv
|
|
||||||
during a deployment and do not want to depend on Internet access and
|
|
||||||
PyPI availability.
|
|
||||||
|
|
||||||
As an alternative, you can provide your own versions of setuptools,
|
|
||||||
distribute and/or pip on the filesystem, and tell virtualenv to use
|
|
||||||
those distributions instead of downloading them from the Internet. To
|
|
||||||
use this feature, pass one or more ``--extra-search-dir`` options to
|
|
||||||
virtualenv like this::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions ENV
|
|
||||||
|
|
||||||
The ``/path/to/distributions`` path should point to a directory that
|
|
||||||
contains setuptools, distribute and/or pip distributions. Setuptools
|
|
||||||
distributions must be ``.egg`` files; distribute and pip distributions
|
|
||||||
should be `.tar.gz` source distributions.
|
|
||||||
|
|
||||||
Virtualenv will still download these packages if no satisfactory local
|
|
||||||
distributions are found.
|
|
||||||
|
|
||||||
If you are really concerned about virtualenv fetching these packages
|
|
||||||
from the Internet and want to ensure that it never will, you can also
|
|
||||||
provide an option ``--never-download`` like so::
|
|
||||||
|
|
||||||
$ virtualenv --extra-search-dir=/path/to/distributions --never-download ENV
|
|
||||||
|
|
||||||
If this option is provided, virtualenv will never try to download
|
|
||||||
setuptools/distribute or pip. Instead, it will exit with status code 1
|
|
||||||
if it fails to find local distributions for any of these required
|
|
||||||
packages.
|
|
||||||
|
|
||||||
Compare & Contrast with Alternatives
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
There are several alternatives that create isolated environments:
|
|
||||||
|
|
||||||
* ``workingenv`` (which I do not suggest you use anymore) is the
|
|
||||||
predecessor to this library. It used the main Python interpreter,
|
|
||||||
but relied on setting ``$PYTHONPATH`` to activate the environment.
|
|
||||||
This causes problems when running Python scripts that aren't part of
|
|
||||||
the environment (e.g., a globally installed ``hg`` or ``bzr``). It
|
|
||||||
also conflicted a lot with Setuptools.
|
|
||||||
|
|
||||||
* `virtual-python
|
|
||||||
<http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python>`_
|
|
||||||
is also a predecessor to this library. It uses only symlinks, so it
|
|
||||||
couldn't work on Windows. It also symlinks over the *entire*
|
|
||||||
standard library and global ``site-packages``. As a result, it
|
|
||||||
won't see new additions to the global ``site-packages``.
|
|
||||||
|
|
||||||
This script only symlinks a small portion of the standard library
|
|
||||||
into the environment, and so on Windows it is feasible to simply
|
|
||||||
copy these files over. Also, it creates a new/empty
|
|
||||||
``site-packages`` and also adds the global ``site-packages`` to the
|
|
||||||
path, so updates are tracked separately. This script also installs
|
|
||||||
Setuptools automatically, saving a step and avoiding the need for
|
|
||||||
network access.
|
|
||||||
|
|
||||||
* `zc.buildout <http://pypi.python.org/pypi/zc.buildout>`_ doesn't
|
|
||||||
create an isolated Python environment in the same style, but
|
|
||||||
achieves similar results through a declarative config file that sets
|
|
||||||
up scripts with very particular packages. As a declarative system,
|
|
||||||
it is somewhat easier to repeat and manage, but more difficult to
|
|
||||||
experiment with. ``zc.buildout`` includes the ability to setup
|
|
||||||
non-Python systems (e.g., a database server or an Apache instance).
|
|
||||||
|
|
||||||
I *strongly* recommend anyone doing application development or
|
|
||||||
deployment use one of these tools.
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
Refer to the `contributing to pip`_ documentation - it applies equally to
|
|
||||||
virtualenv.
|
|
||||||
|
|
||||||
Virtualenv's release schedule is tied to pip's -- each time there's a new pip
|
|
||||||
release, there will be a new virtualenv release that bundles the new version of
|
|
||||||
pip.
|
|
||||||
|
|
||||||
.. _contributing to pip: http://www.pip-installer.org/en/latest/how-to-contribute.html
|
|
||||||
|
|
||||||
Running the tests
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Virtualenv's test suite is small and not yet at all comprehensive, but we aim
|
|
||||||
to grow it.
|
|
||||||
|
|
||||||
The easy way to run tests (handles test dependencies automatically)::
|
|
||||||
|
|
||||||
$ python setup.py test
|
|
||||||
|
|
||||||
If you want to run only a selection of the tests, you'll need to run them
|
|
||||||
directly with nose instead. Create a virtualenv, and install required
|
|
||||||
packages::
|
|
||||||
|
|
||||||
$ pip install nose mock
|
|
||||||
|
|
||||||
Run nosetests::
|
|
||||||
|
|
||||||
$ nosetests
|
|
||||||
|
|
||||||
Or select just a single test file to run::
|
|
||||||
|
|
||||||
$ nosetests tests.test_virtualenv
|
|
||||||
|
|
||||||
|
|
||||||
Other Documentation and Links
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
* James Gardner has written a tutorial on using `virtualenv with
|
|
||||||
Pylons
|
|
||||||
<http://wiki.pylonshq.com/display/pylonscookbook/Using+a+Virtualenv+Sandbox>`_.
|
|
||||||
|
|
||||||
* `Blog announcement
|
|
||||||
<http://blog.ianbicking.org/2007/10/10/workingenv-is-dead-long-live-virtualenv/>`_.
|
|
||||||
|
|
||||||
* Doug Hellmann wrote a description of his `command-line work flow
|
|
||||||
using virtualenv (virtualenvwrapper)
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html>`_
|
|
||||||
including some handy scripts to make working with multiple
|
|
||||||
environments easier. He also wrote `an example of using virtualenv
|
|
||||||
to try IPython
|
|
||||||
<http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html>`_.
|
|
||||||
|
|
||||||
* Chris Perkins created a `showmedo video including virtualenv
|
|
||||||
<http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
|
|
||||||
|
|
||||||
* `Using virtualenv with mod_wsgi
|
|
||||||
<http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
|
|
||||||
* `virtualenv commands
|
|
||||||
<http://thisismedium.com/tech/extending-virtualenv/>`_ for some more
|
|
||||||
workflow-related tools around virtualenv.
|
|
||||||
|
|
||||||
Changes & News
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Next release (1.7) schedule
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python 2.4, too.
|
|
||||||
|
|
||||||
1.6.3 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Restored ability to run on Python < 2.7.
|
|
||||||
|
|
||||||
1.6.2 (2011-07-16)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Updated embedded distribute release to 0.6.19.
|
|
||||||
|
|
||||||
* Updated embedded pip release to 1.0.2.
|
|
||||||
|
|
||||||
* Fixed #141 - Be smarter about finding pkg_resources when using the
|
|
||||||
non-default Python intepreter (by using the ``-p`` option).
|
|
||||||
|
|
||||||
* Fixed #112 - Fixed path in docs.
|
|
||||||
|
|
||||||
* Fixed #109 - Corrected doctests of a Logger method.
|
|
||||||
|
|
||||||
* Fixed #118 - Fixed creating virtualenvs on platforms that use the
|
|
||||||
"posix_local" install scheme, such as Ubuntu with Python 2.7.
|
|
||||||
|
|
||||||
* Add missing library to Python 3 virtualenvs (``_dummy_thread``).
|
|
||||||
|
|
||||||
|
|
||||||
1.6.1 (2011-04-30)
|
|
||||||
~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Start to use git-flow.
|
|
||||||
|
|
||||||
* Added support for PyPy 1.5
|
|
||||||
|
|
||||||
* Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
|
|
||||||
|
|
||||||
* Added progress meter for pip installation as well as setuptools. Thanks Ethan
|
|
||||||
Jucovy.
|
|
||||||
|
|
||||||
* Added --never-download and --search-dir options. Thanks Ethan Jucovy.
|
|
||||||
|
|
||||||
1.6
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
|
|
||||||
|
|
||||||
* Fixed creation of virtualenvs on Mac OS X when standard library modules
|
|
||||||
(readline) are installed outside the standard library.
|
|
||||||
|
|
||||||
* Updated bundled pip to 1.0.
|
|
||||||
|
|
||||||
1.5.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Moved main repository to Github: https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
* Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
|
|
||||||
|
|
||||||
* Fixed a few more pypy related bugs.
|
|
||||||
|
|
||||||
* Updated bundled pip to 0.8.2.
|
|
||||||
|
|
||||||
* Handed project over to new team of maintainers.
|
|
||||||
|
|
||||||
* Moved virtualenv to Github at https://github.com/pypa/virtualenv
|
|
||||||
|
|
||||||
1.5.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added ``_weakrefset`` requirement for Python 2.7.1.
|
|
||||||
|
|
||||||
* Fixed Windows regression in 1.5
|
|
||||||
|
|
||||||
1.5
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Include pip 0.8.1.
|
|
||||||
|
|
||||||
* Add support for PyPy.
|
|
||||||
|
|
||||||
* Uses a proper temporary dir when installing environment requirements.
|
|
||||||
|
|
||||||
* Add ``--prompt`` option to be able to override the default prompt prefix.
|
|
||||||
|
|
||||||
* Fix an issue with ``--relocatable`` on Windows.
|
|
||||||
|
|
||||||
* Fix issue with installing the wrong version of distribute.
|
|
||||||
|
|
||||||
* Add fish and csh activate scripts.
|
|
||||||
|
|
||||||
1.4.9
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7.2
|
|
||||||
|
|
||||||
1.4.8
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix for Mac OS X Framework builds that use
|
|
||||||
``--universal-archs=intel``
|
|
||||||
|
|
||||||
* Fix ``activate_this.py`` on Windows.
|
|
||||||
|
|
||||||
* Allow ``$PYTHONHOME`` to be set, so long as you use ``source
|
|
||||||
bin/activate`` it will get unset; if you leave it set and do not
|
|
||||||
activate the environment it will still break the environment.
|
|
||||||
|
|
||||||
* Include pip 0.7.1
|
|
||||||
|
|
||||||
1.4.7
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.7
|
|
||||||
|
|
||||||
1.4.6
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Allow ``activate.sh`` to skip updating the prompt (by setting
|
|
||||||
``$VIRTUAL_ENV_DISABLE_PROMPT``).
|
|
||||||
|
|
||||||
1.4.5
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.3
|
|
||||||
|
|
||||||
* Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
|
|
||||||
``PATH`` contained a parenthesis
|
|
||||||
|
|
||||||
1.4.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.2 and Distribute 0.6.10
|
|
||||||
|
|
||||||
* Create the ``virtualenv`` script even when Setuptools isn't
|
|
||||||
installed
|
|
||||||
|
|
||||||
* Fix problem with ``virtualenv --relocate`` when ``bin/`` has
|
|
||||||
subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
|
|
||||||
|
|
||||||
* If you set ``$VIRTUALENV_USE_DISTRIBUTE`` then virtualenv will use
|
|
||||||
Distribute by default (so you don't have to remember to use
|
|
||||||
``--distribute``).
|
|
||||||
|
|
||||||
1.4.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6.1
|
|
||||||
|
|
||||||
1.4.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix pip installation on Windows
|
|
||||||
|
|
||||||
* Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
|
|
||||||
|
|
||||||
* Exclude ~/.local (user site-packages) from environments when using
|
|
||||||
``--no-site-packages``
|
|
||||||
|
|
||||||
1.4.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Include pip 0.6
|
|
||||||
|
|
||||||
1.4
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Updated setuptools to 0.6c11
|
|
||||||
|
|
||||||
* Added the --distribute option
|
|
||||||
|
|
||||||
* Fixed packaging problem of support-files
|
|
||||||
|
|
||||||
1.3.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Virtualenv now copies the actual embedded Python binary on
|
|
||||||
Mac OS X to fix a hang on Snow Leopard (10.6).
|
|
||||||
|
|
||||||
* Fail more gracefully on Windows when ``win32api`` is not installed.
|
|
||||||
|
|
||||||
* Fix site-packages taking precedent over Jython's ``__classpath__``
|
|
||||||
and also specially handle the new ``__pyclasspath__`` entry in
|
|
||||||
``sys.path``.
|
|
||||||
|
|
||||||
* Now copies Jython's ``registry`` file to the virtualenv if it exists.
|
|
||||||
|
|
||||||
* Better find libraries when compiling extensions on Windows.
|
|
||||||
|
|
||||||
* Create ``Scripts\pythonw.exe`` on Windows.
|
|
||||||
|
|
||||||
* Added support for the Debian/Ubuntu
|
|
||||||
``/usr/lib/pythonX.Y/dist-packages`` directory.
|
|
||||||
|
|
||||||
* Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
|
|
||||||
``sys.real_prefix``) which is reported to help building on Windows.
|
|
||||||
|
|
||||||
* Make ``deactivate`` work on ksh
|
|
||||||
|
|
||||||
* Fixes for ``--python``: make it work with ``--relocatable`` and the
|
|
||||||
symlink created to the exact Python version.
|
|
||||||
|
|
||||||
1.3.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Use Windows newlines in ``activate.bat``, which has been reported to help
|
|
||||||
when using non-ASCII directory names.
|
|
||||||
|
|
||||||
* Fixed compatibility with Jython 2.5b1.
|
|
||||||
|
|
||||||
* Added a function ``virtualenv.install_python`` for more fine-grained
|
|
||||||
access to what ``virtualenv.create_environment`` does.
|
|
||||||
|
|
||||||
* Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
|
|
||||||
with Windows and paths that contain spaces.
|
|
||||||
|
|
||||||
* If ``/path/to/env/.pydistutils.cfg`` exists (or
|
|
||||||
``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
|
|
||||||
``~/.pydistutils.cfg`` and use that other file instead.
|
|
||||||
|
|
||||||
* Fix ` a problem
|
|
||||||
<https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
|
|
||||||
some ``.so`` libraries in ``/usr/local``.
|
|
||||||
|
|
||||||
1.3.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Remove the ``[install] prefix = ...`` setting from the virtualenv
|
|
||||||
``distutils.cfg`` -- this has been causing problems for a lot of
|
|
||||||
people, in rather obscure ways.
|
|
||||||
|
|
||||||
* If you use a `boot script <./index.html#boot-script>`_ it will attempt to import ``virtualenv``
|
|
||||||
and find a pre-downloaded Setuptools egg using that.
|
|
||||||
|
|
||||||
* Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
|
|
||||||
|
|
||||||
1.3.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Real Python 2.6 compatibility. Backported the Python 2.6 updates to
|
|
||||||
``site.py``, including `user directories
|
|
||||||
<http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
|
|
||||||
(this means older versions of Python will support user directories,
|
|
||||||
whether intended or not).
|
|
||||||
|
|
||||||
* Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
|
|
||||||
on some platforms where a system-wide ``distutils.cfg`` was present
|
|
||||||
with a ``prefix`` setting, packages would be installed globally
|
|
||||||
(usually in ``/usr/local/lib/pythonX.Y/site-packages``).
|
|
||||||
|
|
||||||
* Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
|
|
||||||
workaround is added.
|
|
||||||
|
|
||||||
* Fix ``--python`` option.
|
|
||||||
|
|
||||||
* Fixed handling of Jython environments that use a
|
|
||||||
jython-complete.jar.
|
|
||||||
|
|
||||||
1.3
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Update to Setuptools 0.6c9
|
|
||||||
* Added an option ``virtualenv --relocatable EXISTING_ENV``, which
|
|
||||||
will make an existing environment "relocatable" -- the paths will
|
|
||||||
not be absolute in scripts, ``.egg-info`` and ``.pth`` files. This
|
|
||||||
may assist in building environments that can be moved and copied.
|
|
||||||
You have to run this *after* any new packages installed.
|
|
||||||
* Added ``bin/activate_this.py``, a file you can use like
|
|
||||||
``execfile("path_to/activate_this.py",
|
|
||||||
dict(__file__="path_to/activate_this.py"))`` -- this will activate
|
|
||||||
the environment in place, similar to what `the mod_wsgi example
|
|
||||||
does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
|
|
||||||
* For Mac framework builds of Python, the site-packages directory
|
|
||||||
``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
|
|
||||||
Andrea Rech.
|
|
||||||
* Some platform-specific modules in Macs are added to the path now
|
|
||||||
(``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
|
|
||||||
from Andrea Rech.
|
|
||||||
* Fixed a small Bashism in the ``bin/activate`` shell script.
|
|
||||||
* Added ``__future__`` to the list of required modules, for Python
|
|
||||||
2.3. You'll still need to backport your own ``subprocess`` module.
|
|
||||||
* Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
|
|
||||||
precedent over virtualenv's libs.
|
|
||||||
|
|
||||||
1.2
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added a ``--python`` option to select the Python interpreter.
|
|
||||||
* Add ``warnings`` to the modules copied over, for Python 2.6 support.
|
|
||||||
* Add ``sets`` to the module copied over for Python 2.3 (though Python
|
|
||||||
2.3 still probably doesn't work).
|
|
||||||
|
|
||||||
1.1.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Jython 2.5.
|
|
||||||
|
|
||||||
1.1
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added support for Python 2.6.
|
|
||||||
* Fix a problem with missing ``DLLs/zlib.pyd`` on Windows. Create
|
|
||||||
* ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
|
|
||||||
with an interpreter named, e.g., ``python2.4``
|
|
||||||
* Fix MacPorts Python
|
|
||||||
* Added --unzip-setuptools option
|
|
||||||
* Update to Setuptools 0.6c8
|
|
||||||
* If the current directory is not writable, run ez_setup.py in ``/tmp``
|
|
||||||
* Copy or symlink over the ``include`` directory so that packages will
|
|
||||||
more consistently compile.
|
|
||||||
|
|
||||||
1.0
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Fix build on systems that use ``/usr/lib64``, distinct from
|
|
||||||
``/usr/lib`` (specifically CentOS x64).
|
|
||||||
* Fixed bug in ``--clear``.
|
|
||||||
* Fixed typos in ``deactivate.bat``.
|
|
||||||
* Preserve ``$PYTHONPATH`` when calling subprocesses.
|
|
||||||
|
|
||||||
0.9.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Fix include dir copying on Windows (makes compiling possible).
|
|
||||||
* Include the main ``lib-tk`` in the path.
|
|
||||||
* Patch ``distutils.sysconfig``: ``get_python_inc`` and
|
|
||||||
``get_python_lib`` to point to the global locations.
|
|
||||||
* Install ``distutils.cfg`` before Setuptools, so that system
|
|
||||||
customizations of ``distutils.cfg`` won't effect the installation.
|
|
||||||
* Add ``bin/pythonX.Y`` to the virtualenv (in addition to
|
|
||||||
``bin/python``).
|
|
||||||
* Fixed an issue with Mac Framework Python builds, and absolute paths
|
|
||||||
(from Ronald Oussoren).
|
|
||||||
|
|
||||||
0.9.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Improve ability to create a virtualenv from inside a virtualenv.
|
|
||||||
* Fix a little bug in ``bin/activate``.
|
|
||||||
* Actually get ``distutils.cfg`` to work reliably.
|
|
||||||
|
|
||||||
0.9
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Added ``lib-dynload`` and ``config`` to things that need to be
|
|
||||||
copied over in an environment.
|
|
||||||
* Copy over or symlink the ``include`` directory, so that you can
|
|
||||||
build packages that need the C headers.
|
|
||||||
* Include a ``distutils`` package, so you can locally update
|
|
||||||
``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
|
|
||||||
* Better avoid downloading Setuptools, and hitting PyPI on environment
|
|
||||||
creation.
|
|
||||||
* Fix a problem creating a ``lib64/`` directory.
|
|
||||||
* Should work on MacOSX Framework builds (the default Python
|
|
||||||
installations on Mac). Thanks to Ronald Oussoren.
|
|
||||||
|
|
||||||
0.8.4
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Windows installs would sometimes give errors about ``sys.prefix`` that
|
|
||||||
were inaccurate.
|
|
||||||
* Slightly prettier output.
|
|
||||||
|
|
||||||
0.8.3
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Added support for Windows.
|
|
||||||
|
|
||||||
0.8.2
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
* Give a better warning if you are on an unsupported platform (Mac
|
|
||||||
Framework Pythons, and Windows).
|
|
||||||
* Give error about running while inside a workingenv.
|
|
||||||
* Give better error message about Python 2.3.
|
|
||||||
|
|
||||||
0.8.1
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
Fixed packaging of the library.
|
|
||||||
|
|
||||||
0.8
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Initial release. Everything is changed and new!
|
|
||||||
|
|
||||||
Keywords: setuptools deployment installation distutils
|
|
||||||
Platform: UNKNOWN
|
|
||||||
Classifier: Development Status :: 4 - Beta
|
|
||||||
Classifier: Intended Audience :: Developers
|
|
||||||
Classifier: License :: OSI Approved :: MIT License
|
|
||||||
Classifier: Programming Language :: Python :: 2
|
|
||||||
Classifier: Programming Language :: Python :: 2.4
|
|
||||||
Classifier: Programming Language :: Python :: 2.5
|
|
||||||
Classifier: Programming Language :: Python :: 2.6
|
|
||||||
Classifier: Programming Language :: Python :: 2.7
|
|
||||||
Classifier: Programming Language :: Python :: 3
|
|
||||||
Classifier: Programming Language :: Python :: 3.1
|
|
||||||
Classifier: Programming Language :: Python :: 3.2
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
AUTHORS.txt
|
|
||||||
LICENSE.txt
|
|
||||||
MANIFEST.in
|
|
||||||
setup.py
|
|
||||||
virtualenv.py
|
|
||||||
docs/index.txt
|
|
||||||
docs/news.txt
|
|
||||||
scripts/virtualenv
|
|
||||||
virtualenv.egg-info/PKG-INFO
|
|
||||||
virtualenv.egg-info/SOURCES.txt
|
|
||||||
virtualenv.egg-info/dependency_links.txt
|
|
||||||
virtualenv.egg-info/entry_points.txt
|
|
||||||
virtualenv.egg-info/not-zip-safe
|
|
||||||
virtualenv.egg-info/top_level.txt
|
|
||||||
virtualenv_support/__init__.py
|
|
||||||
virtualenv_support/distribute-0.6.19.tar.gz
|
|
||||||
virtualenv_support/pip-1.0.2.tar.gz
|
|
||||||
virtualenv_support/setuptools-0.6c11-py2.4.egg
|
|
||||||
virtualenv_support/setuptools-0.6c11-py2.5.egg
|
|
||||||
virtualenv_support/setuptools-0.6c11-py2.6.egg
|
|
||||||
virtualenv_support/setuptools-0.6c11-py2.7.egg
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[console_scripts]
|
|
||||||
virtualenv = virtualenv:main
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
virtualenv_support
|
|
||||||
virtualenv
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,210 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
envoy.core
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
This module provides envoy awesomeness.
|
||||||
|
|
||||||
|
Copyright 2012, Kenneth Reitz.
|
||||||
|
MIT Licensed.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shlex
|
||||||
|
import subprocess
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = '0.0.2'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__author__ = 'Kenneth Reitz'
|
||||||
|
|
||||||
|
|
||||||
|
class Command(object):
|
||||||
|
def __init__(self, cmd):
|
||||||
|
self.cmd = cmd
|
||||||
|
self.process = None
|
||||||
|
self.out = None
|
||||||
|
self.err = None
|
||||||
|
self.returncode = None
|
||||||
|
self.data = None
|
||||||
|
|
||||||
|
def run(self, data, timeout, env):
|
||||||
|
self.data = data
|
||||||
|
environ = dict(os.environ).update(env or {})
|
||||||
|
|
||||||
|
def target():
|
||||||
|
|
||||||
|
self.process = subprocess.Popen(self.cmd,
|
||||||
|
universal_newlines=True,
|
||||||
|
shell=False,
|
||||||
|
env=environ,
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
bufsize=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.out, self.err = self.process.communicate(self.data)
|
||||||
|
|
||||||
|
thread = threading.Thread(target=target)
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
thread.join(timeout)
|
||||||
|
if thread.is_alive():
|
||||||
|
self.process.terminate()
|
||||||
|
thread.join()
|
||||||
|
self.returncode = self.process.returncode
|
||||||
|
return self.out, self.err
|
||||||
|
|
||||||
|
|
||||||
|
class ConnectedCommand(object):
|
||||||
|
def __init__(self,
|
||||||
|
process=None,
|
||||||
|
std_in=None,
|
||||||
|
std_out=None,
|
||||||
|
std_err=None):
|
||||||
|
|
||||||
|
self._process = process
|
||||||
|
self.std_in = std_in
|
||||||
|
self.std_out = std_out
|
||||||
|
self.std_err = std_out
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, type, value, traceback):
|
||||||
|
self.kill()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def status_code(self):
|
||||||
|
"""The status code of the process.
|
||||||
|
If the code is None, assume that it's still running.
|
||||||
|
"""
|
||||||
|
if self._status_code is not None:
|
||||||
|
return self._status_code
|
||||||
|
|
||||||
|
# investigate
|
||||||
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pid(self):
|
||||||
|
"""The process' PID."""
|
||||||
|
return self._process.pid
|
||||||
|
|
||||||
|
def kill(self):
|
||||||
|
"""Kills the process."""
|
||||||
|
return self._process.kill()
|
||||||
|
|
||||||
|
def expect(self, bytes, stream=None):
|
||||||
|
"""Block until given bytes appear in the stream."""
|
||||||
|
if stream is None:
|
||||||
|
stream = self.std_out
|
||||||
|
pass
|
||||||
|
|
||||||
|
def send(self, end='\n'):
|
||||||
|
"""Sends a line to std_in."""
|
||||||
|
#TODO: Y U LINE BUFFER
|
||||||
|
pass
|
||||||
|
|
||||||
|
def block(self):
|
||||||
|
"""Blocks until command finishes. Returns Response instance."""
|
||||||
|
self._status_code = self._process.wait()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Response(object):
|
||||||
|
"""A command's response"""
|
||||||
|
|
||||||
|
def __init__(self, process=None):
|
||||||
|
super(Response, self).__init__()
|
||||||
|
|
||||||
|
self._process = process
|
||||||
|
self.command = None
|
||||||
|
self.std_err = None
|
||||||
|
self.std_out = None
|
||||||
|
self.status_code = None
|
||||||
|
self.history = []
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
if len(self.command):
|
||||||
|
return '<Response [{0}]>'.format(self.command[0])
|
||||||
|
else:
|
||||||
|
return '<Response>'
|
||||||
|
|
||||||
|
|
||||||
|
def expand_args(command):
|
||||||
|
"""Parses command strings and returns a Popen-ready list."""
|
||||||
|
|
||||||
|
# Prepare arguments.
|
||||||
|
if isinstance(command, basestring):
|
||||||
|
splitter = shlex.shlex(command, posix=True)
|
||||||
|
splitter.whitespace = '|'
|
||||||
|
splitter.whitespace_split = True
|
||||||
|
command = []
|
||||||
|
|
||||||
|
while True:
|
||||||
|
token = splitter.get_token()
|
||||||
|
if token:
|
||||||
|
command.append(token)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
command = map(shlex.split, command)
|
||||||
|
|
||||||
|
return command
|
||||||
|
|
||||||
|
|
||||||
|
def run(command, data=None, timeout=None, env=None):
|
||||||
|
"""Executes a given commmand and returns Response.
|
||||||
|
|
||||||
|
Blocks until process is complete, or timeout is reached.
|
||||||
|
"""
|
||||||
|
|
||||||
|
command = expand_args(command)
|
||||||
|
|
||||||
|
history = []
|
||||||
|
for c in command:
|
||||||
|
|
||||||
|
if len(history):
|
||||||
|
# due to broken pipe problems pass only first 10MB
|
||||||
|
data = history[-1].std_out[0:10*1024]
|
||||||
|
|
||||||
|
cmd = Command(c)
|
||||||
|
out, err = cmd.run(data, timeout, env)
|
||||||
|
|
||||||
|
r = Response(process=cmd)
|
||||||
|
|
||||||
|
r.command = c
|
||||||
|
r.std_out = out
|
||||||
|
r.std_err = err
|
||||||
|
r.status_code = cmd.returncode
|
||||||
|
|
||||||
|
history.append(r)
|
||||||
|
|
||||||
|
r = history.pop()
|
||||||
|
r.history = history
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def connect(command, data=None, env=None):
|
||||||
|
"""Spawns a new process from the given command."""
|
||||||
|
|
||||||
|
# TODO: support piped commands
|
||||||
|
command_str = expand_args(command).pop()
|
||||||
|
environ = dict(os.environ).update(env or {})
|
||||||
|
|
||||||
|
process = subprocess.Popen(command_str,
|
||||||
|
universal_newlines=True,
|
||||||
|
shell=False,
|
||||||
|
env=environ,
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
bufsize=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
return ConnectedCommand(process=process)
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import envoy
|
||||||
|
|
||||||
|
try:
|
||||||
|
from setuptools import setup
|
||||||
|
except ImportError:
|
||||||
|
from distutils.core import setup
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if sys.argv[-1] == "publish":
|
||||||
|
os.system("python setup.py sdist upload")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
required = []
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='envoy',
|
||||||
|
version=envoy.__version__,
|
||||||
|
description='Simple API for running external processes.',
|
||||||
|
author='Kenneth Reitz',
|
||||||
|
author_email='me@kennethreitz.com',
|
||||||
|
url='https://github.com/kennethreitz/envoy',
|
||||||
|
py_modules= ['envoy'],
|
||||||
|
install_requires=required,
|
||||||
|
license='MIT',
|
||||||
|
classifiers=(
|
||||||
|
'Development Status :: 5 - Production/Stable',
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'Natural Language :: English',
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
'Programming Language :: Python',
|
||||||
|
'Programming Language :: Python :: 2.5',
|
||||||
|
'Programming Language :: Python :: 2.6',
|
||||||
|
'Programming Language :: Python :: 2.7',
|
||||||
|
# 'Programming Language :: Python :: 3.0',
|
||||||
|
# 'Programming Language :: Python :: 3.1',
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from django.core.management import execute_manager
|
||||||
|
import imp
|
||||||
|
try:
|
||||||
|
imp.find_module('settings') # Assumed to be in the same directory.
|
||||||
|
except ImportError:
|
||||||
|
import sys
|
||||||
|
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
import settings
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
execute_manager(settings)
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
# Django settings for haystack project.
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
TEMPLATE_DEBUG = DEBUG
|
||||||
|
|
||||||
|
ADMINS = (
|
||||||
|
# ('Your Name', 'your_email@example.com'),
|
||||||
|
)
|
||||||
|
|
||||||
|
MANAGERS = ADMINS
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
|
||||||
|
'NAME': '', # Or path to database file if using sqlite3.
|
||||||
|
'USER': '', # Not used with sqlite3.
|
||||||
|
'PASSWORD': '', # Not used with sqlite3.
|
||||||
|
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
|
||||||
|
'PORT': '', # Set to empty string for default. Not used with sqlite3.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Local time zone for this installation. Choices can be found here:
|
||||||
|
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||||
|
# although not all choices may be available on all operating systems.
|
||||||
|
# On Unix systems, a value of None will cause Django to use the same
|
||||||
|
# timezone as the operating system.
|
||||||
|
# If running in a Windows environment this must be set to the same as your
|
||||||
|
# system time zone.
|
||||||
|
TIME_ZONE = 'America/Chicago'
|
||||||
|
|
||||||
|
# Language code for this installation. All choices can be found here:
|
||||||
|
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
SITE_ID = 1
|
||||||
|
|
||||||
|
# If you set this to False, Django will make some optimizations so as not
|
||||||
|
# to load the internationalization machinery.
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
# If you set this to False, Django will not format dates, numbers and
|
||||||
|
# calendars according to the current locale
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
||||||
|
# Example: "/home/media/media.lawrence.com/media/"
|
||||||
|
MEDIA_ROOT = ''
|
||||||
|
|
||||||
|
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||||
|
# trailing slash.
|
||||||
|
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
|
||||||
|
MEDIA_URL = ''
|
||||||
|
|
||||||
|
# Absolute path to the directory static files should be collected to.
|
||||||
|
# Don't put anything in this directory yourself; store your static files
|
||||||
|
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
|
||||||
|
# Example: "/home/media/media.lawrence.com/static/"
|
||||||
|
STATIC_ROOT = ''
|
||||||
|
|
||||||
|
# URL prefix for static files.
|
||||||
|
# Example: "http://media.lawrence.com/static/"
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
# URL prefix for admin static files -- CSS, JavaScript and images.
|
||||||
|
# Make sure to use a trailing slash.
|
||||||
|
# Examples: "http://foo.com/static/admin/", "/static/admin/".
|
||||||
|
ADMIN_MEDIA_PREFIX = '/static/admin/'
|
||||||
|
|
||||||
|
# Additional locations of static files
|
||||||
|
STATICFILES_DIRS = (
|
||||||
|
# Put strings here, like "/home/html/static" or "C:/www/django/static".
|
||||||
|
# Always use forward slashes, even on Windows.
|
||||||
|
# Don't forget to use absolute paths, not relative paths.
|
||||||
|
)
|
||||||
|
|
||||||
|
# List of finder classes that know how to find static files in
|
||||||
|
# various locations.
|
||||||
|
STATICFILES_FINDERS = (
|
||||||
|
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||||
|
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||||
|
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make this unique, and don't share it with anybody.
|
||||||
|
SECRET_KEY = '@$87s&royz$nvav^3*$4u6^htybq*o=ge504rqp7r2)@ec*g(3'
|
||||||
|
|
||||||
|
# List of callables that know how to import templates from various sources.
|
||||||
|
TEMPLATE_LOADERS = (
|
||||||
|
'django.template.loaders.filesystem.Loader',
|
||||||
|
'django.template.loaders.app_directories.Loader',
|
||||||
|
# 'django.template.loaders.eggs.Loader',
|
||||||
|
)
|
||||||
|
|
||||||
|
MIDDLEWARE_CLASSES = (
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
)
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'haystack.urls'
|
||||||
|
|
||||||
|
TEMPLATE_DIRS = (
|
||||||
|
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
|
||||||
|
# Always use forward slashes, even on Windows.
|
||||||
|
# Don't forget to use absolute paths, not relative paths.
|
||||||
|
)
|
||||||
|
|
||||||
|
INSTALLED_APPS = (
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.sites',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
# 'django.contrib.admin',
|
||||||
|
# Uncomment the next line to enable admin documentation:
|
||||||
|
# 'django.contrib.admindocs',
|
||||||
|
)
|
||||||
|
|
||||||
|
# A sample logging configuration. The only tangible logging
|
||||||
|
# performed by this configuration is to send an email to
|
||||||
|
# the site admins on every HTTP 500 error.
|
||||||
|
# See http://docs.djangoproject.com/en/dev/topics/logging for
|
||||||
|
# more details on how to customize your logging configuration.
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'handlers': {
|
||||||
|
'mail_admins': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django.request': {
|
||||||
|
'handlers': ['mail_admins'],
|
||||||
|
'level': 'ERROR',
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
from django.conf.urls.defaults import patterns, include, url
|
||||||
|
|
||||||
|
# Uncomment the next two lines to enable the admin:
|
||||||
|
# from django.contrib import admin
|
||||||
|
# admin.autodiscover()
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
# Examples:
|
||||||
|
# url(r'^$', 'haystack.views.home', name='home'),
|
||||||
|
# url(r'^haystack/', include('haystack.foo.urls')),
|
||||||
|
|
||||||
|
# Uncomment the admin/doc line below to enable admin documentation:
|
||||||
|
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||||
|
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
# url(r'^admin/', include(admin.site.urls)),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
django==1.3
|
||||||
BIN
Binary file not shown.
@@ -0,0 +1,154 @@
|
|||||||
|
# Django settings for haystack project.
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
TEMPLATE_DEBUG = DEBUG
|
||||||
|
|
||||||
|
ADMINS = (
|
||||||
|
# ('Your Name', 'your_email@example.com'),
|
||||||
|
)
|
||||||
|
|
||||||
|
MANAGERS = ADMINS
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||||
|
'NAME': '', # Or path to database file if using sqlite3.
|
||||||
|
'USER': '', # Not used with sqlite3.
|
||||||
|
'PASSWORD': '', # Not used with sqlite3.
|
||||||
|
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
|
||||||
|
'PORT': '', # Set to empty string for default. Not used with sqlite3.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Local time zone for this installation. Choices can be found here:
|
||||||
|
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||||
|
# although not all choices may be available on all operating systems.
|
||||||
|
# On Unix systems, a value of None will cause Django to use the same
|
||||||
|
# timezone as the operating system.
|
||||||
|
# If running in a Windows environment this must be set to the same as your
|
||||||
|
# system time zone.
|
||||||
|
TIME_ZONE = 'America/Chicago'
|
||||||
|
|
||||||
|
# Language code for this installation. All choices can be found here:
|
||||||
|
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
SITE_ID = 1
|
||||||
|
|
||||||
|
# If you set this to False, Django will make some optimizations so as not
|
||||||
|
# to load the internationalization machinery.
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
# If you set this to False, Django will not format dates, numbers and
|
||||||
|
# calendars according to the current locale.
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
# If you set this to False, Django will not use timezone-aware datetimes.
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
||||||
|
# Example: "/home/media/media.lawrence.com/media/"
|
||||||
|
MEDIA_ROOT = ''
|
||||||
|
|
||||||
|
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||||
|
# trailing slash.
|
||||||
|
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
|
||||||
|
MEDIA_URL = ''
|
||||||
|
|
||||||
|
# Absolute path to the directory static files should be collected to.
|
||||||
|
# Don't put anything in this directory yourself; store your static files
|
||||||
|
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
|
||||||
|
# Example: "/home/media/media.lawrence.com/static/"
|
||||||
|
STATIC_ROOT = ''
|
||||||
|
|
||||||
|
# URL prefix for static files.
|
||||||
|
# Example: "http://media.lawrence.com/static/"
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
# Additional locations of static files
|
||||||
|
STATICFILES_DIRS = (
|
||||||
|
# Put strings here, like "/home/html/static" or "C:/www/django/static".
|
||||||
|
# Always use forward slashes, even on Windows.
|
||||||
|
# Don't forget to use absolute paths, not relative paths.
|
||||||
|
)
|
||||||
|
|
||||||
|
# List of finder classes that know how to find static files in
|
||||||
|
# various locations.
|
||||||
|
STATICFILES_FINDERS = (
|
||||||
|
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||||
|
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||||
|
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make this unique, and don't share it with anybody.
|
||||||
|
SECRET_KEY = '633$+yuh67kvt_v8gpi9zmkvqb*m5nts6&a=q^dwhi+e#^j_ki'
|
||||||
|
|
||||||
|
# List of callables that know how to import templates from various sources.
|
||||||
|
TEMPLATE_LOADERS = (
|
||||||
|
'django.template.loaders.filesystem.Loader',
|
||||||
|
'django.template.loaders.app_directories.Loader',
|
||||||
|
# 'django.template.loaders.eggs.Loader',
|
||||||
|
)
|
||||||
|
|
||||||
|
MIDDLEWARE_CLASSES = (
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
# Uncomment the next line for simple clickjacking protection:
|
||||||
|
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
)
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'haystack.urls'
|
||||||
|
|
||||||
|
# Python dotted path to the WSGI application used by Django's runserver.
|
||||||
|
WSGI_APPLICATION = 'haystack.wsgi.application'
|
||||||
|
|
||||||
|
TEMPLATE_DIRS = (
|
||||||
|
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
|
||||||
|
# Always use forward slashes, even on Windows.
|
||||||
|
# Don't forget to use absolute paths, not relative paths.
|
||||||
|
)
|
||||||
|
|
||||||
|
INSTALLED_APPS = (
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.sites',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
# 'django.contrib.admin',
|
||||||
|
# Uncomment the next line to enable admin documentation:
|
||||||
|
# 'django.contrib.admindocs',
|
||||||
|
)
|
||||||
|
|
||||||
|
# A sample logging configuration. The only tangible logging
|
||||||
|
# performed by this configuration is to send an email to
|
||||||
|
# the site admins on every HTTP 500 error when DEBUG=False.
|
||||||
|
# See http://docs.djangoproject.com/en/dev/topics/logging for
|
||||||
|
# more details on how to customize your logging configuration.
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'filters': {
|
||||||
|
'require_debug_false': {
|
||||||
|
'()': 'django.utils.log.RequireDebugFalse'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'mail_admins': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'filters': ['require_debug_false'],
|
||||||
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django.request': {
|
||||||
|
'handlers': ['mail_admins'],
|
||||||
|
'level': 'ERROR',
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
from django.conf.urls import patterns, include, url
|
||||||
|
|
||||||
|
# Uncomment the next two lines to enable the admin:
|
||||||
|
# from django.contrib import admin
|
||||||
|
# admin.autodiscover()
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
# Examples:
|
||||||
|
# url(r'^$', 'haystack.views.home', name='home'),
|
||||||
|
# url(r'^haystack/', include('haystack.foo.urls')),
|
||||||
|
|
||||||
|
# Uncomment the admin/doc line below to enable admin documentation:
|
||||||
|
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||||
|
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
# url(r'^admin/', include(admin.site.urls)),
|
||||||
|
)
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for haystack project.
|
||||||
|
|
||||||
|
This module contains the WSGI application used by Django's development server
|
||||||
|
and any production WSGI deployments. It should expose a module-level variable
|
||||||
|
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
|
||||||
|
this application via the ``WSGI_APPLICATION`` setting.
|
||||||
|
|
||||||
|
Usually you will have the standard Django WSGI application here, but it also
|
||||||
|
might make sense to replace the whole Django WSGI application with a custom one
|
||||||
|
that later delegates to the Django one. For example, you could introduce WSGI
|
||||||
|
middleware here, or combine a Django application with an application of another
|
||||||
|
framework.
|
||||||
|
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "haystack.settings")
|
||||||
|
|
||||||
|
# This application object is used by any WSGI server configured to use this
|
||||||
|
# file. This includes Django's development server, if the WSGI_APPLICATION
|
||||||
|
# setting points here.
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
application = get_wsgi_application()
|
||||||
|
|
||||||
|
# Apply WSGI middleware here.
|
||||||
|
# from helloworld.wsgi import HelloWorldApplication
|
||||||
|
# application = HelloWorldApplication(application)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "haystack.settings")
|
||||||
|
|
||||||
|
from django.core.management import execute_from_command_line
|
||||||
|
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Django==1.4
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
try:
|
||||||
|
from setuptools import setup
|
||||||
|
except ImportError:
|
||||||
|
from distutils.core import setup
|
||||||
|
|
||||||
|
required = ['httpbin']
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='haystack',
|
||||||
|
version='0.0.1',
|
||||||
|
description='Simple API for running external processes.',
|
||||||
|
author='Kenneth Reitz',
|
||||||
|
author_email='me@kennethreitz.com',
|
||||||
|
install_requires=required,
|
||||||
|
license='MIT',
|
||||||
|
classifiers=(
|
||||||
|
'Development Status :: 5 - Production/Stable',
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'Natural Language :: English',
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
'Programming Language :: Python',
|
||||||
|
'Programming Language :: Python :: 2.5',
|
||||||
|
'Programming Language :: Python :: 2.6',
|
||||||
|
'Programming Language :: Python :: 2.7',
|
||||||
|
# 'Programming Language :: Python :: 3.0',
|
||||||
|
# 'Programming Language :: Python :: 3.1',
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask==0.8
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
pylibmc
|
||||||
|
psycopg2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
httpbin
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
requests==1.0.3
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
python-2.7.3
|
||||||
Vendored
+509
@@ -0,0 +1,509 @@
|
|||||||
|
=======
|
||||||
|
CHANGES
|
||||||
|
=======
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.36
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #35: In `Buildout issue 64
|
||||||
|
<https://github.com/buildout/buildout/issues/64>`_, it was reported that
|
||||||
|
under Python 3, installation of distutils scripts could attempt to copy
|
||||||
|
the ``__pycache__`` directory as a file, causing an error, apparently only
|
||||||
|
under Windows. Easy_install now skips all directories when processing
|
||||||
|
metadata scripts.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.35
|
||||||
|
------
|
||||||
|
|
||||||
|
Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
|
||||||
|
how it parses version numbers.
|
||||||
|
|
||||||
|
* Issue #278: Restored compatibility with distribute 0.6.22 and setuptools
|
||||||
|
0.6. Updated the documentation to match more closely with the version
|
||||||
|
parsing as intended in setuptools 0.6.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.34
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #341: 0.6.33 fails to build under Python 2.4.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.33
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix 2 errors with Jython 2.5.
|
||||||
|
* Fix 1 failure with Jython 2.5 and 2.7.
|
||||||
|
* Disable workaround for Jython scripts on Linux systems.
|
||||||
|
* Issue #336: `setup.py` no longer masks failure exit code when tests fail.
|
||||||
|
* Fix issue in pkg_resources where try/except around a platform-dependent
|
||||||
|
import would trigger hook load failures on Mercurial. See pull request 32
|
||||||
|
for details.
|
||||||
|
* Issue #341: Fix a ResourceWarning.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.32
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix test suite with Python 2.6.
|
||||||
|
* Fix some DeprecationWarnings and ResourceWarnings.
|
||||||
|
* Issue #335: Backed out `setup_requires` superceding installed requirements
|
||||||
|
until regression can be addressed.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.31
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #303: Make sure the manifest only ever contains UTF-8 in Python 3.
|
||||||
|
* Issue #329: Properly close files created by tests for compatibility with
|
||||||
|
Jython.
|
||||||
|
* Work around Jython bugs `#1980 <http://bugs.jython.org/issue1980>`_ and
|
||||||
|
`#1981 <http://bugs.jython.org/issue1981>`_.
|
||||||
|
* Issue #334: Provide workaround for packages that reference `sys.__stdout__`
|
||||||
|
such as numpy does. This change should address
|
||||||
|
`virtualenv #359 <https://github.com/pypa/virtualenv/issues/359>`_ as long
|
||||||
|
as the system encoding is UTF-8 or the IO encoding is specified in the
|
||||||
|
environment, i.e.::
|
||||||
|
|
||||||
|
PYTHONIOENCODING=utf8 pip install numpy
|
||||||
|
|
||||||
|
* Fix for encoding issue when installing from Windows executable on Python 3.
|
||||||
|
* Issue #323: Allow `setup_requires` requirements to supercede installed
|
||||||
|
requirements. Added some new keyword arguments to existing pkg_resources
|
||||||
|
methods. Also had to updated how __path__ is handled for namespace packages
|
||||||
|
to ensure that when a new egg distribution containing a namespace package is
|
||||||
|
placed on sys.path, the entries in __path__ are found in the same order they
|
||||||
|
would have been in had that egg been on the path when pkg_resources was
|
||||||
|
first imported.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.30
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #328: Clean up temporary directories in distribute_setup.py.
|
||||||
|
* Fix fatal bug in distribute_setup.py.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.29
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #14: Honor file permissions in zip files.
|
||||||
|
* Issue #327: Merged pull request #24 to fix a dependency problem with pip.
|
||||||
|
* Merged pull request #23 to fix https://github.com/pypa/virtualenv/issues/301.
|
||||||
|
* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
|
||||||
|
to produce uploadable documentation.
|
||||||
|
* Issue #326: `upload_docs` provided mangled auth credentials under Python 3.
|
||||||
|
* Issue #320: Fix check for "createable" in distribute_setup.py.
|
||||||
|
* Issue #305: Remove a warning that was triggered during normal operations.
|
||||||
|
* Issue #311: Print metadata in UTF-8 independent of platform.
|
||||||
|
* Issue #303: Read manifest file with UTF-8 encoding under Python 3.
|
||||||
|
* Issue #301: Allow to run tests of namespace packages when using 2to3.
|
||||||
|
* Issue #304: Prevent import loop in site.py under Python 3.3.
|
||||||
|
* Issue #283: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
|
||||||
|
* Issue #299: The develop command didn't work on Python 3, when using 2to3,
|
||||||
|
as the egg link would go to the Python 2 source. Linking to the 2to3'd code
|
||||||
|
in build/lib makes it work, although you will have to rebuild the module
|
||||||
|
before testing it.
|
||||||
|
* Issue #306: Even if 2to3 is used, we build in-place under Python 2.
|
||||||
|
* Issue #307: Prints the full path when .svn/entries is broken.
|
||||||
|
* Issue #313: Support for sdist subcommands (Python 2.7)
|
||||||
|
* Issue #314: test_local_index() would fail an OS X.
|
||||||
|
* Issue #310: Non-ascii characters in a namespace __init__.py causes errors.
|
||||||
|
* Issue #218: Improved documentation on behavior of `package_data` and
|
||||||
|
`include_package_data`. Files indicated by `package_data` are now included
|
||||||
|
in the manifest.
|
||||||
|
* `distribute_setup.py` now allows a `--download-base` argument for retrieving
|
||||||
|
distribute from a specified location.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.28
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #294: setup.py can now be invoked from any directory.
|
||||||
|
* Scripts are now installed honoring the umask.
|
||||||
|
* Added support for .dist-info directories.
|
||||||
|
* Issue #283: Fix and disable scanning of `*.pyc` / `*.pyo` files on
|
||||||
|
Python 3.3.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.27
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support current snapshots of CPython 3.3.
|
||||||
|
* Distribute now recognizes README.rst as a standard, default readme file.
|
||||||
|
* Exclude 'encodings' modules when removing modules from sys.modules.
|
||||||
|
Workaround for #285.
|
||||||
|
* Issue #231: Don't fiddle with system python when used with buildout
|
||||||
|
(bootstrap.py)
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.26
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #183: Symlinked files are now extracted from source distributions.
|
||||||
|
* Issue #227: Easy_install fetch parameters are now passed during the
|
||||||
|
installation of a source distribution; now fulfillment of setup_requires
|
||||||
|
dependencies will honor the parameters passed to easy_install.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.25
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #258: Workaround a cache issue
|
||||||
|
* Issue #260: distribute_setup.py now accepts the --user parameter for
|
||||||
|
Python 2.6 and later.
|
||||||
|
* Issue #262: package_index.open_with_auth no longer throws LookupError
|
||||||
|
on Python 3.
|
||||||
|
* Issue #269: AttributeError when an exception occurs reading Manifest.in
|
||||||
|
on late releases of Python.
|
||||||
|
* Issue #272: Prevent TypeError when namespace package names are unicode
|
||||||
|
and single-install-externally-managed is used. Also fixes PIP issue
|
||||||
|
449.
|
||||||
|
* Issue #273: Legacy script launchers now install with Python2/3 support.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.24
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #249: Added options to exclude 2to3 fixers
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.23
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #244: Fixed a test
|
||||||
|
* Issue #243: Fixed a test
|
||||||
|
* Issue #239: Fixed a test
|
||||||
|
* Issue #240: Fixed a test
|
||||||
|
* Issue #241: Fixed a test
|
||||||
|
* Issue #237: Fixed a test
|
||||||
|
* Issue #238: easy_install now uses 64bit executable wrappers on 64bit Python
|
||||||
|
* Issue #208: Fixed parsed_versions, it now honors post-releases as noted in the documentation
|
||||||
|
* Issue #207: Windows cli and gui wrappers pass CTRL-C to child python process
|
||||||
|
* Issue #227: easy_install now passes its arguments to setup.py bdist_egg
|
||||||
|
* Issue #225: Fixed a NameError on Python 2.5, 2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.21
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #225: FIxed a regression on py2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.20
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue #135: Include url in warning when processing URLs in package_index.
|
||||||
|
* Issue #212: Fix issue where easy_instal fails on Python 3 on windows installer.
|
||||||
|
* Issue #213: Fix typo in documentation.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.19
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue 206: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.18
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue 210: Fixed a regression introduced by Issue 204 fix.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.17
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
|
||||||
|
variable to allow to disable installation of easy_install-${version} script.
|
||||||
|
* Support Python >=3.1.4 and >=3.2.1.
|
||||||
|
* Issue 204: Don't try to import the parent of a namespace package in
|
||||||
|
declare_namespace
|
||||||
|
* Issue 196: Tolerate responses with multiple Content-Length headers
|
||||||
|
* Issue 205: Sandboxing doesn't preserve working_set. Leads to setup_requires
|
||||||
|
problems.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.16
|
||||||
|
------
|
||||||
|
|
||||||
|
* Builds sdist gztar even on Windows (avoiding Issue 193).
|
||||||
|
* Issue 192: Fixed metadata omitted on Windows when package_dir
|
||||||
|
specified with forward-slash.
|
||||||
|
* Issue 195: Cython build support.
|
||||||
|
* Issue 200: Issues with recognizing 64-bit packages on Windows.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.15
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fixed typo in bdist_egg
|
||||||
|
* Several issues under Python 3 has been solved.
|
||||||
|
* Issue 146: Fixed missing DLL files after easy_install of windows exe package.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.14
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue 170: Fixed unittest failure. Thanks to Toshio.
|
||||||
|
* Issue 171: Fixed race condition in unittests cause deadlocks in test suite.
|
||||||
|
* Issue 143: Fixed a lookup issue with easy_install.
|
||||||
|
Thanks to David and Zooko.
|
||||||
|
* Issue 174: Fixed the edit mode when its used with setuptools itself
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.13
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue 160: 2.7 gives ValueError("Invalid IPv6 URL")
|
||||||
|
* Issue 150: Fixed using ~/.local even in a --no-site-packages virtualenv
|
||||||
|
* Issue 163: scan index links before external links, and don't use the md5 when
|
||||||
|
comparing two distributions
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.12
|
||||||
|
------
|
||||||
|
|
||||||
|
* Issue 149: Fixed various failures on 2.3/2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.11
|
||||||
|
------
|
||||||
|
|
||||||
|
* Found another case of SandboxViolation - fixed
|
||||||
|
* Issue 15 and 48: Introduced a socket timeout of 15 seconds on url openings
|
||||||
|
* Added indexsidebar.html into MANIFEST.in
|
||||||
|
* Issue 108: Fixed TypeError with Python3.1
|
||||||
|
* Issue 121: Fixed --help install command trying to actually install.
|
||||||
|
* Issue 112: Added an os.makedirs so that Tarek's solution will work.
|
||||||
|
* Issue 133: Added --no-find-links to easy_install
|
||||||
|
* Added easy_install --user
|
||||||
|
* Issue 100: Fixed develop --user not taking '.' in PYTHONPATH into account
|
||||||
|
* Issue 134: removed spurious UserWarnings. Patch by VanLindberg
|
||||||
|
* Issue 138: cant_write_to_target error when setup_requires is used.
|
||||||
|
* Issue 147: respect the sys.dont_write_bytecode flag
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.10
|
||||||
|
------
|
||||||
|
|
||||||
|
* Reverted change made for the DistributionNotFound exception because
|
||||||
|
zc.buildout uses the exception message to get the name of the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.9
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Issue 90: unknown setuptools version can be added in the working set
|
||||||
|
* Issue 87: setupt.py doesn't try to convert distribute_setup.py anymore
|
||||||
|
Initial Patch by arfrever.
|
||||||
|
* Issue 89: added a side bar with a download link to the doc.
|
||||||
|
* Issue 86: fixed missing sentence in pkg_resources doc.
|
||||||
|
* Added a nicer error message when a DistributionNotFound is raised.
|
||||||
|
* Issue 80: test_develop now works with Python 3.1
|
||||||
|
* Issue 93: upload_docs now works if there is an empty sub-directory.
|
||||||
|
* Issue 70: exec bit on non-exec files
|
||||||
|
* Issue 99: now the standalone easy_install command doesn't uses a
|
||||||
|
"setup.cfg" if any exists in the working directory. It will use it
|
||||||
|
only if triggered by ``install_requires`` from a setup.py call
|
||||||
|
(install, develop, etc).
|
||||||
|
* Issue 101: Allowing ``os.devnull`` in Sandbox
|
||||||
|
* Issue 92: Fixed the "no eggs" found error with MacPort
|
||||||
|
(platform.mac_ver() fails)
|
||||||
|
* Issue 103: test_get_script_header_jython_workaround not run
|
||||||
|
anymore under py3 with C or POSIX local. Contributed by Arfrever.
|
||||||
|
* Issue 104: remvoved the assertion when the installation fails,
|
||||||
|
with a nicer message for the end user.
|
||||||
|
* Issue 100: making sure there's no SandboxViolation when
|
||||||
|
the setup script patches setuptools.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.8
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added "check_packages" in dist. (added in Setuptools 0.6c11)
|
||||||
|
* Fixed the DONT_PATCH_SETUPTOOLS state.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.7
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Issue 58: Added --user support to the develop command
|
||||||
|
* Issue 11: Generated scripts now wrap their call to the script entry point
|
||||||
|
in the standard "if name == 'main'"
|
||||||
|
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
|
||||||
|
can drive an installation that doesn't patch a global setuptools.
|
||||||
|
* Reviewed unladen-swallow specific change from
|
||||||
|
http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
|
||||||
|
and determined that it no longer applies. Distribute should work fine with
|
||||||
|
Unladen Swallow 2009Q3.
|
||||||
|
* Issue 21: Allow PackageIndex.open_url to gracefully handle all cases of a
|
||||||
|
httplib.HTTPException instead of just InvalidURL and BadStatusLine.
|
||||||
|
* Removed virtual-python.py from this distribution and updated documentation
|
||||||
|
to point to the actively maintained virtualenv instead.
|
||||||
|
* Issue 64: use_setuptools no longer rebuilds the distribute egg every
|
||||||
|
time it is run
|
||||||
|
* use_setuptools now properly respects the requested version
|
||||||
|
* use_setuptools will no longer try to import a distribute egg for the
|
||||||
|
wrong Python version
|
||||||
|
* Issue 74: no_fake should be True by default.
|
||||||
|
* Issue 72: avoid a bootstrapping issue with easy_install -U
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.6
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
|
||||||
|
(patch by Holger Krekel)
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.5
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Issue 65: cli.exe and gui.exe are now generated at build time,
|
||||||
|
depending on the platform in use.
|
||||||
|
|
||||||
|
* Issue 67: Fixed doc typo (PEP 381/382)
|
||||||
|
|
||||||
|
* Distribute no longer shadows setuptools if we require a 0.7-series
|
||||||
|
setuptools. And an error is raised when installing a 0.7 setuptools with
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
* When run from within buildout, no attempt is made to modify an existing
|
||||||
|
setuptools egg, whether in a shared egg directory or a system setuptools.
|
||||||
|
|
||||||
|
* Fixed a hole in sandboxing allowing builtin file to write outside of
|
||||||
|
the sandbox.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.4
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added the generation of `distribute_setup_3k.py` during the release.
|
||||||
|
This closes issue #52.
|
||||||
|
|
||||||
|
* Added an upload_docs command to easily upload project documentation to
|
||||||
|
PyPI's http://packages.python.org. This close issue #56.
|
||||||
|
|
||||||
|
* Fixed a bootstrap bug on the use_setuptools() API.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.3
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Fixed a bunch of calls to file() that caused crashes on Python 3.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed a bug in sorting that caused bootstrap to fail on Python 3.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.2
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Added Python 3 support; see docs/python3.txt.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue39.
|
||||||
|
|
||||||
|
* Added option to run 2to3 automatically when installing on Python 3.
|
||||||
|
This closes issue #31.
|
||||||
|
|
||||||
|
* Fixed invalid usage of requirement.parse, that broke develop -d.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue44.
|
||||||
|
|
||||||
|
* Fixed script launcher for 64-bit Windows.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue2.
|
||||||
|
|
||||||
|
* KeyError when compiling extensions.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue41.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed bootstrap not working on Windows. This closes issue #49.
|
||||||
|
|
||||||
|
* Fixed 2.6 dependencies. This closes issue #50.
|
||||||
|
|
||||||
|
* Make sure setuptools is patched when running through easy_install
|
||||||
|
This closes http://bugs.python.org/setuptools/issue40.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.1
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* package_index.urlopen now catches BadStatusLine and malformed url errors.
|
||||||
|
This closes issue #16 and issue #18.
|
||||||
|
|
||||||
|
* zip_ok is now False by default. This closes
|
||||||
|
http://bugs.python.org/setuptools/issue33.
|
||||||
|
|
||||||
|
* Fixed invalid URL error catching. http://bugs.python.org/setuptools/issue20.
|
||||||
|
|
||||||
|
* Fixed invalid bootstraping with easy_install installation (issue #40).
|
||||||
|
Thanks to Florian Schulze for the help.
|
||||||
|
|
||||||
|
* Removed buildout/bootstrap.py. A new repository will create a specific
|
||||||
|
bootstrap.py script.
|
||||||
|
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* The boostrap process leave setuptools alone if detected in the system
|
||||||
|
and --root or --prefix is provided, but is not in the same location.
|
||||||
|
This closes issue #10.
|
||||||
|
|
||||||
|
---
|
||||||
|
0.6
|
||||||
|
---
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Packages required at build time where not fully present at install time.
|
||||||
|
This closes issue #12.
|
||||||
|
|
||||||
|
* Protected against failures in tarfile extraction. This closes issue #10.
|
||||||
|
|
||||||
|
* Made Jython api_tests.txt doctest compatible. This closes issue #7.
|
||||||
|
|
||||||
|
* sandbox.py replaced builtin type file with builtin function open. This
|
||||||
|
closes issue #6.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes issue #3.
|
||||||
|
|
||||||
|
* Added compatibility with Subversion 1.6. This references issue #1.
|
||||||
|
|
||||||
|
pkg_resources
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
|
||||||
|
instead. Based on a patch from ronaldoussoren. This closes issue #5.
|
||||||
|
|
||||||
|
* Fixed a SandboxViolation for mkdir that could occur in certain cases.
|
||||||
|
This closes issue #13.
|
||||||
|
|
||||||
|
* Allow to find_on_path on systems with tight permissions to fail gracefully.
|
||||||
|
This closes issue #9.
|
||||||
|
|
||||||
|
* Corrected inconsistency between documentation and code of add_entry.
|
||||||
|
This closes issue #8.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes issue #3.
|
||||||
|
|
||||||
|
easy_install
|
||||||
|
============
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes issue #3.
|
||||||
|
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
============
|
||||||
|
Contributors
|
||||||
|
============
|
||||||
|
|
||||||
|
* Alex Grönholm
|
||||||
|
* Alice Bevan-McGregor
|
||||||
|
* Arfrever Frehtes Taifersar Arahesis
|
||||||
|
* Christophe Combelles
|
||||||
|
* Daniel Stutzbach
|
||||||
|
* Daniel Holth
|
||||||
|
* Hanno Schlichting
|
||||||
|
* Jannis Leidel
|
||||||
|
* Jason R. Coombs
|
||||||
|
* Jim Fulton
|
||||||
|
* Jonathan Lange
|
||||||
|
* Justin Azoff
|
||||||
|
* Lennart Regebro
|
||||||
|
* Marc Abramowitz
|
||||||
|
* Martin von Löwis
|
||||||
|
* Noufal Ibrahim
|
||||||
|
* Pete Hollobon
|
||||||
|
* Philip Jenvey
|
||||||
|
* Reinout van Rees
|
||||||
|
* Robert Myers
|
||||||
|
* Stefan H. Holek
|
||||||
|
* Tarek Ziadé
|
||||||
|
* Toshio Kuratomi
|
||||||
|
|
||||||
|
If you think you name is missing, please add it (alpha order by first name)
|
||||||
|
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
============================
|
||||||
|
Quick notes for contributors
|
||||||
|
============================
|
||||||
|
|
||||||
|
Distribute is using Mercurial.
|
||||||
|
|
||||||
|
Grab the code at bitbucket::
|
||||||
|
|
||||||
|
$ hg clone https://bitbucket.org/tarek/distribute
|
||||||
|
|
||||||
|
If you want to contribute changes, we recommend you fork the repository on
|
||||||
|
bitbucket, commit the changes to your repository, and then make a pull request
|
||||||
|
on bitbucket. If you make some changes, don't forget to:
|
||||||
|
|
||||||
|
- add a note in CHANGES.txt
|
||||||
|
|
||||||
|
And remember that 0.6 (the only development line) is only bug fixes, and the
|
||||||
|
APIs should be fully backward compatible with Setuptools.
|
||||||
|
|
||||||
|
You can run the tests via::
|
||||||
|
|
||||||
|
$ python setup.py test
|
||||||
Vendored
+9
@@ -0,0 +1,9 @@
|
|||||||
|
recursive-include setuptools *.py *.txt *.exe
|
||||||
|
recursive-include tests *.py *.c *.pyx *.txt
|
||||||
|
recursive-include setuptools/tests *.html
|
||||||
|
recursive-include docs *.py *.txt *.conf *.css *.css_t Makefile indexsidebar.html
|
||||||
|
recursive-include _markerlib *.py
|
||||||
|
include *.py
|
||||||
|
include *.txt
|
||||||
|
include MANIFEST.in
|
||||||
|
include launcher.c
|
||||||
Vendored
+883
@@ -0,0 +1,883 @@
|
|||||||
|
Metadata-Version: 1.1
|
||||||
|
Name: distribute
|
||||||
|
Version: 0.6.36
|
||||||
|
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
||||||
|
Home-page: http://packages.python.org/distribute
|
||||||
|
Author: The fellowship of the packaging
|
||||||
|
Author-email: distutils-sig@python.org
|
||||||
|
License: PSF or ZPL
|
||||||
|
Description: ===============================
|
||||||
|
Installing and Using Distribute
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. contents:: **Table of Contents**
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Disclaimers
|
||||||
|
-----------
|
||||||
|
|
||||||
|
About the fork
|
||||||
|
==============
|
||||||
|
|
||||||
|
`Distribute` is a fork of the `Setuptools` project.
|
||||||
|
|
||||||
|
Distribute is intended to replace Setuptools as the standard method
|
||||||
|
for working with Python module distributions.
|
||||||
|
|
||||||
|
The fork has two goals:
|
||||||
|
|
||||||
|
- Providing a backward compatible version to replace Setuptools
|
||||||
|
and make all distributions that depend on Setuptools work as
|
||||||
|
before, but with less bugs and behaviorial issues.
|
||||||
|
|
||||||
|
This work is done in the 0.6.x series.
|
||||||
|
|
||||||
|
Starting with version 0.6.2, Distribute supports Python 3.
|
||||||
|
Installing and using distribute for Python 3 code works exactly
|
||||||
|
the same as for Python 2 code, but Distribute also helps you to support
|
||||||
|
Python 2 and Python 3 from the same source code by letting you run 2to3
|
||||||
|
on the code as a part of the build process, by setting the keyword parameter
|
||||||
|
``use_2to3`` to True. See http://packages.python.org/distribute for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
- Refactoring the code, and releasing it in several distributions.
|
||||||
|
This work is being done in the 0.7.x series but not yet released.
|
||||||
|
|
||||||
|
The roadmap is still evolving, and the page that is up-to-date is
|
||||||
|
located at : `http://packages.python.org/distribute/roadmap`.
|
||||||
|
|
||||||
|
If you install `Distribute` and want to switch back for any reason to
|
||||||
|
`Setuptools`, get to the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
More documentation
|
||||||
|
==================
|
||||||
|
|
||||||
|
You can get more information in the Sphinx-based documentation, located
|
||||||
|
at http://packages.python.org/distribute. This documentation includes the old
|
||||||
|
Setuptools documentation that is slowly replaced, and brand new content.
|
||||||
|
|
||||||
|
About the installation process
|
||||||
|
==============================
|
||||||
|
|
||||||
|
The `Distribute` installer modifies your installation by de-activating an
|
||||||
|
existing installation of `Setuptools` in a bootstrap process. This process
|
||||||
|
has been tested in various installation schemes and contexts but in case of a
|
||||||
|
bug during this process your Python installation might be left in a broken
|
||||||
|
state. Since all modified files and directories are copied before the
|
||||||
|
installation starts, you will be able to get back to a normal state by reading
|
||||||
|
the instructions in the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
In any case, it is recommended to save you `site-packages` directory before
|
||||||
|
you start the installation of `Distribute`.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Installation Instructions
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Distribute is only released as a source distribution.
|
||||||
|
|
||||||
|
It can be installed using pip, and can be done so with the source tarball,
|
||||||
|
or by using the ``distribute_setup.py`` script provided online.
|
||||||
|
|
||||||
|
``distribute_setup.py`` is the simplest and preferred way on all systems.
|
||||||
|
|
||||||
|
distribute_setup.py
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download
|
||||||
|
`distribute_setup.py <http://python-distribute.org/distribute_setup.py>`_
|
||||||
|
and execute it, using the Python interpreter of your choice.
|
||||||
|
|
||||||
|
If your shell has the ``curl`` program you can do::
|
||||||
|
|
||||||
|
$ curl -O http://python-distribute.org/distribute_setup.py
|
||||||
|
$ python distribute_setup.py
|
||||||
|
|
||||||
|
Notice this file is also provided in the source release.
|
||||||
|
|
||||||
|
pip
|
||||||
|
===
|
||||||
|
|
||||||
|
Run easy_install or pip::
|
||||||
|
|
||||||
|
$ pip install distribute
|
||||||
|
|
||||||
|
Source installation
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download the source tarball, uncompress it, then run the install command::
|
||||||
|
|
||||||
|
$ curl -O http://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
|
||||||
|
$ tar -xzvf distribute-0.6.36.tar.gz
|
||||||
|
$ cd distribute-0.6.36
|
||||||
|
$ python setup.py install
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
Uninstallation Instructions
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Like other distutils-based distributions, Distribute doesn't provide an
|
||||||
|
uninstaller yet. It's all done manually! We are all waiting for PEP 376
|
||||||
|
support in Python.
|
||||||
|
|
||||||
|
Distribute is installed in three steps:
|
||||||
|
|
||||||
|
1. it gets out of the way an existing installation of Setuptools
|
||||||
|
2. it installs a `fake` setuptools installation
|
||||||
|
3. it installs distribute
|
||||||
|
|
||||||
|
Distribute can be removed like this:
|
||||||
|
|
||||||
|
- remove the ``distribute*.egg`` file located in your site-packages directory
|
||||||
|
- remove the ``setuptools.pth`` file located in you site-packages directory
|
||||||
|
- remove the easy_install script located in you ``sys.prefix/bin`` directory
|
||||||
|
- remove the ``setuptools*.egg`` directory located in your site-packages directory,
|
||||||
|
if any.
|
||||||
|
|
||||||
|
If you want to get back to setuptools:
|
||||||
|
|
||||||
|
- reinstall setuptools using its instruction.
|
||||||
|
|
||||||
|
Lastly:
|
||||||
|
|
||||||
|
- remove the *.OLD.* directory located in your site-packages directory if any,
|
||||||
|
**once you have checked everything was working correctly again**.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Quick help for developers
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
To create an egg which is compatible with Distribute, use the same
|
||||||
|
practice as with Setuptools, e.g.::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
)
|
||||||
|
|
||||||
|
To use `pkg_resources` to access data files in the egg, you should
|
||||||
|
require the Setuptools distribution explicitly::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['setuptools']
|
||||||
|
)
|
||||||
|
|
||||||
|
Only if you need Distribute-specific functionality should you depend
|
||||||
|
on it explicitly. In this case, replace the Setuptools dependency::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['distribute']
|
||||||
|
)
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Install FAQ
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Why is Distribute wrapping my Setuptools installation?**
|
||||||
|
|
||||||
|
Since Distribute is a fork, and since it provides the same package
|
||||||
|
and modules, it renames the existing Setuptools egg and inserts a
|
||||||
|
new one which merely wraps the Distribute code. This way, full
|
||||||
|
backwards compatibility is kept for packages which rely on the
|
||||||
|
Setuptools modules.
|
||||||
|
|
||||||
|
At the same time, packages can meet their dependency on Setuptools
|
||||||
|
without actually installing it (which would disable Distribute).
|
||||||
|
|
||||||
|
- **How does Distribute interact with virtualenv?**
|
||||||
|
|
||||||
|
Everytime you create a virtualenv it will install setuptools by default.
|
||||||
|
You either need to re-install Distribute in it right after or pass the
|
||||||
|
``--distribute`` option when creating it.
|
||||||
|
|
||||||
|
Once installed, your virtualenv will use Distribute transparently.
|
||||||
|
|
||||||
|
Although, if you have Setuptools installed in your system-wide Python,
|
||||||
|
and if the virtualenv you are in was generated without the `--no-site-packages`
|
||||||
|
option, the Distribute installation will stop.
|
||||||
|
|
||||||
|
You need in this case to build a virtualenv with the `--no-site-packages`
|
||||||
|
option or to install `Distribute` globally.
|
||||||
|
|
||||||
|
- **How does Distribute interacts with zc.buildout?**
|
||||||
|
|
||||||
|
You can use Distribute in your zc.buildout, with the --distribute option,
|
||||||
|
starting at zc.buildout 1.4.2::
|
||||||
|
|
||||||
|
$ python bootstrap.py --distribute
|
||||||
|
|
||||||
|
For previous zc.buildout versions, *the only thing* you need to do
|
||||||
|
is use the bootstrap at `http://python-distribute.org/bootstrap.py`. Run
|
||||||
|
that bootstrap and ``bin/buildout`` (and all other buildout-generated
|
||||||
|
scripts) will transparently use distribute instead of setuptools. You do
|
||||||
|
not need a specific buildout release.
|
||||||
|
|
||||||
|
A shared eggs directory is no problem (since 0.6.6): the setuptools egg is
|
||||||
|
left in place unmodified. So other buildouts that do not yet use the new
|
||||||
|
bootstrap continue to work just fine. And there is no need to list
|
||||||
|
``distribute`` somewhere in your eggs: using the bootstrap is enough.
|
||||||
|
|
||||||
|
The source code for the bootstrap script is located at
|
||||||
|
`http://bitbucket.org/tarek/buildout-distribute`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
Feedback and getting involved
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
- Mailing list: http://mail.python.org/mailman/listinfo/distutils-sig
|
||||||
|
- Issue tracker: http://bitbucket.org/tarek/distribute/issues/
|
||||||
|
- Code Repository: http://bitbucket.org/tarek/distribute
|
||||||
|
|
||||||
|
=======
|
||||||
|
CHANGES
|
||||||
|
=======
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.36
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #35: In `Buildout `issue 64`_
|
||||||
|
<https://github.com/buildout/buildout/issues/64>`_, it was reported that
|
||||||
|
under Python 3, installation of distutils scripts could attempt to copy
|
||||||
|
the ``__pycache__`` directory as a file, causing an error, apparently only
|
||||||
|
under Windows. Easy_install now skips all directories when processing
|
||||||
|
metadata scripts.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.35
|
||||||
|
------
|
||||||
|
|
||||||
|
Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
|
||||||
|
how it parses version numbers.
|
||||||
|
|
||||||
|
* `Issue #278`_: Restored compatibility with distribute 0.6.22 and setuptools
|
||||||
|
0.6. Updated the documentation to match more closely with the version
|
||||||
|
parsing as intended in setuptools 0.6.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.34
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #341`_: 0.6.33 fails to build under Python 2.4.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.33
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix 2 errors with Jython 2.5.
|
||||||
|
* Fix 1 failure with Jython 2.5 and 2.7.
|
||||||
|
* Disable workaround for Jython scripts on Linux systems.
|
||||||
|
* `Issue #336`_: `setup.py` no longer masks failure exit code when tests fail.
|
||||||
|
* Fix issue in pkg_resources where try/except around a platform-dependent
|
||||||
|
import would trigger hook load failures on Mercurial. See pull request 32
|
||||||
|
for details.
|
||||||
|
* `Issue #341`_: Fix a ResourceWarning.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.32
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix test suite with Python 2.6.
|
||||||
|
* Fix some DeprecationWarnings and ResourceWarnings.
|
||||||
|
* `Issue #335`_: Backed out `setup_requires` superceding installed requirements
|
||||||
|
until regression can be addressed.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.31
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #303`_: Make sure the manifest only ever contains UTF-8 in Python 3.
|
||||||
|
* `Issue #329`_: Properly close files created by tests for compatibility with
|
||||||
|
Jython.
|
||||||
|
* Work around Jython bugs `#1980 <http://bugs.jython.org/issue1980>`_ and
|
||||||
|
`#1981 <http://bugs.jython.org/issue1981>`_.
|
||||||
|
* `Issue #334`_: Provide workaround for packages that reference `sys.__stdout__`
|
||||||
|
such as numpy does. This change should address
|
||||||
|
`virtualenv #359 <https://github.com/pypa/virtualenv/issues/359>`_ as long
|
||||||
|
as the system encoding is UTF-8 or the IO encoding is specified in the
|
||||||
|
environment, i.e.::
|
||||||
|
|
||||||
|
PYTHONIOENCODING=utf8 pip install numpy
|
||||||
|
|
||||||
|
* Fix for encoding issue when installing from Windows executable on Python 3.
|
||||||
|
* `Issue #323`_: Allow `setup_requires` requirements to supercede installed
|
||||||
|
requirements. Added some new keyword arguments to existing pkg_resources
|
||||||
|
methods. Also had to updated how __path__ is handled for namespace packages
|
||||||
|
to ensure that when a new egg distribution containing a namespace package is
|
||||||
|
placed on sys.path, the entries in __path__ are found in the same order they
|
||||||
|
would have been in had that egg been on the path when pkg_resources was
|
||||||
|
first imported.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.30
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #328`_: Clean up temporary directories in distribute_setup.py.
|
||||||
|
* Fix fatal bug in distribute_setup.py.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.29
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #14: Honor file permissions in zip files.
|
||||||
|
* `Issue #327`_: Merged pull request #24 to fix a dependency problem with pip.
|
||||||
|
* Merged pull request #23 to fix https://github.com/pypa/virtualenv/issues/301.
|
||||||
|
* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
|
||||||
|
to produce uploadable documentation.
|
||||||
|
* `Issue #326`_: `upload_docs` provided mangled auth credentials under Python 3.
|
||||||
|
* `Issue #320`_: Fix check for "createable" in distribute_setup.py.
|
||||||
|
* `Issue #305`_: Remove a warning that was triggered during normal operations.
|
||||||
|
* `Issue #311`_: Print metadata in UTF-8 independent of platform.
|
||||||
|
* `Issue #303`_: Read manifest file with UTF-8 encoding under Python 3.
|
||||||
|
* `Issue #301`_: Allow to run tests of namespace packages when using 2to3.
|
||||||
|
* `Issue #304`_: Prevent import loop in site.py under Python 3.3.
|
||||||
|
* `Issue #283`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
|
||||||
|
* `Issue #299`_: The develop command didn't work on Python 3, when using 2to3,
|
||||||
|
as the egg link would go to the Python 2 source. Linking to the 2to3'd code
|
||||||
|
in build/lib makes it work, although you will have to rebuild the module
|
||||||
|
before testing it.
|
||||||
|
* `Issue #306`_: Even if 2to3 is used, we build in-place under Python 2.
|
||||||
|
* `Issue #307`_: Prints the full path when .svn/entries is broken.
|
||||||
|
* `Issue #313`_: Support for sdist subcommands (Python 2.7)
|
||||||
|
* `Issue #314`_: test_local_index() would fail an OS X.
|
||||||
|
* `Issue #310`_: Non-ascii characters in a namespace __init__.py causes errors.
|
||||||
|
* `Issue #218`_: Improved documentation on behavior of `package_data` and
|
||||||
|
`include_package_data`. Files indicated by `package_data` are now included
|
||||||
|
in the manifest.
|
||||||
|
* `distribute_setup.py` now allows a `--download-base` argument for retrieving
|
||||||
|
distribute from a specified location.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.28
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #294`_: setup.py can now be invoked from any directory.
|
||||||
|
* Scripts are now installed honoring the umask.
|
||||||
|
* Added support for .dist-info directories.
|
||||||
|
* `Issue #283`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
|
||||||
|
Python 3.3.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.27
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support current snapshots of CPython 3.3.
|
||||||
|
* Distribute now recognizes README.rst as a standard, default readme file.
|
||||||
|
* Exclude 'encodings' modules when removing modules from sys.modules.
|
||||||
|
Workaround for #285.
|
||||||
|
* `Issue #231`_: Don't fiddle with system python when used with buildout
|
||||||
|
(bootstrap.py)
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.26
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #183`_: Symlinked files are now extracted from source distributions.
|
||||||
|
* `Issue #227`_: Easy_install fetch parameters are now passed during the
|
||||||
|
installation of a source distribution; now fulfillment of setup_requires
|
||||||
|
dependencies will honor the parameters passed to easy_install.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.25
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #258`_: Workaround a cache issue
|
||||||
|
* `Issue #260`_: distribute_setup.py now accepts the --user parameter for
|
||||||
|
Python 2.6 and later.
|
||||||
|
* `Issue #262`_: package_index.open_with_auth no longer throws LookupError
|
||||||
|
on Python 3.
|
||||||
|
* `Issue #269`_: AttributeError when an exception occurs reading Manifest.in
|
||||||
|
on late releases of Python.
|
||||||
|
* `Issue #272`_: Prevent TypeError when namespace package names are unicode
|
||||||
|
and single-install-externally-managed is used. Also fixes PIP `issue
|
||||||
|
449`_.
|
||||||
|
* `Issue #273`_: Legacy script launchers now install with Python2/3 support.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.24
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #249`_: Added options to exclude 2to3 fixers
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.23
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #244`_: Fixed a test
|
||||||
|
* `Issue #243`_: Fixed a test
|
||||||
|
* `Issue #239`_: Fixed a test
|
||||||
|
* `Issue #240`_: Fixed a test
|
||||||
|
* `Issue #241`_: Fixed a test
|
||||||
|
* `Issue #237`_: Fixed a test
|
||||||
|
* `Issue #238`_: easy_install now uses 64bit executable wrappers on 64bit Python
|
||||||
|
* `Issue #208`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
|
||||||
|
* `Issue #207`_: Windows cli and gui wrappers pass CTRL-C to child python process
|
||||||
|
* `Issue #227`_: easy_install now passes its arguments to setup.py bdist_egg
|
||||||
|
* `Issue #225`_: Fixed a NameError on Python 2.5, 2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.21
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #225`_: FIxed a regression on py2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.20
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #135`_: Include url in warning when processing URLs in package_index.
|
||||||
|
* `Issue #212`_: Fix issue where easy_instal fails on Python 3 on windows installer.
|
||||||
|
* `Issue #213`_: Fix typo in documentation.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.19
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 206`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.18
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 210`_: Fixed a regression introduced by `Issue 204`_ fix.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.17
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
|
||||||
|
variable to allow to disable installation of easy_install-${version} script.
|
||||||
|
* Support Python >=3.1.4 and >=3.2.1.
|
||||||
|
* `Issue 204`_: Don't try to import the parent of a namespace package in
|
||||||
|
declare_namespace
|
||||||
|
* `Issue 196`_: Tolerate responses with multiple Content-Length headers
|
||||||
|
* `Issue 205`_: Sandboxing doesn't preserve working_set. Leads to setup_requires
|
||||||
|
problems.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.16
|
||||||
|
------
|
||||||
|
|
||||||
|
* Builds sdist gztar even on Windows (avoiding `Issue 193`_).
|
||||||
|
* `Issue 192`_: Fixed metadata omitted on Windows when package_dir
|
||||||
|
specified with forward-slash.
|
||||||
|
* `Issue 195`_: Cython build support.
|
||||||
|
* `Issue 200`_: Issues with recognizing 64-bit packages on Windows.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.15
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fixed typo in bdist_egg
|
||||||
|
* Several issues under Python 3 has been solved.
|
||||||
|
* `Issue 146`_: Fixed missing DLL files after easy_install of windows exe package.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.14
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 170`_: Fixed unittest failure. Thanks to Toshio.
|
||||||
|
* `Issue 171`_: Fixed race condition in unittests cause deadlocks in test suite.
|
||||||
|
* `Issue 143`_: Fixed a lookup issue with easy_install.
|
||||||
|
Thanks to David and Zooko.
|
||||||
|
* `Issue 174`_: Fixed the edit mode when its used with setuptools itself
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.13
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 160`_: 2.7 gives ValueError("Invalid IPv6 URL")
|
||||||
|
* `Issue 150`_: Fixed using ~/.local even in a --no-site-packages virtualenv
|
||||||
|
* `Issue 163`_: scan index links before external links, and don't use the md5 when
|
||||||
|
comparing two distributions
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.12
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 149`_: Fixed various failures on 2.3/2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.11
|
||||||
|
------
|
||||||
|
|
||||||
|
* Found another case of SandboxViolation - fixed
|
||||||
|
* `Issue 15`_ and 48: Introduced a socket timeout of 15 seconds on url openings
|
||||||
|
* Added indexsidebar.html into MANIFEST.in
|
||||||
|
* `Issue 108`_: Fixed TypeError with Python3.1
|
||||||
|
* `Issue 121`_: Fixed --help install command trying to actually install.
|
||||||
|
* `Issue 112`_: Added an os.makedirs so that Tarek's solution will work.
|
||||||
|
* `Issue 133`_: Added --no-find-links to easy_install
|
||||||
|
* Added easy_install --user
|
||||||
|
* `Issue 100`_: Fixed develop --user not taking '.' in PYTHONPATH into account
|
||||||
|
* `Issue 134`_: removed spurious UserWarnings. Patch by VanLindberg
|
||||||
|
* `Issue 138`_: cant_write_to_target error when setup_requires is used.
|
||||||
|
* `Issue 147`_: respect the sys.dont_write_bytecode flag
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.10
|
||||||
|
------
|
||||||
|
|
||||||
|
* Reverted change made for the DistributionNotFound exception because
|
||||||
|
zc.buildout uses the exception message to get the name of the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.9
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 90`_: unknown setuptools version can be added in the working set
|
||||||
|
* `Issue 87`_: setupt.py doesn't try to convert distribute_setup.py anymore
|
||||||
|
Initial Patch by arfrever.
|
||||||
|
* `Issue 89`_: added a side bar with a download link to the doc.
|
||||||
|
* `Issue 86`_: fixed missing sentence in pkg_resources doc.
|
||||||
|
* Added a nicer error message when a DistributionNotFound is raised.
|
||||||
|
* `Issue 80`_: test_develop now works with Python 3.1
|
||||||
|
* `Issue 93`_: upload_docs now works if there is an empty sub-directory.
|
||||||
|
* `Issue 70`_: exec bit on non-exec files
|
||||||
|
* `Issue 99`_: now the standalone easy_install command doesn't uses a
|
||||||
|
"setup.cfg" if any exists in the working directory. It will use it
|
||||||
|
only if triggered by ``install_requires`` from a setup.py call
|
||||||
|
(install, develop, etc).
|
||||||
|
* `Issue 101`_: Allowing ``os.devnull`` in Sandbox
|
||||||
|
* `Issue 92`_: Fixed the "no eggs" found error with MacPort
|
||||||
|
(platform.mac_ver() fails)
|
||||||
|
* `Issue 103`_: test_get_script_header_jython_workaround not run
|
||||||
|
anymore under py3 with C or POSIX local. Contributed by Arfrever.
|
||||||
|
* `Issue 104`_: remvoved the assertion when the installation fails,
|
||||||
|
with a nicer message for the end user.
|
||||||
|
* `Issue 100`_: making sure there's no SandboxViolation when
|
||||||
|
the setup script patches setuptools.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.8
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added "check_packages" in dist. (added in Setuptools 0.6c11)
|
||||||
|
* Fixed the DONT_PATCH_SETUPTOOLS state.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.7
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 58`_: Added --user support to the develop command
|
||||||
|
* `Issue 11`_: Generated scripts now wrap their call to the script entry point
|
||||||
|
in the standard "if name == 'main'"
|
||||||
|
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
|
||||||
|
can drive an installation that doesn't patch a global setuptools.
|
||||||
|
* Reviewed unladen-swallow specific change from
|
||||||
|
http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
|
||||||
|
and determined that it no longer applies. Distribute should work fine with
|
||||||
|
Unladen Swallow 2009Q3.
|
||||||
|
* `Issue 21`_: Allow PackageIndex.open_url to gracefully handle all cases of a
|
||||||
|
httplib.HTTPException instead of just InvalidURL and BadStatusLine.
|
||||||
|
* Removed virtual-python.py from this distribution and updated documentation
|
||||||
|
to point to the actively maintained virtualenv instead.
|
||||||
|
* `Issue 64`_: use_setuptools no longer rebuilds the distribute egg every
|
||||||
|
time it is run
|
||||||
|
* use_setuptools now properly respects the requested version
|
||||||
|
* use_setuptools will no longer try to import a distribute egg for the
|
||||||
|
wrong Python version
|
||||||
|
* `Issue 74`_: no_fake should be True by default.
|
||||||
|
* `Issue 72`_: avoid a bootstrapping issue with easy_install -U
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.6
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
|
||||||
|
(patch by Holger Krekel)
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.5
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 65`_: cli.exe and gui.exe are now generated at build time,
|
||||||
|
depending on the platform in use.
|
||||||
|
|
||||||
|
* `Issue 67`_: Fixed doc typo (PEP 381/382)
|
||||||
|
|
||||||
|
* Distribute no longer shadows setuptools if we require a 0.7-series
|
||||||
|
setuptools. And an error is raised when installing a 0.7 setuptools with
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
* When run from within buildout, no attempt is made to modify an existing
|
||||||
|
setuptools egg, whether in a shared egg directory or a system setuptools.
|
||||||
|
|
||||||
|
* Fixed a hole in sandboxing allowing builtin file to write outside of
|
||||||
|
the sandbox.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.4
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added the generation of `distribute_setup_3k.py` during the release.
|
||||||
|
This closes `issue #52`_.
|
||||||
|
|
||||||
|
* Added an upload_docs command to easily upload project documentation to
|
||||||
|
PyPI's http://packages.python.org. This close `issue #56`_.
|
||||||
|
|
||||||
|
* Fixed a bootstrap bug on the use_setuptools() API.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.3
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Fixed a bunch of calls to file() that caused crashes on Python 3.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed a bug in sorting that caused bootstrap to fail on Python 3.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.2
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Added Python 3 support; see docs/python3.txt.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue39.
|
||||||
|
|
||||||
|
* Added option to run 2to3 automatically when installing on Python 3.
|
||||||
|
This closes `issue #31`_.
|
||||||
|
|
||||||
|
* Fixed invalid usage of requirement.parse, that broke develop -d.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue44.
|
||||||
|
|
||||||
|
* Fixed script launcher for 64-bit Windows.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue2.
|
||||||
|
|
||||||
|
* KeyError when compiling extensions.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue41.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed bootstrap not working on Windows. This closes `issue #49`_.
|
||||||
|
|
||||||
|
* Fixed 2.6 dependencies. This closes `issue #50`_.
|
||||||
|
|
||||||
|
* Make sure setuptools is patched when running through easy_install
|
||||||
|
This closes http://bugs.python.org/setuptools/issue40.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.1
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* package_index.urlopen now catches BadStatusLine and malformed url errors.
|
||||||
|
This closes `issue #16`_ and `issue #18`_.
|
||||||
|
|
||||||
|
* zip_ok is now False by default. This closes
|
||||||
|
http://bugs.python.org/setuptools/issue33.
|
||||||
|
|
||||||
|
* Fixed invalid URL error catching. http://bugs.python.org/setuptools/issue20.
|
||||||
|
|
||||||
|
* Fixed invalid bootstraping with easy_install installation (`issue #40`_).
|
||||||
|
Thanks to Florian Schulze for the help.
|
||||||
|
|
||||||
|
* Removed buildout/bootstrap.py. A new repository will create a specific
|
||||||
|
bootstrap.py script.
|
||||||
|
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* The boostrap process leave setuptools alone if detected in the system
|
||||||
|
and --root or --prefix is provided, but is not in the same location.
|
||||||
|
This closes `issue #10`_.
|
||||||
|
|
||||||
|
---
|
||||||
|
0.6
|
||||||
|
---
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Packages required at build time where not fully present at install time.
|
||||||
|
This closes `issue #12`_.
|
||||||
|
|
||||||
|
* Protected against failures in tarfile extraction. This closes `issue #10`_.
|
||||||
|
|
||||||
|
* Made Jython api_tests.txt doctest compatible. This closes `issue #7`_.
|
||||||
|
|
||||||
|
* sandbox.py replaced builtin type file with builtin function open. This
|
||||||
|
closes `issue #6`_.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
* Added compatibility with Subversion 1.6. This references `issue #1`_.
|
||||||
|
|
||||||
|
pkg_resources
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
|
||||||
|
instead. Based on a patch from ronaldoussoren. This closes `issue #5`_.
|
||||||
|
|
||||||
|
* Fixed a SandboxViolation for mkdir that could occur in certain cases.
|
||||||
|
This closes `issue #13`_.
|
||||||
|
|
||||||
|
* Allow to find_on_path on systems with tight permissions to fail gracefully.
|
||||||
|
This closes `issue #9`_.
|
||||||
|
|
||||||
|
* Corrected inconsistency between documentation and code of add_entry.
|
||||||
|
This closes `issue #8`_.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
easy_install
|
||||||
|
============
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
|
||||||
|
.. _`Issue #135`: http://bitbucket.org/tarek/distribute/issue/135
|
||||||
|
.. _`Issue #183`: http://bitbucket.org/tarek/distribute/issue/183
|
||||||
|
.. _`Issue #207`: http://bitbucket.org/tarek/distribute/issue/207
|
||||||
|
.. _`Issue #208`: http://bitbucket.org/tarek/distribute/issue/208
|
||||||
|
.. _`Issue #212`: http://bitbucket.org/tarek/distribute/issue/212
|
||||||
|
.. _`Issue #213`: http://bitbucket.org/tarek/distribute/issue/213
|
||||||
|
.. _`Issue #218`: http://bitbucket.org/tarek/distribute/issue/218
|
||||||
|
.. _`Issue #225`: http://bitbucket.org/tarek/distribute/issue/225
|
||||||
|
.. _`Issue #227`: http://bitbucket.org/tarek/distribute/issue/227
|
||||||
|
.. _`Issue #231`: http://bitbucket.org/tarek/distribute/issue/231
|
||||||
|
.. _`Issue #237`: http://bitbucket.org/tarek/distribute/issue/237
|
||||||
|
.. _`Issue #238`: http://bitbucket.org/tarek/distribute/issue/238
|
||||||
|
.. _`Issue #239`: http://bitbucket.org/tarek/distribute/issue/239
|
||||||
|
.. _`Issue #240`: http://bitbucket.org/tarek/distribute/issue/240
|
||||||
|
.. _`Issue #241`: http://bitbucket.org/tarek/distribute/issue/241
|
||||||
|
.. _`Issue #243`: http://bitbucket.org/tarek/distribute/issue/243
|
||||||
|
.. _`Issue #244`: http://bitbucket.org/tarek/distribute/issue/244
|
||||||
|
.. _`Issue #249`: http://bitbucket.org/tarek/distribute/issue/249
|
||||||
|
.. _`Issue #258`: http://bitbucket.org/tarek/distribute/issue/258
|
||||||
|
.. _`Issue #260`: http://bitbucket.org/tarek/distribute/issue/260
|
||||||
|
.. _`Issue #262`: http://bitbucket.org/tarek/distribute/issue/262
|
||||||
|
.. _`Issue #269`: http://bitbucket.org/tarek/distribute/issue/269
|
||||||
|
.. _`Issue #272`: http://bitbucket.org/tarek/distribute/issue/272
|
||||||
|
.. _`Issue #273`: http://bitbucket.org/tarek/distribute/issue/273
|
||||||
|
.. _`Issue #278`: http://bitbucket.org/tarek/distribute/issue/278
|
||||||
|
.. _`Issue #283`: http://bitbucket.org/tarek/distribute/issue/283
|
||||||
|
.. _`Issue #294`: http://bitbucket.org/tarek/distribute/issue/294
|
||||||
|
.. _`Issue #299`: http://bitbucket.org/tarek/distribute/issue/299
|
||||||
|
.. _`Issue #301`: http://bitbucket.org/tarek/distribute/issue/301
|
||||||
|
.. _`Issue #303`: http://bitbucket.org/tarek/distribute/issue/303
|
||||||
|
.. _`Issue #304`: http://bitbucket.org/tarek/distribute/issue/304
|
||||||
|
.. _`Issue #305`: http://bitbucket.org/tarek/distribute/issue/305
|
||||||
|
.. _`Issue #306`: http://bitbucket.org/tarek/distribute/issue/306
|
||||||
|
.. _`Issue #307`: http://bitbucket.org/tarek/distribute/issue/307
|
||||||
|
.. _`Issue #310`: http://bitbucket.org/tarek/distribute/issue/310
|
||||||
|
.. _`Issue #311`: http://bitbucket.org/tarek/distribute/issue/311
|
||||||
|
.. _`Issue #313`: http://bitbucket.org/tarek/distribute/issue/313
|
||||||
|
.. _`Issue #314`: http://bitbucket.org/tarek/distribute/issue/314
|
||||||
|
.. _`Issue #320`: http://bitbucket.org/tarek/distribute/issue/320
|
||||||
|
.. _`Issue #323`: http://bitbucket.org/tarek/distribute/issue/323
|
||||||
|
.. _`Issue #326`: http://bitbucket.org/tarek/distribute/issue/326
|
||||||
|
.. _`Issue #327`: http://bitbucket.org/tarek/distribute/issue/327
|
||||||
|
.. _`Issue #328`: http://bitbucket.org/tarek/distribute/issue/328
|
||||||
|
.. _`Issue #329`: http://bitbucket.org/tarek/distribute/issue/329
|
||||||
|
.. _`Issue #334`: http://bitbucket.org/tarek/distribute/issue/334
|
||||||
|
.. _`Issue #335`: http://bitbucket.org/tarek/distribute/issue/335
|
||||||
|
.. _`Issue #336`: http://bitbucket.org/tarek/distribute/issue/336
|
||||||
|
.. _`Issue #341`: http://bitbucket.org/tarek/distribute/issue/341
|
||||||
|
.. _`Issue 100`: http://bitbucket.org/tarek/distribute/issue/100
|
||||||
|
.. _`Issue 101`: http://bitbucket.org/tarek/distribute/issue/101
|
||||||
|
.. _`Issue 103`: http://bitbucket.org/tarek/distribute/issue/103
|
||||||
|
.. _`Issue 104`: http://bitbucket.org/tarek/distribute/issue/104
|
||||||
|
.. _`Issue 108`: http://bitbucket.org/tarek/distribute/issue/108
|
||||||
|
.. _`Issue 11`: http://bitbucket.org/tarek/distribute/issue/11
|
||||||
|
.. _`Issue 112`: http://bitbucket.org/tarek/distribute/issue/112
|
||||||
|
.. _`Issue 121`: http://bitbucket.org/tarek/distribute/issue/121
|
||||||
|
.. _`Issue 133`: http://bitbucket.org/tarek/distribute/issue/133
|
||||||
|
.. _`Issue 134`: http://bitbucket.org/tarek/distribute/issue/134
|
||||||
|
.. _`Issue 138`: http://bitbucket.org/tarek/distribute/issue/138
|
||||||
|
.. _`Issue 143`: http://bitbucket.org/tarek/distribute/issue/143
|
||||||
|
.. _`Issue 146`: http://bitbucket.org/tarek/distribute/issue/146
|
||||||
|
.. _`Issue 147`: http://bitbucket.org/tarek/distribute/issue/147
|
||||||
|
.. _`Issue 149`: http://bitbucket.org/tarek/distribute/issue/149
|
||||||
|
.. _`Issue 15`: http://bitbucket.org/tarek/distribute/issue/15
|
||||||
|
.. _`Issue 150`: http://bitbucket.org/tarek/distribute/issue/150
|
||||||
|
.. _`Issue 160`: http://bitbucket.org/tarek/distribute/issue/160
|
||||||
|
.. _`Issue 163`: http://bitbucket.org/tarek/distribute/issue/163
|
||||||
|
.. _`Issue 170`: http://bitbucket.org/tarek/distribute/issue/170
|
||||||
|
.. _`Issue 171`: http://bitbucket.org/tarek/distribute/issue/171
|
||||||
|
.. _`Issue 174`: http://bitbucket.org/tarek/distribute/issue/174
|
||||||
|
.. _`Issue 192`: http://bitbucket.org/tarek/distribute/issue/192
|
||||||
|
.. _`Issue 193`: http://bitbucket.org/tarek/distribute/issue/193
|
||||||
|
.. _`Issue 195`: http://bitbucket.org/tarek/distribute/issue/195
|
||||||
|
.. _`Issue 196`: http://bitbucket.org/tarek/distribute/issue/196
|
||||||
|
.. _`Issue 200`: http://bitbucket.org/tarek/distribute/issue/200
|
||||||
|
.. _`Issue 204`: http://bitbucket.org/tarek/distribute/issue/204
|
||||||
|
.. _`Issue 205`: http://bitbucket.org/tarek/distribute/issue/205
|
||||||
|
.. _`Issue 206`: http://bitbucket.org/tarek/distribute/issue/206
|
||||||
|
.. _`Issue 21`: http://bitbucket.org/tarek/distribute/issue/21
|
||||||
|
.. _`Issue 210`: http://bitbucket.org/tarek/distribute/issue/210
|
||||||
|
.. _`Issue 58`: http://bitbucket.org/tarek/distribute/issue/58
|
||||||
|
.. _`Issue 64`: http://bitbucket.org/tarek/distribute/issue/64
|
||||||
|
.. _`Issue 65`: http://bitbucket.org/tarek/distribute/issue/65
|
||||||
|
.. _`Issue 67`: http://bitbucket.org/tarek/distribute/issue/67
|
||||||
|
.. _`Issue 70`: http://bitbucket.org/tarek/distribute/issue/70
|
||||||
|
.. _`Issue 72`: http://bitbucket.org/tarek/distribute/issue/72
|
||||||
|
.. _`Issue 74`: http://bitbucket.org/tarek/distribute/issue/74
|
||||||
|
.. _`Issue 80`: http://bitbucket.org/tarek/distribute/issue/80
|
||||||
|
.. _`Issue 86`: http://bitbucket.org/tarek/distribute/issue/86
|
||||||
|
.. _`Issue 87`: http://bitbucket.org/tarek/distribute/issue/87
|
||||||
|
.. _`Issue 89`: http://bitbucket.org/tarek/distribute/issue/89
|
||||||
|
.. _`Issue 90`: http://bitbucket.org/tarek/distribute/issue/90
|
||||||
|
.. _`Issue 92`: http://bitbucket.org/tarek/distribute/issue/92
|
||||||
|
.. _`Issue 93`: http://bitbucket.org/tarek/distribute/issue/93
|
||||||
|
.. _`Issue 99`: http://bitbucket.org/tarek/distribute/issue/99
|
||||||
|
.. _`issue
|
||||||
|
449`: http://bitbucket.org/tarek/distribute/issue/449
|
||||||
|
.. _`issue #1`: http://bitbucket.org/tarek/distribute/issue/1
|
||||||
|
.. _`issue #10`: http://bitbucket.org/tarek/distribute/issue/10
|
||||||
|
.. _`issue #12`: http://bitbucket.org/tarek/distribute/issue/12
|
||||||
|
.. _`issue #13`: http://bitbucket.org/tarek/distribute/issue/13
|
||||||
|
.. _`issue #16`: http://bitbucket.org/tarek/distribute/issue/16
|
||||||
|
.. _`issue #18`: http://bitbucket.org/tarek/distribute/issue/18
|
||||||
|
.. _`issue #3`: http://bitbucket.org/tarek/distribute/issue/3
|
||||||
|
.. _`issue #31`: http://bitbucket.org/tarek/distribute/issue/31
|
||||||
|
.. _`issue #40`: http://bitbucket.org/tarek/distribute/issue/40
|
||||||
|
.. _`issue #49`: http://bitbucket.org/tarek/distribute/issue/49
|
||||||
|
.. _`issue #5`: http://bitbucket.org/tarek/distribute/issue/5
|
||||||
|
.. _`issue #50`: http://bitbucket.org/tarek/distribute/issue/50
|
||||||
|
.. _`issue #52`: http://bitbucket.org/tarek/distribute/issue/52
|
||||||
|
.. _`issue #56`: http://bitbucket.org/tarek/distribute/issue/56
|
||||||
|
.. _`issue #6`: http://bitbucket.org/tarek/distribute/issue/6
|
||||||
|
.. _`issue #7`: http://bitbucket.org/tarek/distribute/issue/7
|
||||||
|
.. _`issue #8`: http://bitbucket.org/tarek/distribute/issue/8
|
||||||
|
.. _`issue #9`: http://bitbucket.org/tarek/distribute/issue/9
|
||||||
|
.. _`issue 64`: http://bitbucket.org/tarek/distribute/issue/64
|
||||||
|
|
||||||
|
|
||||||
|
Keywords: CPAN PyPI distutils eggs package management
|
||||||
|
Platform: UNKNOWN
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: Python Software Foundation License
|
||||||
|
Classifier: License :: OSI Approved :: Zope Public License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python :: 2.4
|
||||||
|
Classifier: Programming Language :: Python :: 2.5
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
Classifier: Programming Language :: Python :: 2.7
|
||||||
|
Classifier: Programming Language :: Python :: 3
|
||||||
|
Classifier: Programming Language :: Python :: 3.1
|
||||||
|
Classifier: Programming Language :: Python :: 3.2
|
||||||
|
Classifier: Programming Language :: Python :: 3.3
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Classifier: Topic :: System :: Archiving :: Packaging
|
||||||
|
Classifier: Topic :: System :: Systems Administration
|
||||||
|
Classifier: Topic :: Utilities
|
||||||
Vendored
+228
@@ -0,0 +1,228 @@
|
|||||||
|
===============================
|
||||||
|
Installing and Using Distribute
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. contents:: **Table of Contents**
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Disclaimers
|
||||||
|
-----------
|
||||||
|
|
||||||
|
About the fork
|
||||||
|
==============
|
||||||
|
|
||||||
|
`Distribute` is a fork of the `Setuptools` project.
|
||||||
|
|
||||||
|
Distribute is intended to replace Setuptools as the standard method
|
||||||
|
for working with Python module distributions.
|
||||||
|
|
||||||
|
The fork has two goals:
|
||||||
|
|
||||||
|
- Providing a backward compatible version to replace Setuptools
|
||||||
|
and make all distributions that depend on Setuptools work as
|
||||||
|
before, but with less bugs and behaviorial issues.
|
||||||
|
|
||||||
|
This work is done in the 0.6.x series.
|
||||||
|
|
||||||
|
Starting with version 0.6.2, Distribute supports Python 3.
|
||||||
|
Installing and using distribute for Python 3 code works exactly
|
||||||
|
the same as for Python 2 code, but Distribute also helps you to support
|
||||||
|
Python 2 and Python 3 from the same source code by letting you run 2to3
|
||||||
|
on the code as a part of the build process, by setting the keyword parameter
|
||||||
|
``use_2to3`` to True. See http://packages.python.org/distribute for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
- Refactoring the code, and releasing it in several distributions.
|
||||||
|
This work is being done in the 0.7.x series but not yet released.
|
||||||
|
|
||||||
|
The roadmap is still evolving, and the page that is up-to-date is
|
||||||
|
located at : `http://packages.python.org/distribute/roadmap`.
|
||||||
|
|
||||||
|
If you install `Distribute` and want to switch back for any reason to
|
||||||
|
`Setuptools`, get to the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
More documentation
|
||||||
|
==================
|
||||||
|
|
||||||
|
You can get more information in the Sphinx-based documentation, located
|
||||||
|
at http://packages.python.org/distribute. This documentation includes the old
|
||||||
|
Setuptools documentation that is slowly replaced, and brand new content.
|
||||||
|
|
||||||
|
About the installation process
|
||||||
|
==============================
|
||||||
|
|
||||||
|
The `Distribute` installer modifies your installation by de-activating an
|
||||||
|
existing installation of `Setuptools` in a bootstrap process. This process
|
||||||
|
has been tested in various installation schemes and contexts but in case of a
|
||||||
|
bug during this process your Python installation might be left in a broken
|
||||||
|
state. Since all modified files and directories are copied before the
|
||||||
|
installation starts, you will be able to get back to a normal state by reading
|
||||||
|
the instructions in the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
In any case, it is recommended to save you `site-packages` directory before
|
||||||
|
you start the installation of `Distribute`.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Installation Instructions
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Distribute is only released as a source distribution.
|
||||||
|
|
||||||
|
It can be installed using pip, and can be done so with the source tarball,
|
||||||
|
or by using the ``distribute_setup.py`` script provided online.
|
||||||
|
|
||||||
|
``distribute_setup.py`` is the simplest and preferred way on all systems.
|
||||||
|
|
||||||
|
distribute_setup.py
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download
|
||||||
|
`distribute_setup.py <http://python-distribute.org/distribute_setup.py>`_
|
||||||
|
and execute it, using the Python interpreter of your choice.
|
||||||
|
|
||||||
|
If your shell has the ``curl`` program you can do::
|
||||||
|
|
||||||
|
$ curl -O http://python-distribute.org/distribute_setup.py
|
||||||
|
$ python distribute_setup.py
|
||||||
|
|
||||||
|
Notice this file is also provided in the source release.
|
||||||
|
|
||||||
|
pip
|
||||||
|
===
|
||||||
|
|
||||||
|
Run easy_install or pip::
|
||||||
|
|
||||||
|
$ pip install distribute
|
||||||
|
|
||||||
|
Source installation
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download the source tarball, uncompress it, then run the install command::
|
||||||
|
|
||||||
|
$ curl -O http://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
|
||||||
|
$ tar -xzvf distribute-0.6.36.tar.gz
|
||||||
|
$ cd distribute-0.6.36
|
||||||
|
$ python setup.py install
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
Uninstallation Instructions
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Like other distutils-based distributions, Distribute doesn't provide an
|
||||||
|
uninstaller yet. It's all done manually! We are all waiting for PEP 376
|
||||||
|
support in Python.
|
||||||
|
|
||||||
|
Distribute is installed in three steps:
|
||||||
|
|
||||||
|
1. it gets out of the way an existing installation of Setuptools
|
||||||
|
2. it installs a `fake` setuptools installation
|
||||||
|
3. it installs distribute
|
||||||
|
|
||||||
|
Distribute can be removed like this:
|
||||||
|
|
||||||
|
- remove the ``distribute*.egg`` file located in your site-packages directory
|
||||||
|
- remove the ``setuptools.pth`` file located in you site-packages directory
|
||||||
|
- remove the easy_install script located in you ``sys.prefix/bin`` directory
|
||||||
|
- remove the ``setuptools*.egg`` directory located in your site-packages directory,
|
||||||
|
if any.
|
||||||
|
|
||||||
|
If you want to get back to setuptools:
|
||||||
|
|
||||||
|
- reinstall setuptools using its instruction.
|
||||||
|
|
||||||
|
Lastly:
|
||||||
|
|
||||||
|
- remove the *.OLD.* directory located in your site-packages directory if any,
|
||||||
|
**once you have checked everything was working correctly again**.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Quick help for developers
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
To create an egg which is compatible with Distribute, use the same
|
||||||
|
practice as with Setuptools, e.g.::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
)
|
||||||
|
|
||||||
|
To use `pkg_resources` to access data files in the egg, you should
|
||||||
|
require the Setuptools distribution explicitly::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['setuptools']
|
||||||
|
)
|
||||||
|
|
||||||
|
Only if you need Distribute-specific functionality should you depend
|
||||||
|
on it explicitly. In this case, replace the Setuptools dependency::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['distribute']
|
||||||
|
)
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Install FAQ
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Why is Distribute wrapping my Setuptools installation?**
|
||||||
|
|
||||||
|
Since Distribute is a fork, and since it provides the same package
|
||||||
|
and modules, it renames the existing Setuptools egg and inserts a
|
||||||
|
new one which merely wraps the Distribute code. This way, full
|
||||||
|
backwards compatibility is kept for packages which rely on the
|
||||||
|
Setuptools modules.
|
||||||
|
|
||||||
|
At the same time, packages can meet their dependency on Setuptools
|
||||||
|
without actually installing it (which would disable Distribute).
|
||||||
|
|
||||||
|
- **How does Distribute interact with virtualenv?**
|
||||||
|
|
||||||
|
Everytime you create a virtualenv it will install setuptools by default.
|
||||||
|
You either need to re-install Distribute in it right after or pass the
|
||||||
|
``--distribute`` option when creating it.
|
||||||
|
|
||||||
|
Once installed, your virtualenv will use Distribute transparently.
|
||||||
|
|
||||||
|
Although, if you have Setuptools installed in your system-wide Python,
|
||||||
|
and if the virtualenv you are in was generated without the `--no-site-packages`
|
||||||
|
option, the Distribute installation will stop.
|
||||||
|
|
||||||
|
You need in this case to build a virtualenv with the `--no-site-packages`
|
||||||
|
option or to install `Distribute` globally.
|
||||||
|
|
||||||
|
- **How does Distribute interacts with zc.buildout?**
|
||||||
|
|
||||||
|
You can use Distribute in your zc.buildout, with the --distribute option,
|
||||||
|
starting at zc.buildout 1.4.2::
|
||||||
|
|
||||||
|
$ python bootstrap.py --distribute
|
||||||
|
|
||||||
|
For previous zc.buildout versions, *the only thing* you need to do
|
||||||
|
is use the bootstrap at `http://python-distribute.org/bootstrap.py`. Run
|
||||||
|
that bootstrap and ``bin/buildout`` (and all other buildout-generated
|
||||||
|
scripts) will transparently use distribute instead of setuptools. You do
|
||||||
|
not need a specific buildout release.
|
||||||
|
|
||||||
|
A shared eggs directory is no problem (since 0.6.6): the setuptools egg is
|
||||||
|
left in place unmodified. So other buildouts that do not yet use the new
|
||||||
|
bootstrap continue to work just fine. And there is no need to list
|
||||||
|
``distribute`` somewhere in your eggs: using the bootstrap is enough.
|
||||||
|
|
||||||
|
The source code for the bootstrap script is located at
|
||||||
|
`http://bitbucket.org/tarek/buildout-distribute`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
Feedback and getting involved
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
- Mailing list: http://mail.python.org/mailman/listinfo/distutils-sig
|
||||||
|
- Issue tracker: http://bitbucket.org/tarek/distribute/issues/
|
||||||
|
- Code Repository: http://bitbucket.org/tarek/distribute
|
||||||
|
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
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)()
|
||||||
+115
@@ -0,0 +1,115 @@
|
|||||||
|
# -*- 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
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
@@ -0,0 +1,883 @@
|
|||||||
|
Metadata-Version: 1.1
|
||||||
|
Name: distribute
|
||||||
|
Version: 0.6.36
|
||||||
|
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
||||||
|
Home-page: http://packages.python.org/distribute
|
||||||
|
Author: The fellowship of the packaging
|
||||||
|
Author-email: distutils-sig@python.org
|
||||||
|
License: PSF or ZPL
|
||||||
|
Description: ===============================
|
||||||
|
Installing and Using Distribute
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. contents:: **Table of Contents**
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Disclaimers
|
||||||
|
-----------
|
||||||
|
|
||||||
|
About the fork
|
||||||
|
==============
|
||||||
|
|
||||||
|
`Distribute` is a fork of the `Setuptools` project.
|
||||||
|
|
||||||
|
Distribute is intended to replace Setuptools as the standard method
|
||||||
|
for working with Python module distributions.
|
||||||
|
|
||||||
|
The fork has two goals:
|
||||||
|
|
||||||
|
- Providing a backward compatible version to replace Setuptools
|
||||||
|
and make all distributions that depend on Setuptools work as
|
||||||
|
before, but with less bugs and behaviorial issues.
|
||||||
|
|
||||||
|
This work is done in the 0.6.x series.
|
||||||
|
|
||||||
|
Starting with version 0.6.2, Distribute supports Python 3.
|
||||||
|
Installing and using distribute for Python 3 code works exactly
|
||||||
|
the same as for Python 2 code, but Distribute also helps you to support
|
||||||
|
Python 2 and Python 3 from the same source code by letting you run 2to3
|
||||||
|
on the code as a part of the build process, by setting the keyword parameter
|
||||||
|
``use_2to3`` to True. See http://packages.python.org/distribute for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
- Refactoring the code, and releasing it in several distributions.
|
||||||
|
This work is being done in the 0.7.x series but not yet released.
|
||||||
|
|
||||||
|
The roadmap is still evolving, and the page that is up-to-date is
|
||||||
|
located at : `http://packages.python.org/distribute/roadmap`.
|
||||||
|
|
||||||
|
If you install `Distribute` and want to switch back for any reason to
|
||||||
|
`Setuptools`, get to the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
More documentation
|
||||||
|
==================
|
||||||
|
|
||||||
|
You can get more information in the Sphinx-based documentation, located
|
||||||
|
at http://packages.python.org/distribute. This documentation includes the old
|
||||||
|
Setuptools documentation that is slowly replaced, and brand new content.
|
||||||
|
|
||||||
|
About the installation process
|
||||||
|
==============================
|
||||||
|
|
||||||
|
The `Distribute` installer modifies your installation by de-activating an
|
||||||
|
existing installation of `Setuptools` in a bootstrap process. This process
|
||||||
|
has been tested in various installation schemes and contexts but in case of a
|
||||||
|
bug during this process your Python installation might be left in a broken
|
||||||
|
state. Since all modified files and directories are copied before the
|
||||||
|
installation starts, you will be able to get back to a normal state by reading
|
||||||
|
the instructions in the `Uninstallation instructions`_ section.
|
||||||
|
|
||||||
|
In any case, it is recommended to save you `site-packages` directory before
|
||||||
|
you start the installation of `Distribute`.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Installation Instructions
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Distribute is only released as a source distribution.
|
||||||
|
|
||||||
|
It can be installed using pip, and can be done so with the source tarball,
|
||||||
|
or by using the ``distribute_setup.py`` script provided online.
|
||||||
|
|
||||||
|
``distribute_setup.py`` is the simplest and preferred way on all systems.
|
||||||
|
|
||||||
|
distribute_setup.py
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download
|
||||||
|
`distribute_setup.py <http://python-distribute.org/distribute_setup.py>`_
|
||||||
|
and execute it, using the Python interpreter of your choice.
|
||||||
|
|
||||||
|
If your shell has the ``curl`` program you can do::
|
||||||
|
|
||||||
|
$ curl -O http://python-distribute.org/distribute_setup.py
|
||||||
|
$ python distribute_setup.py
|
||||||
|
|
||||||
|
Notice this file is also provided in the source release.
|
||||||
|
|
||||||
|
pip
|
||||||
|
===
|
||||||
|
|
||||||
|
Run easy_install or pip::
|
||||||
|
|
||||||
|
$ pip install distribute
|
||||||
|
|
||||||
|
Source installation
|
||||||
|
===================
|
||||||
|
|
||||||
|
Download the source tarball, uncompress it, then run the install command::
|
||||||
|
|
||||||
|
$ curl -O http://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
|
||||||
|
$ tar -xzvf distribute-0.6.36.tar.gz
|
||||||
|
$ cd distribute-0.6.36
|
||||||
|
$ python setup.py install
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
Uninstallation Instructions
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Like other distutils-based distributions, Distribute doesn't provide an
|
||||||
|
uninstaller yet. It's all done manually! We are all waiting for PEP 376
|
||||||
|
support in Python.
|
||||||
|
|
||||||
|
Distribute is installed in three steps:
|
||||||
|
|
||||||
|
1. it gets out of the way an existing installation of Setuptools
|
||||||
|
2. it installs a `fake` setuptools installation
|
||||||
|
3. it installs distribute
|
||||||
|
|
||||||
|
Distribute can be removed like this:
|
||||||
|
|
||||||
|
- remove the ``distribute*.egg`` file located in your site-packages directory
|
||||||
|
- remove the ``setuptools.pth`` file located in you site-packages directory
|
||||||
|
- remove the easy_install script located in you ``sys.prefix/bin`` directory
|
||||||
|
- remove the ``setuptools*.egg`` directory located in your site-packages directory,
|
||||||
|
if any.
|
||||||
|
|
||||||
|
If you want to get back to setuptools:
|
||||||
|
|
||||||
|
- reinstall setuptools using its instruction.
|
||||||
|
|
||||||
|
Lastly:
|
||||||
|
|
||||||
|
- remove the *.OLD.* directory located in your site-packages directory if any,
|
||||||
|
**once you have checked everything was working correctly again**.
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
Quick help for developers
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
To create an egg which is compatible with Distribute, use the same
|
||||||
|
practice as with Setuptools, e.g.::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
)
|
||||||
|
|
||||||
|
To use `pkg_resources` to access data files in the egg, you should
|
||||||
|
require the Setuptools distribution explicitly::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['setuptools']
|
||||||
|
)
|
||||||
|
|
||||||
|
Only if you need Distribute-specific functionality should you depend
|
||||||
|
on it explicitly. In this case, replace the Setuptools dependency::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['distribute']
|
||||||
|
)
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Install FAQ
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Why is Distribute wrapping my Setuptools installation?**
|
||||||
|
|
||||||
|
Since Distribute is a fork, and since it provides the same package
|
||||||
|
and modules, it renames the existing Setuptools egg and inserts a
|
||||||
|
new one which merely wraps the Distribute code. This way, full
|
||||||
|
backwards compatibility is kept for packages which rely on the
|
||||||
|
Setuptools modules.
|
||||||
|
|
||||||
|
At the same time, packages can meet their dependency on Setuptools
|
||||||
|
without actually installing it (which would disable Distribute).
|
||||||
|
|
||||||
|
- **How does Distribute interact with virtualenv?**
|
||||||
|
|
||||||
|
Everytime you create a virtualenv it will install setuptools by default.
|
||||||
|
You either need to re-install Distribute in it right after or pass the
|
||||||
|
``--distribute`` option when creating it.
|
||||||
|
|
||||||
|
Once installed, your virtualenv will use Distribute transparently.
|
||||||
|
|
||||||
|
Although, if you have Setuptools installed in your system-wide Python,
|
||||||
|
and if the virtualenv you are in was generated without the `--no-site-packages`
|
||||||
|
option, the Distribute installation will stop.
|
||||||
|
|
||||||
|
You need in this case to build a virtualenv with the `--no-site-packages`
|
||||||
|
option or to install `Distribute` globally.
|
||||||
|
|
||||||
|
- **How does Distribute interacts with zc.buildout?**
|
||||||
|
|
||||||
|
You can use Distribute in your zc.buildout, with the --distribute option,
|
||||||
|
starting at zc.buildout 1.4.2::
|
||||||
|
|
||||||
|
$ python bootstrap.py --distribute
|
||||||
|
|
||||||
|
For previous zc.buildout versions, *the only thing* you need to do
|
||||||
|
is use the bootstrap at `http://python-distribute.org/bootstrap.py`. Run
|
||||||
|
that bootstrap and ``bin/buildout`` (and all other buildout-generated
|
||||||
|
scripts) will transparently use distribute instead of setuptools. You do
|
||||||
|
not need a specific buildout release.
|
||||||
|
|
||||||
|
A shared eggs directory is no problem (since 0.6.6): the setuptools egg is
|
||||||
|
left in place unmodified. So other buildouts that do not yet use the new
|
||||||
|
bootstrap continue to work just fine. And there is no need to list
|
||||||
|
``distribute`` somewhere in your eggs: using the bootstrap is enough.
|
||||||
|
|
||||||
|
The source code for the bootstrap script is located at
|
||||||
|
`http://bitbucket.org/tarek/buildout-distribute`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------
|
||||||
|
Feedback and getting involved
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
- Mailing list: http://mail.python.org/mailman/listinfo/distutils-sig
|
||||||
|
- Issue tracker: http://bitbucket.org/tarek/distribute/issues/
|
||||||
|
- Code Repository: http://bitbucket.org/tarek/distribute
|
||||||
|
|
||||||
|
=======
|
||||||
|
CHANGES
|
||||||
|
=======
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.36
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #35: In `Buildout `issue 64`_
|
||||||
|
<https://github.com/buildout/buildout/issues/64>`_, it was reported that
|
||||||
|
under Python 3, installation of distutils scripts could attempt to copy
|
||||||
|
the ``__pycache__`` directory as a file, causing an error, apparently only
|
||||||
|
under Windows. Easy_install now skips all directories when processing
|
||||||
|
metadata scripts.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.35
|
||||||
|
------
|
||||||
|
|
||||||
|
Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
|
||||||
|
how it parses version numbers.
|
||||||
|
|
||||||
|
* `Issue #278`_: Restored compatibility with distribute 0.6.22 and setuptools
|
||||||
|
0.6. Updated the documentation to match more closely with the version
|
||||||
|
parsing as intended in setuptools 0.6.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.34
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #341`_: 0.6.33 fails to build under Python 2.4.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.33
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix 2 errors with Jython 2.5.
|
||||||
|
* Fix 1 failure with Jython 2.5 and 2.7.
|
||||||
|
* Disable workaround for Jython scripts on Linux systems.
|
||||||
|
* `Issue #336`_: `setup.py` no longer masks failure exit code when tests fail.
|
||||||
|
* Fix issue in pkg_resources where try/except around a platform-dependent
|
||||||
|
import would trigger hook load failures on Mercurial. See pull request 32
|
||||||
|
for details.
|
||||||
|
* `Issue #341`_: Fix a ResourceWarning.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.32
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fix test suite with Python 2.6.
|
||||||
|
* Fix some DeprecationWarnings and ResourceWarnings.
|
||||||
|
* `Issue #335`_: Backed out `setup_requires` superceding installed requirements
|
||||||
|
until regression can be addressed.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.31
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #303`_: Make sure the manifest only ever contains UTF-8 in Python 3.
|
||||||
|
* `Issue #329`_: Properly close files created by tests for compatibility with
|
||||||
|
Jython.
|
||||||
|
* Work around Jython bugs `#1980 <http://bugs.jython.org/issue1980>`_ and
|
||||||
|
`#1981 <http://bugs.jython.org/issue1981>`_.
|
||||||
|
* `Issue #334`_: Provide workaround for packages that reference `sys.__stdout__`
|
||||||
|
such as numpy does. This change should address
|
||||||
|
`virtualenv #359 <https://github.com/pypa/virtualenv/issues/359>`_ as long
|
||||||
|
as the system encoding is UTF-8 or the IO encoding is specified in the
|
||||||
|
environment, i.e.::
|
||||||
|
|
||||||
|
PYTHONIOENCODING=utf8 pip install numpy
|
||||||
|
|
||||||
|
* Fix for encoding issue when installing from Windows executable on Python 3.
|
||||||
|
* `Issue #323`_: Allow `setup_requires` requirements to supercede installed
|
||||||
|
requirements. Added some new keyword arguments to existing pkg_resources
|
||||||
|
methods. Also had to updated how __path__ is handled for namespace packages
|
||||||
|
to ensure that when a new egg distribution containing a namespace package is
|
||||||
|
placed on sys.path, the entries in __path__ are found in the same order they
|
||||||
|
would have been in had that egg been on the path when pkg_resources was
|
||||||
|
first imported.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.30
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #328`_: Clean up temporary directories in distribute_setup.py.
|
||||||
|
* Fix fatal bug in distribute_setup.py.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.29
|
||||||
|
------
|
||||||
|
|
||||||
|
* Pull Request #14: Honor file permissions in zip files.
|
||||||
|
* `Issue #327`_: Merged pull request #24 to fix a dependency problem with pip.
|
||||||
|
* Merged pull request #23 to fix https://github.com/pypa/virtualenv/issues/301.
|
||||||
|
* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
|
||||||
|
to produce uploadable documentation.
|
||||||
|
* `Issue #326`_: `upload_docs` provided mangled auth credentials under Python 3.
|
||||||
|
* `Issue #320`_: Fix check for "createable" in distribute_setup.py.
|
||||||
|
* `Issue #305`_: Remove a warning that was triggered during normal operations.
|
||||||
|
* `Issue #311`_: Print metadata in UTF-8 independent of platform.
|
||||||
|
* `Issue #303`_: Read manifest file with UTF-8 encoding under Python 3.
|
||||||
|
* `Issue #301`_: Allow to run tests of namespace packages when using 2to3.
|
||||||
|
* `Issue #304`_: Prevent import loop in site.py under Python 3.3.
|
||||||
|
* `Issue #283`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
|
||||||
|
* `Issue #299`_: The develop command didn't work on Python 3, when using 2to3,
|
||||||
|
as the egg link would go to the Python 2 source. Linking to the 2to3'd code
|
||||||
|
in build/lib makes it work, although you will have to rebuild the module
|
||||||
|
before testing it.
|
||||||
|
* `Issue #306`_: Even if 2to3 is used, we build in-place under Python 2.
|
||||||
|
* `Issue #307`_: Prints the full path when .svn/entries is broken.
|
||||||
|
* `Issue #313`_: Support for sdist subcommands (Python 2.7)
|
||||||
|
* `Issue #314`_: test_local_index() would fail an OS X.
|
||||||
|
* `Issue #310`_: Non-ascii characters in a namespace __init__.py causes errors.
|
||||||
|
* `Issue #218`_: Improved documentation on behavior of `package_data` and
|
||||||
|
`include_package_data`. Files indicated by `package_data` are now included
|
||||||
|
in the manifest.
|
||||||
|
* `distribute_setup.py` now allows a `--download-base` argument for retrieving
|
||||||
|
distribute from a specified location.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.28
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #294`_: setup.py can now be invoked from any directory.
|
||||||
|
* Scripts are now installed honoring the umask.
|
||||||
|
* Added support for .dist-info directories.
|
||||||
|
* `Issue #283`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
|
||||||
|
Python 3.3.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.27
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support current snapshots of CPython 3.3.
|
||||||
|
* Distribute now recognizes README.rst as a standard, default readme file.
|
||||||
|
* Exclude 'encodings' modules when removing modules from sys.modules.
|
||||||
|
Workaround for #285.
|
||||||
|
* `Issue #231`_: Don't fiddle with system python when used with buildout
|
||||||
|
(bootstrap.py)
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.26
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #183`_: Symlinked files are now extracted from source distributions.
|
||||||
|
* `Issue #227`_: Easy_install fetch parameters are now passed during the
|
||||||
|
installation of a source distribution; now fulfillment of setup_requires
|
||||||
|
dependencies will honor the parameters passed to easy_install.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.25
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #258`_: Workaround a cache issue
|
||||||
|
* `Issue #260`_: distribute_setup.py now accepts the --user parameter for
|
||||||
|
Python 2.6 and later.
|
||||||
|
* `Issue #262`_: package_index.open_with_auth no longer throws LookupError
|
||||||
|
on Python 3.
|
||||||
|
* `Issue #269`_: AttributeError when an exception occurs reading Manifest.in
|
||||||
|
on late releases of Python.
|
||||||
|
* `Issue #272`_: Prevent TypeError when namespace package names are unicode
|
||||||
|
and single-install-externally-managed is used. Also fixes PIP `issue
|
||||||
|
449`_.
|
||||||
|
* `Issue #273`_: Legacy script launchers now install with Python2/3 support.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.24
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #249`_: Added options to exclude 2to3 fixers
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.23
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #244`_: Fixed a test
|
||||||
|
* `Issue #243`_: Fixed a test
|
||||||
|
* `Issue #239`_: Fixed a test
|
||||||
|
* `Issue #240`_: Fixed a test
|
||||||
|
* `Issue #241`_: Fixed a test
|
||||||
|
* `Issue #237`_: Fixed a test
|
||||||
|
* `Issue #238`_: easy_install now uses 64bit executable wrappers on 64bit Python
|
||||||
|
* `Issue #208`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
|
||||||
|
* `Issue #207`_: Windows cli and gui wrappers pass CTRL-C to child python process
|
||||||
|
* `Issue #227`_: easy_install now passes its arguments to setup.py bdist_egg
|
||||||
|
* `Issue #225`_: Fixed a NameError on Python 2.5, 2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.21
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #225`_: FIxed a regression on py2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.20
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue #135`_: Include url in warning when processing URLs in package_index.
|
||||||
|
* `Issue #212`_: Fix issue where easy_instal fails on Python 3 on windows installer.
|
||||||
|
* `Issue #213`_: Fix typo in documentation.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.19
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 206`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.18
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 210`_: Fixed a regression introduced by `Issue 204`_ fix.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.17
|
||||||
|
------
|
||||||
|
|
||||||
|
* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
|
||||||
|
variable to allow to disable installation of easy_install-${version} script.
|
||||||
|
* Support Python >=3.1.4 and >=3.2.1.
|
||||||
|
* `Issue 204`_: Don't try to import the parent of a namespace package in
|
||||||
|
declare_namespace
|
||||||
|
* `Issue 196`_: Tolerate responses with multiple Content-Length headers
|
||||||
|
* `Issue 205`_: Sandboxing doesn't preserve working_set. Leads to setup_requires
|
||||||
|
problems.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.16
|
||||||
|
------
|
||||||
|
|
||||||
|
* Builds sdist gztar even on Windows (avoiding `Issue 193`_).
|
||||||
|
* `Issue 192`_: Fixed metadata omitted on Windows when package_dir
|
||||||
|
specified with forward-slash.
|
||||||
|
* `Issue 195`_: Cython build support.
|
||||||
|
* `Issue 200`_: Issues with recognizing 64-bit packages on Windows.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.15
|
||||||
|
------
|
||||||
|
|
||||||
|
* Fixed typo in bdist_egg
|
||||||
|
* Several issues under Python 3 has been solved.
|
||||||
|
* `Issue 146`_: Fixed missing DLL files after easy_install of windows exe package.
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.14
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 170`_: Fixed unittest failure. Thanks to Toshio.
|
||||||
|
* `Issue 171`_: Fixed race condition in unittests cause deadlocks in test suite.
|
||||||
|
* `Issue 143`_: Fixed a lookup issue with easy_install.
|
||||||
|
Thanks to David and Zooko.
|
||||||
|
* `Issue 174`_: Fixed the edit mode when its used with setuptools itself
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.13
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 160`_: 2.7 gives ValueError("Invalid IPv6 URL")
|
||||||
|
* `Issue 150`_: Fixed using ~/.local even in a --no-site-packages virtualenv
|
||||||
|
* `Issue 163`_: scan index links before external links, and don't use the md5 when
|
||||||
|
comparing two distributions
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.12
|
||||||
|
------
|
||||||
|
|
||||||
|
* `Issue 149`_: Fixed various failures on 2.3/2.4
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.11
|
||||||
|
------
|
||||||
|
|
||||||
|
* Found another case of SandboxViolation - fixed
|
||||||
|
* `Issue 15`_ and 48: Introduced a socket timeout of 15 seconds on url openings
|
||||||
|
* Added indexsidebar.html into MANIFEST.in
|
||||||
|
* `Issue 108`_: Fixed TypeError with Python3.1
|
||||||
|
* `Issue 121`_: Fixed --help install command trying to actually install.
|
||||||
|
* `Issue 112`_: Added an os.makedirs so that Tarek's solution will work.
|
||||||
|
* `Issue 133`_: Added --no-find-links to easy_install
|
||||||
|
* Added easy_install --user
|
||||||
|
* `Issue 100`_: Fixed develop --user not taking '.' in PYTHONPATH into account
|
||||||
|
* `Issue 134`_: removed spurious UserWarnings. Patch by VanLindberg
|
||||||
|
* `Issue 138`_: cant_write_to_target error when setup_requires is used.
|
||||||
|
* `Issue 147`_: respect the sys.dont_write_bytecode flag
|
||||||
|
|
||||||
|
------
|
||||||
|
0.6.10
|
||||||
|
------
|
||||||
|
|
||||||
|
* Reverted change made for the DistributionNotFound exception because
|
||||||
|
zc.buildout uses the exception message to get the name of the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.9
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 90`_: unknown setuptools version can be added in the working set
|
||||||
|
* `Issue 87`_: setupt.py doesn't try to convert distribute_setup.py anymore
|
||||||
|
Initial Patch by arfrever.
|
||||||
|
* `Issue 89`_: added a side bar with a download link to the doc.
|
||||||
|
* `Issue 86`_: fixed missing sentence in pkg_resources doc.
|
||||||
|
* Added a nicer error message when a DistributionNotFound is raised.
|
||||||
|
* `Issue 80`_: test_develop now works with Python 3.1
|
||||||
|
* `Issue 93`_: upload_docs now works if there is an empty sub-directory.
|
||||||
|
* `Issue 70`_: exec bit on non-exec files
|
||||||
|
* `Issue 99`_: now the standalone easy_install command doesn't uses a
|
||||||
|
"setup.cfg" if any exists in the working directory. It will use it
|
||||||
|
only if triggered by ``install_requires`` from a setup.py call
|
||||||
|
(install, develop, etc).
|
||||||
|
* `Issue 101`_: Allowing ``os.devnull`` in Sandbox
|
||||||
|
* `Issue 92`_: Fixed the "no eggs" found error with MacPort
|
||||||
|
(platform.mac_ver() fails)
|
||||||
|
* `Issue 103`_: test_get_script_header_jython_workaround not run
|
||||||
|
anymore under py3 with C or POSIX local. Contributed by Arfrever.
|
||||||
|
* `Issue 104`_: remvoved the assertion when the installation fails,
|
||||||
|
with a nicer message for the end user.
|
||||||
|
* `Issue 100`_: making sure there's no SandboxViolation when
|
||||||
|
the setup script patches setuptools.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.8
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added "check_packages" in dist. (added in Setuptools 0.6c11)
|
||||||
|
* Fixed the DONT_PATCH_SETUPTOOLS state.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.7
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 58`_: Added --user support to the develop command
|
||||||
|
* `Issue 11`_: Generated scripts now wrap their call to the script entry point
|
||||||
|
in the standard "if name == 'main'"
|
||||||
|
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
|
||||||
|
can drive an installation that doesn't patch a global setuptools.
|
||||||
|
* Reviewed unladen-swallow specific change from
|
||||||
|
http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
|
||||||
|
and determined that it no longer applies. Distribute should work fine with
|
||||||
|
Unladen Swallow 2009Q3.
|
||||||
|
* `Issue 21`_: Allow PackageIndex.open_url to gracefully handle all cases of a
|
||||||
|
httplib.HTTPException instead of just InvalidURL and BadStatusLine.
|
||||||
|
* Removed virtual-python.py from this distribution and updated documentation
|
||||||
|
to point to the actively maintained virtualenv instead.
|
||||||
|
* `Issue 64`_: use_setuptools no longer rebuilds the distribute egg every
|
||||||
|
time it is run
|
||||||
|
* use_setuptools now properly respects the requested version
|
||||||
|
* use_setuptools will no longer try to import a distribute egg for the
|
||||||
|
wrong Python version
|
||||||
|
* `Issue 74`_: no_fake should be True by default.
|
||||||
|
* `Issue 72`_: avoid a bootstrapping issue with easy_install -U
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.6
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
|
||||||
|
(patch by Holger Krekel)
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.5
|
||||||
|
-----
|
||||||
|
|
||||||
|
* `Issue 65`_: cli.exe and gui.exe are now generated at build time,
|
||||||
|
depending on the platform in use.
|
||||||
|
|
||||||
|
* `Issue 67`_: Fixed doc typo (PEP 381/382)
|
||||||
|
|
||||||
|
* Distribute no longer shadows setuptools if we require a 0.7-series
|
||||||
|
setuptools. And an error is raised when installing a 0.7 setuptools with
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
* When run from within buildout, no attempt is made to modify an existing
|
||||||
|
setuptools egg, whether in a shared egg directory or a system setuptools.
|
||||||
|
|
||||||
|
* Fixed a hole in sandboxing allowing builtin file to write outside of
|
||||||
|
the sandbox.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.4
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Added the generation of `distribute_setup_3k.py` during the release.
|
||||||
|
This closes `issue #52`_.
|
||||||
|
|
||||||
|
* Added an upload_docs command to easily upload project documentation to
|
||||||
|
PyPI's http://packages.python.org. This close `issue #56`_.
|
||||||
|
|
||||||
|
* Fixed a bootstrap bug on the use_setuptools() API.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.3
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Fixed a bunch of calls to file() that caused crashes on Python 3.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed a bug in sorting that caused bootstrap to fail on Python 3.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.2
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Added Python 3 support; see docs/python3.txt.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue39.
|
||||||
|
|
||||||
|
* Added option to run 2to3 automatically when installing on Python 3.
|
||||||
|
This closes `issue #31`_.
|
||||||
|
|
||||||
|
* Fixed invalid usage of requirement.parse, that broke develop -d.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue44.
|
||||||
|
|
||||||
|
* Fixed script launcher for 64-bit Windows.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue2.
|
||||||
|
|
||||||
|
* KeyError when compiling extensions.
|
||||||
|
This closes http://bugs.python.org/setuptools/issue41.
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Fixed bootstrap not working on Windows. This closes `issue #49`_.
|
||||||
|
|
||||||
|
* Fixed 2.6 dependencies. This closes `issue #50`_.
|
||||||
|
|
||||||
|
* Make sure setuptools is patched when running through easy_install
|
||||||
|
This closes http://bugs.python.org/setuptools/issue40.
|
||||||
|
|
||||||
|
-----
|
||||||
|
0.6.1
|
||||||
|
-----
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* package_index.urlopen now catches BadStatusLine and malformed url errors.
|
||||||
|
This closes `issue #16`_ and `issue #18`_.
|
||||||
|
|
||||||
|
* zip_ok is now False by default. This closes
|
||||||
|
http://bugs.python.org/setuptools/issue33.
|
||||||
|
|
||||||
|
* Fixed invalid URL error catching. http://bugs.python.org/setuptools/issue20.
|
||||||
|
|
||||||
|
* Fixed invalid bootstraping with easy_install installation (`issue #40`_).
|
||||||
|
Thanks to Florian Schulze for the help.
|
||||||
|
|
||||||
|
* Removed buildout/bootstrap.py. A new repository will create a specific
|
||||||
|
bootstrap.py script.
|
||||||
|
|
||||||
|
|
||||||
|
bootstrapping
|
||||||
|
=============
|
||||||
|
|
||||||
|
* The boostrap process leave setuptools alone if detected in the system
|
||||||
|
and --root or --prefix is provided, but is not in the same location.
|
||||||
|
This closes `issue #10`_.
|
||||||
|
|
||||||
|
---
|
||||||
|
0.6
|
||||||
|
---
|
||||||
|
|
||||||
|
setuptools
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Packages required at build time where not fully present at install time.
|
||||||
|
This closes `issue #12`_.
|
||||||
|
|
||||||
|
* Protected against failures in tarfile extraction. This closes `issue #10`_.
|
||||||
|
|
||||||
|
* Made Jython api_tests.txt doctest compatible. This closes `issue #7`_.
|
||||||
|
|
||||||
|
* sandbox.py replaced builtin type file with builtin function open. This
|
||||||
|
closes `issue #6`_.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
* Added compatibility with Subversion 1.6. This references `issue #1`_.
|
||||||
|
|
||||||
|
pkg_resources
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
|
||||||
|
instead. Based on a patch from ronaldoussoren. This closes `issue #5`_.
|
||||||
|
|
||||||
|
* Fixed a SandboxViolation for mkdir that could occur in certain cases.
|
||||||
|
This closes `issue #13`_.
|
||||||
|
|
||||||
|
* Allow to find_on_path on systems with tight permissions to fail gracefully.
|
||||||
|
This closes `issue #9`_.
|
||||||
|
|
||||||
|
* Corrected inconsistency between documentation and code of add_entry.
|
||||||
|
This closes `issue #8`_.
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
easy_install
|
||||||
|
============
|
||||||
|
|
||||||
|
* Immediately close all file handles. This closes `issue #3`_.
|
||||||
|
|
||||||
|
|
||||||
|
.. _`Issue #135`: http://bitbucket.org/tarek/distribute/issue/135
|
||||||
|
.. _`Issue #183`: http://bitbucket.org/tarek/distribute/issue/183
|
||||||
|
.. _`Issue #207`: http://bitbucket.org/tarek/distribute/issue/207
|
||||||
|
.. _`Issue #208`: http://bitbucket.org/tarek/distribute/issue/208
|
||||||
|
.. _`Issue #212`: http://bitbucket.org/tarek/distribute/issue/212
|
||||||
|
.. _`Issue #213`: http://bitbucket.org/tarek/distribute/issue/213
|
||||||
|
.. _`Issue #218`: http://bitbucket.org/tarek/distribute/issue/218
|
||||||
|
.. _`Issue #225`: http://bitbucket.org/tarek/distribute/issue/225
|
||||||
|
.. _`Issue #227`: http://bitbucket.org/tarek/distribute/issue/227
|
||||||
|
.. _`Issue #231`: http://bitbucket.org/tarek/distribute/issue/231
|
||||||
|
.. _`Issue #237`: http://bitbucket.org/tarek/distribute/issue/237
|
||||||
|
.. _`Issue #238`: http://bitbucket.org/tarek/distribute/issue/238
|
||||||
|
.. _`Issue #239`: http://bitbucket.org/tarek/distribute/issue/239
|
||||||
|
.. _`Issue #240`: http://bitbucket.org/tarek/distribute/issue/240
|
||||||
|
.. _`Issue #241`: http://bitbucket.org/tarek/distribute/issue/241
|
||||||
|
.. _`Issue #243`: http://bitbucket.org/tarek/distribute/issue/243
|
||||||
|
.. _`Issue #244`: http://bitbucket.org/tarek/distribute/issue/244
|
||||||
|
.. _`Issue #249`: http://bitbucket.org/tarek/distribute/issue/249
|
||||||
|
.. _`Issue #258`: http://bitbucket.org/tarek/distribute/issue/258
|
||||||
|
.. _`Issue #260`: http://bitbucket.org/tarek/distribute/issue/260
|
||||||
|
.. _`Issue #262`: http://bitbucket.org/tarek/distribute/issue/262
|
||||||
|
.. _`Issue #269`: http://bitbucket.org/tarek/distribute/issue/269
|
||||||
|
.. _`Issue #272`: http://bitbucket.org/tarek/distribute/issue/272
|
||||||
|
.. _`Issue #273`: http://bitbucket.org/tarek/distribute/issue/273
|
||||||
|
.. _`Issue #278`: http://bitbucket.org/tarek/distribute/issue/278
|
||||||
|
.. _`Issue #283`: http://bitbucket.org/tarek/distribute/issue/283
|
||||||
|
.. _`Issue #294`: http://bitbucket.org/tarek/distribute/issue/294
|
||||||
|
.. _`Issue #299`: http://bitbucket.org/tarek/distribute/issue/299
|
||||||
|
.. _`Issue #301`: http://bitbucket.org/tarek/distribute/issue/301
|
||||||
|
.. _`Issue #303`: http://bitbucket.org/tarek/distribute/issue/303
|
||||||
|
.. _`Issue #304`: http://bitbucket.org/tarek/distribute/issue/304
|
||||||
|
.. _`Issue #305`: http://bitbucket.org/tarek/distribute/issue/305
|
||||||
|
.. _`Issue #306`: http://bitbucket.org/tarek/distribute/issue/306
|
||||||
|
.. _`Issue #307`: http://bitbucket.org/tarek/distribute/issue/307
|
||||||
|
.. _`Issue #310`: http://bitbucket.org/tarek/distribute/issue/310
|
||||||
|
.. _`Issue #311`: http://bitbucket.org/tarek/distribute/issue/311
|
||||||
|
.. _`Issue #313`: http://bitbucket.org/tarek/distribute/issue/313
|
||||||
|
.. _`Issue #314`: http://bitbucket.org/tarek/distribute/issue/314
|
||||||
|
.. _`Issue #320`: http://bitbucket.org/tarek/distribute/issue/320
|
||||||
|
.. _`Issue #323`: http://bitbucket.org/tarek/distribute/issue/323
|
||||||
|
.. _`Issue #326`: http://bitbucket.org/tarek/distribute/issue/326
|
||||||
|
.. _`Issue #327`: http://bitbucket.org/tarek/distribute/issue/327
|
||||||
|
.. _`Issue #328`: http://bitbucket.org/tarek/distribute/issue/328
|
||||||
|
.. _`Issue #329`: http://bitbucket.org/tarek/distribute/issue/329
|
||||||
|
.. _`Issue #334`: http://bitbucket.org/tarek/distribute/issue/334
|
||||||
|
.. _`Issue #335`: http://bitbucket.org/tarek/distribute/issue/335
|
||||||
|
.. _`Issue #336`: http://bitbucket.org/tarek/distribute/issue/336
|
||||||
|
.. _`Issue #341`: http://bitbucket.org/tarek/distribute/issue/341
|
||||||
|
.. _`Issue 100`: http://bitbucket.org/tarek/distribute/issue/100
|
||||||
|
.. _`Issue 101`: http://bitbucket.org/tarek/distribute/issue/101
|
||||||
|
.. _`Issue 103`: http://bitbucket.org/tarek/distribute/issue/103
|
||||||
|
.. _`Issue 104`: http://bitbucket.org/tarek/distribute/issue/104
|
||||||
|
.. _`Issue 108`: http://bitbucket.org/tarek/distribute/issue/108
|
||||||
|
.. _`Issue 11`: http://bitbucket.org/tarek/distribute/issue/11
|
||||||
|
.. _`Issue 112`: http://bitbucket.org/tarek/distribute/issue/112
|
||||||
|
.. _`Issue 121`: http://bitbucket.org/tarek/distribute/issue/121
|
||||||
|
.. _`Issue 133`: http://bitbucket.org/tarek/distribute/issue/133
|
||||||
|
.. _`Issue 134`: http://bitbucket.org/tarek/distribute/issue/134
|
||||||
|
.. _`Issue 138`: http://bitbucket.org/tarek/distribute/issue/138
|
||||||
|
.. _`Issue 143`: http://bitbucket.org/tarek/distribute/issue/143
|
||||||
|
.. _`Issue 146`: http://bitbucket.org/tarek/distribute/issue/146
|
||||||
|
.. _`Issue 147`: http://bitbucket.org/tarek/distribute/issue/147
|
||||||
|
.. _`Issue 149`: http://bitbucket.org/tarek/distribute/issue/149
|
||||||
|
.. _`Issue 15`: http://bitbucket.org/tarek/distribute/issue/15
|
||||||
|
.. _`Issue 150`: http://bitbucket.org/tarek/distribute/issue/150
|
||||||
|
.. _`Issue 160`: http://bitbucket.org/tarek/distribute/issue/160
|
||||||
|
.. _`Issue 163`: http://bitbucket.org/tarek/distribute/issue/163
|
||||||
|
.. _`Issue 170`: http://bitbucket.org/tarek/distribute/issue/170
|
||||||
|
.. _`Issue 171`: http://bitbucket.org/tarek/distribute/issue/171
|
||||||
|
.. _`Issue 174`: http://bitbucket.org/tarek/distribute/issue/174
|
||||||
|
.. _`Issue 192`: http://bitbucket.org/tarek/distribute/issue/192
|
||||||
|
.. _`Issue 193`: http://bitbucket.org/tarek/distribute/issue/193
|
||||||
|
.. _`Issue 195`: http://bitbucket.org/tarek/distribute/issue/195
|
||||||
|
.. _`Issue 196`: http://bitbucket.org/tarek/distribute/issue/196
|
||||||
|
.. _`Issue 200`: http://bitbucket.org/tarek/distribute/issue/200
|
||||||
|
.. _`Issue 204`: http://bitbucket.org/tarek/distribute/issue/204
|
||||||
|
.. _`Issue 205`: http://bitbucket.org/tarek/distribute/issue/205
|
||||||
|
.. _`Issue 206`: http://bitbucket.org/tarek/distribute/issue/206
|
||||||
|
.. _`Issue 21`: http://bitbucket.org/tarek/distribute/issue/21
|
||||||
|
.. _`Issue 210`: http://bitbucket.org/tarek/distribute/issue/210
|
||||||
|
.. _`Issue 58`: http://bitbucket.org/tarek/distribute/issue/58
|
||||||
|
.. _`Issue 64`: http://bitbucket.org/tarek/distribute/issue/64
|
||||||
|
.. _`Issue 65`: http://bitbucket.org/tarek/distribute/issue/65
|
||||||
|
.. _`Issue 67`: http://bitbucket.org/tarek/distribute/issue/67
|
||||||
|
.. _`Issue 70`: http://bitbucket.org/tarek/distribute/issue/70
|
||||||
|
.. _`Issue 72`: http://bitbucket.org/tarek/distribute/issue/72
|
||||||
|
.. _`Issue 74`: http://bitbucket.org/tarek/distribute/issue/74
|
||||||
|
.. _`Issue 80`: http://bitbucket.org/tarek/distribute/issue/80
|
||||||
|
.. _`Issue 86`: http://bitbucket.org/tarek/distribute/issue/86
|
||||||
|
.. _`Issue 87`: http://bitbucket.org/tarek/distribute/issue/87
|
||||||
|
.. _`Issue 89`: http://bitbucket.org/tarek/distribute/issue/89
|
||||||
|
.. _`Issue 90`: http://bitbucket.org/tarek/distribute/issue/90
|
||||||
|
.. _`Issue 92`: http://bitbucket.org/tarek/distribute/issue/92
|
||||||
|
.. _`Issue 93`: http://bitbucket.org/tarek/distribute/issue/93
|
||||||
|
.. _`Issue 99`: http://bitbucket.org/tarek/distribute/issue/99
|
||||||
|
.. _`issue
|
||||||
|
449`: http://bitbucket.org/tarek/distribute/issue/449
|
||||||
|
.. _`issue #1`: http://bitbucket.org/tarek/distribute/issue/1
|
||||||
|
.. _`issue #10`: http://bitbucket.org/tarek/distribute/issue/10
|
||||||
|
.. _`issue #12`: http://bitbucket.org/tarek/distribute/issue/12
|
||||||
|
.. _`issue #13`: http://bitbucket.org/tarek/distribute/issue/13
|
||||||
|
.. _`issue #16`: http://bitbucket.org/tarek/distribute/issue/16
|
||||||
|
.. _`issue #18`: http://bitbucket.org/tarek/distribute/issue/18
|
||||||
|
.. _`issue #3`: http://bitbucket.org/tarek/distribute/issue/3
|
||||||
|
.. _`issue #31`: http://bitbucket.org/tarek/distribute/issue/31
|
||||||
|
.. _`issue #40`: http://bitbucket.org/tarek/distribute/issue/40
|
||||||
|
.. _`issue #49`: http://bitbucket.org/tarek/distribute/issue/49
|
||||||
|
.. _`issue #5`: http://bitbucket.org/tarek/distribute/issue/5
|
||||||
|
.. _`issue #50`: http://bitbucket.org/tarek/distribute/issue/50
|
||||||
|
.. _`issue #52`: http://bitbucket.org/tarek/distribute/issue/52
|
||||||
|
.. _`issue #56`: http://bitbucket.org/tarek/distribute/issue/56
|
||||||
|
.. _`issue #6`: http://bitbucket.org/tarek/distribute/issue/6
|
||||||
|
.. _`issue #7`: http://bitbucket.org/tarek/distribute/issue/7
|
||||||
|
.. _`issue #8`: http://bitbucket.org/tarek/distribute/issue/8
|
||||||
|
.. _`issue #9`: http://bitbucket.org/tarek/distribute/issue/9
|
||||||
|
.. _`issue 64`: http://bitbucket.org/tarek/distribute/issue/64
|
||||||
|
|
||||||
|
|
||||||
|
Keywords: CPAN PyPI distutils eggs package management
|
||||||
|
Platform: UNKNOWN
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: Python Software Foundation License
|
||||||
|
Classifier: License :: OSI Approved :: Zope Public License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python :: 2.4
|
||||||
|
Classifier: Programming Language :: Python :: 2.5
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
Classifier: Programming Language :: Python :: 2.7
|
||||||
|
Classifier: Programming Language :: Python :: 3
|
||||||
|
Classifier: Programming Language :: Python :: 3.1
|
||||||
|
Classifier: Programming Language :: Python :: 3.2
|
||||||
|
Classifier: Programming Language :: Python :: 3.3
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Classifier: Topic :: System :: Archiving :: Packaging
|
||||||
|
Classifier: Topic :: System :: Systems Administration
|
||||||
|
Classifier: Topic :: Utilities
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
CHANGES.txt
|
||||||
|
CONTRIBUTORS.txt
|
||||||
|
DEVGUIDE.txt
|
||||||
|
MANIFEST.in
|
||||||
|
README.txt
|
||||||
|
distribute_setup.py
|
||||||
|
easy_install.py
|
||||||
|
launcher.c
|
||||||
|
pkg_resources.py
|
||||||
|
release.py
|
||||||
|
setup.cfg
|
||||||
|
setup.py
|
||||||
|
site.py
|
||||||
|
_markerlib/__init__.py
|
||||||
|
_markerlib/markers.py
|
||||||
|
distribute.egg-info/PKG-INFO
|
||||||
|
distribute.egg-info/SOURCES.txt
|
||||||
|
distribute.egg-info/dependency_links.txt
|
||||||
|
distribute.egg-info/entry_points.txt
|
||||||
|
distribute.egg-info/top_level.txt
|
||||||
|
distribute.egg-info/zip-safe
|
||||||
|
docs/Makefile
|
||||||
|
docs/conf.py
|
||||||
|
docs/easy_install.txt
|
||||||
|
docs/index.txt
|
||||||
|
docs/pkg_resources.txt
|
||||||
|
docs/python3.txt
|
||||||
|
docs/roadmap.txt
|
||||||
|
docs/setuptools.txt
|
||||||
|
docs/using.txt
|
||||||
|
docs/_templates/indexsidebar.html
|
||||||
|
docs/_theme/nature/theme.conf
|
||||||
|
docs/_theme/nature/static/nature.css_t
|
||||||
|
docs/_theme/nature/static/pygments.css
|
||||||
|
docs/build/html/_sources/easy_install.txt
|
||||||
|
docs/build/html/_sources/index.txt
|
||||||
|
docs/build/html/_sources/pkg_resources.txt
|
||||||
|
docs/build/html/_sources/python3.txt
|
||||||
|
docs/build/html/_sources/roadmap.txt
|
||||||
|
docs/build/html/_sources/setuptools.txt
|
||||||
|
docs/build/html/_sources/using.txt
|
||||||
|
docs/build/html/_static/basic.css
|
||||||
|
docs/build/html/_static/nature.css
|
||||||
|
docs/build/html/_static/pygments.css
|
||||||
|
setuptools/__init__.py
|
||||||
|
setuptools/archive_util.py
|
||||||
|
setuptools/cli-32.exe
|
||||||
|
setuptools/cli-64.exe
|
||||||
|
setuptools/cli.exe
|
||||||
|
setuptools/depends.py
|
||||||
|
setuptools/dist.py
|
||||||
|
setuptools/extension.py
|
||||||
|
setuptools/gui-32.exe
|
||||||
|
setuptools/gui-64.exe
|
||||||
|
setuptools/gui.exe
|
||||||
|
setuptools/package_index.py
|
||||||
|
setuptools/sandbox.py
|
||||||
|
setuptools/script template (dev).py
|
||||||
|
setuptools/script template.py
|
||||||
|
setuptools/command/__init__.py
|
||||||
|
setuptools/command/alias.py
|
||||||
|
setuptools/command/bdist_egg.py
|
||||||
|
setuptools/command/bdist_rpm.py
|
||||||
|
setuptools/command/bdist_wininst.py
|
||||||
|
setuptools/command/build_ext.py
|
||||||
|
setuptools/command/build_py.py
|
||||||
|
setuptools/command/develop.py
|
||||||
|
setuptools/command/easy_install.py
|
||||||
|
setuptools/command/egg_info.py
|
||||||
|
setuptools/command/install.py
|
||||||
|
setuptools/command/install_egg_info.py
|
||||||
|
setuptools/command/install_lib.py
|
||||||
|
setuptools/command/install_scripts.py
|
||||||
|
setuptools/command/register.py
|
||||||
|
setuptools/command/rotate.py
|
||||||
|
setuptools/command/saveopts.py
|
||||||
|
setuptools/command/sdist.py
|
||||||
|
setuptools/command/setopt.py
|
||||||
|
setuptools/command/test.py
|
||||||
|
setuptools/command/upload.py
|
||||||
|
setuptools/command/upload_docs.py
|
||||||
|
setuptools/tests/__init__.py
|
||||||
|
setuptools/tests/doctest.py
|
||||||
|
setuptools/tests/py26compat.py
|
||||||
|
setuptools/tests/server.py
|
||||||
|
setuptools/tests/test_bdist_egg.py
|
||||||
|
setuptools/tests/test_build_ext.py
|
||||||
|
setuptools/tests/test_develop.py
|
||||||
|
setuptools/tests/test_dist_info.py
|
||||||
|
setuptools/tests/test_easy_install.py
|
||||||
|
setuptools/tests/test_markerlib.py
|
||||||
|
setuptools/tests/test_packageindex.py
|
||||||
|
setuptools/tests/test_resources.py
|
||||||
|
setuptools/tests/test_sandbox.py
|
||||||
|
setuptools/tests/test_sdist.py
|
||||||
|
setuptools/tests/test_test.py
|
||||||
|
setuptools/tests/test_upload_docs.py
|
||||||
|
setuptools/tests/win_script_wrapper.txt
|
||||||
|
setuptools/tests/indexes/test_links_priority/external.html
|
||||||
|
setuptools/tests/indexes/test_links_priority/simple/foobar/index.html
|
||||||
|
tests/api_tests.txt
|
||||||
|
tests/install_test.py
|
||||||
|
tests/manual_test.py
|
||||||
|
tests/test_distribute_setup.py
|
||||||
|
tests/shlib_test/hello.c
|
||||||
|
tests/shlib_test/hello.pyx
|
||||||
|
tests/shlib_test/hellolib.c
|
||||||
|
tests/shlib_test/setup.py
|
||||||
|
tests/shlib_test/test_hello.py
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
[distutils.commands]
|
||||||
|
bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
|
||||||
|
rotate = setuptools.command.rotate:rotate
|
||||||
|
develop = setuptools.command.develop:develop
|
||||||
|
setopt = setuptools.command.setopt:setopt
|
||||||
|
build_py = setuptools.command.build_py:build_py
|
||||||
|
saveopts = setuptools.command.saveopts:saveopts
|
||||||
|
egg_info = setuptools.command.egg_info:egg_info
|
||||||
|
register = setuptools.command.register:register
|
||||||
|
upload_docs = setuptools.command.upload_docs:upload_docs
|
||||||
|
install_egg_info = setuptools.command.install_egg_info:install_egg_info
|
||||||
|
alias = setuptools.command.alias:alias
|
||||||
|
easy_install = setuptools.command.easy_install:easy_install
|
||||||
|
install_scripts = setuptools.command.install_scripts:install_scripts
|
||||||
|
bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
|
||||||
|
bdist_egg = setuptools.command.bdist_egg:bdist_egg
|
||||||
|
install = setuptools.command.install:install
|
||||||
|
test = setuptools.command.test:test
|
||||||
|
install_lib = setuptools.command.install_lib:install_lib
|
||||||
|
build_ext = setuptools.command.build_ext:build_ext
|
||||||
|
sdist = setuptools.command.sdist:sdist
|
||||||
|
|
||||||
|
[egg_info.writers]
|
||||||
|
dependency_links.txt = setuptools.command.egg_info:overwrite_arg
|
||||||
|
requires.txt = setuptools.command.egg_info:write_requirements
|
||||||
|
PKG-INFO = setuptools.command.egg_info:write_pkg_info
|
||||||
|
eager_resources.txt = setuptools.command.egg_info:overwrite_arg
|
||||||
|
top_level.txt = setuptools.command.egg_info:write_toplevel_names
|
||||||
|
namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
|
||||||
|
entry_points.txt = setuptools.command.egg_info:write_entries
|
||||||
|
depends.txt = setuptools.command.egg_info:warn_depends_obsolete
|
||||||
|
|
||||||
|
[console_scripts]
|
||||||
|
easy_install = setuptools.command.easy_install:main
|
||||||
|
easy_install-2.7 = setuptools.command.easy_install:main
|
||||||
|
|
||||||
|
[setuptools.file_finders]
|
||||||
|
svn_cvs = setuptools.command.sdist:_default_revctrl
|
||||||
|
|
||||||
|
[distutils.setup_keywords]
|
||||||
|
dependency_links = setuptools.dist:assert_string_list
|
||||||
|
entry_points = setuptools.dist:check_entry_points
|
||||||
|
extras_require = setuptools.dist:check_extras
|
||||||
|
use_2to3_exclude_fixers = setuptools.dist:assert_string_list
|
||||||
|
package_data = setuptools.dist:check_package_data
|
||||||
|
install_requires = setuptools.dist:check_requirements
|
||||||
|
use_2to3 = setuptools.dist:assert_bool
|
||||||
|
use_2to3_fixers = setuptools.dist:assert_string_list
|
||||||
|
include_package_data = setuptools.dist:assert_bool
|
||||||
|
exclude_package_data = setuptools.dist:check_package_data
|
||||||
|
namespace_packages = setuptools.dist:check_nsp
|
||||||
|
test_suite = setuptools.dist:check_test_suite
|
||||||
|
eager_resources = setuptools.dist:assert_string_list
|
||||||
|
zip_safe = setuptools.dist:assert_bool
|
||||||
|
test_loader = setuptools.dist:check_importable
|
||||||
|
packages = setuptools.dist:check_packages
|
||||||
|
convert_2to3_doctests = setuptools.dist:assert_string_list
|
||||||
|
tests_require = setuptools.dist:check_requirements
|
||||||
|
|
||||||
|
[setuptools.installation]
|
||||||
|
eggsecutable = setuptools.command.easy_install:bootstrap
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
_markerlib
|
||||||
|
easy_install
|
||||||
|
pkg_resources
|
||||||
|
setuptools
|
||||||
|
site
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
|
|
||||||
+546
@@ -0,0 +1,546 @@
|
|||||||
|
#!python
|
||||||
|
"""Bootstrap distribute installation
|
||||||
|
|
||||||
|
If you want to use setuptools in your package's setup.py, just include this
|
||||||
|
file in the same directory with it, and add this to the top of your setup.py::
|
||||||
|
|
||||||
|
from distribute_setup import use_setuptools
|
||||||
|
use_setuptools()
|
||||||
|
|
||||||
|
If you want to require a specific version of setuptools, set a download
|
||||||
|
mirror, or use an alternate download directory, you can do so by supplying
|
||||||
|
the appropriate options to ``use_setuptools()``.
|
||||||
|
|
||||||
|
This file can also be run as a script to install or upgrade setuptools.
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import fnmatch
|
||||||
|
import tempfile
|
||||||
|
import tarfile
|
||||||
|
import optparse
|
||||||
|
|
||||||
|
from distutils import log
|
||||||
|
|
||||||
|
try:
|
||||||
|
from site import USER_SITE
|
||||||
|
except ImportError:
|
||||||
|
USER_SITE = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def _python_cmd(*args):
|
||||||
|
args = (sys.executable,) + args
|
||||||
|
return subprocess.call(args) == 0
|
||||||
|
|
||||||
|
except ImportError:
|
||||||
|
# will be used for python 2.3
|
||||||
|
def _python_cmd(*args):
|
||||||
|
args = (sys.executable,) + args
|
||||||
|
# quoting arguments if windows
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
def quote(arg):
|
||||||
|
if ' ' in arg:
|
||||||
|
return '"%s"' % arg
|
||||||
|
return arg
|
||||||
|
args = [quote(arg) for arg in args]
|
||||||
|
return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
|
||||||
|
|
||||||
|
DEFAULT_VERSION = "0.6.36"
|
||||||
|
DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
|
||||||
|
SETUPTOOLS_FAKED_VERSION = "0.6c11"
|
||||||
|
|
||||||
|
SETUPTOOLS_PKG_INFO = """\
|
||||||
|
Metadata-Version: 1.0
|
||||||
|
Name: setuptools
|
||||||
|
Version: %s
|
||||||
|
Summary: xxxx
|
||||||
|
Home-page: xxx
|
||||||
|
Author: xxx
|
||||||
|
Author-email: xxx
|
||||||
|
License: xxx
|
||||||
|
Description: xxx
|
||||||
|
""" % SETUPTOOLS_FAKED_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
def _install(tarball, install_args=()):
|
||||||
|
# extracting the tarball
|
||||||
|
tmpdir = tempfile.mkdtemp()
|
||||||
|
log.warn('Extracting in %s', tmpdir)
|
||||||
|
old_wd = os.getcwd()
|
||||||
|
try:
|
||||||
|
os.chdir(tmpdir)
|
||||||
|
tar = tarfile.open(tarball)
|
||||||
|
_extractall(tar)
|
||||||
|
tar.close()
|
||||||
|
|
||||||
|
# going in the directory
|
||||||
|
subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
|
||||||
|
os.chdir(subdir)
|
||||||
|
log.warn('Now working in %s', subdir)
|
||||||
|
|
||||||
|
# installing
|
||||||
|
log.warn('Installing Distribute')
|
||||||
|
if not _python_cmd('setup.py', 'install', *install_args):
|
||||||
|
log.warn('Something went wrong during the installation.')
|
||||||
|
log.warn('See the error message above.')
|
||||||
|
# exitcode will be 2
|
||||||
|
return 2
|
||||||
|
finally:
|
||||||
|
os.chdir(old_wd)
|
||||||
|
shutil.rmtree(tmpdir)
|
||||||
|
|
||||||
|
|
||||||
|
def _build_egg(egg, tarball, to_dir):
|
||||||
|
# extracting the tarball
|
||||||
|
tmpdir = tempfile.mkdtemp()
|
||||||
|
log.warn('Extracting in %s', tmpdir)
|
||||||
|
old_wd = os.getcwd()
|
||||||
|
try:
|
||||||
|
os.chdir(tmpdir)
|
||||||
|
tar = tarfile.open(tarball)
|
||||||
|
_extractall(tar)
|
||||||
|
tar.close()
|
||||||
|
|
||||||
|
# going in the directory
|
||||||
|
subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
|
||||||
|
os.chdir(subdir)
|
||||||
|
log.warn('Now working in %s', subdir)
|
||||||
|
|
||||||
|
# building an egg
|
||||||
|
log.warn('Building a Distribute egg in %s', to_dir)
|
||||||
|
_python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
os.chdir(old_wd)
|
||||||
|
shutil.rmtree(tmpdir)
|
||||||
|
# returning the result
|
||||||
|
log.warn(egg)
|
||||||
|
if not os.path.exists(egg):
|
||||||
|
raise IOError('Could not build the egg.')
|
||||||
|
|
||||||
|
|
||||||
|
def _do_download(version, download_base, to_dir, download_delay):
|
||||||
|
egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'
|
||||||
|
% (version, sys.version_info[0], sys.version_info[1]))
|
||||||
|
if not os.path.exists(egg):
|
||||||
|
tarball = download_setuptools(version, download_base,
|
||||||
|
to_dir, download_delay)
|
||||||
|
_build_egg(egg, tarball, to_dir)
|
||||||
|
sys.path.insert(0, egg)
|
||||||
|
import setuptools
|
||||||
|
setuptools.bootstrap_install_from = egg
|
||||||
|
|
||||||
|
|
||||||
|
def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
|
||||||
|
to_dir=os.curdir, download_delay=15, no_fake=True):
|
||||||
|
# making sure we use the absolute path
|
||||||
|
to_dir = os.path.abspath(to_dir)
|
||||||
|
was_imported = 'pkg_resources' in sys.modules or \
|
||||||
|
'setuptools' in sys.modules
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
import pkg_resources
|
||||||
|
if not hasattr(pkg_resources, '_distribute'):
|
||||||
|
if not no_fake:
|
||||||
|
_fake_setuptools()
|
||||||
|
raise ImportError
|
||||||
|
except ImportError:
|
||||||
|
return _do_download(version, download_base, to_dir, download_delay)
|
||||||
|
try:
|
||||||
|
pkg_resources.require("distribute>=" + version)
|
||||||
|
return
|
||||||
|
except pkg_resources.VersionConflict:
|
||||||
|
e = sys.exc_info()[1]
|
||||||
|
if was_imported:
|
||||||
|
sys.stderr.write(
|
||||||
|
"The required version of distribute (>=%s) is not available,\n"
|
||||||
|
"and can't be installed while this script is running. Please\n"
|
||||||
|
"install a more recent version first, using\n"
|
||||||
|
"'easy_install -U distribute'."
|
||||||
|
"\n\n(Currently using %r)\n" % (version, e.args[0]))
|
||||||
|
sys.exit(2)
|
||||||
|
else:
|
||||||
|
del pkg_resources, sys.modules['pkg_resources'] # reload ok
|
||||||
|
return _do_download(version, download_base, to_dir,
|
||||||
|
download_delay)
|
||||||
|
except pkg_resources.DistributionNotFound:
|
||||||
|
return _do_download(version, download_base, to_dir,
|
||||||
|
download_delay)
|
||||||
|
finally:
|
||||||
|
if not no_fake:
|
||||||
|
_create_fake_setuptools_pkg_info(to_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
|
||||||
|
to_dir=os.curdir, delay=15):
|
||||||
|
"""Download distribute from a specified location and return its filename
|
||||||
|
|
||||||
|
`version` should be a valid distribute version number that is available
|
||||||
|
as an egg for download under the `download_base` URL (which should end
|
||||||
|
with a '/'). `to_dir` is the directory where the egg will be downloaded.
|
||||||
|
`delay` is the number of seconds to pause before an actual download
|
||||||
|
attempt.
|
||||||
|
"""
|
||||||
|
# making sure we use the absolute path
|
||||||
|
to_dir = os.path.abspath(to_dir)
|
||||||
|
try:
|
||||||
|
from urllib.request import urlopen
|
||||||
|
except ImportError:
|
||||||
|
from urllib2 import urlopen
|
||||||
|
tgz_name = "distribute-%s.tar.gz" % version
|
||||||
|
url = download_base + tgz_name
|
||||||
|
saveto = os.path.join(to_dir, tgz_name)
|
||||||
|
src = dst = None
|
||||||
|
if not os.path.exists(saveto): # Avoid repeated downloads
|
||||||
|
try:
|
||||||
|
log.warn("Downloading %s", url)
|
||||||
|
src = urlopen(url)
|
||||||
|
# Read/write all in one block, so we don't create a corrupt file
|
||||||
|
# if the download is interrupted.
|
||||||
|
data = src.read()
|
||||||
|
dst = open(saveto, "wb")
|
||||||
|
dst.write(data)
|
||||||
|
finally:
|
||||||
|
if src:
|
||||||
|
src.close()
|
||||||
|
if dst:
|
||||||
|
dst.close()
|
||||||
|
return os.path.realpath(saveto)
|
||||||
|
|
||||||
|
|
||||||
|
def _no_sandbox(function):
|
||||||
|
def __no_sandbox(*args, **kw):
|
||||||
|
try:
|
||||||
|
from setuptools.sandbox import DirectorySandbox
|
||||||
|
if not hasattr(DirectorySandbox, '_old'):
|
||||||
|
def violation(*args):
|
||||||
|
pass
|
||||||
|
DirectorySandbox._old = DirectorySandbox._violation
|
||||||
|
DirectorySandbox._violation = violation
|
||||||
|
patched = True
|
||||||
|
else:
|
||||||
|
patched = False
|
||||||
|
except ImportError:
|
||||||
|
patched = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
return function(*args, **kw)
|
||||||
|
finally:
|
||||||
|
if patched:
|
||||||
|
DirectorySandbox._violation = DirectorySandbox._old
|
||||||
|
del DirectorySandbox._old
|
||||||
|
|
||||||
|
return __no_sandbox
|
||||||
|
|
||||||
|
|
||||||
|
def _patch_file(path, content):
|
||||||
|
"""Will backup the file then patch it"""
|
||||||
|
f = open(path)
|
||||||
|
existing_content = f.read()
|
||||||
|
f.close()
|
||||||
|
if existing_content == content:
|
||||||
|
# already patched
|
||||||
|
log.warn('Already patched.')
|
||||||
|
return False
|
||||||
|
log.warn('Patching...')
|
||||||
|
_rename_path(path)
|
||||||
|
f = open(path, 'w')
|
||||||
|
try:
|
||||||
|
f.write(content)
|
||||||
|
finally:
|
||||||
|
f.close()
|
||||||
|
return True
|
||||||
|
|
||||||
|
_patch_file = _no_sandbox(_patch_file)
|
||||||
|
|
||||||
|
|
||||||
|
def _same_content(path, content):
|
||||||
|
f = open(path)
|
||||||
|
existing_content = f.read()
|
||||||
|
f.close()
|
||||||
|
return existing_content == content
|
||||||
|
|
||||||
|
|
||||||
|
def _rename_path(path):
|
||||||
|
new_name = path + '.OLD.%s' % time.time()
|
||||||
|
log.warn('Renaming %s to %s', path, new_name)
|
||||||
|
os.rename(path, new_name)
|
||||||
|
return new_name
|
||||||
|
|
||||||
|
|
||||||
|
def _remove_flat_installation(placeholder):
|
||||||
|
if not os.path.isdir(placeholder):
|
||||||
|
log.warn('Unkown installation at %s', placeholder)
|
||||||
|
return False
|
||||||
|
found = False
|
||||||
|
for file in os.listdir(placeholder):
|
||||||
|
if fnmatch.fnmatch(file, 'setuptools*.egg-info'):
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
if not found:
|
||||||
|
log.warn('Could not locate setuptools*.egg-info')
|
||||||
|
return
|
||||||
|
|
||||||
|
log.warn('Moving elements out of the way...')
|
||||||
|
pkg_info = os.path.join(placeholder, file)
|
||||||
|
if os.path.isdir(pkg_info):
|
||||||
|
patched = _patch_egg_dir(pkg_info)
|
||||||
|
else:
|
||||||
|
patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO)
|
||||||
|
|
||||||
|
if not patched:
|
||||||
|
log.warn('%s already patched.', pkg_info)
|
||||||
|
return False
|
||||||
|
# now let's move the files out of the way
|
||||||
|
for element in ('setuptools', 'pkg_resources.py', 'site.py'):
|
||||||
|
element = os.path.join(placeholder, element)
|
||||||
|
if os.path.exists(element):
|
||||||
|
_rename_path(element)
|
||||||
|
else:
|
||||||
|
log.warn('Could not find the %s element of the '
|
||||||
|
'Setuptools distribution', element)
|
||||||
|
return True
|
||||||
|
|
||||||
|
_remove_flat_installation = _no_sandbox(_remove_flat_installation)
|
||||||
|
|
||||||
|
|
||||||
|
def _after_install(dist):
|
||||||
|
log.warn('After install bootstrap.')
|
||||||
|
placeholder = dist.get_command_obj('install').install_purelib
|
||||||
|
_create_fake_setuptools_pkg_info(placeholder)
|
||||||
|
|
||||||
|
|
||||||
|
def _create_fake_setuptools_pkg_info(placeholder):
|
||||||
|
if not placeholder or not os.path.exists(placeholder):
|
||||||
|
log.warn('Could not find the install location')
|
||||||
|
return
|
||||||
|
pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
|
||||||
|
setuptools_file = 'setuptools-%s-py%s.egg-info' % \
|
||||||
|
(SETUPTOOLS_FAKED_VERSION, pyver)
|
||||||
|
pkg_info = os.path.join(placeholder, setuptools_file)
|
||||||
|
if os.path.exists(pkg_info):
|
||||||
|
log.warn('%s already exists', pkg_info)
|
||||||
|
return
|
||||||
|
|
||||||
|
log.warn('Creating %s', pkg_info)
|
||||||
|
try:
|
||||||
|
f = open(pkg_info, 'w')
|
||||||
|
except EnvironmentError:
|
||||||
|
log.warn("Don't have permissions to write %s, skipping", pkg_info)
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
f.write(SETUPTOOLS_PKG_INFO)
|
||||||
|
finally:
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
pth_file = os.path.join(placeholder, 'setuptools.pth')
|
||||||
|
log.warn('Creating %s', pth_file)
|
||||||
|
f = open(pth_file, 'w')
|
||||||
|
try:
|
||||||
|
f.write(os.path.join(os.curdir, setuptools_file))
|
||||||
|
finally:
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
_create_fake_setuptools_pkg_info = _no_sandbox(
|
||||||
|
_create_fake_setuptools_pkg_info
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _patch_egg_dir(path):
|
||||||
|
# let's check if it's already patched
|
||||||
|
pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
|
||||||
|
if os.path.exists(pkg_info):
|
||||||
|
if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):
|
||||||
|
log.warn('%s already patched.', pkg_info)
|
||||||
|
return False
|
||||||
|
_rename_path(path)
|
||||||
|
os.mkdir(path)
|
||||||
|
os.mkdir(os.path.join(path, 'EGG-INFO'))
|
||||||
|
pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
|
||||||
|
f = open(pkg_info, 'w')
|
||||||
|
try:
|
||||||
|
f.write(SETUPTOOLS_PKG_INFO)
|
||||||
|
finally:
|
||||||
|
f.close()
|
||||||
|
return True
|
||||||
|
|
||||||
|
_patch_egg_dir = _no_sandbox(_patch_egg_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def _before_install():
|
||||||
|
log.warn('Before install bootstrap.')
|
||||||
|
_fake_setuptools()
|
||||||
|
|
||||||
|
|
||||||
|
def _under_prefix(location):
|
||||||
|
if 'install' not in sys.argv:
|
||||||
|
return True
|
||||||
|
args = sys.argv[sys.argv.index('install') + 1:]
|
||||||
|
for index, arg in enumerate(args):
|
||||||
|
for option in ('--root', '--prefix'):
|
||||||
|
if arg.startswith('%s=' % option):
|
||||||
|
top_dir = arg.split('root=')[-1]
|
||||||
|
return location.startswith(top_dir)
|
||||||
|
elif arg == option:
|
||||||
|
if len(args) > index:
|
||||||
|
top_dir = args[index + 1]
|
||||||
|
return location.startswith(top_dir)
|
||||||
|
if arg == '--user' and USER_SITE is not None:
|
||||||
|
return location.startswith(USER_SITE)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _fake_setuptools():
|
||||||
|
log.warn('Scanning installed packages')
|
||||||
|
try:
|
||||||
|
import pkg_resources
|
||||||
|
except ImportError:
|
||||||
|
# we're cool
|
||||||
|
log.warn('Setuptools or Distribute does not seem to be installed.')
|
||||||
|
return
|
||||||
|
ws = pkg_resources.working_set
|
||||||
|
try:
|
||||||
|
setuptools_dist = ws.find(
|
||||||
|
pkg_resources.Requirement.parse('setuptools', replacement=False)
|
||||||
|
)
|
||||||
|
except TypeError:
|
||||||
|
# old distribute API
|
||||||
|
setuptools_dist = ws.find(
|
||||||
|
pkg_resources.Requirement.parse('setuptools')
|
||||||
|
)
|
||||||
|
|
||||||
|
if setuptools_dist is None:
|
||||||
|
log.warn('No setuptools distribution found')
|
||||||
|
return
|
||||||
|
# detecting if it was already faked
|
||||||
|
setuptools_location = setuptools_dist.location
|
||||||
|
log.warn('Setuptools installation detected at %s', setuptools_location)
|
||||||
|
|
||||||
|
# if --root or --preix was provided, and if
|
||||||
|
# setuptools is not located in them, we don't patch it
|
||||||
|
if not _under_prefix(setuptools_location):
|
||||||
|
log.warn('Not patching, --root or --prefix is installing Distribute'
|
||||||
|
' in another location')
|
||||||
|
return
|
||||||
|
|
||||||
|
# let's see if its an egg
|
||||||
|
if not setuptools_location.endswith('.egg'):
|
||||||
|
log.warn('Non-egg installation')
|
||||||
|
res = _remove_flat_installation(setuptools_location)
|
||||||
|
if not res:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
log.warn('Egg installation')
|
||||||
|
pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO')
|
||||||
|
if (os.path.exists(pkg_info) and
|
||||||
|
_same_content(pkg_info, SETUPTOOLS_PKG_INFO)):
|
||||||
|
log.warn('Already patched.')
|
||||||
|
return
|
||||||
|
log.warn('Patching...')
|
||||||
|
# let's create a fake egg replacing setuptools one
|
||||||
|
res = _patch_egg_dir(setuptools_location)
|
||||||
|
if not res:
|
||||||
|
return
|
||||||
|
log.warn('Patching complete.')
|
||||||
|
_relaunch()
|
||||||
|
|
||||||
|
|
||||||
|
def _relaunch():
|
||||||
|
log.warn('Relaunching...')
|
||||||
|
# we have to relaunch the process
|
||||||
|
# pip marker to avoid a relaunch bug
|
||||||
|
_cmd1 = ['-c', 'install', '--single-version-externally-managed']
|
||||||
|
_cmd2 = ['-c', 'install', '--record']
|
||||||
|
if sys.argv[:3] == _cmd1 or sys.argv[:3] == _cmd2:
|
||||||
|
sys.argv[0] = 'setup.py'
|
||||||
|
args = [sys.executable] + sys.argv
|
||||||
|
sys.exit(subprocess.call(args))
|
||||||
|
|
||||||
|
|
||||||
|
def _extractall(self, path=".", members=None):
|
||||||
|
"""Extract all members from the archive to the current working
|
||||||
|
directory and set owner, modification time and permissions on
|
||||||
|
directories afterwards. `path' specifies a different directory
|
||||||
|
to extract to. `members' is optional and must be a subset of the
|
||||||
|
list returned by getmembers().
|
||||||
|
"""
|
||||||
|
import copy
|
||||||
|
import operator
|
||||||
|
from tarfile import ExtractError
|
||||||
|
directories = []
|
||||||
|
|
||||||
|
if members is None:
|
||||||
|
members = self
|
||||||
|
|
||||||
|
for tarinfo in members:
|
||||||
|
if tarinfo.isdir():
|
||||||
|
# Extract directories with a safe mode.
|
||||||
|
directories.append(tarinfo)
|
||||||
|
tarinfo = copy.copy(tarinfo)
|
||||||
|
tarinfo.mode = 448 # decimal for oct 0700
|
||||||
|
self.extract(tarinfo, path)
|
||||||
|
|
||||||
|
# Reverse sort directories.
|
||||||
|
if sys.version_info < (2, 4):
|
||||||
|
def sorter(dir1, dir2):
|
||||||
|
return cmp(dir1.name, dir2.name)
|
||||||
|
directories.sort(sorter)
|
||||||
|
directories.reverse()
|
||||||
|
else:
|
||||||
|
directories.sort(key=operator.attrgetter('name'), reverse=True)
|
||||||
|
|
||||||
|
# Set correct owner, mtime and filemode on directories.
|
||||||
|
for tarinfo in directories:
|
||||||
|
dirpath = os.path.join(path, tarinfo.name)
|
||||||
|
try:
|
||||||
|
self.chown(tarinfo, dirpath)
|
||||||
|
self.utime(tarinfo, dirpath)
|
||||||
|
self.chmod(tarinfo, dirpath)
|
||||||
|
except ExtractError:
|
||||||
|
e = sys.exc_info()[1]
|
||||||
|
if self.errorlevel > 1:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
self._dbg(1, "tarfile: %s" % e)
|
||||||
|
|
||||||
|
|
||||||
|
def _build_install_args(options):
|
||||||
|
"""
|
||||||
|
Build the arguments to 'python setup.py install' on the distribute package
|
||||||
|
"""
|
||||||
|
install_args = []
|
||||||
|
if options.user_install:
|
||||||
|
if sys.version_info < (2, 6):
|
||||||
|
log.warn("--user requires Python 2.6 or later")
|
||||||
|
raise SystemExit(1)
|
||||||
|
install_args.append('--user')
|
||||||
|
return install_args
|
||||||
|
|
||||||
|
def _parse_args():
|
||||||
|
"""
|
||||||
|
Parse the command line for options
|
||||||
|
"""
|
||||||
|
parser = optparse.OptionParser()
|
||||||
|
parser.add_option(
|
||||||
|
'--user', dest='user_install', action='store_true', default=False,
|
||||||
|
help='install in user site package (requires Python 2.6 or later)')
|
||||||
|
parser.add_option(
|
||||||
|
'--download-base', dest='download_base', metavar="URL",
|
||||||
|
default=DEFAULT_URL,
|
||||||
|
help='alternative URL from where to download the distribute package')
|
||||||
|
options, args = parser.parse_args()
|
||||||
|
# positional arguments are ignored
|
||||||
|
return options
|
||||||
|
|
||||||
|
def main(version=DEFAULT_VERSION):
|
||||||
|
"""Install or upgrade setuptools and EasyInstall"""
|
||||||
|
options = _parse_args()
|
||||||
|
tarball = download_setuptools(download_base=options.download_base)
|
||||||
|
return _install(tarball, _build_install_args(options))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
|
||||||
|
.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
@echo " pickle to make pickle files"
|
||||||
|
@echo " json to make JSON files"
|
||||||
|
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||||
|
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||||
|
@echo " changes to make an overview over all changed/added/deprecated items"
|
||||||
|
@echo " linkcheck to check all external links for integrity"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf build/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
mkdir -p build/html build/doctrees
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in build/html."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
mkdir -p build/pickle build/doctrees
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
web: pickle
|
||||||
|
|
||||||
|
json:
|
||||||
|
mkdir -p build/json build/doctrees
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) build/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
htmlhelp:
|
||||||
|
mkdir -p build/htmlhelp build/doctrees
|
||||||
|
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||||
|
".hhp project file in build/htmlhelp."
|
||||||
|
|
||||||
|
latex:
|
||||||
|
mkdir -p build/latex build/doctrees
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in build/latex."
|
||||||
|
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
|
||||||
|
"run these through (pdf)latex."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
mkdir -p build/changes build/doctrees
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in build/changes."
|
||||||
|
|
||||||
|
linkcheck:
|
||||||
|
mkdir -p build/linkcheck build/doctrees
|
||||||
|
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) build/linkcheck
|
||||||
|
@echo
|
||||||
|
@echo "Link check complete; look for any errors in the above output " \
|
||||||
|
"or in build/linkcheck/output.txt."
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<h3>Download</h3>
|
||||||
|
|
||||||
|
<p>Current version: <b>{{ version }}</b></p>
|
||||||
|
<p>Get Distribute from the <a href="http://pypi.python.org/pypi/distribute"> Python Package Index</a>
|
||||||
|
|
||||||
|
<h3>Questions? Suggestions? Contributions?</h3>
|
||||||
|
|
||||||
|
<p>Visit the <a href="http://bitbucket.org/tarek/distribute">Distribute project page</a> </p>
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
/**
|
||||||
|
* Sphinx stylesheet -- default theme
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import url("basic.css");
|
||||||
|
|
||||||
|
/* -- page layout ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 100%;
|
||||||
|
background-color: #111111;
|
||||||
|
color: #555555;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.documentwrapper {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 0 0 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr{
|
||||||
|
border: 1px solid #B1B4B6;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.document {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #3E4349;
|
||||||
|
padding: 1em 30px 30px 30px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer {
|
||||||
|
color: #555;
|
||||||
|
width: 100%;
|
||||||
|
padding: 13px 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related {
|
||||||
|
background-color: #6BA81E;
|
||||||
|
line-height: 36px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-shadow: 0px 1px 0 #444444;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related a {
|
||||||
|
color: #E2F3CC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related .right {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar {
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebarwrapper{
|
||||||
|
padding: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3,
|
||||||
|
div.sphinxsidebar h4 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
color: #222222;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-shadow: 1px 1px 0 white
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p {
|
||||||
|
color: #888888;
|
||||||
|
padding: 5px 20px;
|
||||||
|
margin: 0.5em 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p.topless {
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
margin: 10px 10px 10px 20px;
|
||||||
|
padding: 0;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a:hover {
|
||||||
|
color: #E32E00;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1.1em;
|
||||||
|
padding: 0.15em 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input[type=text]{
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- body styles ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #005B81;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #E32E00;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1,
|
||||||
|
div.body h2,
|
||||||
|
div.body h3,
|
||||||
|
div.body h4,
|
||||||
|
div.body h5,
|
||||||
|
div.body h6 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #212224;
|
||||||
|
margin: 30px 0px 10px 0px;
|
||||||
|
padding: 5px 0 5px 0px;
|
||||||
|
text-shadow: 0px 1px 0 white;
|
||||||
|
border-bottom: 1px solid #C8D5E3;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1 { margin-top: 0; font-size: 200%; }
|
||||||
|
div.body h2 { font-size: 150%; }
|
||||||
|
div.body h3 { font-size: 120%; }
|
||||||
|
div.body h4 { font-size: 110%; }
|
||||||
|
div.body h5 { font-size: 100%; }
|
||||||
|
div.body h6 { font-size: 100%; }
|
||||||
|
|
||||||
|
a.headerlink {
|
||||||
|
color: #c60f0f;
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 0 4px 0 4px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.headerlink:hover {
|
||||||
|
background-color: #c60f0f;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body p, div.body dd, div.body li {
|
||||||
|
line-height: 1.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition p.admonition-title + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.highlight{
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.note {
|
||||||
|
background-color: #eeeeee;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.seealso {
|
||||||
|
background-color: #ffffcc;
|
||||||
|
border: 1px solid #ffff66;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
background-color: #fafafa;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.warning {
|
||||||
|
background-color: #ffe4e4;
|
||||||
|
border: 1px solid #ff6666;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #fafafa;
|
||||||
|
color: #222222;
|
||||||
|
line-height: 1.5em;
|
||||||
|
font-size: 1.1em;
|
||||||
|
margin: 1.5em 0 1.5em 0;
|
||||||
|
-webkit-box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
-moz-box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt {
|
||||||
|
color: #222222;
|
||||||
|
padding: 1px 2px;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
#table-of-contents ul {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
.c { color: #999988; font-style: italic } /* Comment */
|
||||||
|
.k { font-weight: bold } /* Keyword */
|
||||||
|
.o { font-weight: bold } /* Operator */
|
||||||
|
.cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||||
|
.cp { color: #999999; font-weight: bold } /* Comment.preproc */
|
||||||
|
.c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||||
|
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||||
|
.ge { font-style: italic } /* Generic.Emph */
|
||||||
|
.gr { color: #aa0000 } /* Generic.Error */
|
||||||
|
.gh { color: #999999 } /* Generic.Heading */
|
||||||
|
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||||
|
.go { color: #111 } /* Generic.Output */
|
||||||
|
.gp { color: #555555 } /* Generic.Prompt */
|
||||||
|
.gs { font-weight: bold } /* Generic.Strong */
|
||||||
|
.gu { color: #aaaaaa } /* Generic.Subheading */
|
||||||
|
.gt { color: #aa0000 } /* Generic.Traceback */
|
||||||
|
.kc { font-weight: bold } /* Keyword.Constant */
|
||||||
|
.kd { font-weight: bold } /* Keyword.Declaration */
|
||||||
|
.kp { font-weight: bold } /* Keyword.Pseudo */
|
||||||
|
.kr { font-weight: bold } /* Keyword.Reserved */
|
||||||
|
.kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||||
|
.m { color: #009999 } /* Literal.Number */
|
||||||
|
.s { color: #bb8844 } /* Literal.String */
|
||||||
|
.na { color: #008080 } /* Name.Attribute */
|
||||||
|
.nb { color: #999999 } /* Name.Builtin */
|
||||||
|
.nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||||
|
.no { color: #ff99ff } /* Name.Constant */
|
||||||
|
.ni { color: #800080 } /* Name.Entity */
|
||||||
|
.ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||||
|
.nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||||
|
.nn { color: #555555 } /* Name.Namespace */
|
||||||
|
.nt { color: #000080 } /* Name.Tag */
|
||||||
|
.nv { color: purple } /* Name.Variable */
|
||||||
|
.ow { font-weight: bold } /* Operator.Word */
|
||||||
|
.mf { color: #009999 } /* Literal.Number.Float */
|
||||||
|
.mh { color: #009999 } /* Literal.Number.Hex */
|
||||||
|
.mi { color: #009999 } /* Literal.Number.Integer */
|
||||||
|
.mo { color: #009999 } /* Literal.Number.Oct */
|
||||||
|
.sb { color: #bb8844 } /* Literal.String.Backtick */
|
||||||
|
.sc { color: #bb8844 } /* Literal.String.Char */
|
||||||
|
.sd { color: #bb8844 } /* Literal.String.Doc */
|
||||||
|
.s2 { color: #bb8844 } /* Literal.String.Double */
|
||||||
|
.se { color: #bb8844 } /* Literal.String.Escape */
|
||||||
|
.sh { color: #bb8844 } /* Literal.String.Heredoc */
|
||||||
|
.si { color: #bb8844 } /* Literal.String.Interpol */
|
||||||
|
.sx { color: #bb8844 } /* Literal.String.Other */
|
||||||
|
.sr { color: #808000 } /* Literal.String.Regex */
|
||||||
|
.s1 { color: #bb8844 } /* Literal.String.Single */
|
||||||
|
.ss { color: #bb8844 } /* Literal.String.Symbol */
|
||||||
|
.bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||||
|
.vc { color: #ff99ff } /* Name.Variable.Class */
|
||||||
|
.vg { color: #ff99ff } /* Name.Variable.Global */
|
||||||
|
.vi { color: #ff99ff } /* Name.Variable.Instance */
|
||||||
|
.il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
[theme]
|
||||||
|
inherit = basic
|
||||||
|
stylesheet = nature.css
|
||||||
|
pygments_style = tango
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
|||||||
|
Welcome to Distribute's documentation!
|
||||||
|
======================================
|
||||||
|
|
||||||
|
`Distribute` is a fork of the `Setuptools` project.
|
||||||
|
|
||||||
|
Distribute is intended to replace Setuptools as the standard method for
|
||||||
|
working with Python module distributions.
|
||||||
|
|
||||||
|
For those who may wonder why they should switch to Distribute over Setuptools, it’s quite simple:
|
||||||
|
|
||||||
|
- Distribute is a drop-in replacement for Setuptools
|
||||||
|
- The code is actively maintained, and has over 10 commiters
|
||||||
|
- Distribute offers Python 3 support !
|
||||||
|
|
||||||
|
Documentation content:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
roadmap
|
||||||
|
python3
|
||||||
|
using
|
||||||
|
setuptools
|
||||||
|
easy_install
|
||||||
|
pkg_resources
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: http://python-distribute.org/pip_distribute.png
|
||||||
|
|
||||||
|
Design done by Idan Gazit (http://pixane.com) - License: cc-by-3.0
|
||||||
|
|
||||||
|
Copy & paste::
|
||||||
|
|
||||||
|
curl -O http://python-distribute.org/distribute_setup.py
|
||||||
|
python distribute_setup.py
|
||||||
|
easy_install pip
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,121 @@
|
|||||||
|
=====================================================
|
||||||
|
Supporting both Python 2 and Python 3 with Distribute
|
||||||
|
=====================================================
|
||||||
|
|
||||||
|
Starting with version 0.6.2, Distribute supports Python 3. Installing and
|
||||||
|
using distribute for Python 3 code works exactly the same as for Python 2
|
||||||
|
code, but Distribute also helps you to support Python 2 and Python 3 from
|
||||||
|
the same source code by letting you run 2to3 on the code as a part of the
|
||||||
|
build process, by setting the keyword parameter ``use_2to3`` to True.
|
||||||
|
|
||||||
|
|
||||||
|
Distribute as help during porting
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Distribute can make the porting process much easier by automatically running
|
||||||
|
2to3 as a part of the test running. To do this you need to configure the
|
||||||
|
setup.py so that you can run the unit tests with ``python setup.py test``.
|
||||||
|
|
||||||
|
See :ref:`test` for more information on this.
|
||||||
|
|
||||||
|
Once you have the tests running under Python 2, you can add the use_2to3
|
||||||
|
keyword parameters to setup(), and start running the tests under Python 3.
|
||||||
|
The test command will now first run the build command during which the code
|
||||||
|
will be converted with 2to3, and the tests will then be run from the build
|
||||||
|
directory, as opposed from the source directory as is normally done.
|
||||||
|
|
||||||
|
Distribute will convert all Python files, and also all doctests in Python
|
||||||
|
files. However, if you have doctests located in separate text files, these
|
||||||
|
will not automatically be converted. By adding them to the
|
||||||
|
``convert_2to3_doctests`` keyword parameter Distrubute will convert them as
|
||||||
|
well.
|
||||||
|
|
||||||
|
By default, the conversion uses all fixers in the ``lib2to3.fixers`` package.
|
||||||
|
To use additional fixers, the parameter ``use_2to3_fixers`` can be set
|
||||||
|
to a list of names of packages containing fixers. To exclude fixers, the
|
||||||
|
parameter ``use_2to3_exclude_fixers`` can be set to fixer names to be
|
||||||
|
skipped.
|
||||||
|
|
||||||
|
A typical setup.py can look something like this::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='your.module',
|
||||||
|
version = '1.0',
|
||||||
|
description='This is your awesome module',
|
||||||
|
author='You',
|
||||||
|
author_email='your@email',
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
packages = ['your', 'you.module'],
|
||||||
|
test_suite = 'your.module.tests',
|
||||||
|
use_2to3 = True,
|
||||||
|
convert_2to3_doctests = ['src/your/module/README.txt'],
|
||||||
|
use_2to3_fixers = ['your.fixers'],
|
||||||
|
use_2to3_exclude_fixers = ['lib2to3.fixes.fix_import'],
|
||||||
|
)
|
||||||
|
|
||||||
|
Differential conversion
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Note that a file will only be copied and converted during the build process
|
||||||
|
if the source file has been changed. If you add a file to the doctests
|
||||||
|
that should be converted, it will not be converted the next time you run
|
||||||
|
the tests, since it hasn't been modified. You need to remove it from the
|
||||||
|
build directory. Also if you run the build, install or test commands before
|
||||||
|
adding the use_2to3 parameter, you will have to remove the build directory
|
||||||
|
before you run the test command, as the files otherwise will seem updated,
|
||||||
|
and no conversion will happen.
|
||||||
|
|
||||||
|
In general, if code doesn't seem to be converted, deleting the build directory
|
||||||
|
and trying again is a good saferguard against the build directory getting
|
||||||
|
"out of sync" with the source directory.
|
||||||
|
|
||||||
|
Distributing Python 3 modules
|
||||||
|
=============================
|
||||||
|
|
||||||
|
You can distribute your modules with Python 3 support in different ways. A
|
||||||
|
normal source distribution will work, but can be slow in installing, as the
|
||||||
|
2to3 process will be run during the install. But you can also distribute
|
||||||
|
the module in binary format, such as a binary egg. That egg will contain the
|
||||||
|
already converted code, and hence no 2to3 conversion is needed during install.
|
||||||
|
|
||||||
|
Advanced features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If you don't want to run the 2to3 conversion on the doctests in Python files,
|
||||||
|
you can turn that off by setting ``setuptools.use_2to3_on_doctests = False``.
|
||||||
|
|
||||||
|
Note on compatibility with setuptools
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Setuptools do not know about the new keyword parameters to support Python 3.
|
||||||
|
As a result it will warn about the unknown keyword parameters if you use
|
||||||
|
setuptools instead of Distribute under Python 2. This is not an error, and
|
||||||
|
install process will continue as normal, but if you want to get rid of that
|
||||||
|
error this is easy. Simply conditionally add the new parameters into an extra
|
||||||
|
dict and pass that dict into setup()::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
import sys
|
||||||
|
|
||||||
|
extra = {}
|
||||||
|
if sys.version_info >= (3,):
|
||||||
|
extra['use_2to3'] = True
|
||||||
|
extra['convert_2to3_doctests'] = ['src/your/module/README.txt']
|
||||||
|
extra['use_2to3_fixers'] = ['your.fixers']
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='your.module',
|
||||||
|
version = '1.0',
|
||||||
|
description='This is your awesome module',
|
||||||
|
author='You',
|
||||||
|
author_email='your@email',
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
packages = ['your', 'you.module'],
|
||||||
|
test_suite = 'your.module.tests',
|
||||||
|
**extra
|
||||||
|
)
|
||||||
|
|
||||||
|
This way the parameters will only be used under Python 3, where you have to
|
||||||
|
use Distribute.
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
=======
|
||||||
|
Roadmap
|
||||||
|
=======
|
||||||
|
|
||||||
|
Distribute has two branches:
|
||||||
|
|
||||||
|
- 0.6.x : provides a Setuptools-0.6cX compatible version
|
||||||
|
- 0.7.x : will provide a refactoring
|
||||||
|
|
||||||
|
0.6.x
|
||||||
|
=====
|
||||||
|
|
||||||
|
Not "much" is going to happen here, we want this branch to be helpful
|
||||||
|
to the community *today* by addressing the 40-or-so bugs
|
||||||
|
that were found in Setuptools and never fixed. This is eventually
|
||||||
|
happen soon because its development is
|
||||||
|
fast : there are up to 5 commiters that are working on it very often
|
||||||
|
(and the number grows weekly.)
|
||||||
|
|
||||||
|
The biggest issue with this branch is that it is providing the same
|
||||||
|
packages and modules setuptools does, and this
|
||||||
|
requires some bootstrapping work where we make sure once Distribute is
|
||||||
|
installed, all Distribution that requires Setuptools
|
||||||
|
will continue to work. This is done by faking the metadata of
|
||||||
|
Setuptools 0.6c9. That's the only way we found to do this.
|
||||||
|
|
||||||
|
There's one major thing though: thanks to the work of Lennart, Alex,
|
||||||
|
Martin, this branch supports Python 3,
|
||||||
|
which is great to have to speed up Py3 adoption.
|
||||||
|
|
||||||
|
The goal of the 0.6.x is to remove as much bugs as we can, and try if
|
||||||
|
possible to remove the patches done
|
||||||
|
on Distutils. We will support 0.6.x maintenance for years and we will
|
||||||
|
promote its usage everywhere instead of
|
||||||
|
Setuptools.
|
||||||
|
|
||||||
|
Some new commands are added there, when they are helpful and don't
|
||||||
|
interact with the rest. I am thinking
|
||||||
|
about "upload_docs" that let you upload documentation to PyPI. The
|
||||||
|
goal is to move it to Distutils
|
||||||
|
at some point, if the documentation feature of PyPI stays and starts to be used.
|
||||||
|
|
||||||
|
0.7.x
|
||||||
|
=====
|
||||||
|
|
||||||
|
We've started to refactor Distribute with this roadmap in mind (and
|
||||||
|
no, as someone said, it's not vaporware,
|
||||||
|
we've done a lot already)
|
||||||
|
|
||||||
|
- 0.7.x can be installed and used with 0.6.x
|
||||||
|
|
||||||
|
- easy_install is going to be deprecated ! use Pip !
|
||||||
|
|
||||||
|
- the version system will be deprecated, in favor of the one in Distutils
|
||||||
|
|
||||||
|
- no more Distutils monkey-patch that happens once you use the code
|
||||||
|
(things like 'from distutils import cmd; cmd.Command = CustomCommand')
|
||||||
|
|
||||||
|
- no more custom site.py (that is: if something misses in Python's
|
||||||
|
site.py we'll add it there instead of patching it)
|
||||||
|
|
||||||
|
- no more namespaced packages system, if PEP 382 (namespaces package
|
||||||
|
support) makes it to 2.7
|
||||||
|
|
||||||
|
- The code is splitted in many packages and might be distributed under
|
||||||
|
several distributions.
|
||||||
|
|
||||||
|
- distribute.resources: that's the old pkg_resources, but
|
||||||
|
reorganized in clean, pep-8 modules. This package will
|
||||||
|
only contain the query APIs and will focus on being PEP 376
|
||||||
|
compatible. We will promote its usage and see if Pip wants
|
||||||
|
to use it as a basis.
|
||||||
|
It will probably shrink a lot though, once the stdlib provides PEP 376 support.
|
||||||
|
|
||||||
|
- distribute.entrypoints: that's the old pkg_resources entry points
|
||||||
|
system, but on its own. it uses distribute.resources
|
||||||
|
|
||||||
|
- distribute.index: that's package_index and a few other things.
|
||||||
|
everything required to interact with PyPI. We will promote
|
||||||
|
its usage and see if Pip wants to use it as a basis.
|
||||||
|
|
||||||
|
- distribute.core (might be renamed to main): that's everything
|
||||||
|
else, and uses the other packages.
|
||||||
|
|
||||||
|
Goal: A first release before (or when) Python 2.7 / 3.2 is out.
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,21 @@
|
|||||||
|
================================
|
||||||
|
Using Distribute in your project
|
||||||
|
================================
|
||||||
|
|
||||||
|
To use Distribute in your project, the recommended way is to ship
|
||||||
|
`distribute_setup.py` alongside your `setup.py` script and call
|
||||||
|
it at the very begining of `setup.py` like this::
|
||||||
|
|
||||||
|
from distribute_setup import use_setuptools
|
||||||
|
use_setuptools()
|
||||||
|
|
||||||
|
Another way is to add ``Distribute`` in the ``install_requires`` option::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['distribute']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
XXX to be finished
|
||||||
@@ -0,0 +1,540 @@
|
|||||||
|
/*
|
||||||
|
* basic.css
|
||||||
|
* ~~~~~~~~~
|
||||||
|
*
|
||||||
|
* Sphinx stylesheet -- basic theme.
|
||||||
|
*
|
||||||
|
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
|
||||||
|
* :license: BSD, see LICENSE for details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -- main layout ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.clearer {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- relbar ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.related {
|
||||||
|
width: 100%;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related h3 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0 10px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related li.right {
|
||||||
|
float: right;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- sidebar --------------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.sphinxsidebarwrapper {
|
||||||
|
padding: 10px 5px 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar {
|
||||||
|
float: left;
|
||||||
|
width: 230px;
|
||||||
|
margin-left: -100%;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul ul,
|
||||||
|
div.sphinxsidebar ul.want-points {
|
||||||
|
margin-left: 20px;
|
||||||
|
list-style: square;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul ul {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar form {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input {
|
||||||
|
border: 1px solid #98dbcc;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar #searchbox input[type="text"] {
|
||||||
|
width: 170px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar #searchbox input[type="submit"] {
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- search page ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
ul.search {
|
||||||
|
margin: 10px 0 0 20px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.search li {
|
||||||
|
padding: 5px 0 5px 20px;
|
||||||
|
background-image: url(file.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: 0 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.search li a {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.search li div.context {
|
||||||
|
color: #888;
|
||||||
|
margin: 2px 0 0 30px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.keywordmatches li.goodmatch a {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- index page ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
table.contentstable {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.contentstable p.biglink {
|
||||||
|
line-height: 150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.biglink {
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.linkdescr {
|
||||||
|
font-style: italic;
|
||||||
|
padding-top: 5px;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- general index --------------------------------------------------------- */
|
||||||
|
|
||||||
|
table.indextable {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.indextable td {
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.indextable dl, table.indextable dd {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.indextable tr.pcap {
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.indextable tr.cap {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.toggler {
|
||||||
|
margin-right: 3px;
|
||||||
|
margin-top: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.modindex-jumpbox {
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
margin: 1em 0 1em 0;
|
||||||
|
padding: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.genindex-jumpbox {
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
margin: 1em 0 1em 0;
|
||||||
|
padding: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- general body styles --------------------------------------------------- */
|
||||||
|
|
||||||
|
a.headerlink {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1:hover > a.headerlink,
|
||||||
|
h2:hover > a.headerlink,
|
||||||
|
h3:hover > a.headerlink,
|
||||||
|
h4:hover > a.headerlink,
|
||||||
|
h5:hover > a.headerlink,
|
||||||
|
h6:hover > a.headerlink,
|
||||||
|
dt:hover > a.headerlink {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body p.caption {
|
||||||
|
text-align: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body td {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-list ul {
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
margin-top: 30px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left {
|
||||||
|
clear: left;
|
||||||
|
float: left;
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right {
|
||||||
|
clear: right;
|
||||||
|
float: right;
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- sidebars -------------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em;
|
||||||
|
border: 1px solid #ddb;
|
||||||
|
padding: 7px 7px 0 7px;
|
||||||
|
background-color: #ffe;
|
||||||
|
width: 40%;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- topics ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 7px 7px 0 7px;
|
||||||
|
margin: 10px 0 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-size: 1.1em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- admonitions ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.admonition {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition dt {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition dl {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title {
|
||||||
|
margin: 0px 10px 5px 0px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body p.centered {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- tables ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
border: 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th {
|
||||||
|
padding: 1px 8px 1px 5px;
|
||||||
|
border-top: 0;
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.field-list td, table.field-list th {
|
||||||
|
border: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.footnote td, table.footnote th {
|
||||||
|
border: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
text-align: left;
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.citation td {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- other body styles ----------------------------------------------------- */
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd p {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd ul, dd table {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin-top: 3px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt:target, .highlighted {
|
||||||
|
background-color: #fbe54e;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.glossary dt {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-list ul {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-list p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.refcount {
|
||||||
|
color: #060;
|
||||||
|
}
|
||||||
|
|
||||||
|
.optional {
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.versionmodified {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-message {
|
||||||
|
background-color: #fda;
|
||||||
|
padding: 5px;
|
||||||
|
border: 3px solid red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footnote:target {
|
||||||
|
background-color: #ffa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-block {
|
||||||
|
display: block;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-block .line-block {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-left: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guilabel, .menuselection {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.accelerator {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.classifier {
|
||||||
|
font-style: oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr, acronym {
|
||||||
|
border-bottom: dotted 1px;
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- code displays --------------------------------------------------------- */
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow: auto;
|
||||||
|
overflow-y: hidden; /* fixes display issues on Chrome browsers */
|
||||||
|
}
|
||||||
|
|
||||||
|
td.linenos pre {
|
||||||
|
padding: 5px 0px;
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.highlighttable {
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.highlighttable td {
|
||||||
|
padding: 0 0.5em 0 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt.descname {
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt.descclassname {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt.xref, a tt {
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewcode-link {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewcode-back {
|
||||||
|
float: right;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.viewcode-block:target {
|
||||||
|
margin: -1px -10px;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- math display ---------------------------------------------------------- */
|
||||||
|
|
||||||
|
img.math {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body div.math p {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.eqno {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- printout stylesheet --------------------------------------------------- */
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
div.document,
|
||||||
|
div.documentwrapper,
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 !important;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar,
|
||||||
|
div.related,
|
||||||
|
div.footer,
|
||||||
|
#top-link {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
/**
|
||||||
|
* Sphinx stylesheet -- default theme
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import url("basic.css");
|
||||||
|
|
||||||
|
/* -- page layout ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 100%;
|
||||||
|
background-color: #111111;
|
||||||
|
color: #555555;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.documentwrapper {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 0 0 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr{
|
||||||
|
border: 1px solid #B1B4B6;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.document {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #3E4349;
|
||||||
|
padding: 1em 30px 30px 30px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer {
|
||||||
|
color: #555;
|
||||||
|
width: 100%;
|
||||||
|
padding: 13px 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related {
|
||||||
|
background-color: #6BA81E;
|
||||||
|
line-height: 36px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-shadow: 0px 1px 0 #444444;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related a {
|
||||||
|
color: #E2F3CC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related .right {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar {
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebarwrapper{
|
||||||
|
padding: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3,
|
||||||
|
div.sphinxsidebar h4 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
color: #222222;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-shadow: 1px 1px 0 white
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p {
|
||||||
|
color: #888888;
|
||||||
|
padding: 5px 20px;
|
||||||
|
margin: 0.5em 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p.topless {
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
margin: 10px 10px 10px 20px;
|
||||||
|
padding: 0;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a:hover {
|
||||||
|
color: #E32E00;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1.1em;
|
||||||
|
padding: 0.15em 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input[type=text]{
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- body styles ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #005B81;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #E32E00;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1,
|
||||||
|
div.body h2,
|
||||||
|
div.body h3,
|
||||||
|
div.body h4,
|
||||||
|
div.body h5,
|
||||||
|
div.body h6 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #212224;
|
||||||
|
margin: 30px 0px 10px 0px;
|
||||||
|
padding: 5px 0 5px 0px;
|
||||||
|
text-shadow: 0px 1px 0 white;
|
||||||
|
border-bottom: 1px solid #C8D5E3;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1 { margin-top: 0; font-size: 200%; }
|
||||||
|
div.body h2 { font-size: 150%; }
|
||||||
|
div.body h3 { font-size: 120%; }
|
||||||
|
div.body h4 { font-size: 110%; }
|
||||||
|
div.body h5 { font-size: 100%; }
|
||||||
|
div.body h6 { font-size: 100%; }
|
||||||
|
|
||||||
|
a.headerlink {
|
||||||
|
color: #c60f0f;
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 0 4px 0 4px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.headerlink:hover {
|
||||||
|
background-color: #c60f0f;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body p, div.body dd, div.body li {
|
||||||
|
line-height: 1.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition p.admonition-title + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.highlight{
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.note {
|
||||||
|
background-color: #eeeeee;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.seealso {
|
||||||
|
background-color: #ffffcc;
|
||||||
|
border: 1px solid #ffff66;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
background-color: #fafafa;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.warning {
|
||||||
|
background-color: #ffe4e4;
|
||||||
|
border: 1px solid #ff6666;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #fafafa;
|
||||||
|
color: #222222;
|
||||||
|
line-height: 1.5em;
|
||||||
|
font-size: 1.1em;
|
||||||
|
margin: 1.5em 0 1.5em 0;
|
||||||
|
-webkit-box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
-moz-box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
box-shadow: 0px 0px 4px #d8d8d8;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt {
|
||||||
|
color: #222222;
|
||||||
|
padding: 1px 2px;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
#table-of-contents ul {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
.c { color: #999988; font-style: italic } /* Comment */
|
||||||
|
.k { font-weight: bold } /* Keyword */
|
||||||
|
.o { font-weight: bold } /* Operator */
|
||||||
|
.cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||||
|
.cp { color: #999999; font-weight: bold } /* Comment.preproc */
|
||||||
|
.c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||||
|
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||||
|
.ge { font-style: italic } /* Generic.Emph */
|
||||||
|
.gr { color: #aa0000 } /* Generic.Error */
|
||||||
|
.gh { color: #999999 } /* Generic.Heading */
|
||||||
|
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||||
|
.go { color: #111 } /* Generic.Output */
|
||||||
|
.gp { color: #555555 } /* Generic.Prompt */
|
||||||
|
.gs { font-weight: bold } /* Generic.Strong */
|
||||||
|
.gu { color: #aaaaaa } /* Generic.Subheading */
|
||||||
|
.gt { color: #aa0000 } /* Generic.Traceback */
|
||||||
|
.kc { font-weight: bold } /* Keyword.Constant */
|
||||||
|
.kd { font-weight: bold } /* Keyword.Declaration */
|
||||||
|
.kp { font-weight: bold } /* Keyword.Pseudo */
|
||||||
|
.kr { font-weight: bold } /* Keyword.Reserved */
|
||||||
|
.kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||||
|
.m { color: #009999 } /* Literal.Number */
|
||||||
|
.s { color: #bb8844 } /* Literal.String */
|
||||||
|
.na { color: #008080 } /* Name.Attribute */
|
||||||
|
.nb { color: #999999 } /* Name.Builtin */
|
||||||
|
.nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||||
|
.no { color: #ff99ff } /* Name.Constant */
|
||||||
|
.ni { color: #800080 } /* Name.Entity */
|
||||||
|
.ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||||
|
.nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||||
|
.nn { color: #555555 } /* Name.Namespace */
|
||||||
|
.nt { color: #000080 } /* Name.Tag */
|
||||||
|
.nv { color: purple } /* Name.Variable */
|
||||||
|
.ow { font-weight: bold } /* Operator.Word */
|
||||||
|
.mf { color: #009999 } /* Literal.Number.Float */
|
||||||
|
.mh { color: #009999 } /* Literal.Number.Hex */
|
||||||
|
.mi { color: #009999 } /* Literal.Number.Integer */
|
||||||
|
.mo { color: #009999 } /* Literal.Number.Oct */
|
||||||
|
.sb { color: #bb8844 } /* Literal.String.Backtick */
|
||||||
|
.sc { color: #bb8844 } /* Literal.String.Char */
|
||||||
|
.sd { color: #bb8844 } /* Literal.String.Doc */
|
||||||
|
.s2 { color: #bb8844 } /* Literal.String.Double */
|
||||||
|
.se { color: #bb8844 } /* Literal.String.Escape */
|
||||||
|
.sh { color: #bb8844 } /* Literal.String.Heredoc */
|
||||||
|
.si { color: #bb8844 } /* Literal.String.Interpol */
|
||||||
|
.sx { color: #bb8844 } /* Literal.String.Other */
|
||||||
|
.sr { color: #808000 } /* Literal.String.Regex */
|
||||||
|
.s1 { color: #bb8844 } /* Literal.String.Single */
|
||||||
|
.ss { color: #bb8844 } /* Literal.String.Symbol */
|
||||||
|
.bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||||
|
.vc { color: #ff99ff } /* Name.Variable.Class */
|
||||||
|
.vg { color: #ff99ff } /* Name.Variable.Global */
|
||||||
|
.vi { color: #ff99ff } /* Name.Variable.Instance */
|
||||||
|
.il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||||
+197
@@ -0,0 +1,197 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Distribute documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Fri Jul 17 14:22:37 2009.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# The contents of this file are pickled, so don't put values in the namespace
|
||||||
|
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#sys.path.append(os.path.abspath('.'))
|
||||||
|
|
||||||
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = []
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.txt'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
#source_encoding = 'utf-8'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'Distribute'
|
||||||
|
copyright = u'2009-2011, The fellowship of the packaging'
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '0.6.36'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
release = '0.6.36'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of documents that shouldn't be included in the build.
|
||||||
|
#unused_docs = []
|
||||||
|
|
||||||
|
# List of directories, relative to source directory, that shouldn't be searched
|
||||||
|
# for source files.
|
||||||
|
exclude_trees = []
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output ---------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
||||||
|
# Sphinx are currently 'default' and 'sphinxdoc'.
|
||||||
|
html_theme = 'nature'
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#html_theme_options = {}
|
||||||
|
|
||||||
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
html_theme_path = ['_theme']
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
html_title = "Distribute documentation"
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
html_short_title = "Distribute"
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
#html_static_path = ['_static']
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
#html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
html_sidebars = {'index': 'indexsidebar.html'}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
html_use_modindex = False
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
html_use_index = False
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = ''
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'Distributedoc'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
|
# The paper size ('letter' or 'a4').
|
||||||
|
#latex_paper_size = 'letter'
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#latex_font_size = '10pt'
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
('index', 'Distribute.tex', ur'Distribute Documentation',
|
||||||
|
ur'The fellowship of the packaging', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#latex_preamble = ''
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_use_modindex = True
|
||||||
+1597
File diff suppressed because it is too large
Load Diff
+36
@@ -0,0 +1,36 @@
|
|||||||
|
Welcome to Distribute's documentation!
|
||||||
|
======================================
|
||||||
|
|
||||||
|
`Distribute` is a fork of the `Setuptools` project.
|
||||||
|
|
||||||
|
Distribute is intended to replace Setuptools as the standard method for
|
||||||
|
working with Python module distributions.
|
||||||
|
|
||||||
|
For those who may wonder why they should switch to Distribute over Setuptools, it’s quite simple:
|
||||||
|
|
||||||
|
- Distribute is a drop-in replacement for Setuptools
|
||||||
|
- The code is actively maintained, and has over 10 commiters
|
||||||
|
- Distribute offers Python 3 support !
|
||||||
|
|
||||||
|
Documentation content:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
roadmap
|
||||||
|
python3
|
||||||
|
using
|
||||||
|
setuptools
|
||||||
|
easy_install
|
||||||
|
pkg_resources
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: http://python-distribute.org/pip_distribute.png
|
||||||
|
|
||||||
|
Design done by Idan Gazit (http://pixane.com) - License: cc-by-3.0
|
||||||
|
|
||||||
|
Copy & paste::
|
||||||
|
|
||||||
|
curl -O http://python-distribute.org/distribute_setup.py
|
||||||
|
python distribute_setup.py
|
||||||
|
easy_install pip
|
||||||
+1955
File diff suppressed because it is too large
Load Diff
+121
@@ -0,0 +1,121 @@
|
|||||||
|
=====================================================
|
||||||
|
Supporting both Python 2 and Python 3 with Distribute
|
||||||
|
=====================================================
|
||||||
|
|
||||||
|
Starting with version 0.6.2, Distribute supports Python 3. Installing and
|
||||||
|
using distribute for Python 3 code works exactly the same as for Python 2
|
||||||
|
code, but Distribute also helps you to support Python 2 and Python 3 from
|
||||||
|
the same source code by letting you run 2to3 on the code as a part of the
|
||||||
|
build process, by setting the keyword parameter ``use_2to3`` to True.
|
||||||
|
|
||||||
|
|
||||||
|
Distribute as help during porting
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Distribute can make the porting process much easier by automatically running
|
||||||
|
2to3 as a part of the test running. To do this you need to configure the
|
||||||
|
setup.py so that you can run the unit tests with ``python setup.py test``.
|
||||||
|
|
||||||
|
See :ref:`test` for more information on this.
|
||||||
|
|
||||||
|
Once you have the tests running under Python 2, you can add the use_2to3
|
||||||
|
keyword parameters to setup(), and start running the tests under Python 3.
|
||||||
|
The test command will now first run the build command during which the code
|
||||||
|
will be converted with 2to3, and the tests will then be run from the build
|
||||||
|
directory, as opposed from the source directory as is normally done.
|
||||||
|
|
||||||
|
Distribute will convert all Python files, and also all doctests in Python
|
||||||
|
files. However, if you have doctests located in separate text files, these
|
||||||
|
will not automatically be converted. By adding them to the
|
||||||
|
``convert_2to3_doctests`` keyword parameter Distrubute will convert them as
|
||||||
|
well.
|
||||||
|
|
||||||
|
By default, the conversion uses all fixers in the ``lib2to3.fixers`` package.
|
||||||
|
To use additional fixers, the parameter ``use_2to3_fixers`` can be set
|
||||||
|
to a list of names of packages containing fixers. To exclude fixers, the
|
||||||
|
parameter ``use_2to3_exclude_fixers`` can be set to fixer names to be
|
||||||
|
skipped.
|
||||||
|
|
||||||
|
A typical setup.py can look something like this::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='your.module',
|
||||||
|
version = '1.0',
|
||||||
|
description='This is your awesome module',
|
||||||
|
author='You',
|
||||||
|
author_email='your@email',
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
packages = ['your', 'you.module'],
|
||||||
|
test_suite = 'your.module.tests',
|
||||||
|
use_2to3 = True,
|
||||||
|
convert_2to3_doctests = ['src/your/module/README.txt'],
|
||||||
|
use_2to3_fixers = ['your.fixers'],
|
||||||
|
use_2to3_exclude_fixers = ['lib2to3.fixes.fix_import'],
|
||||||
|
)
|
||||||
|
|
||||||
|
Differential conversion
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Note that a file will only be copied and converted during the build process
|
||||||
|
if the source file has been changed. If you add a file to the doctests
|
||||||
|
that should be converted, it will not be converted the next time you run
|
||||||
|
the tests, since it hasn't been modified. You need to remove it from the
|
||||||
|
build directory. Also if you run the build, install or test commands before
|
||||||
|
adding the use_2to3 parameter, you will have to remove the build directory
|
||||||
|
before you run the test command, as the files otherwise will seem updated,
|
||||||
|
and no conversion will happen.
|
||||||
|
|
||||||
|
In general, if code doesn't seem to be converted, deleting the build directory
|
||||||
|
and trying again is a good saferguard against the build directory getting
|
||||||
|
"out of sync" with the source directory.
|
||||||
|
|
||||||
|
Distributing Python 3 modules
|
||||||
|
=============================
|
||||||
|
|
||||||
|
You can distribute your modules with Python 3 support in different ways. A
|
||||||
|
normal source distribution will work, but can be slow in installing, as the
|
||||||
|
2to3 process will be run during the install. But you can also distribute
|
||||||
|
the module in binary format, such as a binary egg. That egg will contain the
|
||||||
|
already converted code, and hence no 2to3 conversion is needed during install.
|
||||||
|
|
||||||
|
Advanced features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If you don't want to run the 2to3 conversion on the doctests in Python files,
|
||||||
|
you can turn that off by setting ``setuptools.use_2to3_on_doctests = False``.
|
||||||
|
|
||||||
|
Note on compatibility with setuptools
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Setuptools do not know about the new keyword parameters to support Python 3.
|
||||||
|
As a result it will warn about the unknown keyword parameters if you use
|
||||||
|
setuptools instead of Distribute under Python 2. This is not an error, and
|
||||||
|
install process will continue as normal, but if you want to get rid of that
|
||||||
|
error this is easy. Simply conditionally add the new parameters into an extra
|
||||||
|
dict and pass that dict into setup()::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
import sys
|
||||||
|
|
||||||
|
extra = {}
|
||||||
|
if sys.version_info >= (3,):
|
||||||
|
extra['use_2to3'] = True
|
||||||
|
extra['convert_2to3_doctests'] = ['src/your/module/README.txt']
|
||||||
|
extra['use_2to3_fixers'] = ['your.fixers']
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='your.module',
|
||||||
|
version = '1.0',
|
||||||
|
description='This is your awesome module',
|
||||||
|
author='You',
|
||||||
|
author_email='your@email',
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
packages = ['your', 'you.module'],
|
||||||
|
test_suite = 'your.module.tests',
|
||||||
|
**extra
|
||||||
|
)
|
||||||
|
|
||||||
|
This way the parameters will only be used under Python 3, where you have to
|
||||||
|
use Distribute.
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
=======
|
||||||
|
Roadmap
|
||||||
|
=======
|
||||||
|
|
||||||
|
Distribute has two branches:
|
||||||
|
|
||||||
|
- 0.6.x : provides a Setuptools-0.6cX compatible version
|
||||||
|
- 0.7.x : will provide a refactoring
|
||||||
|
|
||||||
|
0.6.x
|
||||||
|
=====
|
||||||
|
|
||||||
|
Not "much" is going to happen here, we want this branch to be helpful
|
||||||
|
to the community *today* by addressing the 40-or-so bugs
|
||||||
|
that were found in Setuptools and never fixed. This is eventually
|
||||||
|
happen soon because its development is
|
||||||
|
fast : there are up to 5 commiters that are working on it very often
|
||||||
|
(and the number grows weekly.)
|
||||||
|
|
||||||
|
The biggest issue with this branch is that it is providing the same
|
||||||
|
packages and modules setuptools does, and this
|
||||||
|
requires some bootstrapping work where we make sure once Distribute is
|
||||||
|
installed, all Distribution that requires Setuptools
|
||||||
|
will continue to work. This is done by faking the metadata of
|
||||||
|
Setuptools 0.6c9. That's the only way we found to do this.
|
||||||
|
|
||||||
|
There's one major thing though: thanks to the work of Lennart, Alex,
|
||||||
|
Martin, this branch supports Python 3,
|
||||||
|
which is great to have to speed up Py3 adoption.
|
||||||
|
|
||||||
|
The goal of the 0.6.x is to remove as much bugs as we can, and try if
|
||||||
|
possible to remove the patches done
|
||||||
|
on Distutils. We will support 0.6.x maintenance for years and we will
|
||||||
|
promote its usage everywhere instead of
|
||||||
|
Setuptools.
|
||||||
|
|
||||||
|
Some new commands are added there, when they are helpful and don't
|
||||||
|
interact with the rest. I am thinking
|
||||||
|
about "upload_docs" that let you upload documentation to PyPI. The
|
||||||
|
goal is to move it to Distutils
|
||||||
|
at some point, if the documentation feature of PyPI stays and starts to be used.
|
||||||
|
|
||||||
|
0.7.x
|
||||||
|
=====
|
||||||
|
|
||||||
|
We've started to refactor Distribute with this roadmap in mind (and
|
||||||
|
no, as someone said, it's not vaporware,
|
||||||
|
we've done a lot already)
|
||||||
|
|
||||||
|
- 0.7.x can be installed and used with 0.6.x
|
||||||
|
|
||||||
|
- easy_install is going to be deprecated ! use Pip !
|
||||||
|
|
||||||
|
- the version system will be deprecated, in favor of the one in Distutils
|
||||||
|
|
||||||
|
- no more Distutils monkey-patch that happens once you use the code
|
||||||
|
(things like 'from distutils import cmd; cmd.Command = CustomCommand')
|
||||||
|
|
||||||
|
- no more custom site.py (that is: if something misses in Python's
|
||||||
|
site.py we'll add it there instead of patching it)
|
||||||
|
|
||||||
|
- no more namespaced packages system, if PEP 382 (namespaces package
|
||||||
|
support) makes it to 2.7
|
||||||
|
|
||||||
|
- The code is splitted in many packages and might be distributed under
|
||||||
|
several distributions.
|
||||||
|
|
||||||
|
- distribute.resources: that's the old pkg_resources, but
|
||||||
|
reorganized in clean, pep-8 modules. This package will
|
||||||
|
only contain the query APIs and will focus on being PEP 376
|
||||||
|
compatible. We will promote its usage and see if Pip wants
|
||||||
|
to use it as a basis.
|
||||||
|
It will probably shrink a lot though, once the stdlib provides PEP 376 support.
|
||||||
|
|
||||||
|
- distribute.entrypoints: that's the old pkg_resources entry points
|
||||||
|
system, but on its own. it uses distribute.resources
|
||||||
|
|
||||||
|
- distribute.index: that's package_index and a few other things.
|
||||||
|
everything required to interact with PyPI. We will promote
|
||||||
|
its usage and see if Pip wants to use it as a basis.
|
||||||
|
|
||||||
|
- distribute.core (might be renamed to main): that's everything
|
||||||
|
else, and uses the other packages.
|
||||||
|
|
||||||
|
Goal: A first release before (or when) Python 2.7 / 3.2 is out.
|
||||||
|
|
||||||
+3230
File diff suppressed because it is too large
Load Diff
+21
@@ -0,0 +1,21 @@
|
|||||||
|
================================
|
||||||
|
Using Distribute in your project
|
||||||
|
================================
|
||||||
|
|
||||||
|
To use Distribute in your project, the recommended way is to ship
|
||||||
|
`distribute_setup.py` alongside your `setup.py` script and call
|
||||||
|
it at the very begining of `setup.py` like this::
|
||||||
|
|
||||||
|
from distribute_setup import use_setuptools
|
||||||
|
use_setuptools()
|
||||||
|
|
||||||
|
Another way is to add ``Distribute`` in the ``install_requires`` option::
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(...
|
||||||
|
install_requires=['distribute']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
XXX to be finished
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
"""Run the EasyInstall command"""
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from setuptools.command.easy_install import main
|
||||||
|
main()
|
||||||
Vendored
+327
@@ -0,0 +1,327 @@
|
|||||||
|
/* Setuptools Script Launcher for Windows
|
||||||
|
|
||||||
|
This is a stub executable for Windows that functions somewhat like
|
||||||
|
Effbot's "exemaker", in that it runs a script with the same name but
|
||||||
|
a .py extension, using information from a #! line. It differs in that
|
||||||
|
it spawns the actual Python executable, rather than attempting to
|
||||||
|
hook into the Python DLL. This means that the script will run with
|
||||||
|
sys.executable set to the Python executable, where exemaker ends up with
|
||||||
|
sys.executable pointing to itself. (Which means it won't work if you try
|
||||||
|
to run another Python process using sys.executable.)
|
||||||
|
|
||||||
|
To build/rebuild with mingw32, do this in the setuptools project directory:
|
||||||
|
|
||||||
|
gcc -DGUI=0 -mno-cygwin -O -s -o setuptools/cli.exe launcher.c
|
||||||
|
gcc -DGUI=1 -mwindows -mno-cygwin -O -s -o setuptools/gui.exe launcher.c
|
||||||
|
|
||||||
|
It links to msvcrt.dll, but this shouldn't be a problem since it doesn't
|
||||||
|
actually run Python in the same process. Note that using 'exec' instead
|
||||||
|
of 'spawn' doesn't work, because on Windows this leads to the Python
|
||||||
|
executable running in the *background*, attached to the same console
|
||||||
|
window, meaning you get a command prompt back *before* Python even finishes
|
||||||
|
starting. So, we have to use spawnv() and wait for Python to exit before
|
||||||
|
continuing. :(
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
int child_pid=0;
|
||||||
|
|
||||||
|
int fail(char *format, char *data) {
|
||||||
|
/* Print error message to stderr and return 2 */
|
||||||
|
fprintf(stderr, format, data);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *quoted(char *data) {
|
||||||
|
int i, ln = strlen(data), nb;
|
||||||
|
|
||||||
|
/* We allocate twice as much space as needed to deal with worse-case
|
||||||
|
of having to escape everything. */
|
||||||
|
char *result = calloc(ln*2+3, sizeof(char));
|
||||||
|
char *presult = result;
|
||||||
|
|
||||||
|
*presult++ = '"';
|
||||||
|
for (nb=0, i=0; i < ln; i++)
|
||||||
|
{
|
||||||
|
if (data[i] == '\\')
|
||||||
|
nb += 1;
|
||||||
|
else if (data[i] == '"')
|
||||||
|
{
|
||||||
|
for (; nb > 0; nb--)
|
||||||
|
*presult++ = '\\';
|
||||||
|
*presult++ = '\\';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nb = 0;
|
||||||
|
*presult++ = data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; nb > 0; nb--) /* Deal w trailing slashes */
|
||||||
|
*presult++ = '\\';
|
||||||
|
|
||||||
|
*presult++ = '"';
|
||||||
|
*presult++ = 0;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char *loadable_exe(char *exename) {
|
||||||
|
/* HINSTANCE hPython; DLL handle for python executable */
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
/* hPython = LoadLibraryEx(exename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||||
|
if (!hPython) return NULL; */
|
||||||
|
|
||||||
|
/* Return the absolute filename for spawnv */
|
||||||
|
result = calloc(MAX_PATH, sizeof(char));
|
||||||
|
strncpy(result, exename, MAX_PATH);
|
||||||
|
/*if (result) GetModuleFileNameA(hPython, result, MAX_PATH);
|
||||||
|
|
||||||
|
FreeLibrary(hPython); */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *find_exe(char *exename, char *script) {
|
||||||
|
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||||
|
char path[_MAX_PATH], c, *result;
|
||||||
|
|
||||||
|
/* convert slashes to backslashes for uniform search below */
|
||||||
|
result = exename;
|
||||||
|
while (c = *result++) if (c=='/') result[-1] = '\\';
|
||||||
|
|
||||||
|
_splitpath(exename, drive, dir, fname, ext);
|
||||||
|
if (drive[0] || dir[0]=='\\') {
|
||||||
|
return loadable_exe(exename); /* absolute path, use directly */
|
||||||
|
}
|
||||||
|
/* Use the script's parent directory, which should be the Python home
|
||||||
|
(This should only be used for bdist_wininst-installed scripts, because
|
||||||
|
easy_install-ed scripts use the absolute path to python[w].exe
|
||||||
|
*/
|
||||||
|
_splitpath(script, drive, dir, fname, ext);
|
||||||
|
result = dir + strlen(dir) -1;
|
||||||
|
if (*result == '\\') result--;
|
||||||
|
while (*result != '\\' && result>=dir) *result-- = 0;
|
||||||
|
_makepath(path, drive, dir, exename, NULL);
|
||||||
|
return loadable_exe(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char **parse_argv(char *cmdline, int *argc)
|
||||||
|
{
|
||||||
|
/* Parse a command line in-place using MS C rules */
|
||||||
|
|
||||||
|
char **result = calloc(strlen(cmdline), sizeof(char *));
|
||||||
|
char *output = cmdline;
|
||||||
|
char c;
|
||||||
|
int nb = 0;
|
||||||
|
int iq = 0;
|
||||||
|
*argc = 0;
|
||||||
|
|
||||||
|
result[0] = output;
|
||||||
|
while (isspace(*cmdline)) cmdline++; /* skip leading spaces */
|
||||||
|
|
||||||
|
do {
|
||||||
|
c = *cmdline++;
|
||||||
|
if (!c || (isspace(c) && !iq)) {
|
||||||
|
while (nb) {*output++ = '\\'; nb--; }
|
||||||
|
*output++ = 0;
|
||||||
|
result[++*argc] = output;
|
||||||
|
if (!c) return result;
|
||||||
|
while (isspace(*cmdline)) cmdline++; /* skip leading spaces */
|
||||||
|
if (!*cmdline) return result; /* avoid empty arg if trailing ws */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c == '\\')
|
||||||
|
++nb; /* count \'s */
|
||||||
|
else {
|
||||||
|
if (c == '"') {
|
||||||
|
if (!(nb & 1)) { iq = !iq; c = 0; } /* skip " unless odd # of \ */
|
||||||
|
nb = nb >> 1; /* cut \'s in half */
|
||||||
|
}
|
||||||
|
while (nb) {*output++ = '\\'; nb--; }
|
||||||
|
if (c) *output++ = c;
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pass_control_to_child(DWORD control_type) {
|
||||||
|
/*
|
||||||
|
* distribute-issue207
|
||||||
|
* passes the control event to child process (Python)
|
||||||
|
*/
|
||||||
|
if (!child_pid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GenerateConsoleCtrlEvent(child_pid,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL control_handler(DWORD control_type) {
|
||||||
|
/*
|
||||||
|
* distribute-issue207
|
||||||
|
* control event handler callback function
|
||||||
|
*/
|
||||||
|
switch (control_type) {
|
||||||
|
case CTRL_C_EVENT:
|
||||||
|
pass_control_to_child(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int create_and_wait_for_subprocess(char* command) {
|
||||||
|
/*
|
||||||
|
* distribute-issue207
|
||||||
|
* launches child process (Python)
|
||||||
|
*/
|
||||||
|
DWORD return_value = 0;
|
||||||
|
LPSTR commandline = command;
|
||||||
|
STARTUPINFOA s_info;
|
||||||
|
PROCESS_INFORMATION p_info;
|
||||||
|
ZeroMemory(&p_info, sizeof(p_info));
|
||||||
|
ZeroMemory(&s_info, sizeof(s_info));
|
||||||
|
s_info.cb = sizeof(STARTUPINFO);
|
||||||
|
// set-up control handler callback funciotn
|
||||||
|
SetConsoleCtrlHandler((PHANDLER_ROUTINE) control_handler, TRUE);
|
||||||
|
if (!CreateProcessA(NULL, commandline, NULL, NULL, TRUE, 0, NULL, NULL, &s_info, &p_info)) {
|
||||||
|
fprintf(stderr, "failed to create process.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
child_pid = p_info.dwProcessId;
|
||||||
|
// wait for Python to exit
|
||||||
|
WaitForSingleObject(p_info.hProcess, INFINITE);
|
||||||
|
if (!GetExitCodeProcess(p_info.hProcess, &return_value)) {
|
||||||
|
fprintf(stderr, "failed to get exit code from process.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* join_executable_and_args(char *executable, char **args, int argc)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* distribute-issue207
|
||||||
|
* CreateProcess needs a long string of the executable and command-line arguments,
|
||||||
|
* so we need to convert it from the args that was built
|
||||||
|
*/
|
||||||
|
int len,counter;
|
||||||
|
char* cmdline;
|
||||||
|
|
||||||
|
len=strlen(executable)+2;
|
||||||
|
for (counter=1; counter<argc; counter++) {
|
||||||
|
len+=strlen(args[counter])+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdline = (char*)calloc(len, sizeof(char));
|
||||||
|
sprintf(cmdline, "%s", executable);
|
||||||
|
len=strlen(executable);
|
||||||
|
for (counter=1; counter<argc; counter++) {
|
||||||
|
sprintf(cmdline+len, " %s", args[counter]);
|
||||||
|
len+=strlen(args[counter])+1;
|
||||||
|
}
|
||||||
|
return cmdline;
|
||||||
|
}
|
||||||
|
|
||||||
|
int run(int argc, char **argv, int is_gui) {
|
||||||
|
|
||||||
|
char python[256]; /* python executable's filename*/
|
||||||
|
char *pyopt; /* Python option */
|
||||||
|
char script[256]; /* the script's filename */
|
||||||
|
|
||||||
|
int scriptf; /* file descriptor for script file */
|
||||||
|
|
||||||
|
char **newargs, **newargsp, **parsedargs; /* argument array for exec */
|
||||||
|
char *ptr, *end; /* working pointers for string manipulation */
|
||||||
|
char *cmdline;
|
||||||
|
int i, parsedargc; /* loop counter */
|
||||||
|
|
||||||
|
/* compute script name from our .exe name*/
|
||||||
|
GetModuleFileNameA(NULL, script, sizeof(script));
|
||||||
|
end = script + strlen(script);
|
||||||
|
while( end>script && *end != '.')
|
||||||
|
*end-- = '\0';
|
||||||
|
*end-- = '\0';
|
||||||
|
strcat(script, (GUI ? "-script.pyw" : "-script.py"));
|
||||||
|
|
||||||
|
/* figure out the target python executable */
|
||||||
|
|
||||||
|
scriptf = open(script, O_RDONLY);
|
||||||
|
if (scriptf == -1) {
|
||||||
|
return fail("Cannot open %s\n", script);
|
||||||
|
}
|
||||||
|
end = python + read(scriptf, python, sizeof(python));
|
||||||
|
close(scriptf);
|
||||||
|
|
||||||
|
ptr = python-1;
|
||||||
|
while(++ptr < end && *ptr && *ptr!='\n' && *ptr!='\r') {;}
|
||||||
|
|
||||||
|
*ptr-- = '\0';
|
||||||
|
|
||||||
|
if (strncmp(python, "#!", 2)) {
|
||||||
|
/* default to python.exe if no #! header */
|
||||||
|
strcpy(python, "#!python.exe");
|
||||||
|
}
|
||||||
|
|
||||||
|
parsedargs = parse_argv(python+2, &parsedargc);
|
||||||
|
|
||||||
|
/* Using spawnv() can fail strangely if you e.g. find the Cygwin
|
||||||
|
Python, so we'll make sure Windows can find and load it */
|
||||||
|
|
||||||
|
ptr = find_exe(parsedargs[0], script);
|
||||||
|
if (!ptr) {
|
||||||
|
return fail("Cannot find Python executable %s\n", parsedargs[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* printf("Python executable: %s\n", ptr); */
|
||||||
|
|
||||||
|
/* Argument array needs to be
|
||||||
|
parsedargc + argc, plus 1 for null sentinel */
|
||||||
|
|
||||||
|
newargs = (char **)calloc(parsedargc + argc + 1, sizeof(char *));
|
||||||
|
newargsp = newargs;
|
||||||
|
|
||||||
|
*newargsp++ = quoted(ptr);
|
||||||
|
for (i = 1; i<parsedargc; i++) *newargsp++ = quoted(parsedargs[i]);
|
||||||
|
|
||||||
|
*newargsp++ = quoted(script);
|
||||||
|
for (i = 1; i < argc; i++) *newargsp++ = quoted(argv[i]);
|
||||||
|
|
||||||
|
*newargsp++ = NULL;
|
||||||
|
|
||||||
|
/* printf("args 0: %s\nargs 1: %s\n", newargs[0], newargs[1]); */
|
||||||
|
|
||||||
|
if (is_gui) {
|
||||||
|
/* Use exec, we don't need to wait for the GUI to finish */
|
||||||
|
execv(ptr, (const char * const *)(newargs));
|
||||||
|
return fail("Could not exec %s", ptr); /* shouldn't get here! */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* distribute-issue207: using CreateProcessA instead of spawnv
|
||||||
|
*/
|
||||||
|
cmdline = join_executable_and_args(ptr, newargs, parsedargc + argc);
|
||||||
|
return create_and_wait_for_subprocess(cmdline);
|
||||||
|
}
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpCmd, int nShow) {
|
||||||
|
return run(__argc, __argv, GUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
return run(argc, argv, GUI);
|
||||||
|
}
|
||||||
|
|
||||||
+2827
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user