mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
174 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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
|
||||||
|
|||||||
@@ -1,9 +1,51 @@
|
|||||||
|
## 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 +56,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) 2012 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,19 @@
|
|||||||
|
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 'Pylibmc Buildpack Compiler' ./bin/steps/pylibmc > site/pylibmc.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.7/virtualenv_support/pip-1.0.2.tar.gz
|
||||||
|
rm -fr pip/.git
|
||||||
|
tar -pczf vendor/virtualenv-1.7/virtualenv_support/pip-1.0.2.tar.gz pip
|
||||||
|
rm -fr pip
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
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.
|
||||||
It uses [virtualenv](http://www.virtualenv.org/) and [pip](http://www.pip-installer.org/).
|
It uses [virtualenv](http://www.virtualenv.org/) and [pip](http://www.pip-installer.org/).
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
|
|||||||
+165
-114
@@ -1,153 +1,204 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# bin/compile <build-dir> <cache-dir>
|
|
||||||
|
|
||||||
|
# This script serves as 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.
|
||||||
|
|
||||||
|
# ## Usage
|
||||||
|
# Compiling an app into a slug is simple:
|
||||||
|
#
|
||||||
|
# $ bin/compile <build-dir> <cache-dir>
|
||||||
|
|
||||||
|
|
||||||
|
# ## Assumptions
|
||||||
|
#
|
||||||
|
# This buildpack makes the following assumptions:
|
||||||
|
#
|
||||||
|
# - The desired Python VM is available on the base system.
|
||||||
|
# - Library dependencies are available on the base system.
|
||||||
|
# - Django applications should not require any platform-specific configuration.
|
||||||
|
|
||||||
|
# <hr />
|
||||||
|
|
||||||
|
# ## Context
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# The detected application type (`Python`|`Python/Django`).
|
||||||
NAME=$($BIN_DIR/detect $BUILD_DIR)
|
NAME=$($BIN_DIR/detect $BUILD_DIR)
|
||||||
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"
|
|
||||||
|
|
||||||
|
# Where to store the Pip download cache.
|
||||||
|
CACHED_DIRS=".heroku"
|
||||||
|
PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-$CACHE_DIR/pip_downloads}
|
||||||
|
|
||||||
|
# Static configurations for virtualenv caches.
|
||||||
|
LEGACY_VIRTUALENV_LOC="."
|
||||||
|
MODERN_VIRTUALENV_LOC=".heroku/venv"
|
||||||
|
LEGACY_VIRTUALENV_DIRS="bin include lib"
|
||||||
|
LEGACY_VIRTUALENV_TRIGGER="lib/python2.7"
|
||||||
|
|
||||||
|
|
||||||
|
# Python version. This will be used in the future to specify custom Pythons.
|
||||||
|
PYTHON_VERSION="2.7.2"
|
||||||
|
PYTHON_EXE="python2.7"
|
||||||
|
|
||||||
|
# The slug compiler doesn't do a very good job of sanitizing environment variables.
|
||||||
|
unset GIT_DIR
|
||||||
|
|
||||||
|
# We'll need to send these statics to other scripts we `source`.
|
||||||
|
export PIP_DOWNLOAD_CACHE
|
||||||
|
export BUILD_DIR
|
||||||
|
|
||||||
|
# Syntax sugar.
|
||||||
indent() {
|
indent() {
|
||||||
RE="s/^/ /"
|
RE="s/^/ /"
|
||||||
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE"
|
[ $(uname) == "Darwin" ] && sed -l "$RE" || sed -u "$RE"
|
||||||
}
|
}
|
||||||
|
|
||||||
virtualenv() {
|
function virtualenv (){
|
||||||
python - "$@" <<EOF
|
python "$ROOT_DIR/vendor/virtualenv-1.7/virtualenv.py" "$@"
|
||||||
import sys
|
|
||||||
sys.path.insert(0, "$ROOT_DIR/src/virtualenv-1.6.4")
|
|
||||||
import virtualenv
|
|
||||||
virtualenv.main()
|
|
||||||
EOF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function puts-step (){
|
||||||
|
echo "-----> $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
function puts-warn (){
|
||||||
|
echo " ! $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ## Build Time
|
||||||
|
#
|
||||||
|
|
||||||
|
# Switch to the repo's context.
|
||||||
cd $BUILD_DIR
|
cd $BUILD_DIR
|
||||||
|
|
||||||
# reject a non-packaged Django app
|
# ### Sanity Checks
|
||||||
if [ "$NAME" = "Python" ]; then
|
#
|
||||||
[ -f manage.py ] && [ -f settings.py ] && { echo " ! Django app must be in a package subdirectory"; exit 1; }
|
# Just a little peace of mind.
|
||||||
|
|
||||||
|
# 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
|
# ### The Cache
|
||||||
if [ -d "lib" ] || [ -d "bin" ]; 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.";
|
|
||||||
fi
|
|
||||||
|
|
||||||
# reject a conflicting checked-in virtualenv
|
|
||||||
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
|
|
||||||
|
# Create set-aside `.heroku` folder.
|
||||||
|
mkdir -p .heroku
|
||||||
|
|
||||||
|
# Nice defaults.
|
||||||
|
LEGACY_VIRTUALENV=false
|
||||||
|
VIRTUALENV_LOC=$MODERN_VIRTUALENV_LOC
|
||||||
|
|
||||||
|
# Support "old-style" virtualenvs.
|
||||||
|
if [ -d $CACHE_DIR/$LEGACY_VIRTUALENV_TRIGGER ]; then
|
||||||
|
LEGACY_VIRTUALENV=true
|
||||||
|
VIRTUALENV_LOC=$LEGACY_VIRTUALENV_LOC
|
||||||
|
CACHED_DIRS=$LEGACY_VIRTUALENV_DIRS
|
||||||
|
|
||||||
|
# Warn for a checked-in virtualenv.
|
||||||
|
if [ -d "lib" ] || [ -d "bin" ]; then
|
||||||
|
puts-warn "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.";
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reject a conflicting checked-in virtualenv.
|
||||||
|
if [ -f "lib/python2.7" ]; then
|
||||||
|
puts-warn "Checked-in virtualenv conflict."
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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.
|
# ### Virtualenv Setup
|
||||||
mkdir .heroku
|
#
|
||||||
|
|
||||||
|
# Create the virtualenv. Rebuild if corrupt.
|
||||||
# if pylibmc within requirements, use vendored libmemcached
|
# TODO: Bootstrap a bottled Python VM...
|
||||||
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 .)
|
puts-step "Preparing Python interpreter ($PYTHON_VERSION)"
|
||||||
|
puts-step "Creating Virtualenv version $(virtualenv --version)"
|
||||||
|
|
||||||
|
# Try to create the virtualenv.
|
||||||
|
OUT=$(virtualenv --python $PYTHON_EXE --distribute --never-download --prompt='(venv) ' $VIRTUALENV_LOC 2>&1)
|
||||||
|
|
||||||
|
# If there's an error, purge and recreate.
|
||||||
[ $? -ne 0 ] && {
|
[ $? -ne 0 ] && {
|
||||||
echo " ! Error making virtualenv relocatable"
|
puts-warn "Virtualenv corrupt, rebuilding."
|
||||||
|
for dir in $VIRTUALENV_DIRS; do
|
||||||
|
rm -fr $dir &> /dev/null || true
|
||||||
|
done
|
||||||
|
OUT=$(virtualenv --python $PYTHON_EXE --distribute --never-download --prompt='(venv) ' $VIRTUALENV_LOC )
|
||||||
|
}
|
||||||
|
echo "$OUT" | indent
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Pylibmc support.
|
||||||
|
# See [`bin/steps/pylibmc`](pylibmc.html).
|
||||||
|
source $BIN_DIR/steps/pylibmc
|
||||||
|
|
||||||
|
# Activate the Virtualenv.
|
||||||
|
puts-step "Activating virtualenv"
|
||||||
|
source $VIRTUALENV_LOC/bin/activate
|
||||||
|
|
||||||
|
# Install Mercurial if it appears to be required.
|
||||||
|
if (grep -Fiq "hg+" requirements.txt) then
|
||||||
|
pip install --use-mirrors mercurial | indent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install dependencies with Pip.
|
||||||
|
puts-step "Installing dependencies using Pip version $(pip --version | awk '{print $2}')"
|
||||||
|
pip install --use-mirrors -r requirements.txt --src ./.heroku/src | indent
|
||||||
|
|
||||||
|
# Do additional application hackery if applications appears to be a Django app.
|
||||||
|
# Optionally, disable all Django-specific changes with `DISABLE_INJECTION` env.
|
||||||
|
#
|
||||||
|
# See [`bin/steps/django`](django.html).
|
||||||
|
|
||||||
|
if [ "$NAME" = "Python/Django" ] && ! [ "$DISABLE_INJECTION" ]; then
|
||||||
|
source $BIN_DIR/steps/django
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make Virtualenv's paths relative for portability.
|
||||||
|
set +e
|
||||||
|
OUT=$(virtualenv --python $PYTHON_EXE --relocatable $VIRTUALENV_LOC)
|
||||||
|
[ $? -ne 0 ] && {
|
||||||
|
puts-warn "Error making virtualenv relocatable"
|
||||||
echo "$OUT" | indent
|
echo "$OUT" | indent
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# store new artifacts in cache
|
# ### Finalize
|
||||||
for dir in $VIRTUALENV_DIRS; do
|
#
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# ### Fin.
|
||||||
+29
-4
@@ -1,8 +1,33 @@
|
|||||||
#!/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
|
||||||
|
|
||||||
|
# If only `setup.py`, assume that the app is not Django.
|
||||||
|
if [ ! -f $BUILD_DIR/requirements.txt ]; then
|
||||||
|
echo Python
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# `Python/Django` if `**/settings.py` is present and `django` exists in
|
||||||
|
# `requirements.txt`.
|
||||||
|
#
|
||||||
|
# Otherwise, `Python`.
|
||||||
|
|
||||||
|
ls $BUILD_DIR/**/settings.py &> /dev/null && (grep -Fiq "django" $BUILD_DIR/requirements.txt) && echo Python/Django || echo Python
|
||||||
+10
-5
@@ -8,17 +8,22 @@ NAME=$($BIN_DIR/detect $BUILD_DIR) || exit 1
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
---
|
---
|
||||||
config_vars:
|
config_vars:
|
||||||
PATH: bin:/usr/local/bin:/usr/bin:/bin
|
PATH: /app/.heroku/venv/bin:/bin:/usr/local/bin:/usr/bin
|
||||||
PYTHONUNBUFFERED: true
|
PYTHONUNBUFFERED: true
|
||||||
LIBRARY_PATH: .heroku/vendor/lib
|
LIBRARY_PATH: /app/.heroku/vendor/lib
|
||||||
LD_LIBRARY_PATH: .heroku/vendor/lib
|
LD_LIBRARY_PATH: /app/.heroku/vendor/lib
|
||||||
|
LANG: en_US.UTF-8
|
||||||
|
PYTHONHASHSEED: random
|
||||||
|
PYTHONHOME: /app/.heroku/venv/
|
||||||
|
PYTHONPATH: /app/
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
||||||
[ "$NAME" = "Python/Django" ] || exit 0
|
[ "$NAME" = "Python/Django" ] || exit 0
|
||||||
|
|
||||||
SETTINGS_FILE=$(cd $BUILD_DIR && ls **/settings.py | head -1)
|
MANAGE_FILE=$(cd $BUILD_DIR && find . -maxdepth 2 -type f -name 'manage.py' | head -1)
|
||||||
PROJECT=$(dirname $SETTINGS_FILE)
|
MANAGE_FILE=${MANAGE_FILE:2}
|
||||||
|
PROJECT=$(dirname $MANAGE_FILE)
|
||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
|
|||||||
Executable
+70
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This script serves as the Django 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`](/).
|
||||||
|
|
||||||
|
# ## Sanity Checks
|
||||||
|
#
|
||||||
|
|
||||||
|
# Reject a Django app that appears to be packaged incorrectly.
|
||||||
|
if [ -f settings.py ]; then
|
||||||
|
echo " ! Django app must be in a package subdirectory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "-----> Injecting Django settings..."
|
||||||
|
|
||||||
|
|
||||||
|
SETTINGS_FILE=$(find . -maxdepth 2 -type f -name '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
|
||||||
|
|
||||||
|
# Register database schemes in URLs.
|
||||||
|
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 Exception:
|
||||||
|
print 'Unexpected error:', sys.exc_info()
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/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"
|
||||||
|
|
||||||
|
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||||
|
if (grep -Fiq "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/Django"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testDetectDjango13() {
|
||||||
|
detect "django-1.3-skeleton"
|
||||||
|
assertCapturedEquals "Python/Django"
|
||||||
|
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
|
||||||
|
|
||||||
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
|
||||||
@@ -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 @@
|
|||||||
|
httpbin
|
||||||
+1048
File diff suppressed because it is too large
Load Diff
Vendored
+204
@@ -0,0 +1,204 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# taken from
|
||||||
|
# https://github.com/ryanbrainard/heroku-buildpack-testrunner/blob/master/lib/test_utils.sh
|
||||||
|
|
||||||
|
oneTimeSetUp()
|
||||||
|
{
|
||||||
|
TEST_SUITE_CACHE="$(mktemp -d ${SHUNIT_TMPDIR}/test_suite_cache.XXXX)"
|
||||||
|
}
|
||||||
|
|
||||||
|
oneTimeTearDown()
|
||||||
|
{
|
||||||
|
rm -rf ${TEST_SUITE_CACHE}
|
||||||
|
}
|
||||||
|
|
||||||
|
setUp()
|
||||||
|
{
|
||||||
|
OUTPUT_DIR="$(mktemp -d ${SHUNIT_TMPDIR}/output.XXXX)"
|
||||||
|
STD_OUT="${OUTPUT_DIR}/stdout"
|
||||||
|
STD_ERR="${OUTPUT_DIR}/stderr"
|
||||||
|
BUILD_DIR="${OUTPUT_DIR}/build"
|
||||||
|
CACHE_DIR="${OUTPUT_DIR}/cache"
|
||||||
|
mkdir -p ${OUTPUT_DIR}
|
||||||
|
mkdir -p ${BUILD_DIR}
|
||||||
|
mkdir -p ${CACHE_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
tearDown()
|
||||||
|
{
|
||||||
|
rm -rf ${OUTPUT_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
capture()
|
||||||
|
{
|
||||||
|
resetCapture
|
||||||
|
|
||||||
|
LAST_COMMAND="$@"
|
||||||
|
|
||||||
|
$@ >${STD_OUT} 2>${STD_ERR}
|
||||||
|
RETURN=$?
|
||||||
|
rtrn=${RETURN} # deprecated
|
||||||
|
}
|
||||||
|
|
||||||
|
resetCapture()
|
||||||
|
{
|
||||||
|
if [ -f ${STD_OUT} ]; then
|
||||||
|
rm ${STD_OUT}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f ${STD_ERR} ]; then
|
||||||
|
rm ${STD_ERR}
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset LAST_COMMAND
|
||||||
|
unset RETURN
|
||||||
|
unset rtrn # deprecated
|
||||||
|
}
|
||||||
|
|
||||||
|
detect()
|
||||||
|
{
|
||||||
|
capture ${BUILDPACK_HOME}/bin/detect ${BUILD_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
compile()
|
||||||
|
{
|
||||||
|
capture ${BUILDPACK_HOME}/bin/compile ${BUILD_DIR} ${CACHE_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
release()
|
||||||
|
{
|
||||||
|
capture ${BUILDPACK_HOME}/bin/release ${BUILD_DIR}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertCapturedEquals()
|
||||||
|
{
|
||||||
|
assertEquals "$@" "$(cat ${STD_OUT})"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertCapturedNotEquals()
|
||||||
|
{
|
||||||
|
assertNotEquals "$@" "$(cat ${STD_OUT})"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertCaptured()
|
||||||
|
{
|
||||||
|
assertFileContains "$@" "${STD_OUT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertNotCaptured()
|
||||||
|
{
|
||||||
|
assertFileNotContains "$@" "${STD_OUT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertCapturedSuccess()
|
||||||
|
{
|
||||||
|
assertEquals "Expected captured exit code to be 0; was <${RETURN}>" "0" "${RETURN}"
|
||||||
|
assertEquals "Expected STD_ERR to be empty; was <$(cat ${STD_ERR})>" "" "$(cat ${STD_ERR})"
|
||||||
|
}
|
||||||
|
|
||||||
|
# assertCapturedError [[expectedErrorCode] expectedErrorMsg]
|
||||||
|
assertCapturedError()
|
||||||
|
{
|
||||||
|
if [ $# -gt 1 ]; then
|
||||||
|
expectedErrorCode=${1}
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
expectedErrorMsg=${1:-""}
|
||||||
|
|
||||||
|
if [ -z ${expectedErrorCode} ]; then
|
||||||
|
assertTrue "Expected captured exit code to be greater than 0; was <${RETURN}>" "[ ${RETURN} -gt 0 ]"
|
||||||
|
else
|
||||||
|
assertTrue "Expected captured exit code to be <${expectedErrorCode}>; was <${RETURN}>" "[ ${RETURN} -eq ${expectedErrorCode} ]"
|
||||||
|
fi
|
||||||
|
|
||||||
|
assertFileContains "Expected STD_OUT to contain error <${expectedErrorMsg}>" "${expectedErrorMsg}" "${STD_OUT}"
|
||||||
|
assertEquals "STD_ERR should always be empty" "" "$(cat ${STD_ERR})"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertAppDetected()
|
||||||
|
{
|
||||||
|
expectedAppType=${1?"Must provide app type"}
|
||||||
|
|
||||||
|
assertCapturedSuccess
|
||||||
|
assertEquals "${expectedAppType}" "$(cat ${STD_OUT})"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertNoAppDetected()
|
||||||
|
{
|
||||||
|
assertEquals "1" "${RETURN}"
|
||||||
|
assertEquals "no" "$(cat ${STD_OUT})"
|
||||||
|
assertEquals "" "$(cat ${STD_ERR})"
|
||||||
|
}
|
||||||
|
|
||||||
|
_assertContains()
|
||||||
|
{
|
||||||
|
if [ 5 -eq $# ]; then
|
||||||
|
msg=$1
|
||||||
|
shift
|
||||||
|
elif [ ! 4 -eq $# ]; then
|
||||||
|
fail "Expected 4 or 5 parameters; Receieved $# parameters"
|
||||||
|
fi
|
||||||
|
|
||||||
|
needle=$1
|
||||||
|
haystack=$2
|
||||||
|
expectation=$3
|
||||||
|
haystack_type=$4
|
||||||
|
|
||||||
|
case "${haystack_type}" in
|
||||||
|
"file") grep -q -F -e "${needle}" ${haystack} ;;
|
||||||
|
"text") echo "${haystack}" | grep -q -F -e "${needle}" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "${expectation}" != "$?" ]; then
|
||||||
|
case "${expectation}" in
|
||||||
|
0) default_msg="Expected <${haystack}> to contain <${needle}>" ;;
|
||||||
|
1) default_msg="Did not expect <${haystack}> to contain <${needle}>" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fail "${msg:-${default_msg}}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
assertContains()
|
||||||
|
{
|
||||||
|
_assertContains "$@" 0 "text"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertNotContains()
|
||||||
|
{
|
||||||
|
_assertContains "$@" 1 "text"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFileContains()
|
||||||
|
{
|
||||||
|
_assertContains "$@" 0 "file"
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFileNotContains()
|
||||||
|
{
|
||||||
|
_assertContains "$@" 1 "file"
|
||||||
|
}
|
||||||
|
|
||||||
|
command_exists () {
|
||||||
|
type "$1" > /dev/null 2>&1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFileMD5()
|
||||||
|
{
|
||||||
|
expectedHash=$1
|
||||||
|
filename=$2
|
||||||
|
|
||||||
|
if command_exists "md5sum"; then
|
||||||
|
md5_cmd="md5sum ${filename}"
|
||||||
|
expected_md5_cmd_output="${expectedHash} ${filename}"
|
||||||
|
elif command_exists "md5"; then
|
||||||
|
md5_cmd="md5 ${filename}"
|
||||||
|
expected_md5_cmd_output="MD5 (${filename}) = ${expectedHash}"
|
||||||
|
else
|
||||||
|
fail "no suitable MD5 hashing command found on this system"
|
||||||
|
fi
|
||||||
|
|
||||||
|
assertEquals "${expected_md5_cmd_output}" "`${md5_cmd}`"
|
||||||
|
}
|
||||||
@@ -13,11 +13,15 @@ Jannis Leidel
|
|||||||
Contributors
|
Contributors
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
Alex Grönholm
|
||||||
Antonio Cuni
|
Antonio Cuni
|
||||||
Armin Ronacher
|
Armin Ronacher
|
||||||
|
Chris McDonough
|
||||||
|
Christian Stefanescu
|
||||||
Christopher Nilsson
|
Christopher Nilsson
|
||||||
Curt Micol
|
Curt Micol
|
||||||
Douglas Creager
|
Douglas Creager
|
||||||
|
Gunnlaugur Thor Briem
|
||||||
Jeff Hammel
|
Jeff Hammel
|
||||||
Jorge Vargas
|
Jorge Vargas
|
||||||
Josh Bronson
|
Josh Bronson
|
||||||
Vendored
+16
@@ -0,0 +1,16 @@
|
|||||||
|
virtualenv
|
||||||
|
==========
|
||||||
|
|
||||||
|
See docs/index.txt for user documentation.
|
||||||
|
|
||||||
|
Contributor notes
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
* virtualenv is designed to work on python 2 and 3 with a single code base.
|
||||||
|
Use Python 3 print-function syntax, and always use sys.exc_info()[1]
|
||||||
|
inside the `except` block to get at exception objects.
|
||||||
|
|
||||||
|
* virtualenv uses git-flow_ to `coordinate development`_.
|
||||||
|
|
||||||
|
.. _git-flow: https://github.com/nvie/gitflow
|
||||||
|
.. _coordinate development: http://nvie.com/posts/a-successful-git-branching-model/
|
||||||
+102
-23
@@ -1,6 +1,6 @@
|
|||||||
Metadata-Version: 1.0
|
Metadata-Version: 1.0
|
||||||
Name: virtualenv
|
Name: virtualenv
|
||||||
Version: 1.6.4
|
Version: 1.7
|
||||||
Summary: Virtual Python Environment builder
|
Summary: Virtual Python Environment builder
|
||||||
Home-page: http://www.virtualenv.org
|
Home-page: http://www.virtualenv.org
|
||||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
||||||
@@ -22,9 +22,16 @@ Description:
|
|||||||
It is licensed under an
|
It is licensed under an
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
You can install it with ``pip install virtualenv``, or the `latest
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||||
with ``easy_install virtualenv==dev``.
|
with ``pip install virtualenv==dev``.
|
||||||
|
|
||||||
|
You can also use ``easy_install``, or if you have no Python package manager
|
||||||
|
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||||
|
it with ``python virtualenv.py``.
|
||||||
|
|
||||||
|
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||||
|
|
||||||
|
|
||||||
What It Does
|
What It Does
|
||||||
------------
|
------------
|
||||||
@@ -74,9 +81,65 @@ Description:
|
|||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
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
|
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||||
the environment.
|
the environment.
|
||||||
|
|
||||||
|
Environment variables and configuration files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
virtualenv can not only be configured by passing command line options such as
|
||||||
|
``--distribute`` but also by two other means:
|
||||||
|
|
||||||
|
- Environment variables
|
||||||
|
|
||||||
|
Each command line option is automatically used to look for environment
|
||||||
|
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||||
|
the name of the command line options are capitalized and have dashes
|
||||||
|
(``'-'``) replaced with underscores (``'_'``).
|
||||||
|
|
||||||
|
For example, to automatically install Distribute instead of setuptools
|
||||||
|
you can also set an environment variable::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||||
|
$ python virtualenv.py ENV
|
||||||
|
|
||||||
|
It's the same as passing the option to virtualenv directly::
|
||||||
|
|
||||||
|
$ python virtualenv.py --distribute ENV
|
||||||
|
|
||||||
|
This also works for appending command line options, like ``--find-links``.
|
||||||
|
Just leave an empty space between the passsed values, e.g.::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||||
|
$ virtualenv ENV
|
||||||
|
|
||||||
|
is the same as calling::
|
||||||
|
|
||||||
|
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||||
|
|
||||||
|
- Config files
|
||||||
|
|
||||||
|
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||||
|
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||||
|
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||||
|
|
||||||
|
The names of the settings are derived from the long command line option,
|
||||||
|
e.g. the option ``--distribute`` would look like this::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
distribute = true
|
||||||
|
|
||||||
|
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||||
|
lines::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
extra-search-dir =
|
||||||
|
/path/to/dists
|
||||||
|
/path/to/other/dists
|
||||||
|
|
||||||
|
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||||
|
of supported options.
|
||||||
|
|
||||||
Windows Notes
|
Windows Notes
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -167,7 +230,7 @@ Description:
|
|||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
f = open('blog-bootstrap.py', 'w').write(output)
|
||||||
|
|
||||||
Another example is available `here
|
Another example is available `here
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||||
|
|
||||||
activate script
|
activate script
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
@@ -202,15 +265,16 @@ Description:
|
|||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
And use ``deactivate.bat`` to undo the changes.
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
The ``--system-site-packages`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||||
wherever your global site-packages directory is). This can be used if
|
(or wherever your global site-packages directory is).
|
||||||
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
|
This can be used if you have control over the global site-packages directory,
|
||||||
system.
|
and you want to depend on the packages there. If you want isolation from the
|
||||||
|
global system, do not use this flag.
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
Using Virtualenv without ``bin/python``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -231,11 +295,12 @@ Description:
|
|||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
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
|
you to use an existing interpreter. Items in your environment will show up
|
||||||
first on ``sys.path``, before global items. However, global items will
|
first on ``sys.path``, before global items. However, global items will
|
||||||
always be accessible -- this technique does not support the
|
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
in creating the environment, whether it was or not). Also, this cannot undo
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
the activation of other environments, or modules that have been imported.
|
||||||
instance, activate an environment before a web request; you should activate
|
You shouldn't try to, for instance, activate an environment before a web
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
request; you should activate *one* environment as early as possible, and not
|
||||||
|
do it again in that process.
|
||||||
|
|
||||||
Making Environments Relocatable
|
Making Environments Relocatable
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -272,8 +337,8 @@ Description:
|
|||||||
different (either different versions, or a different filesystem
|
different (either different versions, or a different filesystem
|
||||||
layout).
|
layout).
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
If you use this flag to create an environment, currently, the
|
||||||
use this on an environment.
|
``--system-site-packages`` option will be implied.
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
The ``--extra-search-dir`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -419,10 +484,24 @@ Description:
|
|||||||
Changes & News
|
Changes & News
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Next release (1.7) schedule
|
1.7 (2011-11-30)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||||
|
|
||||||
|
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||||
|
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||||
|
used. Thanks Chris McDonough.
|
||||||
|
|
||||||
|
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||||
|
previous default global-site-package-including behavior back.
|
||||||
|
|
||||||
|
* Added ability to set command options as environment variables and options
|
||||||
|
in a ``virtualenv.ini`` file.
|
||||||
|
|
||||||
|
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||||
|
|
||||||
|
* Made ``virtualenv.py`` script executable.
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
1.6.4 (2011-07-21)
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
+70
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
Helper script to rebuild virtualenv.py from virtualenv_support
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
here = os.path.dirname(__file__)
|
||||||
|
script = os.path.join(here, '..', 'virtualenv.py')
|
||||||
|
|
||||||
|
file_regex = re.compile(
|
||||||
|
r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
|
||||||
|
re.S)
|
||||||
|
file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
|
||||||
|
|
||||||
|
def rebuild():
|
||||||
|
f = open(script, 'rb')
|
||||||
|
content = f.read()
|
||||||
|
f.close()
|
||||||
|
parts = []
|
||||||
|
last_pos = 0
|
||||||
|
match = None
|
||||||
|
for match in file_regex.finditer(content):
|
||||||
|
parts.append(content[last_pos:match.start()])
|
||||||
|
last_pos = match.end()
|
||||||
|
filename = match.group(1)
|
||||||
|
varname = match.group(2)
|
||||||
|
data = match.group(3)
|
||||||
|
print('Found reference to file %s' % filename)
|
||||||
|
f = open(os.path.join(here, '..', 'virtualenv_support', filename), 'rb')
|
||||||
|
c = f.read()
|
||||||
|
f.close()
|
||||||
|
new_data = c.encode('zlib').encode('base64')
|
||||||
|
if new_data == data:
|
||||||
|
print(' Reference up to date (%s bytes)' % len(c))
|
||||||
|
parts.append(match.group(0))
|
||||||
|
continue
|
||||||
|
print(' Content changed (%s bytes -> %s bytes)' % (
|
||||||
|
zipped_len(data), len(c)))
|
||||||
|
new_match = file_template % dict(
|
||||||
|
filename=filename,
|
||||||
|
varname=varname,
|
||||||
|
data=new_data)
|
||||||
|
parts.append(new_match)
|
||||||
|
parts.append(content[last_pos:])
|
||||||
|
new_content = ''.join(parts)
|
||||||
|
if new_content != content:
|
||||||
|
sys.stdout.write('Content updated; overwriting... ')
|
||||||
|
f = open(script, 'wb')
|
||||||
|
f.write(new_content)
|
||||||
|
f.close()
|
||||||
|
print('done.')
|
||||||
|
else:
|
||||||
|
print('No changes in content')
|
||||||
|
if match is None:
|
||||||
|
print('No variables were matched/found')
|
||||||
|
|
||||||
|
def zipped_len(data):
|
||||||
|
if not data:
|
||||||
|
return 'no data'
|
||||||
|
try:
|
||||||
|
return len(data.decode('base64').decode('zlib'))
|
||||||
|
except:
|
||||||
|
return 'unknown'
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
rebuild()
|
||||||
|
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
Refresh any files in ../virtualenv_support/ that come from elsewhere
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
try:
|
||||||
|
from urllib.request import urlopen
|
||||||
|
except ImportError:
|
||||||
|
from urllib2 import urlopen
|
||||||
|
import sys
|
||||||
|
|
||||||
|
here = os.path.dirname(__file__)
|
||||||
|
support_files = os.path.join(here, '..', 'virtualenv_support')
|
||||||
|
|
||||||
|
files = [
|
||||||
|
('http://peak.telecommunity.com/dist/ez_setup.py', 'ez_setup.py'),
|
||||||
|
('http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg', 'setuptools-0.6c11-py2.6.egg'),
|
||||||
|
('http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c11-py2.5.egg', 'setuptools-0.6c11-py2.5.egg'),
|
||||||
|
('http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg', 'setuptools-0.6c11-py2.4.egg'),
|
||||||
|
('http://python-distribute.org/distribute_setup.py', 'distribute_setup.py'),
|
||||||
|
('http://pypi.python.org/packages/source/d/distribute/distribute-0.6.24.tar.gz', 'distribute-0.6.24.tar.gz'),
|
||||||
|
('http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz', 'pip-1.0.2.tar.gz'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def main():
|
||||||
|
for url, filename in files:
|
||||||
|
sys.stdout.write('fetching %s ... ' % url)
|
||||||
|
sys.stdout.flush()
|
||||||
|
f = urlopen(url)
|
||||||
|
content = f.read()
|
||||||
|
f.close()
|
||||||
|
print('done.')
|
||||||
|
filename = os.path.join(support_files, filename)
|
||||||
|
if os.path.exists(filename):
|
||||||
|
f = open(filename, 'rb')
|
||||||
|
cur_content = f.read()
|
||||||
|
f.close()
|
||||||
|
else:
|
||||||
|
cur_content = ''
|
||||||
|
if cur_content == content:
|
||||||
|
print(' %s up-to-date' % filename)
|
||||||
|
else:
|
||||||
|
print(' overwriting %s' % filename)
|
||||||
|
f = open(filename, 'wb')
|
||||||
|
f.write(content)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
Vendored
+130
@@ -0,0 +1,130 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
@echo " dirhtml to make HTML files named index.html in directories"
|
||||||
|
@echo " singlehtml to make a single large HTML file"
|
||||||
|
@echo " pickle to make pickle files"
|
||||||
|
@echo " json to make JSON files"
|
||||||
|
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||||
|
@echo " qthelp to make HTML files and a qthelp project"
|
||||||
|
@echo " devhelp to make HTML files and a Devhelp project"
|
||||||
|
@echo " epub to make an epub"
|
||||||
|
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||||
|
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||||
|
@echo " text to make text files"
|
||||||
|
@echo " man to make manual pages"
|
||||||
|
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||||
|
@echo " linkcheck to check all external links for integrity"
|
||||||
|
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf $(BUILDDIR)/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
|
dirhtml:
|
||||||
|
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||||
|
|
||||||
|
singlehtml:
|
||||||
|
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
json:
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
htmlhelp:
|
||||||
|
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||||
|
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||||
|
|
||||||
|
qthelp:
|
||||||
|
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||||
|
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||||
|
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-compressor.qhcp"
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-compressor.qhc"
|
||||||
|
|
||||||
|
devhelp:
|
||||||
|
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished."
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# mkdir -p $$HOME/.local/share/devhelp/django-compressor"
|
||||||
|
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-compressor"
|
||||||
|
@echo "# devhelp"
|
||||||
|
|
||||||
|
epub:
|
||||||
|
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||||
|
|
||||||
|
latex:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||||
|
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||||
|
"(use \`make latexpdf' here to do that automatically)."
|
||||||
|
|
||||||
|
latexpdf:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo "Running LaTeX files through pdflatex..."
|
||||||
|
make -C $(BUILDDIR)/latex all-pdf
|
||||||
|
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||||
|
|
||||||
|
text:
|
||||||
|
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||||
|
|
||||||
|
man:
|
||||||
|
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||||
|
|
||||||
|
linkcheck:
|
||||||
|
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||||
|
@echo
|
||||||
|
@echo "Link check complete; look for any errors in the above output " \
|
||||||
|
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||||
|
@echo "Testing of doctests in the sources finished, look at the " \
|
||||||
|
"results in $(BUILDDIR)/doctest/output.txt."
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
/**
|
||||||
|
* Sphinx stylesheet -- default theme
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import url("basic.css");
|
||||||
|
|
||||||
|
/* -- page layout ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 100%;
|
||||||
|
background-color: #111;
|
||||||
|
color: #555;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.documentwrapper {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 0 0 230px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr{
|
||||||
|
border: 1px solid #B1B4B6;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.document {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #3E4349;
|
||||||
|
padding: 0 30px 30px 30px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer {
|
||||||
|
color: #555;
|
||||||
|
width: 100%;
|
||||||
|
padding: 13px 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer a {
|
||||||
|
color: #444;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related {
|
||||||
|
background-color: #6BA81E;
|
||||||
|
line-height: 32px;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0px 1px 0 #444;
|
||||||
|
font-size: 0.80em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related a {
|
||||||
|
color: #E2F3CC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar {
|
||||||
|
font-size: 0.75em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebarwrapper{
|
||||||
|
padding: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3,
|
||||||
|
div.sphinxsidebar h4 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
color: #222;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 10px;
|
||||||
|
background-color: #ddd;
|
||||||
|
text-shadow: 1px 1px 0 white
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h4{
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 a {
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.sphinxsidebar p {
|
||||||
|
color: #888;
|
||||||
|
padding: 5px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p.topless {
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
margin: 10px 20px;
|
||||||
|
padding: 0;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a {
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input[type=text]{
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- body styles ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #005B81;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #E32E00;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1,
|
||||||
|
div.body h2,
|
||||||
|
div.body h3,
|
||||||
|
div.body h4,
|
||||||
|
div.body h5,
|
||||||
|
div.body h6 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #BED4EB;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #212224;
|
||||||
|
margin: 30px 0px 10px 0px;
|
||||||
|
padding: 5px 0 5px 10px;
|
||||||
|
text-shadow: 0px 1px 0 white
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
|
||||||
|
div.body h2 { font-size: 150%; background-color: #C8D5E3; }
|
||||||
|
div.body h3 { font-size: 120%; background-color: #D8DEE3; }
|
||||||
|
div.body h4 { font-size: 110%; background-color: #D8DEE3; }
|
||||||
|
div.body h5 { font-size: 100%; background-color: #D8DEE3; }
|
||||||
|
div.body h6 { font-size: 100%; background-color: #D8DEE3; }
|
||||||
|
|
||||||
|
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.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition p.admonition-title + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.highlight{
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.note {
|
||||||
|
background-color: #eee;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.seealso {
|
||||||
|
background-color: #ffc;
|
||||||
|
border: 1px solid #ff6;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.warning {
|
||||||
|
background-color: #ffe4e4;
|
||||||
|
border: 1px solid #f66;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 10px;
|
||||||
|
background-color: White;
|
||||||
|
color: #222;
|
||||||
|
line-height: 1.2em;
|
||||||
|
border: 1px solid #C6C9CB;
|
||||||
|
font-size: 1.2em;
|
||||||
|
margin: 1.5em 0 1.5em 0;
|
||||||
|
-webkit-box-shadow: 1px 1px 1px #d8d8d8;
|
||||||
|
-moz-box-shadow: 1px 1px 1px #d8d8d8;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt {
|
||||||
|
background-color: #ecf0f3;
|
||||||
|
color: #222;
|
||||||
|
padding: 1px 2px;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
Vendored
+136
@@ -0,0 +1,136 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Paste documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Tue Apr 22 22:08:49 2008.
|
||||||
|
#
|
||||||
|
# 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).
|
||||||
|
#
|
||||||
|
# All configuration values have a default value; values that are commented out
|
||||||
|
# serve to show the default value.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# If your extensions are in another directory, add it here.
|
||||||
|
#sys.path.append('some/directory')
|
||||||
|
|
||||||
|
# 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 = ['sphinx.ext.autodoc']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
## FIXME: disabled for now because I haven't figured out how to use this:
|
||||||
|
#templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.txt'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General substitutions.
|
||||||
|
project = 'virtualenv'
|
||||||
|
copyright = '2007-2011, Ian Bicking, The Open Planning Project, The virtualenv developers'
|
||||||
|
|
||||||
|
# The default replacements for |version| and |release|, also used in various
|
||||||
|
# other places throughout the built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
|
||||||
|
release = "1.7"
|
||||||
|
version = ".".join(release.split(".")[:2])
|
||||||
|
|
||||||
|
# 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 = []
|
||||||
|
|
||||||
|
# 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'
|
||||||
|
|
||||||
|
|
||||||
|
# Options for HTML output
|
||||||
|
# -----------------------
|
||||||
|
|
||||||
|
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||||
|
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||||
|
# given in html_static_path.
|
||||||
|
#html_style = 'default.css'
|
||||||
|
|
||||||
|
html_theme = 'nature'
|
||||||
|
html_theme_path = ['_theme']
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Content template for the index page.
|
||||||
|
#html_index = ''
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# 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 = True
|
||||||
|
|
||||||
|
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||||
|
#html_copy_source = True
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'Pastedoc'
|
||||||
|
|
||||||
|
|
||||||
|
# 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, document class [howto/manual]).
|
||||||
|
#latex_documents = []
|
||||||
|
|
||||||
|
# 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
|
||||||
+84
-19
@@ -27,9 +27,16 @@ Project <http://openplans.org>`_ and is now maintained by a
|
|||||||
It is licensed under an
|
It is licensed under an
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
You can install it with ``pip install virtualenv``, or the `latest
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||||
with ``easy_install virtualenv==dev``.
|
with ``pip install virtualenv==dev``.
|
||||||
|
|
||||||
|
You can also use ``easy_install``, or if you have no Python package manager
|
||||||
|
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||||
|
it with ``python virtualenv.py``.
|
||||||
|
|
||||||
|
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||||
|
|
||||||
|
|
||||||
What It Does
|
What It Does
|
||||||
------------
|
------------
|
||||||
@@ -79,9 +86,65 @@ Distribute instead of setuptools, just call virtualenv like this::
|
|||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
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
|
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||||
the environment.
|
the environment.
|
||||||
|
|
||||||
|
Environment variables and configuration files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
virtualenv can not only be configured by passing command line options such as
|
||||||
|
``--distribute`` but also by two other means:
|
||||||
|
|
||||||
|
- Environment variables
|
||||||
|
|
||||||
|
Each command line option is automatically used to look for environment
|
||||||
|
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||||
|
the name of the command line options are capitalized and have dashes
|
||||||
|
(``'-'``) replaced with underscores (``'_'``).
|
||||||
|
|
||||||
|
For example, to automatically install Distribute instead of setuptools
|
||||||
|
you can also set an environment variable::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||||
|
$ python virtualenv.py ENV
|
||||||
|
|
||||||
|
It's the same as passing the option to virtualenv directly::
|
||||||
|
|
||||||
|
$ python virtualenv.py --distribute ENV
|
||||||
|
|
||||||
|
This also works for appending command line options, like ``--find-links``.
|
||||||
|
Just leave an empty space between the passsed values, e.g.::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||||
|
$ virtualenv ENV
|
||||||
|
|
||||||
|
is the same as calling::
|
||||||
|
|
||||||
|
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||||
|
|
||||||
|
- Config files
|
||||||
|
|
||||||
|
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||||
|
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||||
|
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||||
|
|
||||||
|
The names of the settings are derived from the long command line option,
|
||||||
|
e.g. the option ``--distribute`` would look like this::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
distribute = true
|
||||||
|
|
||||||
|
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||||
|
lines::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
extra-search-dir =
|
||||||
|
/path/to/dists
|
||||||
|
/path/to/other/dists
|
||||||
|
|
||||||
|
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||||
|
of supported options.
|
||||||
|
|
||||||
Windows Notes
|
Windows Notes
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -172,7 +235,7 @@ Here's a more concrete example of how you could use this::
|
|||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
f = open('blog-bootstrap.py', 'w').write(output)
|
||||||
|
|
||||||
Another example is available `here
|
Another example is available `here
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||||
|
|
||||||
activate script
|
activate script
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
@@ -207,15 +270,16 @@ On Windows you just do::
|
|||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
And use ``deactivate.bat`` to undo the changes.
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
The ``--system-site-packages`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||||
wherever your global site-packages directory is). This can be used if
|
(or wherever your global site-packages directory is).
|
||||||
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
|
This can be used if you have control over the global site-packages directory,
|
||||||
system.
|
and you want to depend on the packages there. If you want isolation from the
|
||||||
|
global system, do not use this flag.
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
Using Virtualenv without ``bin/python``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -236,11 +300,12 @@ can setup the environment like::
|
|||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
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
|
you to use an existing interpreter. Items in your environment will show up
|
||||||
first on ``sys.path``, before global items. However, global items will
|
first on ``sys.path``, before global items. However, global items will
|
||||||
always be accessible -- this technique does not support the
|
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
in creating the environment, whether it was or not). Also, this cannot undo
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
the activation of other environments, or modules that have been imported.
|
||||||
instance, activate an environment before a web request; you should activate
|
You shouldn't try to, for instance, activate an environment before a web
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
request; you should activate *one* environment as early as possible, and not
|
||||||
|
do it again in that process.
|
||||||
|
|
||||||
Making Environments Relocatable
|
Making Environments Relocatable
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -277,8 +342,8 @@ libraries on the system, if those C libraries are located somewhere
|
|||||||
different (either different versions, or a different filesystem
|
different (either different versions, or a different filesystem
|
||||||
layout).
|
layout).
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
If you use this flag to create an environment, currently, the
|
||||||
use this on an environment.
|
``--system-site-packages`` option will be implied.
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
The ``--extra-search-dir`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
Vendored
+170
@@ -0,0 +1,170 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
|
||||||
|
REM Command file for Sphinx documentation
|
||||||
|
|
||||||
|
if "%SPHINXBUILD%" == "" (
|
||||||
|
set SPHINXBUILD=sphinx-build
|
||||||
|
)
|
||||||
|
set BUILDDIR=_build
|
||||||
|
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||||
|
if NOT "%PAPER%" == "" (
|
||||||
|
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "" goto help
|
||||||
|
|
||||||
|
if "%1" == "help" (
|
||||||
|
:help
|
||||||
|
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||||
|
echo. html to make standalone HTML files
|
||||||
|
echo. dirhtml to make HTML files named index.html in directories
|
||||||
|
echo. singlehtml to make a single large HTML file
|
||||||
|
echo. pickle to make pickle files
|
||||||
|
echo. json to make JSON files
|
||||||
|
echo. htmlhelp to make HTML files and a HTML help project
|
||||||
|
echo. qthelp to make HTML files and a qthelp project
|
||||||
|
echo. devhelp to make HTML files and a Devhelp project
|
||||||
|
echo. epub to make an epub
|
||||||
|
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||||
|
echo. text to make text files
|
||||||
|
echo. man to make manual pages
|
||||||
|
echo. changes to make an overview over all changed/added/deprecated items
|
||||||
|
echo. linkcheck to check all external links for integrity
|
||||||
|
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "clean" (
|
||||||
|
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||||
|
del /q /s %BUILDDIR%\*
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "html" (
|
||||||
|
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "dirhtml" (
|
||||||
|
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "singlehtml" (
|
||||||
|
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "pickle" (
|
||||||
|
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished; now you can process the pickle files.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "json" (
|
||||||
|
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished; now you can process the JSON files.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "htmlhelp" (
|
||||||
|
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||||
|
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "qthelp" (
|
||||||
|
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||||
|
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||||
|
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\django-compressor.qhcp
|
||||||
|
echo.To view the help file:
|
||||||
|
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\django-compressor.ghc
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "devhelp" (
|
||||||
|
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "epub" (
|
||||||
|
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "latex" (
|
||||||
|
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "text" (
|
||||||
|
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "man" (
|
||||||
|
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "changes" (
|
||||||
|
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.The overview file is in %BUILDDIR%/changes.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "linkcheck" (
|
||||||
|
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Link check complete; look for any errors in the above output ^
|
||||||
|
or in %BUILDDIR%/linkcheck/output.txt.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "doctest" (
|
||||||
|
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
echo.
|
||||||
|
echo.Testing of doctests in the sources finished, look at the ^
|
||||||
|
results in %BUILDDIR%/doctest/output.txt.
|
||||||
|
goto end
|
||||||
|
)
|
||||||
|
|
||||||
|
:end
|
||||||
@@ -1,10 +1,24 @@
|
|||||||
Changes & News
|
Changes & News
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Next release (1.7) schedule
|
1.7 (2011-11-30)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||||
|
|
||||||
|
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||||
|
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||||
|
used. Thanks Chris McDonough.
|
||||||
|
|
||||||
|
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||||
|
previous default global-site-package-including behavior back.
|
||||||
|
|
||||||
|
* Added ability to set command options as environment variables and options
|
||||||
|
in a ``virtualenv.ini`` file.
|
||||||
|
|
||||||
|
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||||
|
|
||||||
|
* Made ``virtualenv.py`` script executable.
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
1.6.4 (2011-07-21)
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
@@ -26,7 +26,7 @@ f.close()
|
|||||||
setup(name='virtualenv',
|
setup(name='virtualenv',
|
||||||
# If you change the version here, change it in virtualenv.py and
|
# If you change the version here, change it in virtualenv.py and
|
||||||
# docs/conf.py as well
|
# docs/conf.py as well
|
||||||
version="1.6.4",
|
version="1.7",
|
||||||
description="Virtual Python Environment builder",
|
description="Virtual Python Environment builder",
|
||||||
long_description=long_description,
|
long_description=long_description,
|
||||||
classifiers=[
|
classifiers=[
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
import virtualenv
|
||||||
|
from mock import patch, Mock
|
||||||
|
|
||||||
|
|
||||||
|
def test_version():
|
||||||
|
"""Should have a version string"""
|
||||||
|
assert virtualenv.virtualenv_version == "1.7", "Should have version"
|
||||||
|
|
||||||
|
|
||||||
|
@patch('os.path.exists')
|
||||||
|
def test_resolve_interpreter_with_absolute_path(mock_exists):
|
||||||
|
"""Should return absolute path if given and exists"""
|
||||||
|
mock_exists.return_value = True
|
||||||
|
virtualenv.is_executable = Mock(return_value=True)
|
||||||
|
|
||||||
|
exe = virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||||
|
|
||||||
|
assert exe == "/usr/bin/python42", "Absolute path should return as is"
|
||||||
|
mock_exists.assert_called_with("/usr/bin/python42")
|
||||||
|
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||||
|
|
||||||
|
|
||||||
|
@patch('os.path.exists')
|
||||||
|
def test_resolve_intepreter_with_nonexistant_interpreter(mock_exists):
|
||||||
|
"""Should exit when with absolute path if not exists"""
|
||||||
|
mock_exists.return_value = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||||
|
assert False, "Should raise exception"
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
|
||||||
|
mock_exists.assert_called_with("/usr/bin/python42")
|
||||||
|
|
||||||
|
|
||||||
|
@patch('os.path.exists')
|
||||||
|
def test_resolve_intepreter_with_invalid_interpreter(mock_exists):
|
||||||
|
"""Should exit when with absolute path if not exists"""
|
||||||
|
mock_exists.return_value = True
|
||||||
|
virtualenv.is_executable = Mock(return_value=False)
|
||||||
|
|
||||||
|
try:
|
||||||
|
virtualenv.resolve_interpreter("/usr/bin/python42")
|
||||||
|
assert False, "Should raise exception"
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
|
||||||
|
mock_exists.assert_called_with("/usr/bin/python42")
|
||||||
|
virtualenv.is_executable.assert_called_with("/usr/bin/python42")
|
||||||
+102
-23
@@ -1,6 +1,6 @@
|
|||||||
Metadata-Version: 1.0
|
Metadata-Version: 1.0
|
||||||
Name: virtualenv
|
Name: virtualenv
|
||||||
Version: 1.6.4
|
Version: 1.7
|
||||||
Summary: Virtual Python Environment builder
|
Summary: Virtual Python Environment builder
|
||||||
Home-page: http://www.virtualenv.org
|
Home-page: http://www.virtualenv.org
|
||||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
||||||
@@ -22,9 +22,16 @@ Description:
|
|||||||
It is licensed under an
|
It is licensed under an
|
||||||
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
`MIT-style permissive license <https://github.com/pypa/virtualenv/raw/master/LICENSE.txt>`_.
|
||||||
|
|
||||||
You can install it with ``easy_install virtualenv``, or the `latest
|
You can install it with ``pip install virtualenv``, or the `latest
|
||||||
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
development version <https://github.com/pypa/virtualenv/tarball/develop#egg=virtualenv-dev>`_
|
||||||
with ``easy_install virtualenv==dev``.
|
with ``pip install virtualenv==dev``.
|
||||||
|
|
||||||
|
You can also use ``easy_install``, or if you have no Python package manager
|
||||||
|
available at all, you can just grab the single file `virtualenv.py`_ and run
|
||||||
|
it with ``python virtualenv.py``.
|
||||||
|
|
||||||
|
.. _virtualenv.py: https://raw.github.com/pypa/virtualenv/master/virtualenv.py
|
||||||
|
|
||||||
|
|
||||||
What It Does
|
What It Does
|
||||||
------------
|
------------
|
||||||
@@ -74,9 +81,65 @@ Description:
|
|||||||
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
You can also set the environment variable VIRTUALENV_USE_DISTRIBUTE.
|
||||||
|
|
||||||
A new virtualenv also includes the `pip <http://pypy.python.org/pypi/pip>`_
|
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
|
installer, so you can use ``ENV/bin/pip`` to install additional packages into
|
||||||
the environment.
|
the environment.
|
||||||
|
|
||||||
|
Environment variables and configuration files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
virtualenv can not only be configured by passing command line options such as
|
||||||
|
``--distribute`` but also by two other means:
|
||||||
|
|
||||||
|
- Environment variables
|
||||||
|
|
||||||
|
Each command line option is automatically used to look for environment
|
||||||
|
variables with the name format ``VIRTUALENV_<UPPER_NAME>``. That means
|
||||||
|
the name of the command line options are capitalized and have dashes
|
||||||
|
(``'-'``) replaced with underscores (``'_'``).
|
||||||
|
|
||||||
|
For example, to automatically install Distribute instead of setuptools
|
||||||
|
you can also set an environment variable::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_USE_DISTRIBUTE=true
|
||||||
|
$ python virtualenv.py ENV
|
||||||
|
|
||||||
|
It's the same as passing the option to virtualenv directly::
|
||||||
|
|
||||||
|
$ python virtualenv.py --distribute ENV
|
||||||
|
|
||||||
|
This also works for appending command line options, like ``--find-links``.
|
||||||
|
Just leave an empty space between the passsed values, e.g.::
|
||||||
|
|
||||||
|
$ export VIRTUALENV_EXTRA_SEARCH_DIR="/path/to/dists /path/to/other/dists"
|
||||||
|
$ virtualenv ENV
|
||||||
|
|
||||||
|
is the same as calling::
|
||||||
|
|
||||||
|
$ python virtualenv.py --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists ENV
|
||||||
|
|
||||||
|
- Config files
|
||||||
|
|
||||||
|
virtualenv also looks for a standard ini config file. On Unix and Mac OS X
|
||||||
|
that's ``$HOME/.virtualenv/virtualenv.ini`` and on Windows, it's
|
||||||
|
``%HOME%\\virtualenv\\virtualenv.ini``.
|
||||||
|
|
||||||
|
The names of the settings are derived from the long command line option,
|
||||||
|
e.g. the option ``--distribute`` would look like this::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
distribute = true
|
||||||
|
|
||||||
|
Appending options like ``--extra-search-dir`` can be written on multiple
|
||||||
|
lines::
|
||||||
|
|
||||||
|
[virtualenv]
|
||||||
|
extra-search-dir =
|
||||||
|
/path/to/dists
|
||||||
|
/path/to/other/dists
|
||||||
|
|
||||||
|
Please have a look at the output of ``virtualenv --help`` for a full list
|
||||||
|
of supported options.
|
||||||
|
|
||||||
Windows Notes
|
Windows Notes
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -167,7 +230,7 @@ Description:
|
|||||||
f = open('blog-bootstrap.py', 'w').write(output)
|
f = open('blog-bootstrap.py', 'w').write(output)
|
||||||
|
|
||||||
Another example is available `here
|
Another example is available `here
|
||||||
<https://svn.openplans.org/svn/fassembler/trunk/fassembler/create-venv-script.py>`_.
|
<https://github.com/socialplanning/fassembler/blob/master/fassembler/create-venv-script.py>`_.
|
||||||
|
|
||||||
activate script
|
activate script
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
@@ -202,15 +265,16 @@ Description:
|
|||||||
|
|
||||||
And use ``deactivate.bat`` to undo the changes.
|
And use ``deactivate.bat`` to undo the changes.
|
||||||
|
|
||||||
The ``--no-site-packages`` Option
|
The ``--system-site-packages`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
If you build with ``virtualenv --no-site-packages ENV`` it will *not*
|
If you build with ``virtualenv --system-site-packages ENV``, your virtual
|
||||||
inherit any packages from ``/usr/lib/python2.5/site-packages`` (or
|
environment will inherit packages from ``/usr/lib/python2.7/site-packages``
|
||||||
wherever your global site-packages directory is). This can be used if
|
(or wherever your global site-packages directory is).
|
||||||
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
|
This can be used if you have control over the global site-packages directory,
|
||||||
system.
|
and you want to depend on the packages there. If you want isolation from the
|
||||||
|
global system, do not use this flag.
|
||||||
|
|
||||||
Using Virtualenv without ``bin/python``
|
Using Virtualenv without ``bin/python``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -231,11 +295,12 @@ Description:
|
|||||||
This will change ``sys.path`` and even change ``sys.prefix``, but also allow
|
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
|
you to use an existing interpreter. Items in your environment will show up
|
||||||
first on ``sys.path``, before global items. However, global items will
|
first on ``sys.path``, before global items. However, global items will
|
||||||
always be accessible -- this technique does not support the
|
always be accessible (as if the ``--system-site-packages`` flag had been used
|
||||||
``--no-site-packages`` flag. Also, this cannot undo the activation of other
|
in creating the environment, whether it was or not). Also, this cannot undo
|
||||||
environments, or modules that have been imported. You shouldn't try to, for
|
the activation of other environments, or modules that have been imported.
|
||||||
instance, activate an environment before a web request; you should activate
|
You shouldn't try to, for instance, activate an environment before a web
|
||||||
*one* environment as early as possible, and not do it again in that process.
|
request; you should activate *one* environment as early as possible, and not
|
||||||
|
do it again in that process.
|
||||||
|
|
||||||
Making Environments Relocatable
|
Making Environments Relocatable
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -272,8 +337,8 @@ Description:
|
|||||||
different (either different versions, or a different filesystem
|
different (either different versions, or a different filesystem
|
||||||
layout).
|
layout).
|
||||||
|
|
||||||
Currently the ``--no-site-packages`` option will not be honored if you
|
If you use this flag to create an environment, currently, the
|
||||||
use this on an environment.
|
``--system-site-packages`` option will be implied.
|
||||||
|
|
||||||
The ``--extra-search-dir`` Option
|
The ``--extra-search-dir`` Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -419,10 +484,24 @@ Description:
|
|||||||
Changes & News
|
Changes & News
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Next release (1.7) schedule
|
1.7 (2011-11-30)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Beta release mid-July 2011, final release early August.
|
* Updated embedded Distribute release to 0.6.24. Thanks Alex Grönholm.
|
||||||
|
|
||||||
|
* Made ``--no-site-packages`` behavior the default behavior. The
|
||||||
|
``--no-site-packages`` flag is still permitted, but displays a warning when
|
||||||
|
used. Thanks Chris McDonough.
|
||||||
|
|
||||||
|
* New flag: ``--system-site-packages``; this flag should be passed to get the
|
||||||
|
previous default global-site-package-including behavior back.
|
||||||
|
|
||||||
|
* Added ability to set command options as environment variables and options
|
||||||
|
in a ``virtualenv.ini`` file.
|
||||||
|
|
||||||
|
* Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
|
||||||
|
|
||||||
|
* Made ``virtualenv.py`` script executable.
|
||||||
|
|
||||||
1.6.4 (2011-07-21)
|
1.6.4 (2011-07-21)
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
+18
-1
@@ -1,11 +1,22 @@
|
|||||||
AUTHORS.txt
|
AUTHORS.txt
|
||||||
|
HACKING
|
||||||
LICENSE.txt
|
LICENSE.txt
|
||||||
MANIFEST.in
|
MANIFEST.in
|
||||||
setup.py
|
setup.py
|
||||||
virtualenv.py
|
virtualenv.py
|
||||||
|
bin/rebuild-script.py
|
||||||
|
bin/refresh-support-files.py
|
||||||
|
docs/Makefile
|
||||||
|
docs/conf.py
|
||||||
docs/index.txt
|
docs/index.txt
|
||||||
|
docs/make.bat
|
||||||
docs/news.txt
|
docs/news.txt
|
||||||
|
docs/_theme/nature/theme.conf
|
||||||
|
docs/_theme/nature/static/nature.css_t
|
||||||
|
docs/_theme/nature/static/pygments.css
|
||||||
scripts/virtualenv
|
scripts/virtualenv
|
||||||
|
tests/__init__.py
|
||||||
|
tests/test_virtualenv.py
|
||||||
virtualenv.egg-info/PKG-INFO
|
virtualenv.egg-info/PKG-INFO
|
||||||
virtualenv.egg-info/SOURCES.txt
|
virtualenv.egg-info/SOURCES.txt
|
||||||
virtualenv.egg-info/dependency_links.txt
|
virtualenv.egg-info/dependency_links.txt
|
||||||
@@ -13,7 +24,13 @@ virtualenv.egg-info/entry_points.txt
|
|||||||
virtualenv.egg-info/not-zip-safe
|
virtualenv.egg-info/not-zip-safe
|
||||||
virtualenv.egg-info/top_level.txt
|
virtualenv.egg-info/top_level.txt
|
||||||
virtualenv_support/__init__.py
|
virtualenv_support/__init__.py
|
||||||
virtualenv_support/distribute-0.6.19.tar.gz
|
virtualenv_support/activate.bat
|
||||||
|
virtualenv_support/activate.csh
|
||||||
|
virtualenv_support/activate.fish
|
||||||
|
virtualenv_support/activate.sh
|
||||||
|
virtualenv_support/deactivate.bat
|
||||||
|
virtualenv_support/distribute-0.6.24.tar.gz
|
||||||
|
virtualenv_support/distutils.cfg
|
||||||
virtualenv_support/pip-1.0.2.tar.gz
|
virtualenv_support/pip-1.0.2.tar.gz
|
||||||
virtualenv_support/setuptools-0.6c11-py2.4.egg
|
virtualenv_support/setuptools-0.6c11-py2.4.egg
|
||||||
virtualenv_support/setuptools-0.6c11-py2.5.egg
|
virtualenv_support/setuptools-0.6c11-py2.5.egg
|
||||||
Vendored
Regular → Executable
+268
-122
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# If you change the version here, change it in setup.py
|
# If you change the version here, change it in setup.py
|
||||||
# and docs/conf.py as well.
|
# and docs/conf.py as well.
|
||||||
virtualenv_version = "1.6.4"
|
virtualenv_version = "1.7"
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import sys
|
import sys
|
||||||
@@ -17,6 +17,8 @@ import tempfile
|
|||||||
import zlib
|
import zlib
|
||||||
import errno
|
import errno
|
||||||
import distutils.sysconfig
|
import distutils.sysconfig
|
||||||
|
from distutils.util import strtobool
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import subprocess
|
import subprocess
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@@ -36,6 +38,11 @@ try:
|
|||||||
except NameError:
|
except NameError:
|
||||||
basestring = str
|
basestring = str
|
||||||
|
|
||||||
|
try:
|
||||||
|
import ConfigParser
|
||||||
|
except ImportError:
|
||||||
|
import configparser as ConfigParser
|
||||||
|
|
||||||
join = os.path.join
|
join = os.path.join
|
||||||
py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
|
py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
|
||||||
|
|
||||||
@@ -44,6 +51,14 @@ is_pypy = hasattr(sys, 'pypy_version_info')
|
|||||||
is_win = (sys.platform == 'win32')
|
is_win = (sys.platform == 'win32')
|
||||||
abiflags = getattr(sys, 'abiflags', '')
|
abiflags = getattr(sys, 'abiflags', '')
|
||||||
|
|
||||||
|
user_dir = os.path.expanduser('~')
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
user_dir = os.environ.get('APPDATA', user_dir) # Use %APPDATA% for roaming
|
||||||
|
default_storage_dir = os.path.join(user_dir, 'virtualenv')
|
||||||
|
else:
|
||||||
|
default_storage_dir = os.path.join(user_dir, '.virtualenv')
|
||||||
|
default_config_file = os.path.join(default_storage_dir, 'virtualenv.ini')
|
||||||
|
|
||||||
if is_pypy:
|
if is_pypy:
|
||||||
expected_exe = 'pypy'
|
expected_exe = 'pypy'
|
||||||
elif is_jython:
|
elif is_jython:
|
||||||
@@ -472,35 +487,10 @@ def _install_req(py_executable, unzip=False, distribute=False,
|
|||||||
source = None
|
source = None
|
||||||
else:
|
else:
|
||||||
setup_fn = None
|
setup_fn = None
|
||||||
source = 'distribute-0.6.19.tar.gz'
|
source = 'distribute-0.6.24.tar.gz'
|
||||||
project_name = 'distribute'
|
project_name = 'distribute'
|
||||||
bootstrap_script = DISTRIBUTE_SETUP_PY
|
bootstrap_script = DISTRIBUTE_SETUP_PY
|
||||||
|
|
||||||
# If we are running under -p, we need to remove the current
|
|
||||||
# directory from sys.path temporarily here, so that we
|
|
||||||
# definitely get the pkg_resources from the site directory of
|
|
||||||
# the interpreter we are running under, not the one
|
|
||||||
# virtualenv.py is installed under (which might lead to py2/py3
|
|
||||||
# incompatibility issues)
|
|
||||||
_prev_sys_path = sys.path
|
|
||||||
if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
|
|
||||||
sys.path = sys.path[1:]
|
|
||||||
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
# check if the global Python has distribute installed or plain
|
|
||||||
# setuptools
|
|
||||||
import pkg_resources
|
|
||||||
if not hasattr(pkg_resources, '_distribute'):
|
|
||||||
location = os.path.dirname(pkg_resources.__file__)
|
|
||||||
logger.notify("A globally installed setuptools was found (in %s)" % location)
|
|
||||||
logger.notify("Use the --no-site-packages option to use distribute in "
|
|
||||||
"the virtualenv.")
|
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
finally:
|
|
||||||
sys.path = _prev_sys_path
|
|
||||||
|
|
||||||
if setup_fn is not None:
|
if setup_fn is not None:
|
||||||
setup_fn = _find_file(setup_fn, search_dirs)
|
setup_fn = _find_file(setup_fn, search_dirs)
|
||||||
|
|
||||||
@@ -626,7 +616,9 @@ def install_pip(py_executable, search_dirs=None, never_download=False):
|
|||||||
easy_install_script = 'easy_install'
|
easy_install_script = 'easy_install'
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
easy_install_script = 'easy_install-script.py'
|
easy_install_script = 'easy_install-script.py'
|
||||||
cmd = [py_executable, join(os.path.dirname(py_executable), easy_install_script), filename]
|
cmd = [join(os.path.dirname(py_executable), easy_install_script), filename]
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
cmd.insert(0, py_executable)
|
||||||
if filename == 'pip':
|
if filename == 'pip':
|
||||||
if never_download:
|
if never_download:
|
||||||
logger.fatal("Can't find any local distributions of pip to install "
|
logger.fatal("Can't find any local distributions of pip to install "
|
||||||
@@ -669,10 +661,113 @@ def filter_ez_setup(line, project_name='setuptools'):
|
|||||||
return Logger.DEBUG
|
return Logger.DEBUG
|
||||||
return Logger.INFO
|
return Logger.INFO
|
||||||
|
|
||||||
|
|
||||||
|
class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
|
||||||
|
"""
|
||||||
|
Custom help formatter for use in ConfigOptionParser that updates
|
||||||
|
the defaults before expanding them, allowing them to show up correctly
|
||||||
|
in the help listing
|
||||||
|
"""
|
||||||
|
def expand_default(self, option):
|
||||||
|
if self.parser is not None:
|
||||||
|
self.parser.update_defaults(self.parser.defaults)
|
||||||
|
return optparse.IndentedHelpFormatter.expand_default(self, option)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigOptionParser(optparse.OptionParser):
|
||||||
|
"""
|
||||||
|
Custom option parser which updates its defaults by by checking the
|
||||||
|
configuration files and environmental variables
|
||||||
|
"""
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.config = ConfigParser.RawConfigParser()
|
||||||
|
self.files = self.get_config_files()
|
||||||
|
self.config.read(self.files)
|
||||||
|
optparse.OptionParser.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_config_files(self):
|
||||||
|
config_file = os.environ.get('VIRTUALENV_CONFIG_FILE', False)
|
||||||
|
if config_file and os.path.exists(config_file):
|
||||||
|
return [config_file]
|
||||||
|
return [default_config_file]
|
||||||
|
|
||||||
|
def update_defaults(self, defaults):
|
||||||
|
"""
|
||||||
|
Updates the given defaults with values from the config files and
|
||||||
|
the environ. Does a little special handling for certain types of
|
||||||
|
options (lists).
|
||||||
|
"""
|
||||||
|
# Then go and look for the other sources of configuration:
|
||||||
|
config = {}
|
||||||
|
# 1. config files
|
||||||
|
config.update(dict(self.get_config_section('virtualenv')))
|
||||||
|
# 2. environmental variables
|
||||||
|
config.update(dict(self.get_environ_vars()))
|
||||||
|
# Then set the options with those values
|
||||||
|
for key, val in config.items():
|
||||||
|
key = key.replace('_', '-')
|
||||||
|
if not key.startswith('--'):
|
||||||
|
key = '--%s' % key # only prefer long opts
|
||||||
|
option = self.get_option(key)
|
||||||
|
if option is not None:
|
||||||
|
# ignore empty values
|
||||||
|
if not val:
|
||||||
|
continue
|
||||||
|
# handle multiline configs
|
||||||
|
if option.action == 'append':
|
||||||
|
val = val.split()
|
||||||
|
else:
|
||||||
|
option.nargs = 1
|
||||||
|
if option.action in ('store_true', 'store_false', 'count'):
|
||||||
|
val = strtobool(val)
|
||||||
|
try:
|
||||||
|
val = option.convert_value(key, val)
|
||||||
|
except optparse.OptionValueError:
|
||||||
|
e = sys.exc_info()[1]
|
||||||
|
print("An error occured during configuration: %s" % e)
|
||||||
|
sys.exit(3)
|
||||||
|
defaults[option.dest] = val
|
||||||
|
return defaults
|
||||||
|
|
||||||
|
def get_config_section(self, name):
|
||||||
|
"""
|
||||||
|
Get a section of a configuration
|
||||||
|
"""
|
||||||
|
if self.config.has_section(name):
|
||||||
|
return self.config.items(name)
|
||||||
|
return []
|
||||||
|
|
||||||
|
def get_environ_vars(self, prefix='VIRTUALENV_'):
|
||||||
|
"""
|
||||||
|
Returns a generator with all environmental vars with prefix VIRTUALENV
|
||||||
|
"""
|
||||||
|
for key, val in os.environ.items():
|
||||||
|
if key.startswith(prefix):
|
||||||
|
yield (key.replace(prefix, '').lower(), val)
|
||||||
|
|
||||||
|
def get_default_values(self):
|
||||||
|
"""
|
||||||
|
Overridding to make updating the defaults after instantiation of
|
||||||
|
the option parser possible, update_defaults() does the dirty work.
|
||||||
|
"""
|
||||||
|
if not self.process_default_values:
|
||||||
|
# Old, pre-Optik 1.5 behaviour.
|
||||||
|
return optparse.Values(self.defaults)
|
||||||
|
|
||||||
|
defaults = self.update_defaults(self.defaults.copy()) # ours
|
||||||
|
for option in self._get_all_options():
|
||||||
|
default = defaults.get(option.dest)
|
||||||
|
if isinstance(default, basestring):
|
||||||
|
opt_str = option.get_opt_string()
|
||||||
|
defaults[option.dest] = option.check_value(opt_str, default)
|
||||||
|
return optparse.Values(defaults)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = optparse.OptionParser(
|
parser = ConfigOptionParser(
|
||||||
version=virtualenv_version,
|
version=virtualenv_version,
|
||||||
usage="%prog [OPTIONS] DEST_DIR")
|
usage="%prog [OPTIONS] DEST_DIR",
|
||||||
|
formatter=UpdatingDefaultsHelpFormatter())
|
||||||
|
|
||||||
parser.add_option(
|
parser.add_option(
|
||||||
'-v', '--verbose',
|
'-v', '--verbose',
|
||||||
@@ -709,6 +804,13 @@ def main():
|
|||||||
help="Don't give access to the global site-packages dir to the "
|
help="Don't give access to the global site-packages dir to the "
|
||||||
"virtual environment")
|
"virtual environment")
|
||||||
|
|
||||||
|
parser.add_option(
|
||||||
|
'--system-site-packages',
|
||||||
|
dest='system_site_packages',
|
||||||
|
action='store_true',
|
||||||
|
help="Give access to the global site-packages dir to the "
|
||||||
|
"virtual environment")
|
||||||
|
|
||||||
parser.add_option(
|
parser.add_option(
|
||||||
'--unzip-setuptools',
|
'--unzip-setuptools',
|
||||||
dest='unzip_setuptools',
|
dest='unzip_setuptools',
|
||||||
@@ -727,7 +829,7 @@ def main():
|
|||||||
dest='use_distribute',
|
dest='use_distribute',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='Use Distribute instead of Setuptools. Set environ variable '
|
help='Use Distribute instead of Setuptools. Set environ variable '
|
||||||
'VIRTUALENV_USE_DISTRIBUTE to make it the default ')
|
'VIRTUALENV_DISTRIBUTE to make it the default ')
|
||||||
|
|
||||||
default_search_dirs = file_search_dirs()
|
default_search_dirs = file_search_dirs()
|
||||||
parser.add_option(
|
parser.add_option(
|
||||||
@@ -777,6 +879,16 @@ def main():
|
|||||||
popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
|
popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
|
||||||
raise SystemExit(popen.wait())
|
raise SystemExit(popen.wait())
|
||||||
|
|
||||||
|
# Force --use-distribute on Python 3, since setuptools is not available.
|
||||||
|
if majver > 2:
|
||||||
|
options.use_distribute = True
|
||||||
|
|
||||||
|
if os.environ.get('PYTHONDONTWRITEBYTECODE') and not options.use_distribute:
|
||||||
|
print(
|
||||||
|
"The PYTHONDONTWRITEBYTECODE environment variable is "
|
||||||
|
"not compatible with setuptools. Either use --distribute "
|
||||||
|
"or unset PYTHONDONTWRITEBYTECODE.")
|
||||||
|
sys.exit(2)
|
||||||
if not args:
|
if not args:
|
||||||
print('You must provide a DEST_DIR')
|
print('You must provide a DEST_DIR')
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
@@ -802,9 +914,15 @@ def main():
|
|||||||
make_environment_relocatable(home_dir)
|
make_environment_relocatable(home_dir)
|
||||||
return
|
return
|
||||||
|
|
||||||
create_environment(home_dir, site_packages=not options.no_site_packages, clear=options.clear,
|
if options.no_site_packages:
|
||||||
|
logger.warn('The --no-site-packages flag is deprecated; it is now '
|
||||||
|
'the default behavior.')
|
||||||
|
|
||||||
|
create_environment(home_dir,
|
||||||
|
site_packages=options.system_site_packages,
|
||||||
|
clear=options.clear,
|
||||||
unzip_setuptools=options.unzip_setuptools,
|
unzip_setuptools=options.unzip_setuptools,
|
||||||
use_distribute=options.use_distribute or majver > 2,
|
use_distribute=options.use_distribute,
|
||||||
prompt=options.prompt,
|
prompt=options.prompt,
|
||||||
search_dirs=options.search_dirs,
|
search_dirs=options.search_dirs,
|
||||||
never_download=options.never_download)
|
never_download=options.never_download)
|
||||||
@@ -821,6 +939,11 @@ def call_subprocess(cmd, show_stdout=True,
|
|||||||
part = part[:20]+"..."+part[-20:]
|
part = part[:20]+"..."+part[-20:]
|
||||||
if ' ' in part or '\n' in part or '"' in part or "'" in part:
|
if ' ' in part or '\n' in part or '"' in part or "'" in part:
|
||||||
part = '"%s"' % part.replace('"', '\\"')
|
part = '"%s"' % part.replace('"', '\\"')
|
||||||
|
if hasattr(part, 'decode'):
|
||||||
|
try:
|
||||||
|
part = part.decode(sys.getdefaultencoding())
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
part = part.decode(sys.getfilesystemencoding())
|
||||||
cmd_parts.append(part)
|
cmd_parts.append(part)
|
||||||
cmd_desc = ' '.join(cmd_parts)
|
cmd_desc = ' '.join(cmd_parts)
|
||||||
if show_stdout:
|
if show_stdout:
|
||||||
@@ -850,8 +973,13 @@ def call_subprocess(cmd, show_stdout=True,
|
|||||||
if stdout is not None:
|
if stdout is not None:
|
||||||
stdout = proc.stdout
|
stdout = proc.stdout
|
||||||
encoding = sys.getdefaultencoding()
|
encoding = sys.getdefaultencoding()
|
||||||
|
fs_encoding = sys.getfilesystemencoding()
|
||||||
while 1:
|
while 1:
|
||||||
line = stdout.readline().decode(encoding)
|
line = stdout.readline()
|
||||||
|
try:
|
||||||
|
line = line.decode(encoding)
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
line = line.decode(fs_encoding)
|
||||||
if not line:
|
if not line:
|
||||||
break
|
break
|
||||||
line = line.rstrip()
|
line = line.rstrip()
|
||||||
@@ -882,14 +1010,14 @@ def call_subprocess(cmd, show_stdout=True,
|
|||||||
% (cmd_desc, proc.returncode))
|
% (cmd_desc, proc.returncode))
|
||||||
|
|
||||||
|
|
||||||
def create_environment(home_dir, site_packages=True, clear=False,
|
def create_environment(home_dir, site_packages=False, clear=False,
|
||||||
unzip_setuptools=False, use_distribute=False,
|
unzip_setuptools=False, use_distribute=False,
|
||||||
prompt=None, search_dirs=None, never_download=False):
|
prompt=None, search_dirs=None, never_download=False):
|
||||||
"""
|
"""
|
||||||
Creates a new environment in ``home_dir``.
|
Creates a new environment in ``home_dir``.
|
||||||
|
|
||||||
If ``site_packages`` is true (the default) then the global
|
If ``site_packages`` is true, then the global ``site-packages/``
|
||||||
``site-packages/`` directory will be on the path.
|
directory will be on the path.
|
||||||
|
|
||||||
If ``clear`` is true (default False) then the environment will
|
If ``clear`` is true (default False) then the environment will
|
||||||
first be cleared.
|
first be cleared.
|
||||||
@@ -902,6 +1030,8 @@ def create_environment(home_dir, site_packages=True, clear=False,
|
|||||||
|
|
||||||
install_distutils(home_dir)
|
install_distutils(home_dir)
|
||||||
|
|
||||||
|
# use_distribute also is True if VIRTUALENV_DISTRIBUTE env var is set
|
||||||
|
# we also check VIRTUALENV_USE_DISTRIBUTE for backwards compatibility
|
||||||
if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'):
|
if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'):
|
||||||
install_distribute(py_executable, unzip=unzip_setuptools,
|
install_distribute(py_executable, unzip=unzip_setuptools,
|
||||||
search_dirs=search_dirs, never_download=never_download)
|
search_dirs=search_dirs, never_download=never_download)
|
||||||
@@ -1191,7 +1321,17 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
|
|||||||
# argument that has a space in it. Instead we have to quote
|
# argument that has a space in it. Instead we have to quote
|
||||||
# the value:
|
# the value:
|
||||||
py_executable = '"%s"' % py_executable
|
py_executable = '"%s"' % py_executable
|
||||||
cmd = [py_executable, '-c', 'import sys; print(sys.prefix)']
|
cmd = [py_executable, '-c', """
|
||||||
|
import sys
|
||||||
|
prefix = sys.prefix
|
||||||
|
if sys.version_info[0] == 3:
|
||||||
|
prefix = prefix.encode('utf8')
|
||||||
|
if hasattr(sys.stdout, 'detach'):
|
||||||
|
sys.stdout = sys.stdout.detach()
|
||||||
|
elif hasattr(sys.stdout, 'buffer'):
|
||||||
|
sys.stdout = sys.stdout.buffer
|
||||||
|
sys.stdout.write(prefix)
|
||||||
|
"""]
|
||||||
logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
|
logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
|
||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(cmd,
|
proc = subprocess.Popen(cmd,
|
||||||
@@ -1205,14 +1345,17 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
|
|||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
proc_stdout = proc_stdout.strip().decode(sys.getdefaultencoding())
|
proc_stdout = proc_stdout.strip().decode("utf-8")
|
||||||
proc_stdout = os.path.normcase(os.path.abspath(proc_stdout))
|
proc_stdout = os.path.normcase(os.path.abspath(proc_stdout))
|
||||||
if proc_stdout != os.path.normcase(os.path.abspath(home_dir)):
|
norm_home_dir = os.path.normcase(os.path.abspath(home_dir))
|
||||||
|
if hasattr(norm_home_dir, 'decode'):
|
||||||
|
norm_home_dir = norm_home_dir.decode(sys.getfilesystemencoding())
|
||||||
|
if proc_stdout != norm_home_dir:
|
||||||
logger.fatal(
|
logger.fatal(
|
||||||
'ERROR: The executable %s is not functioning' % py_executable)
|
'ERROR: The executable %s is not functioning' % py_executable)
|
||||||
logger.fatal(
|
logger.fatal(
|
||||||
'ERROR: It thinks sys.prefix is %r (should be %r)'
|
'ERROR: It thinks sys.prefix is %r (should be %r)'
|
||||||
% (proc_stdout, os.path.normcase(os.path.abspath(home_dir))))
|
% (proc_stdout, norm_home_dir))
|
||||||
logger.fatal(
|
logger.fatal(
|
||||||
'ERROR: virtualenv is not compatible with this system or executable')
|
'ERROR: virtualenv is not compatible with this system or executable')
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
@@ -1248,11 +1391,14 @@ def install_activate(home_dir, bin_dir, prompt=None):
|
|||||||
|
|
||||||
|
|
||||||
files['activate_this.py'] = ACTIVATE_THIS
|
files['activate_this.py'] = ACTIVATE_THIS
|
||||||
vname = os.path.basename(os.path.abspath(home_dir))
|
home_dir = os.path.abspath(home_dir)
|
||||||
|
if hasattr(home_dir, 'decode'):
|
||||||
|
home_dir = home_dir.decode(sys.getfilesystemencoding())
|
||||||
|
vname = os.path.basename(home_dir)
|
||||||
for name, content in files.items():
|
for name, content in files.items():
|
||||||
content = content.replace('__VIRTUAL_PROMPT__', prompt or '')
|
content = content.replace('__VIRTUAL_PROMPT__', prompt or '')
|
||||||
content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname)
|
content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname)
|
||||||
content = content.replace('__VIRTUAL_ENV__', os.path.abspath(home_dir))
|
content = content.replace('__VIRTUAL_ENV__', home_dir)
|
||||||
content = content.replace('__VIRTUAL_NAME__', vname)
|
content = content.replace('__VIRTUAL_NAME__', vname)
|
||||||
content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
|
content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
|
||||||
writefile(os.path.join(bin_dir, name), content)
|
writefile(os.path.join(bin_dir, name), content)
|
||||||
@@ -1752,85 +1898,85 @@ BDaonX65d/fwEjNqlDjLVIvM9X+XVxF7
|
|||||||
|
|
||||||
##file distribute_setup.py
|
##file distribute_setup.py
|
||||||
DISTRIBUTE_SETUP_PY = convert("""
|
DISTRIBUTE_SETUP_PY = convert("""
|
||||||
eJztG2tz27jxu34FKo+HVELRdu768lQ3k0ucq+fSJBM7dx8SDw2RkMQzX8eHZd2v7+4CIEESkp1e
|
eJztG2tz2zbyu34FTh4PqYSi7TT3GM+pM2nj9DzNJZnYaT8kHhoiIYk1X+XDsvrrb3cBkCAJyc61
|
||||||
25nOVO05ErFYLPa9C/DoD8Wu3uTZZDqdfp/ndVWXvGBRDP/Gy6YWLM6qmicJr2MAmlyu2C5v2JZn
|
dzM3c7qrIxGLxWLfuwCP/lTs6k2eTabT6Xd5Xld1yQsWxfBvvGxqweKsqnmS8DoGoMnliu3yhm15
|
||||||
Natz1lSCVaJuijrPkwpgcbRkBQ/v+Fo4lRz0i53HfmmqGgDCpIkEqzdxNVnFCaKHH4CEpwJWLUVY
|
VrM6Z00lWCXqpqjzPKkAFkdLVvDwjq+FU8lBv9h57JemqgEgTJpIsHoTV5NVnCB6+AFIeCpg1VKE
|
||||||
5+WObeN6w+LaYzyLGI8imoALImydFyxfyZU0/vPzyYTBZ1XmqUF9QOMsTou8rJHaoKOW4PuP3Nlo
|
dV7u2DauNyyuPcaziPEoogm4IMLWecHylVxJ4z8/n0wYfFZlnhrUBzTO4rTIyxqpDTpqCb7/yJ2N
|
||||||
h6X4tQGyGGdVIcJ4FYfsXpQVMANp6KZ6+B2gonybJTmPJmlclnnpsbwkLvGM8aQWZcaBpxqo27FH
|
dliKXxsgi3FWFSKMV3HI7kVZATOQhm6qh98BKsq3WZLzaJLGZZmXHstL4hLPGE9qUWYceKqBuh17
|
||||||
i4YAFeWsytlyx6qmKJJdnK0nuGleFGVelDFOzwsUBvHj9na4g9tbfzK5RnYRf0NaGDEKVjbwvcKt
|
tGgIUFHOqpwtd6xqiiLZxdl6gpvmRVHmRRnj9LxAYRA/bm+HO7i99SeTa2QX8TekhRGjYGUD3yvc
|
||||||
hGVc0PaUdInKYl3yyJSnj0oxUczLK/2t2rVf6zgV+vsqS3kdbtohkRZIQfubl/SzlVBTx6gycjTJ
|
SljGBW1PSZeoLNYlj0x5+qgUE8W8vNLfql37tY5Tob+vspTX4aYdEmmBFLS/eUk/Wwk1dYwqI0eT
|
||||||
15NJXe7OOylWMWqfHP50dfExuLq8vpiIh1AA6Zf0/AJZLKe0EGzB3uWZMLBpspslsDAUVSVVJRIr
|
fD2Z1OXuvJNiFaP2yeFPVxcfg6vL64uJeAgFkH5Jzy+QxXJKC8EW7F2eCQObJrtZAgtDUVVSVSKx
|
||||||
FkjlD8I0cp/xcl3N5BT84E9A5sJ2ffEgwqbmy0R4M/achlq4EvhVZgZ6PwSOuoSNLRbsdLKX6CNQ
|
YoFU/iBMI/cZL9fVTE7BD/4EZC5s1xcPImxqvkyEN2PPaaiFK4FfZWag90PgqEvY2GLBTid7iT4C
|
||||||
dGA+iAakGLEVSEESxF743/xbiTxivzZ5DcqEj5tUZDWwfgXLZ6CLHRg8QkwFmDsQkyL5DsB888Lp
|
RQfmg2hAihFbgRQkQeyF/80fSuQR+7XJa1AmfNykIquB9StYPgNd7MDgEWIqwNyBmBTJdwDmmxdO
|
||||||
ltRkIUKB25z1xxQeB/4Hxg3j42GDbc70uJo67BgBR3AKZjikNv25o4BYB1/UitXNUDp55VcFB6tz
|
t6QmCxEK3OasP6bwOPA/MG4YHw8bbHOmx9XUYccIOIJTMMMhtenPHQXEOviiVqxuhtLJK78qOFid
|
||||||
4duH4OeXl9ceGzCNPTNl9vrizctPb6+Dny4+Xl2+fwfrTU/9P/lnf522Q58+vsXHm7ouzk9Oil0R
|
C98+BD+/urz22IBp7Jkps9cXb159ensd/HTx8ery/TtYb3rq/8V/8XLaDn36+BYfb+q6OD85KXZF
|
||||||
+1JUfl6uT5QTrE4qcFShOIlOOr90Mp1cXVx/+nD9/v3bq+DNyx8vXg8WCs/OphMT6MOPPwSX7968
|
7EtR+Xm5PlFOsDqpwFGF4iQ66fzSyXRydXH96cP1+/dvr4I3r368eD1YKDw7m05MoA8//hBcvnvz
|
||||||
x/Hp9MvkH6LmEa/5/Cfpjs7ZmX86eQd+9Nww4Uk7elxNrpo05WAV7AE+k7/nqZgXQCH9nrxsgPLS
|
Hsen0y+Tf4qaR7zm85+kOzpnZ/7p5B340XPDhCft6HE1uWrSlINVsAf4TP6Rp2JeAIX0e/KqAcpL
|
||||||
/D4XKY8T+eRtHIqsUqCvhXQghBcfAEEgwX07mkwmpMbK17jgCZbw70zbgHiAmBOScpJ7l8M0WKcF
|
8/tcpDxO5JO3cSiySoG+FtKBEF58AASBBPftaDKZkBorX+OCJ1jCvzNtA+IBYk5IyknuXQ7TYJ0W
|
||||||
uEjYsvYmfnoX4Xfw1DgObsPf8jJznYsOCejAceV4arIEzJMo2EaACMS/FnW4jRSG1ksQFNjuBua4
|
4CJhy9qb+OldhN/BU+M4uA1/y8vMdS46JKADx5XjqckSME+iYBsBIhD/WtThNlIYWi9BUGC7G5jj
|
||||||
5lSC4kSEdGF+Xois3UULE6h9qC32JvthklcCw0tnkOtcEYubbgNBCwD+RG4diCp4vfF/AXhFmIcP
|
mlMJihMR0oX5eSGydhctTKD2obbYm+yHSV4JDC+dQa5zRSxuug0ELQD4E7l1IKrg9cb/BeAVYR4+
|
||||||
E9Amg9bPpzez8UYklm6gY9i7fMu2eXlnckxDG1QqoWEYGuO4bAfZ61a3nZnpTrK87jkwR0dsWM5R
|
TECbDFo/n97MxhuRWLqBjmHv8i3b5uWdyTENbVCphIZhaIzjsh1kr1vddmamO8nyuufAHB2xYTlH
|
||||||
yJ2BB+kWuAIdhdAP+Lfgsti2zOFr1JRaV8zkxDcWHmARgqAFel6WgosGrWd8md8LPWkVZ4DHpgpS
|
IXcGHqRb4Ap0FEI/4N+Cy2LbMoevUVNqXTGTE99YeIBFCIIW6HlZCi4atJ7xZX4v9KRVnAEemypI
|
||||||
c2ZaiZdNDA/Eeu3Cf55WVviSB8i6/+v0/4BOkwwpFmYMpGhB9H0LYSg2wnaCkPLuOLVPx+e/4t8l
|
zZlpJV42MTwQ67UL/3laWeFLHiDr/q/T/wM6TTKkWJgxkKIF0XcthKHYCNsJQsq749Q+HZ//in+X
|
||||||
+n5UG3o0x1/wpzQQPVEN5Q5kVNPaVYqqSeq+8sBSEljZoOa4eIClKxruVil5DCnq5XtKTVznVd4k
|
6PtRbejRHH/Bn9JA9EQ1lDuQUU1rVymqJqn7ygNLSWBlg5rj4gGWrmi4W6XkMaSol+8pNXGd7/Mm
|
||||||
Ec0iTknbWa/RVpQVREC0ymFdlQ57bVYbLHkl9MaMx5FI+E6tiqwcqoGCd7owOT+u5sXuOPLh/8g7
|
iWgWcUraznqNtqKsIAKiVQ7rqnTYa7PaYMkroTdmPI5EwndqVWTlUA0UvNOFyflxNS92x5EP/0fe
|
||||||
ayIBn2PWUYFBXf2AiLPKQYcsD89uZk9njzILILjdi5Fx79n/PloHnz1c6vTqEYdDgJSzIfngD0VZ
|
WRMJ+ByzjgoM6uoHRJxVDjpkeXh2M3s6e5RZAMHtXoyMe8/+99E6+OzhUqdXjzgcAqScDckHfyjK
|
||||||
u6ce6+Svst9+3WMk+Utd9ekAHVD6vSDTkPIe1Bhqx4tBijTgwMJIk6zckDtYoIo3pYUJi7M/eiCc
|
2j31WCd/lf326x4jyV/qqk8H6IDS7wWZhpT3oMZQO14MUqQBBxZGmmTlhtzBAlW8KS1MWJz92QPh
|
||||||
YMXvxOK6bETrXVNOJl41UJhtKXkmHeXLKk/QUJEXk24JQ9MABP91Te5teRVILgn0pk5xtw7ApChr
|
BCt+JxbXZSNa75pyMvGqgcJsS8kz6ShfVnmChoq8mHRLGJoGIPiva3Jvy6tAckmgN3WKu3UAJkVZ
|
||||||
qyiJRf6medQkosJK6Uu7G6fjyhBw7Il7PwzR9NbrA0jl3PCK13Xp9gDBUILICLrWJBxnKw7as3Aa
|
W0VJLPI3zaMmERVWSl/a3TgdV4aAY0/c+2GIprdeH0Aq54ZXvK5LtwcIhhJERtC1JuE4W3HQnoXT
|
||||||
6lfAQxDlHLrapYXYV9a0M2Xu/Xu8xX7m9ZjhqzLdnXYs+W4xfa5Wm1nIGu6ij0+lza/ybJXEYd1f
|
UL8CHoIo59DVLi3EvrKmnSlz79/jLfYzr8cMX5Xp7rRjybeL6XO12sxC1nAXfXwqbf4+z1ZJHNb9
|
||||||
WoCWyNohJG/izsCfDAVnatWY9zgdQh1kJP62hELXHUFMr8mz07Yis+dg9Gbc7xbHULBArY+C5veQ
|
pQVoiawdQvIm7gz8yVBwplaNeY/TIdRBRuJvSyh03RHE9Jo8O20rMnsORm/G/XZxDAUL1PooaH4P
|
||||||
rlMl8yWbjvFhKyXkmVNjvalMHTBvN9gmoP6KagvAt7LJMLr47EMiQDxWfLp1wFmal0hqiCmaJnQV
|
6TpVMl+y6RgftlJCnjk11pvK1AHzdoNtAuqvqLYAfCubDKOLzz4kAsRjxadbB5yleYmkhpiiaUJX
|
||||||
l1XtgWkCGut0BxDvtMth80/GvhzfAv8l+5K5r5qyhFWSnUTMjssZIO/5f+FjFYeZw1iVpdDi2n3R
|
cVnVHpgmoLFOdwDxTrscNv9k7MvxLfBfsi+Z+31TlrBKspOI2XE5A+Q9/y98rOIwcxirshRaXLsv
|
||||||
HxNJZbEP0EA2MDnDvj8P/MQNTsHITI2d/G5fMfs11vCkGLLPYqx63WYzsOq7vH6TN1n0u432UTJt
|
+mMiqSz2ARrIBiZn2PfngZ+4wSkYmamxk9/tK2a/xhqeFEP2WYxVr9tsBlZ9l9dv8iaLfrfRPkqm
|
||||||
JI5SnUPuKghLwWsx9FYBbo4ssM2iMFwdiNK/N2bRxxK4VLxSXhjq4dddi681V4qrbSMRbC/JQypd
|
jcRRqnPIXQVhKXgtht4qwM2RBbZZFIarA1H698Ys+lgCl4pXygtDPfy6a/G15kpxtW0kgu0leUil
|
||||||
qM2pGB/XsnOXQSUvk8JbRfstqzaUmS2xHXnPk7iHXVte1qRLUYJFczLl1isQLmz/UdJLHZO2Dwla
|
C7U5FePjWnbuMqjkZVJ4q2i/ZdWGMrMltiPveRL3sGvLy5p0KUqwaE6m3HoFwoXtP0p6qWPS9iFB
|
||||||
QFMEu+3x45Zhj8MFHxFu9Ooii2TYxB4tZ86JM/PZreTJLa7Yy/3Bv4hS6BSy7XfpVUTkyz0SB9vp
|
C2iKYLc9ftwy7HG44CPCjV5dZJEMm9ij5cw5cWY+u5U8ucUVe7k/+BdRCp1Ctv0uvYqIfLlH4mA7
|
||||||
ag/UYQ3zLKJeZ8Ex0C/FCt0NtjXDuuFJ13Gl/dVYSdW+FsN/JGHoxSISalNCFbykKCSwza36zWWC
|
Xe2BOqxhnkXU6yw4BvqlWKG7wbZmWDc86TqutL8aK6na12L4jyQMvVhEQm1KqIKXFIUEtrlVv7lM
|
||||||
ZdXEsEZrrDRQvLDNrde/BagO2PrpJcc+lmHr39ABKunLpnbZy1VRkOx5i0Xmf/xeAEv3pOAaVGWX
|
sKyaGNZojZUGihe2ufX6twDVAVs/veTYxzJs/Rs6QCV92dQue7kqCpI9b7HI/I/fC2DpnhRcg6rs
|
||||||
ZYjoYF+qtWpY6yBvlmhn58jzl/d5jFpdoOVGLTldhjMK6W3x0loP+fhq6uGW+i5bEqW45I6Gj9hH
|
sgwRHexLtVYNax3kzRLt7Bx5/uo+j1GrC7TcqCWny3BGIb0tXlrrIR9fTT3cUt9lS6IUl9zR8BH7
|
||||||
waMTiq0MAwwkZ0A6W4LJ3XnYYd+iEmI0lK4FNDnMyxLcBVnfABnslrRa20uMZx21IHitwvqDTTlM
|
KHh0QrGVYYCB5AxIZ0swuTsPO+xbVEKMhtK1gCaHeVmCuyDrGyCD3ZJWa3uJ8ayjFgSvVVh/sCmH
|
||||||
EMoQ9IFHg4xKspGIlszy2HS7nI6AVFqAyLqxkc9UkoC1LCkGEKBL9AE84LeEO1jUhO86pyRh2EtC
|
CUIZgj7waJBRSTYS0ZJZHptul9MRkEoLEFk3NvKZShKwliXFAAJ0iT6AB/yWcAeLmvBd55QkDHtJ
|
||||||
lqBkrCpBcNcVeK9l/uCumixEb6acIA2b49Re9dizZ3fb2YGsWDb/u/pETdeG8Vp7liv5/FDCPITF
|
yBKUjFUlCO66Au+1zB/cVZOF6M2UE6Rhc5zaqx579uxuOzuQFcvmf1efqOnaMF5rz3Ilnx9KmIew
|
||||||
nBkKaVuyjNTex7lsJY3a7Oan4FU1Ghiu5OM6IOjx83aRJ+BoYQHT/nkFHrtQ6YJF0hMSm27CGw4A
|
mDNDIW1LlpHa+ziXraRRm938FLyqRgPDlXxcBwQ9ft4u8gQcLSxg2j+vwGMXKl2wSHpCYtNNeMMB
|
||||||
T87nh/P2y1DpjtaInugf1Wa1zJjuwwyyisCa1NkhTaU39VYpOlEVoG9w0Qw8cBfgAbK6C/k/U2zj
|
4Mn5/HDefhkq3dEa0RP9o9qslhnTfZhBVhFYkzo7pKn0pt4qRSeqAvQNLpqBB+4CPEBWdyH/Z4pt
|
||||||
4V1TkLdYycRaZHJHENl1QCJvCb4tUDi0R0DEM9NrADfGsAu9dMehI/BxOG2nmWfpab3sQ5jtUrXr
|
PLxrCvIWK5lYi0zuCCK7DkjkLcG3BQqH9giIeGZ6DeDGGHahl+44dAQ+DqftNPMsPa1XfQizXap2
|
||||||
Thu6WR8QGksBX0+AbBJjQ0DOgCiW+Zy5CTC0rWMLlsqtad7ZM8GVzQ+Rbk8MMcB6pncxRrRvwkNl
|
3WlDN+sDQmMp4OsJkE1ibAjIGRDFMp8zNwGGtnVswVK5Nc07eya4svkh0u2JIQZYz/Quxoj2TXio
|
||||||
zTar0LSLG/Le4LFCNdqzRJCJrY7M+BSirOO/f/vaP67wSAtPR338M+rsfkR0MrhhIMllT1GSqHGq
|
rNlmFZp2cUPeGzxWqEZ7lggysdWRGZ9ClHX8929f+8cVHmnh6aiPf0ad3Y+ITgY3DCS57ClKEjVO
|
||||||
Ji/WtvjTtY2qDeiHLbFpfg/JMphGYHbI3SLhodiAsgvdqR6E8bjCXuMYrE/9p+wOAmGv+Q6Jl9qD
|
1eTF2hZ/urZRtQH9sCU2ze8hWQbTCMwOuVskPBQbUHahO9WDMB5X2Gscg/Wp/5TdQSDsNd8h8VJ7
|
||||||
MXe/fq2w7uj5H0xH9YUAoxFsJwWoVqfNvvrXxbme2Y95hh3DORYHQ3evFx95yyVI/85ky6pfHnUc
|
MObu168V1h09/4PpqL4QYDSC7aQA1eq02Vf/ujjXM/sxz7BjOMfiYOju9eIjb7kE6d+ZbFn1y6OO
|
||||||
6DqklMKbh+bmugMGTEZaAHJCLRCJkEeyeVNj0oveY8t3nc3pOmeYsBns8ZhUfUX+QKJqvsGJzpkr
|
A12HlFJ489DcXHfAgMlIC0BOqAUiEfJINm9qTHrRe2z5rrM5XecMEzaDPR6Tqq/IH0hUzTc40Tlz
|
||||||
ywGygx6sdFW9CDKaJP2hmuExy3ml6mwrjo58e8cNMAU+dFEe61NjVaYjwLxliaidiqHit853yM9W
|
ZTlAdtCDla6qF0FGk6Q/VDM8ZjmvVJ1txdGRb++4AabAhy7KY31qrMp0BJi3LBG1UzFU/Nb5DvnZ
|
||||||
0RS/Uddcs4XnDZp/qoWPNxHwq8E9jeGQPBRM7zhs2GdWIINq1/Q2IyzjmG7TS3CqsnEPbNXEKk7s
|
KpriN+qaa7bwvEHzT7Xw8SYCfjW4pzEckoeC6R2HDfvMCmRQ7ZreZoRlHNNteglOVTbuga2aWMWJ
|
||||||
aaM7V91FnshoEziDnfT98T5fM/TO++C0r+YrSKfbI2JcXzHFCGAI0t5YadvWrY10vMdyBTDgqRj4
|
PW1056q7yBMZbQJnsJO+P97na4beeR+c9tV8Bel0e0SM6yumGAEMQdobK23burWRjvdYrgAGPBUD
|
||||||
/zQFIoJ8+YvbHTj6utddQEkIdZeMbI91GXrOTdL9NVN6LtckF1TSUkw95oYtwtbM0Y2FsQsiTu3u
|
/5+mQESQL39xuwNHX/e6CygJoe6Ske2xLkPPuUm6v2ZKz+Wa5IJKWoqpx9ywRdiaObqxMHZBxKnd
|
||||||
iUdgcipSuU8+NZEVYbdRFYkNK1KHNlXnB2GBLz2dc/ddFfAkbV/h9AakjPyf5uXYAVo9jwQ/4HeG
|
PfEITE5FKvfJpyayIuw2qiKxYUXq0Kbq/CAs8KWnc+6+qwKepO0rnN6AlJH/07wcO0Cr55HgB/zO
|
||||||
PvwVyl9G8tGsLiVqHeThtMjqPglgf4okWVW3OdF+Vhky8mGCM0xKBlupNwZHu62ox49tpUeG0Skb
|
0Id/j/KXkXw0q0uJWgd5OC2yuk8C2J8iSVbVbU60n1WGjHyY4AyTksFW6o3B0W4r6vFjW+mRYXTK
|
||||||
yuvx/T1mYkNP8wj4rJfPt0Gvy+mOVCiBCBTeoSrF+MuWX+9VUJkBX/zwwxxFiCEExCm/f4WCxqMU
|
hvJ6fH+PmdjQ0zwCPuvl823Q63K6IxVKIAKFd6hKMf6y5dd7FVRmwBc//DBHEWIIAXHK71+hoPEo
|
||||||
9mCc3RcTnhpXDd/exdY9yT4Qn961fOs/OsiK2SOm/Sjn/is2ZbCiV3YobbFXHmpQ65fsU7YRbRTN
|
hT0YZ/fFhKfGVcO3d7F1T7IPxKd3Ld/6jw6yYvaIaT/Kuf+KTRms6JUdSlvslYca1Pol+5RtRBtF
|
||||||
vpd9zL3hzHIypzBTszYoSrGKH1zt6bvg0gY5Cg3qUBLq73vjvN/YG/5WF+o04Gf9BaJkJB6MsPn8
|
s+9kH3NvOLOczCnM1KwNilKs4gdXe/ouuLRBjkKDOpSE+vveOO839oa/1YU6DfhZf4EoGYkHI2w+
|
||||||
7PymzaJo0NPX7kTWpKLk8kKe2TtBUHljVeZb83kJe5X3IOQmhgk6bAJw+LBmWVfYZkYlXmAYkXgs
|
Pzu/abMoGvT0tTuRNakoubyQZ/ZOEFTeWJX51nxewl7lPQi5iWGCDpsAHD6sWdYVtplRiRcYRiQe
|
||||||
jZk6L5RkaGaRxLXr4DoLZ/Z5PjidM1ig2WcupnANj4gkVVgaSiqsB64JaKa8Rfid5I+9h9Qjt/pM
|
S2OmzgslGZpZJHHtOrjOwpl9ng9O5wwWaPaZiylcwyMiSRWWhpIK64FrApopbxF+K/lj7yH1yK0+
|
||||||
kM8tVH4tpR2NwNymEqVDRwvd5Vh1VIhtXGvHxrZKO9tiGFIjR6o6VParkNOBonHuqK9H2mx378H4
|
E+RzC5VfS2lHIzC3qUTp0NFCdzlWHRViG9fasbGt0s62GIbUyJGqDpX9KuR0oGicO+rrkTbb3Xsw
|
||||||
oQ7VEdsKBywqBBIsQd7IbkEhjVs9US4kUyohUjxnMI9Hx10S+rlFc+mXCureEbJhvCEjDmFiCpO3
|
fqhDdcS2wgGLCoEES5A3sltQSONWT5QLyZRKiBTPGczj0XGXhH5u0Vz6pYK6d4RsGG/IiEOYmMLk
|
||||||
lY9ZW/9M3/8oz3sx2QavWIIz6pUn9sR9oC0U8xHDgty48riKc9e7Qoz4hq1K4yDp5YfLfzPhs64I
|
beVj1tY/0/c/yvNeTLbBK5bgjHrliT1xH2gLxXzEsCA3rjyu4tz1rhAjvmGr0jhIevXh8g8mfNYV
|
||||||
HCIEhewro3mby3y3wCxJZGFuF80Ri0Qt1K05DN54Et9GQNTUaJjDtsdwiyF5vh4a6rP5zoNR9Mil
|
gUOEoJB9ZTRvc5nvFpgliSzM7aI5YpGohbo1h8EbT+LbCIiaGg1z2PYYbjEkz9dDQ30233kwih65
|
||||||
Qbt1O8SyiuIFHSpIX4gKSb4wfiBiizK/jyMRydcf4pWCN1+0qIzmQ6Qu3KVed6ihO45mxdEPHDbK
|
NGi3bodYVlG8oEMF6QtRIckXxg9EbFHm93EkIvn6Q7xS8OaLFpXRfIjUhbvU6w41dMfRrDj6gcNG
|
||||||
7FJQ2ICh3pBgQCTPQmz3QMfaKm+EAy0bqD/21yi9NAysUsqxMq/rqS1ZNuGLLFJBg+6M7dlUNpe3
|
mV0KChsw1BsSDIjkWYjtHuhYW+WNcKBlA/XH/hqll4aBVUo5VuZ1PbUlyyZ8kUUqaNCdsT2byuby
|
||||||
+Trh9ehA+97fR7NKVU9WpAEOm4e1NFWMC5/7SdqXMVlIOZxAKRLdffkn6ly/G/EVOejeJPRA83nA
|
Nl8nvB4daN/7+2hWqerJijTAYfOwlqaKceFzP0n7MiYLKYcTKEWiuy//RJ3rdyO+Igfdm4QeaD4P
|
||||||
m/68cfvZ1I326A7Nms6Xpfujs17D32diKNp+9v975Tmgl047M2E0zBPeZOGmS+G6J8NI+VGN9PaM
|
eNOfN24/m7rRHt2hWdP5snR/dNZr+PtMDEXbz/5/rzwH9NJpZyaMhnnCmyzcdClc92QYKT+qkd6e
|
||||||
oY1tOLa28I0kCUEFv36jRUIVccFSXt7hWX7OOB3A8m7CsmmNp031zr+5wXThszMPzRvZlJ3hFZtE
|
MbSxDcfWFr6RJCGo4NdvtEioIi5Yyss7PMvPGacDWN5NWDat8bSp3vk3N5gufHbmoXkjm7IzvGKT
|
||||||
zFULYC4e6P0lyJnnKc8gdkfOjRHiNMbTm7YfgE0zM8H83H/j4oY9b6dNNA66n2N9mablnnEpuRLJ
|
iLlqAczFA72/BDnzPOUZxO7IuTFCnMZ4etP2A7BpZiaYn/tvXNyw5+20icZB93OsL9O03DMuJVci
|
||||||
SjbOF1N/6rFU4MWBaoExpTuZURep6SBYQchjRroEUAK3JWvxZyivGOl7xHp/3YUG9Mn4rle+zbCq
|
WcnG+WLqTz2WCrw4UC0wpnQnM+oiNR0EKwh5zEiXAErgtmQt/gzlFSN9j1jvr7vQgD4Z3/XKtxlW
|
||||||
TvMI3wqT/h+b/QRQiDKNq4pe0+qO7DSSGJSQGl4g86jy2S1uwGkvhuArWoB0JYiQ0TVqIFRxAL7C
|
1Wke4Vth0v9js58AClGmcVXRa1rdkZ1GEoMSUsMLZB5VPrvFDTjtxRB8RQuQrgQRMrpGDYQqDsBX
|
||||||
ZLUjBz2xTE15QkSk+ModXRYBfhLJ1ADUeLDHrrQYNHa5Y2tRK1zurH+DQiVkYV7szN9QiEHGr24E
|
mKx25KAnlqkpT4iIFF+5o8siwE8imRqAGg/22JUWg8Yud2wtaoXLnfVvUKiELMyLnfkbCjHI+NWN
|
||||||
SobK6+QaQDG+uzZocgD04abNC7RYRvmAHsDYnKwmbfUBK5E/hIiiQHqVsxpW/e+BXzrShPXoURda
|
QMlQeZ1cAyjGd9cGTQ6APty0eYEWyygf0AMYm5PVpK0+YCXyhxBRFEivclbDqv898EtHmrAePepC
|
||||||
Kr4SKFUxONbvIH1eQAUauWqNvivTdC2IWz7+OQiI98mwb/Ptt3+h3CWMUxAfFU1A3+mfT0+NZCxZ
|
S8VXAqUqBsf6HaTPC6hAI1et0Xdlmq4FccvHPwcB8T4Z9m1evvwb5S5hnIL4qGgC+k7/enpqJGPJ
|
||||||
+Ur0GqdU/jan+CjQWgWrkPsmyabhmz099jfmvvDYtwaH0MZwvihdwHDmIZ4XM2u5EKYFwfjYJJCA
|
ylei1zil8rc5xUeB1ipYhdw3STYN3+zpsb8z94XHXhocQhvD+aJ0AcOZh3hezKzlQpgWBONjk0AC
|
||||||
fnc6NWQbInUlZjtAKal3bUcPI0R3YrfQCujjcT+oL9LsIAHOzGMKm7w6rBkEmRtd9ABcrQW3Vouq
|
+t3p1JBtiNSVmO0ApaTetR09jBDdid1CK6CPx/2gvkizgwQ4M48pbPLqsGYQZG500QNwtRbcWi2q
|
||||||
S+LAVG7IvIHSGeM9Iukc0NrW0ALvM2h0dk5SDjdAXCdjhXc2BmzofPEJgOEGdnYAUBUIpsX+C7de
|
LokDU7kh8wZKZ4z3iKRzQGtbQwu8z6DR2TlJOdwAcZ2MFd7ZGLCh88UnAIYb2NkBQFUgmBb7b9x6
|
||||||
pYri5AS4n0AVfDaugOlG8aC6tt1TIGRBtFy7oIRT5VrwTTa88CR0OEh5TDX3vcf2XPLrAsHloddd
|
lSqKkxPgfgJV8Nm4AqYbxYPq2nZPgZAF0XLtghJOlWvBN9nwwpPQ4SDlMdXc9x7bc8mvCwSXh153
|
||||||
SQUueLVTUNr5Hb7+r2L88OU2IC6m+y+YPAVUkQcBkhoE6l1KoruNmmfnN7PJPwERhOVk
|
JRW44NVOQWnnd/j6v4rxw5fbgLiY7r9g8hRQRR4ESGoQqHcpie42ap6d38wm/wIwBuVg
|
||||||
""")
|
""")
|
||||||
|
|
||||||
##file activate.sh
|
##file activate.sh
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
@echo off
|
||||||
|
set VIRTUAL_ENV=__VIRTUAL_ENV__
|
||||||
|
|
||||||
|
if not defined PROMPT (
|
||||||
|
set PROMPT=$P$G
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PROMPT (
|
||||||
|
set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||||
|
set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||||
|
)
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PROMPT=%PROMPT%
|
||||||
|
set PROMPT=__VIRTUAL_WINPROMPT__ %PROMPT%
|
||||||
|
|
||||||
|
if defined PYTHONHOME (
|
||||||
|
set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
|
||||||
|
set PYTHONHOME=
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%; goto SKIPPATH
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PATH=%PATH%
|
||||||
|
|
||||||
|
:SKIPPATH
|
||||||
|
set PATH=%VIRTUAL_ENV%\__BIN_NAME__;%PATH%
|
||||||
|
|
||||||
|
:END
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# This file must be used with "source bin/activate.csh" *from csh*.
|
||||||
|
# You cannot run it directly.
|
||||||
|
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
||||||
|
|
||||||
|
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
|
||||||
|
|
||||||
|
# Unset irrelavent variables.
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
setenv VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PATH="$PATH"
|
||||||
|
setenv PATH "$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PROMPT="$prompt"
|
||||||
|
|
||||||
|
if ("__VIRTUAL_PROMPT__" != "") then
|
||||||
|
set env_name = "__VIRTUAL_PROMPT__"
|
||||||
|
else
|
||||||
|
if (`basename "$VIRTUAL_ENV"` == "__") then
|
||||||
|
# special case for Aspen magic directories
|
||||||
|
# see http://www.zetadev.com/software/aspen/
|
||||||
|
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
|
||||||
|
else
|
||||||
|
set env_name = `basename "$VIRTUAL_ENV"`
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
set prompt = "[$env_name] $prompt"
|
||||||
|
unset env_name
|
||||||
|
|
||||||
|
rehash
|
||||||
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
|
||||||
|
# you cannot run it directly
|
||||||
|
|
||||||
|
function deactivate -d "Exit virtualenv and return to normal shell environment"
|
||||||
|
# reset old environment variables
|
||||||
|
if test -n "$_OLD_VIRTUAL_PATH"
|
||||||
|
set -gx PATH $_OLD_VIRTUAL_PATH
|
||||||
|
set -e _OLD_VIRTUAL_PATH
|
||||||
|
end
|
||||||
|
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
||||||
|
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
||||||
|
set -e _OLD_VIRTUAL_PYTHONHOME
|
||||||
|
end
|
||||||
|
|
||||||
|
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
||||||
|
functions -e fish_prompt
|
||||||
|
set -e _OLD_FISH_PROMPT_OVERRIDE
|
||||||
|
end
|
||||||
|
|
||||||
|
set -e VIRTUAL_ENV
|
||||||
|
if test "$argv[1]" != "nondestructive"
|
||||||
|
# Self destruct!
|
||||||
|
functions -e deactivate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# unset irrelavent variables
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
set -gx VIRTUAL_ENV "__VIRTUAL_ENV__"
|
||||||
|
|
||||||
|
set -gx _OLD_VIRTUAL_PATH $PATH
|
||||||
|
set -gx PATH "$VIRTUAL_ENV/__BIN_NAME__" $PATH
|
||||||
|
|
||||||
|
# unset PYTHONHOME if set
|
||||||
|
if set -q PYTHONHOME
|
||||||
|
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
||||||
|
set -e PYTHONHOME
|
||||||
|
end
|
||||||
|
|
||||||
|
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
||||||
|
# fish shell uses a function, instead of env vars,
|
||||||
|
# to produce the prompt. Overriding the existing function is easy.
|
||||||
|
# However, adding to the current prompt, instead of clobbering it,
|
||||||
|
# is a little more work.
|
||||||
|
set -l oldpromptfile (tempfile)
|
||||||
|
if test $status
|
||||||
|
# save the current fish_prompt function...
|
||||||
|
echo "function _old_fish_prompt" >> $oldpromptfile
|
||||||
|
echo -n \# >> $oldpromptfile
|
||||||
|
functions fish_prompt >> $oldpromptfile
|
||||||
|
# we've made the "_old_fish_prompt" file, source it.
|
||||||
|
. $oldpromptfile
|
||||||
|
rm -f $oldpromptfile
|
||||||
|
|
||||||
|
if test -n "__VIRTUAL_PROMPT__"
|
||||||
|
# We've been given us a prompt override.
|
||||||
|
#
|
||||||
|
# FIXME: Unsure how to handle this *safely*. We could just eval()
|
||||||
|
# whatever is given, but the risk is a bit much.
|
||||||
|
echo "activate.fish: Alternative prompt prefix is not supported under fish-shell." 1>&2
|
||||||
|
echo "activate.fish: Alter the fish_prompt in this file as needed." 1>&2
|
||||||
|
end
|
||||||
|
|
||||||
|
# with the original prompt function renamed, we can override with our own.
|
||||||
|
function fish_prompt
|
||||||
|
set -l _checkbase (basename "$VIRTUAL_ENV")
|
||||||
|
if test $_checkbase = "__"
|
||||||
|
# special case for Aspen magic directories
|
||||||
|
# see http://www.zetadev.com/software/aspen/
|
||||||
|
printf "%s[%s]%s %s" (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) (_old_fish_prompt)
|
||||||
|
else
|
||||||
|
printf "%s(%s)%s%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) (_old_fish_prompt)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
# This file must be used with "source bin/activate" *from bash*
|
||||||
|
# you cannot run it directly
|
||||||
|
|
||||||
|
deactivate () {
|
||||||
|
# reset old environment variables
|
||||||
|
if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
|
||||||
|
PATH="$_OLD_VIRTUAL_PATH"
|
||||||
|
export PATH
|
||||||
|
unset _OLD_VIRTUAL_PATH
|
||||||
|
fi
|
||||||
|
if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
|
||||||
|
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
|
||||||
|
export PYTHONHOME
|
||||||
|
unset _OLD_VIRTUAL_PYTHONHOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This should detect bash and zsh, which have a hash command that must
|
||||||
|
# be called to get it to forget past commands. Without forgetting
|
||||||
|
# past commands the $PATH changes we made may not be respected
|
||||||
|
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||||
|
hash -r
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
|
||||||
|
PS1="$_OLD_VIRTUAL_PS1"
|
||||||
|
export PS1
|
||||||
|
unset _OLD_VIRTUAL_PS1
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset VIRTUAL_ENV
|
||||||
|
if [ ! "$1" = "nondestructive" ] ; then
|
||||||
|
# Self destruct!
|
||||||
|
unset -f deactivate
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# unset irrelavent variables
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
VIRTUAL_ENV="__VIRTUAL_ENV__"
|
||||||
|
export VIRTUAL_ENV
|
||||||
|
|
||||||
|
_OLD_VIRTUAL_PATH="$PATH"
|
||||||
|
PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# unset PYTHONHOME if set
|
||||||
|
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
||||||
|
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
||||||
|
if [ -n "$PYTHONHOME" ] ; then
|
||||||
|
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
|
||||||
|
unset PYTHONHOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
|
||||||
|
_OLD_VIRTUAL_PS1="$PS1"
|
||||||
|
if [ "x__VIRTUAL_PROMPT__" != x ] ; then
|
||||||
|
PS1="__VIRTUAL_PROMPT__$PS1"
|
||||||
|
else
|
||||||
|
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
|
||||||
|
# special case for Aspen magic directories
|
||||||
|
# see http://www.zetadev.com/software/aspen/
|
||||||
|
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
|
||||||
|
else
|
||||||
|
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
export PS1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This should detect bash and zsh, which have a hash command that must
|
||||||
|
# be called to get it to forget past commands. Without forgetting
|
||||||
|
# past commands the $PATH changes we made may not be respected
|
||||||
|
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
|
||||||
|
hash -r
|
||||||
|
fi
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PROMPT (
|
||||||
|
set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||||
|
)
|
||||||
|
set _OLD_VIRTUAL_PROMPT=
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||||
|
set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||||
|
set _OLD_VIRTUAL_PYTHONHOME=
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PATH=
|
||||||
|
|
||||||
|
:END
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
# This is a config file local to this virtualenv installation
|
||||||
|
# You may include options that will be used by all distutils commands,
|
||||||
|
# and by easy_install. For instance:
|
||||||
|
#
|
||||||
|
# [easy_install]
|
||||||
|
# find_links = http://mylocalsite
|
||||||
Binary file not shown.
Reference in New Issue
Block a user