mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
115 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b87419166 | |||
| d832b7425e | |||
| 2991dce623 | |||
| ffd0bb57ee | |||
| 75870dd412 | |||
| 831d73e302 | |||
| 0cf2e2849d | |||
| 6ba8d47927 | |||
| af940b5390 | |||
| 819bc2da5b | |||
| 2dad2e73f3 | |||
| e550b32ea8 | |||
| 6af8d81086 | |||
| 0ed4089cb9 | |||
| f09191ec8b | |||
| aef7b65b95 | |||
| 5438aab121 | |||
| a259143c0b | |||
| 0896d6a0c4 | |||
| 39f2efe296 | |||
| d047f26ad4 | |||
| 998f996a32 | |||
| c620980e5a | |||
| 2983fcfbea | |||
| e3511e7202 | |||
| 692f040618 | |||
| 8645a965aa | |||
| 3a483865e8 | |||
| 6ea6a0ccaf | |||
| 6bc94eaf6e | |||
| 49e409cb64 | |||
| 2693de45c7 | |||
| 88f711b6e7 | |||
| a7976fc177 | |||
| 8a837a23e7 | |||
| f37597ad9d | |||
| 928a664544 | |||
| 9fb715ef1c | |||
| 3cff2e39fe | |||
| 653a5be104 | |||
| 67ade52e95 | |||
| ab3e365ff6 | |||
| 902672e934 | |||
| 6207b3506b | |||
| 5446d448fd | |||
| 366def6c16 | |||
| a84fc7a248 | |||
| e4aa40216b | |||
| 87d03e62d7 | |||
| 92b4f5e8aa | |||
| 19cd447b83 | |||
| 570182b6b7 | |||
| 0a6ed0de43 | |||
| 0b7a1fc14e | |||
| 2c69e3b98f | |||
| 86f43fa02a | |||
| 03b95247c3 | |||
| 0e8a11b836 | |||
| 4c9de740d2 | |||
| 9b45baa41c | |||
| ecfaeb2fd2 | |||
| cef0b1703a | |||
| 18317ef606 | |||
| 4896396a51 | |||
| be4f207aac | |||
| af15be61b8 | |||
| 39d64c5fd1 | |||
| 645cf5e338 | |||
| 7430c48b72 | |||
| 783d9e4b12 | |||
| eab957c8c9 | |||
| 6e80c391a8 | |||
| 58bae65a28 | |||
| 70d8c7a625 | |||
| 66611ca21a | |||
| 20fe371ac7 | |||
| d23143b801 | |||
| c98615cdd0 | |||
| 0749a04773 | |||
| a4f072714d | |||
| 427ec9e431 | |||
| 168939d14f | |||
| 58ecbd8a73 | |||
| 10eb361975 | |||
| 1242d71382 | |||
| 6ef93693c5 | |||
| 69b8b25322 | |||
| b706cd13f7 | |||
| 724e51b5c7 | |||
| 7b4835a98e | |||
| 477773b331 | |||
| c98c481f24 | |||
| 462fe074f9 | |||
| 70bfc5eab3 | |||
| a4d2592438 | |||
| 8306f84236 | |||
| 6952a2e728 | |||
| 7142c747f4 | |||
| 11db8e126a | |||
| 6f1fce3cdb | |||
| b2e12f9ec8 | |||
| 44f8e393d6 | |||
| b8cbc64d20 | |||
| 5d51be5679 | |||
| d550b8cd15 | |||
| 25b28af19d | |||
| dbe2cdac37 | |||
| 767af30453 | |||
| df02e34a5b | |||
| 26c918863e | |||
| 1c458cee2e | |||
| 433570c27b | |||
| 30cb4ecef3 | |||
| 84e2a51337 | |||
| f1c2bc39d2 |
@@ -0,0 +1,2 @@
|
||||
sudo: false
|
||||
script: exit 0
|
||||
@@ -1,5 +1,40 @@
|
||||
# Python Buildpack Changelog
|
||||
|
||||
## v82 (2016-08-22)
|
||||
|
||||
Update to library detection mechnisms (pip-pop).
|
||||
|
||||
- Updated setuptools to v25.5.0
|
||||
|
||||
## v81 (2016-06-28)
|
||||
|
||||
Updated default Python to 2.7.11.
|
||||
|
||||
- Updated setuptools to v8.1.2.
|
||||
- Updated pip to v23.1.0.
|
||||
|
||||
## v80 (2016-04-05)
|
||||
|
||||
Improved pip-pop compatibility with latest pip releases.
|
||||
|
||||
## v79 (2016-03-22)
|
||||
|
||||
Compatibility improvements with heroku-apt-buildpack.
|
||||
|
||||
## v78 (2016-03-18)
|
||||
|
||||
Added automatic configuration of Gunicorn's `FORWARDED_ALLOW_IPS` setting.
|
||||
|
||||
Improved detection of libffi dependency when using bcrypt via `Django[bcrypt]`.
|
||||
|
||||
Improved GDAL support.
|
||||
|
||||
- GDAL dependency detection now checks for pygdal and is case-insensitive.
|
||||
- The vendored GDAL library has been updated to 1.11.1.
|
||||
- GDAL bootstrapping now also installs the GEOS and Proj.4 libraries.
|
||||
|
||||
Updated pip to 8.1.1 and setuptools to 20.3.
|
||||
|
||||
## v77 (2016-02-10)
|
||||
|
||||
Improvements to warnings and minor bugfix.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License:
|
||||
|
||||
Copyright (C) 2013 Heroku, Inc.
|
||||
Copyright (C) 2016 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:
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
-
|
||||
|
||||
# Heroku Buildpack: Python
|
||||
|
||||
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](https://pip.pypa.io/) and other excellent software.
|
||||
|
||||
Recommended web frameworks include **Django** and **Flask**. The recommended webserver is **Gunicorn**. There are no restrictions around what software can be used (as long as it's pip-installable). Web processes must bind to `$PORT`, and only the HTTP protocol is permitted for incoming connections.
|
||||
|
||||
Some Python packages with obscure C dependencies (e.g. scipy) are [not compatible](https://devcenter.heroku.com/articles/python-c-deps).
|
||||
|
||||
See it in Action
|
||||
----------------
|
||||
|
||||
Deploying a Python application couldn't be easier:
|
||||
|
||||
$ ls
|
||||
Procfile requirements.txt web.py
|
||||
|
||||
$ heroku create --buildpack heroku/python
|
||||
|
||||
$ git push heroku master
|
||||
...
|
||||
-----> Python app detected
|
||||
-----> Installing python-2.7.12
|
||||
$ pip install -r requirements.txt
|
||||
Collecting requests (from -r requirements.txt (line 1))
|
||||
Downloading requests-2.10.0-py2.py3-none-any.whl (501kB)
|
||||
Installing collected packages: requests
|
||||
Successfully installed requests-2.10.0
|
||||
|
||||
-----> Discovering process types
|
||||
Procfile declares types -> (none)
|
||||
|
||||
A `requirements.txt` file must be present at the root of your application's repository.
|
||||
|
||||
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
|
||||
|
||||
$ heroku buildpacks:set heroku/python
|
||||
|
||||
|
||||
Specify a Python Runtime
|
||||
------------------------
|
||||
|
||||
Specific versions of the Python runtime can be specified with a `runtime.txt` file:
|
||||
|
||||
$ cat runtime.txt
|
||||
python-3.5.2
|
||||
|
||||
Runtime options include:
|
||||
|
||||
- `python-2.7.12`
|
||||
- `python-3.5.2`
|
||||
- `pypy-5.3.1` (unsupported, experimental)
|
||||
|
||||
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well. Use at your own risk.
|
||||
@@ -1,54 +0,0 @@
|
||||
# Heroku Buildpack: Python
|
||||

|
||||
|
||||
This is a [Heroku buildpack](http://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [pip](http://www.pip-installer.org/).
|
||||
|
||||
This buildpack supports running Django and Flask apps.
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Example usage:
|
||||
|
||||
$ ls
|
||||
Procfile requirements.txt web.py
|
||||
|
||||
$ heroku create --buildpack git://github.com/heroku/heroku-buildpack-python.git
|
||||
|
||||
$ git push heroku master
|
||||
...
|
||||
-----> Python app detected
|
||||
-----> Installing runtime (python-2.7.11)
|
||||
-----> Installing dependencies using pip
|
||||
Downloading/unpacking requests (from -r requirements.txt (line 1))
|
||||
Installing collected packages: requests
|
||||
Successfully installed requests
|
||||
Cleaning up...
|
||||
-----> Discovering process types
|
||||
Procfile declares types -> (none)
|
||||
|
||||
You can also add it to upcoming builds of an existing application:
|
||||
|
||||
$ heroku buildpacks:set git://github.com/heroku/heroku-buildpack-python.git
|
||||
|
||||
The buildpack will detect your app as Python if it has the file `requirements.txt` in the root.
|
||||
|
||||
It will use Pip to install your dependencies, vendoring a copy of the Python runtime into your slug.
|
||||
|
||||
Specify a Runtime
|
||||
-----------------
|
||||
|
||||
You can also provide arbitrary releases Python with a `runtime.txt` file.
|
||||
|
||||
$ cat runtime.txt
|
||||
python-3.5.1
|
||||
|
||||
Runtime options include:
|
||||
|
||||
- python-2.7.11
|
||||
- python-3.5.1
|
||||
- pypy-4.0.1 (unsupported, experimental)
|
||||
- pypy3-2.4.0 (unsupported, experimental)
|
||||
|
||||
Other [unsupported runtimes](https://github.com/heroku/heroku-buildpack-python/tree/master/builds/runtimes) are available as well.
|
||||
+21
-18
@@ -1,10 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# The Heroku Python Buildpack. This script accepts paramaters for a build
|
||||
# The Heroku Python Buildpack. This script accepts parameters for a build
|
||||
# directory, a cache directory, and a directory for app environment variables.
|
||||
|
||||
# Warning: there are a few hacks in this script to accomidate excellent builds
|
||||
# on Heroku. No gaurentee for external compatibility is made. However,
|
||||
# Warning: there are a few hacks in this script to accommodate excellent builds
|
||||
# on Heroku. No guarantee for external compatibility is made. However,
|
||||
# everything should work fine outside of the Heroku environment, if the
|
||||
# environment is setup correctly.
|
||||
|
||||
@@ -31,11 +31,11 @@ ENV_DIR=$3
|
||||
VIRTUALENV_LOC=".heroku/venv"
|
||||
LEGACY_TRIGGER="lib/python2.7"
|
||||
|
||||
DEFAULT_PYTHON_VERSION="python-2.7.11"
|
||||
DEFAULT_PYTHON_STACK="cedar"
|
||||
DEFAULT_PYTHON_VERSION="python-2.7.12"
|
||||
DEFAULT_PYTHON_STACK="cedar-14"
|
||||
PYTHON_EXE="/app/.heroku/python/bin/python"
|
||||
PIP_VERSION="8.0.2"
|
||||
SETUPTOOLS_VERSION="19.6"
|
||||
PIP_VERSION="8.1.2"
|
||||
SETUPTOOLS_VERSION="25.2.0"
|
||||
|
||||
# Common Problem Warnings
|
||||
export WARNINGS_LOG=$(mktemp)
|
||||
@@ -56,7 +56,7 @@ export PATH=$PATH:$ROOT_DIR/vendor/pip-pop
|
||||
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
|
||||
|
||||
# Sanitizing environment variables.
|
||||
unset GIT_DIR PYTHONHOME PYTHONPATH LD_LIBRARY_PATH LIBRARY_PATH
|
||||
unset GIT_DIR PYTHONHOME PYTHONPATH
|
||||
unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN DYNO
|
||||
unset CYTOKINE_LOG_FILE GEM_PATH
|
||||
|
||||
@@ -73,7 +73,7 @@ source $BIN_DIR/utils
|
||||
# Import collection of warnings.
|
||||
source $BIN_DIR/warnings
|
||||
|
||||
# Directory Hacks for path consistiency.
|
||||
# Directory Hacks for path consistency.
|
||||
APP_DIR='/app'
|
||||
TMP_APP_DIR=$CACHE_DIR/tmp_app_dir
|
||||
|
||||
@@ -103,7 +103,7 @@ BUILD_DIR=$APP_DIR
|
||||
|
||||
# Set up outputs under new context
|
||||
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
|
||||
WEBCONCURRENCY_PROFILE_PATH="$BUILD_DIR/.profile.d/python.webconcurrency.sh"
|
||||
GUNICORN_PROFILE_PATH="$BUILD_DIR/.profile.d/python.gunicorn.sh"
|
||||
|
||||
# We'll need to send these statics to other scripts we `source`.
|
||||
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
|
||||
@@ -112,11 +112,11 @@ export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH
|
||||
export PATH=$BUILD_DIR/.heroku/python/bin:$BUILD_DIR/.heroku/vendor/bin:$PATH
|
||||
export PYTHONUNBUFFERED=1
|
||||
export LANG=en_US.UTF-8
|
||||
export C_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
|
||||
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include
|
||||
export LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
|
||||
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib
|
||||
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:$BUILD_DIR/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config
|
||||
export C_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include:$C_INCLUDE_PATH
|
||||
export CPLUS_INCLUDE_PATH=/app/.heroku/vendor/include:$BUILD_DIR/.heroku/vendor/include:/app/.heroku/python/include:$CPLUS_INCLUDE_PATH
|
||||
export LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib:$LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:$BUILD_DIR/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:$BUILD_DIR/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config:$PKG_CONFIG_PATH
|
||||
|
||||
# Switch to the repo's context.
|
||||
cd $BUILD_DIR
|
||||
@@ -147,7 +147,7 @@ fi
|
||||
if [ -f $CACHE_DIR/.heroku/python-stack ]; then
|
||||
CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
|
||||
else
|
||||
CACHED_PYTHON_STACK=$DEFAULT_PYTHON_STACK
|
||||
CACHED_PYTHON_STACK=$STACK
|
||||
fi
|
||||
|
||||
# If no runtime given, assume default version.
|
||||
@@ -201,6 +201,9 @@ source $BIN_DIR/steps/pylibmc
|
||||
# Libffi support.
|
||||
source $BIN_DIR/steps/cryptography
|
||||
|
||||
# Support for Geo libraries.
|
||||
sub-env $BIN_DIR/steps/geo-libs
|
||||
|
||||
# GDAL support.
|
||||
source $BIN_DIR/steps/gdal
|
||||
|
||||
@@ -221,8 +224,8 @@ set-default-env LANG en_US.UTF-8
|
||||
set-default-env PYTHONHASHSEED random
|
||||
set-default-env PYTHONPATH /app/
|
||||
|
||||
# Install sane-default script for WEB_CONCURRENCY environment variable.
|
||||
cp $ROOT_DIR/vendor/python.webconcurrency.sh $WEBCONCURRENCY_PROFILE_PATH
|
||||
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
||||
cp $ROOT_DIR/vendor/python.gunicorn.sh $GUNICORN_PROFILE_PATH
|
||||
|
||||
|
||||
# Experimental post_compile hook.
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# detector.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
|
||||
# ## Usage
|
||||
|
||||
@@ -19,7 +19,7 @@ MANAGE_FILE=${MANAGE_FILE:-fakepath}
|
||||
# Legacy file-based support for $DISABLE_COLLECTSTATIC
|
||||
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
|
||||
|
||||
# Ensure that Django is explicitily specified in requirments.txt
|
||||
# Ensure that Django is explicitly specified in requirements.txt
|
||||
pip-grep -s requirements.txt django Django && DJANGO_INSTALLED=1
|
||||
|
||||
bpwatch start collectstatic # metrics collection
|
||||
@@ -47,7 +47,7 @@ if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALL
|
||||
echo
|
||||
echo " $ heroku config:set DISABLE_COLLECTSTATIC=1"
|
||||
echo
|
||||
echo " http://devcenter.heroku.com/articles/django-assets"
|
||||
echo " https://devcenter.heroku.com/articles/django-assets"
|
||||
|
||||
# Additionally, dump out the environment, if debug mode is on.
|
||||
if [ "$DEBUG_COLLECTSTATIC" ]; then
|
||||
|
||||
+9
-11
@@ -1,15 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the Pylibmc build step of the
|
||||
# This script serves as the Cryptography build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://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 cryptography binary.
|
||||
# The location of the pre-compiled libffi binary.
|
||||
VENDORED_LIBFFI="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libffi.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
@@ -19,19 +19,17 @@ source $BIN_DIR/utils
|
||||
|
||||
bpwatch start libffi_install
|
||||
|
||||
# If pylibmc exists within requirements, use vendored cryptography.
|
||||
if (pip-grep -s requirements.txt bcrypt cffi cryptography pyOpenSSL PyOpenSSL requests[security] &> /dev/null) then
|
||||
# If a package using cffi exists within requirements, use vendored libffi.
|
||||
if (pip-grep -s requirements.txt bcrypt cffi cryptography django[bcrypt] Django[bcrypt] PyNaCl pyOpenSSL PyOpenSSL requests[security] misaka &> /dev/null) then
|
||||
|
||||
if [ -d ".heroku/vendor/lib/libffi-3.1.1" ]; then
|
||||
export LIBFFI=$(pwd)/vendor
|
||||
else
|
||||
if [ ! -d ".heroku/vendor/lib/libffi-3.1" ]; then
|
||||
echo "-----> Noticed cffi. Bootstrapping libffi."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
# Download and extract libffi into target vendor directory.
|
||||
curl $VENDORED_LIBFFI -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
export LIBFFI=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
export LIBFFI=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
bpwatch stop libffi_install
|
||||
|
||||
+5
-7
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
@@ -20,18 +20,16 @@ source $BIN_DIR/utils
|
||||
bpwatch start gdal_install
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if (pip-grep -s requirements.txt GDAL &> /dev/null) then
|
||||
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||
|
||||
if [ -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
export GDAL=$(pwd)/vendor
|
||||
else
|
||||
if [ ! -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
echo "-----> Noticed GDAL. Bootstrapping gdal."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl $VENDORED_GDAL -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
export GDAL=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
export GDAL=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
bpwatch stop gdal_install
|
||||
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script serves as the GDAL build step of the
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](https://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 cryptography binary.
|
||||
VENDORED_GDAL="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
||||
VENDORED_GEOS="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/geos.tar.gz"
|
||||
VENDORED_PROJ="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/proj.tar.gz"
|
||||
|
||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
|
||||
# Syntax sugar.
|
||||
source $BIN_DIR/utils
|
||||
|
||||
bpwatch start geo_libs_install
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||
|
||||
if [ ! -f ".heroku/vendor/bin/proj" ]; then
|
||||
echo "-----> Bootstrapping gdal, geos, proj."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract cryptography into target vendor directory.
|
||||
curl $VENDORED_GDAL -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl $VENDORED_GEOS -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
curl $VENDORED_PROJ -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
fi
|
||||
|
||||
export GDAL=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
bpwatch stop geo_libs_install
|
||||
+1
-1
@@ -3,4 +3,4 @@ if (grep -Fiq "hg+" requirements.txt) then
|
||||
bpwatch start mercurial_install
|
||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||
bpwatch stop mercurial_install
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -15,4 +15,4 @@ if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||
fi
|
||||
fi
|
||||
bpwatch stop pip_uninstall
|
||||
set -e
|
||||
set -e
|
||||
|
||||
+4
-6
@@ -4,7 +4,7 @@
|
||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||
# compiler.
|
||||
#
|
||||
# A [buildpack](http://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# A [buildpack](https://devcenter.heroku.com/articles/buildpacks) is an
|
||||
# adapter between a Python application and Heroku's runtime.
|
||||
#
|
||||
# This script is invoked by [`bin/compile`](/).
|
||||
@@ -21,16 +21,14 @@ bpwatch start pylibmc_install
|
||||
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
||||
|
||||
if [ -d ".heroku/vendor/lib/sasl2" ]; then
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
else
|
||||
if [ ! -d ".heroku/vendor/lib/sasl2" ]; then
|
||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||
mkdir -p .heroku/vendor
|
||||
# Download and extract libmemcached into target vendor directory.
|
||||
curl $VENDORED_MEMCACHED -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
export LIBMEMCACHED=$(pwd)/vendor
|
||||
fi
|
||||
|
||||
bpwatch stop pylibmc_install
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building libffi..."
|
||||
|
||||
SOURCE_TARBALL='https://cl.ly/2s1t1u3v0N0I/download/libffi-3.1.tar'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar x
|
||||
|
||||
cd libffi-3.1
|
||||
./configure --prefix=$OUT_PREFIX --disable-static &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
Vendored
+2
-2
@@ -10,11 +10,11 @@ hash -r
|
||||
|
||||
echo "Building gdal..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.0/gdal-1.11.0.tar.gz'
|
||||
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.1/gdal-1.11.1.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
cd gdal-1.11.0
|
||||
cd gdal-1.11.1
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building geos..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/geos/geos-3.4.2.tar.bz2'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar xj
|
||||
|
||||
cd geos-3.4.2
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/vendor/
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
# Use new path, containing autoconf.
|
||||
export PATH="/app/.heroku/python/bin/:$PATH"
|
||||
hash -r
|
||||
|
||||
|
||||
echo "Building gdal..."
|
||||
|
||||
SOURCE_TARBALL='http://download.osgeo.org/proj/proj-4.8.0.tar.gz'
|
||||
|
||||
curl -L $SOURCE_TARBALL | tar zx
|
||||
|
||||
cd proj-4.8.0
|
||||
./configure --prefix=$OUT_PREFIX &&
|
||||
make
|
||||
make install
|
||||
|
||||
# Cleanup
|
||||
cd ..
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-5.0.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy-5.0.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-5.0.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy-5.0.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-5.1.0-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy-5.1.0-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy-5.1.1-linux64.tar.bz2'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy-5.1.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
# NOTICE: This formula only works for the cedar-14 stack, not cedar.
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building PyPy..."
|
||||
SOURCE_TARBALL='https://bbuseruploads.s3.amazonaws.com/54220cd1-b139-4188-9455-1e13e663f1ac/downloads/265504fc-8c03-4c1d-935a-2b8fbc6da51a/pypy2-v5.3.1-linux64.tar.bz2?Signature=F%2FnnB39QrCTPldSErIJoqzAt8YA%3D&Expires=1471612628&AWSAccessKeyId=AKIAIWY5XSVPZPDQYRQQ&versionId=kJjoDTh5eNcLrGrt5hYT0_5XGjg3.gl0&response-content-disposition=attachment%3B%20filename%3D%22pypy2-v5.3.1-linux64.tar.bz2%22'
|
||||
curl -L $SOURCE_TARBALL | tar jx
|
||||
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
|
||||
|
||||
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||
@@ -5,9 +5,9 @@
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://www.python.org/ftp/python/2.7.11/Python-2.7.11rc1.tgz'
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-2.7.11rc1 src
|
||||
mv Python-2.7.12 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
@@ -10,7 +10,7 @@ curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.1 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no --enable-shared
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.2/Python-3.5.2.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.2 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
+10
-13
@@ -18,6 +18,7 @@ from pip._vendor.requests import session
|
||||
|
||||
requests = session()
|
||||
|
||||
|
||||
class Requirements(object):
|
||||
def __init__(self, reqfile=None):
|
||||
super(Requirements, self).__init__()
|
||||
@@ -31,13 +32,15 @@ class Requirements(object):
|
||||
return '<Requirements \'{}\'>'.format(self.path)
|
||||
|
||||
def load(self, reqfile):
|
||||
|
||||
if not os.path.exists(reqfile):
|
||||
raise ValueError('The given requirements file does not exist.')
|
||||
|
||||
finder = PackageFinder([], [], session=requests)
|
||||
for requirement in parse_requirements(reqfile, finder=finder, session=requests):
|
||||
if requirement.req:
|
||||
if not getattr(requirement.req, 'name', None):
|
||||
# Prior to pip 8.1.2 the attribute `name` did not exist.
|
||||
requirement.req.name = requirement.req.project_name
|
||||
self.requirements.append(requirement.req)
|
||||
|
||||
|
||||
@@ -48,24 +51,24 @@ class Requirements(object):
|
||||
|
||||
# Generate fresh packages.
|
||||
other_reqs = (
|
||||
[r.project_name for r in r1.requirements]
|
||||
[r.name for r in r1.requirements]
|
||||
if ignore_versions else r1.requirements
|
||||
)
|
||||
|
||||
for req in r2.requirements:
|
||||
r = req.project_name if ignore_versions else req
|
||||
r = req.name if ignore_versions else req
|
||||
|
||||
if r not in other_reqs and r not in excludes:
|
||||
results['fresh'].append(req)
|
||||
|
||||
# Generate stale packages.
|
||||
other_reqs = (
|
||||
[r.project_name for r in r2.requirements]
|
||||
[r.name for r in r2.requirements]
|
||||
if ignore_versions else r2.requirements
|
||||
)
|
||||
|
||||
for req in r1.requirements:
|
||||
r = req.project_name if ignore_versions else req
|
||||
r = req.name if ignore_versions else req
|
||||
|
||||
if r not in other_reqs and r not in excludes:
|
||||
results['stale'].append(req)
|
||||
@@ -73,11 +76,7 @@ class Requirements(object):
|
||||
return results
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def diff(r1, r2, include_fresh=False, include_stale=False, excludes=None):
|
||||
|
||||
include_versions = True if include_stale else False
|
||||
excludes = excludes if len(excludes) else []
|
||||
|
||||
@@ -92,12 +91,11 @@ def diff(r1, r2, include_fresh=False, include_stale=False, excludes=None):
|
||||
|
||||
if include_fresh:
|
||||
for line in results['fresh']:
|
||||
print(line.project_name if include_versions else line)
|
||||
print(line.name if include_versions else line)
|
||||
|
||||
if include_stale:
|
||||
for line in results['stale']:
|
||||
print(line.project_name if include_versions else line)
|
||||
|
||||
print(line.name if include_versions else line)
|
||||
|
||||
|
||||
def main():
|
||||
@@ -114,6 +112,5 @@ def main():
|
||||
diff(**kwargs)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Vendored
+12
-20
@@ -15,6 +15,7 @@ from pip._vendor.requests import session
|
||||
|
||||
requests = session()
|
||||
|
||||
|
||||
class Requirements(object):
|
||||
def __init__(self, reqfile=None):
|
||||
super(Requirements, self).__init__()
|
||||
@@ -28,41 +29,34 @@ class Requirements(object):
|
||||
return '<Requirements \'{}\'>'.format(self.path)
|
||||
|
||||
def load(self, reqfile):
|
||||
|
||||
if not os.path.exists(reqfile):
|
||||
raise ValueError('The given requirements file does not exist.')
|
||||
|
||||
finder = PackageFinder([], [], session=requests)
|
||||
for requirement in parse_requirements(reqfile, finder=finder, session=requests):
|
||||
self.requirements.append(requirement)
|
||||
|
||||
|
||||
if requirement.req:
|
||||
if not getattr(requirement.req, 'name', None):
|
||||
# Prior to pip 8.1.2 the attribute `name` did not exist.
|
||||
requirement.req.name = requirement.req.project_name
|
||||
self.requirements.append(requirement.req)
|
||||
|
||||
|
||||
def grep(reqfile, packages, silent=False):
|
||||
|
||||
try:
|
||||
r = Requirements(reqfile)
|
||||
except ValueError:
|
||||
|
||||
if not silent:
|
||||
print('There was a problem loading the given requirement file.')
|
||||
|
||||
exit(os.EX_NOINPUT)
|
||||
|
||||
for requirement in r.requirements:
|
||||
|
||||
if requirement.req:
|
||||
|
||||
if requirement.req.project_name in packages:
|
||||
|
||||
if not silent:
|
||||
print('Package {} found!'.format(requirement.req.project_name))
|
||||
|
||||
exit(0)
|
||||
for req in r.requirements:
|
||||
if req.name in packages:
|
||||
if not silent:
|
||||
print('Package {} found!'.format(req.name))
|
||||
exit(0)
|
||||
|
||||
if not silent:
|
||||
print('Not found.'.format(requirement.req.project_name))
|
||||
print('Not found.')
|
||||
|
||||
exit(1)
|
||||
|
||||
@@ -72,10 +66,8 @@ def main():
|
||||
|
||||
kwargs = {'reqfile': args['<reqfile>'], 'packages': args['<package>'], 'silent': args['-s']}
|
||||
|
||||
|
||||
grep(**kwargs)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -1,27 +1,32 @@
|
||||
case $(ulimit -u) in
|
||||
|
||||
# 1X DYNO
|
||||
# Automatic configuration for Gunicorn's Workers setting.
|
||||
|
||||
# Standard-1X (+Free, +Hobby) Dyno
|
||||
256)
|
||||
export DYNO_RAM=512
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-2}
|
||||
;;
|
||||
|
||||
# 2X DYNO
|
||||
# Standard-2X Dyno
|
||||
512)
|
||||
export DYNO_RAM=1024
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-4}
|
||||
;;
|
||||
|
||||
# IX DYNO
|
||||
# Performance-M Dyno
|
||||
16384)
|
||||
export DYNO_RAM=2560
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-8}
|
||||
;;
|
||||
|
||||
# PX DYNO
|
||||
# Performance-L Dyno
|
||||
32768)
|
||||
export DYNO_RAM=6656
|
||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-11}
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Automatic configuration for Gunicorn's ForwardedAllowIPS setting.
|
||||
export FORWARDED_ALLOW_IPS='*'
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Reference in New Issue
Block a user