mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
58 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 97ac451a80 | |||
| 06fa6d23ba | |||
| df083fd3b8 | |||
| 2e1638a1b0 | |||
| e15f68944a | |||
| 9468ec2630 | |||
| c4ec6d3370 | |||
| 1ed0a96b09 | |||
| 500daaf6fc | |||
| 4a1fcafecc | |||
| 23ee27792a | |||
| de680016c9 | |||
| 646466c4dd | |||
| a2c3aaf817 | |||
| 88d6c93955 | |||
| b261158bf2 | |||
| 009d0ddbae | |||
| 17dd42113f | |||
| f767a73515 | |||
| 2608bf43dd | |||
| 25c5762cb9 | |||
| ff223597f3 | |||
| 50950c59df | |||
| 9817eb149e | |||
| a703d2febe | |||
| e304405410 | |||
| 17f992a106 | |||
| 24895082d3 | |||
| 002780c2d9 | |||
| df7f8f3507 | |||
| 312a468cce | |||
| d4b8c2aeda | |||
| f86e8079b6 | |||
| 36c6f5e388 | |||
| 91a65b2984 | |||
| 3010070d55 | |||
| fedae5ceda | |||
| 4212e06309 | |||
| fd360bda14 | |||
| 4723abb896 | |||
| 155b5eecb9 | |||
| 845635d667 | |||
| 0c26eae214 | |||
| 325a3165e4 | |||
| bf378916af | |||
| c029e44dc8 | |||
| f74d4db8c5 | |||
| 2512694df9 | |||
| f289984061 | |||
| 1d37749ec1 | |||
| da13bf1f3d | |||
| 78767e7199 | |||
| 194932889d | |||
| 4293ec5564 | |||
| 57baab9f68 | |||
| a7c20eea42 | |||
| 0a4cc2c476 | |||
| cbb718bb8b |
@@ -1,3 +1,5 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
site
|
site
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
/.envrc
|
||||||
|
|||||||
+22
-8
@@ -1,9 +1,23 @@
|
|||||||
language: bash
|
language: bash
|
||||||
sudo: required
|
dist: trusty
|
||||||
services:
|
jobs:
|
||||||
- docker
|
include:
|
||||||
# install: docker pull heroku/cedar:14
|
- stage: "Bash linting (shellcheck)"
|
||||||
script: ./tests.sh
|
sudo: false
|
||||||
env:
|
addons:
|
||||||
- STACK=heroku-16
|
apt:
|
||||||
- STACK=cedar-14
|
sources:
|
||||||
|
- debian-sid # Grab shellcheck from the Debian repo (o_O)
|
||||||
|
packages:
|
||||||
|
- shellcheck
|
||||||
|
script: make check
|
||||||
|
|
||||||
|
- stage: "Stack Tests"
|
||||||
|
services: docker
|
||||||
|
env: STACK=heroku-16
|
||||||
|
script: ./tests.sh
|
||||||
|
|
||||||
|
- stage: "Stack Tests"
|
||||||
|
services: docker
|
||||||
|
env: STACK=cedar-14
|
||||||
|
script: ./tests.sh
|
||||||
|
|||||||
+89
-2
@@ -1,12 +1,99 @@
|
|||||||
# Python Buildpack Changelog
|
# Python Buildpack Changelog
|
||||||
|
|
||||||
|
# 126
|
||||||
|
|
||||||
|
Skip installs if Pipfile.lock hasn't changed, and uninstall stale dependencies with Pipenv.
|
||||||
|
|
||||||
|
- No longer warn if there is no `Procfile`.
|
||||||
|
|
||||||
|
# 125
|
||||||
|
|
||||||
|
Set `PYTHONPATH` during collectstatic runs, other updates.
|
||||||
|
|
||||||
|
- Update Set `PYTHONPATH` during collectstatic runs.
|
||||||
|
- Update Pipenv "3.6" to "3.6.4".
|
||||||
|
|
||||||
|
# 124
|
||||||
|
|
||||||
|
Update buildpack to automatically install [dev-packages] (Pipenv) during Heroku CI builds.
|
||||||
|
|
||||||
|
# 123
|
||||||
|
|
||||||
|
Update gunicorn init.d script to allow overrides.
|
||||||
|
|
||||||
|
# 122
|
||||||
|
|
||||||
|
Update default Python to v3.6.4.
|
||||||
|
|
||||||
|
# 121
|
||||||
|
|
||||||
|
Update default Python to v3.6.3.
|
||||||
|
|
||||||
|
# 120
|
||||||
|
|
||||||
|
Use Pipenv --deploy.
|
||||||
|
|
||||||
|
# 119
|
||||||
|
|
||||||
|
Improvements to Pipenv support, warning on unsupported Python versions.
|
||||||
|
|
||||||
|
- We now warn when a user is not using latest 2.x or 3.x Python.
|
||||||
|
- Heroku now supports `[requires]` `python_full_version` in addition to `python_version`.
|
||||||
|
|
||||||
|
# 118
|
||||||
|
|
||||||
|
Improvements to Pipenv support.
|
||||||
|
|
||||||
|
# 117
|
||||||
|
|
||||||
|
Bug fix.
|
||||||
|
|
||||||
|
# 116
|
||||||
|
|
||||||
|
Vendoring improvements.
|
||||||
|
|
||||||
|
- Geos libraries should work on Heroku-16 now.
|
||||||
|
- The libffi/libmemcached vendoring step is now skipped on Heroku-16 (since they are installed in the base image).
|
||||||
|
|
||||||
|
# 115
|
||||||
|
|
||||||
|
Revert a pull request.
|
||||||
|
|
||||||
|
- No longer using `sub_env` for `pip install` step.
|
||||||
|
|
||||||
|
# 114
|
||||||
|
|
||||||
|
- Bugfixes.
|
||||||
|
|
||||||
|
Blacklisting `PYTHONHOME` and `PYTHONPATH` for older apps. Upgrades to nltk support.
|
||||||
|
|
||||||
|
# 113
|
||||||
|
|
||||||
|
Updates to Pipenv support.
|
||||||
|
|
||||||
|
# 112
|
||||||
|
|
||||||
|
Bugfix.
|
||||||
|
|
||||||
|
- Fixed grep output bug.
|
||||||
|
|
||||||
|
# 111
|
||||||
|
|
||||||
|
Linting, bugfixes.
|
||||||
|
|
||||||
|
# 110
|
||||||
|
|
||||||
|
Update default Python to 3.6.2.
|
||||||
|
|
||||||
# 109
|
# 109
|
||||||
|
|
||||||
Fix output for collectstatic step.
|
Update Default Python to 3.6.1, bugfixes.
|
||||||
|
|
||||||
|
- Fixed automatic pip uninstall of dependencies removed from requirements.txt.
|
||||||
|
|
||||||
# 108
|
# 108
|
||||||
|
|
||||||
Updated setuptools.
|
Fix output for collectstatic step.
|
||||||
|
|
||||||
# 107
|
# 107
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
# These targets are not files
|
# These targets are not files
|
||||||
.PHONY: tests
|
.PHONY: tests
|
||||||
|
|
||||||
test: test-cedar-14
|
test: test-heroku-16
|
||||||
|
|
||||||
|
check:
|
||||||
|
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings
|
||||||
|
@shellcheck -x bin/steps/collectstatic bin/steps/cryptography bin/steps/eggpath-fix bin/steps/eggpath-fix2 bin/steps/gdal bin/steps/geo-libs bin/steps/mercurial bin/steps/nltk bin/steps/pip-install bin/steps/pip-uninstall bin/steps/pipenv bin/steps/pipenv-python-version bin/steps/pylibmc bin/steps/python
|
||||||
|
@shellcheck -x bin/steps/hooks/*
|
||||||
|
|
||||||
test-cedar-14:
|
test-cedar-14:
|
||||||
@echo "Running tests in docker (cedar-14)..."
|
@echo "Running tests in docker (cedar-14)..."
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.python.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
"bob-builder" = "==0.0.13"
|
||||||
Generated
+52
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "36d17c46a8b1b844b3cae475f6f42d6c0a9e59b2a9685cbcdc0985656a7a129f"
|
||||||
|
},
|
||||||
|
"host-environment-markers": {
|
||||||
|
"implementation_name": "cpython",
|
||||||
|
"implementation_version": "3.6.3",
|
||||||
|
"os_name": "posix",
|
||||||
|
"platform_machine": "x86_64",
|
||||||
|
"platform_python_implementation": "CPython",
|
||||||
|
"platform_release": "16.7.0",
|
||||||
|
"platform_system": "Darwin",
|
||||||
|
"platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
|
||||||
|
"python_full_version": "3.6.3",
|
||||||
|
"python_version": "3.6",
|
||||||
|
"sys_platform": "darwin"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.python.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"bob-builder": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:b4de49a8e436fcaf82236ea43f78413b4a4c92100726e382ab57b6bdfb38fe64",
|
||||||
|
"sha256:288e3e765c4890fe9a63ae52ac6b4a963c13fe508482c70ff701a5ae21b9a673"
|
||||||
|
],
|
||||||
|
"version": "==0.0.13"
|
||||||
|
},
|
||||||
|
"boto": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:13be844158d1bd80a94c972c806ec8381b9ea72035aa06123c5db6bc6a6f3ead",
|
||||||
|
"sha256:deb8925b734b109679e3de65856018996338758f4b916ff4fe7bb62b6d7000d1"
|
||||||
|
],
|
||||||
|
"version": "==2.48.0"
|
||||||
|
},
|
||||||
|
"docopt": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
|
||||||
|
],
|
||||||
|
"version": "==0.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
[](https://travis-ci.org/heroku/heroku-buildpack-python)
|
[](https://travis-ci.org/heroku/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.
|
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps, powered by [Pipenv](http://docs.pipenv.org/), [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.
|
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).
|
Python packages with C dependencies that are not [available on the stack image](https://devcenter.heroku.com/articles/stack-packages) are generally not supported, unless `manylinux` wheels are provided by the package maintainers (common). For recommended solutions, check out [this article](https://devcenter.heroku.com/articles/python-c-deps) for more information.
|
||||||
|
|
||||||
See it in Action
|
See it in Action
|
||||||
----------------
|
----------------
|
||||||
@@ -16,24 +16,22 @@ See it in Action
|
|||||||
Deploying a Python application couldn't be easier:
|
Deploying a Python application couldn't be easier:
|
||||||
|
|
||||||
$ ls
|
$ ls
|
||||||
Procfile requirements.txt web.py
|
Pipfile Pipfile.lock Procfile web.py
|
||||||
|
|
||||||
$ heroku create --buildpack heroku/python
|
$ heroku create --buildpack heroku/python
|
||||||
|
|
||||||
$ git push heroku master
|
$ git push heroku master
|
||||||
...
|
…
|
||||||
-----> Python app detected
|
-----> Python app detected
|
||||||
-----> Installing python-2.7.13
|
-----> Installing python-3.6.4
|
||||||
$ pip install -r requirements.txt
|
-----> Installing pip
|
||||||
Collecting requests (from -r requirements.txt (line 1))
|
-----> Installing requirements with latest pipenv…
|
||||||
Downloading requests-2.12.4-py2.py3-none-any.whl (576KB)
|
...
|
||||||
Installing collected packages: requests
|
Installing dependencies from Pipfile…
|
||||||
Successfully installed requests-2.12.4
|
|
||||||
|
|
||||||
-----> Discovering process types
|
-----> Discovering process types
|
||||||
Procfile declares types -> (none)
|
Procfile declares types -> (none)
|
||||||
|
|
||||||
A `requirements.txt` file must be present at the root of your application's repository.
|
A `Pipfile` or `requirements.txt` 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:
|
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
|
||||||
|
|
||||||
@@ -43,14 +41,22 @@ You can also specify the latest production release of this buildpack for upcomin
|
|||||||
Specify a Python Runtime
|
Specify a Python Runtime
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Specific versions of the Python runtime can be specified with a `runtime.txt` file:
|
Specific versions of the Python runtime can be specified in your `Pipfile`:
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "2.7"
|
||||||
|
|
||||||
|
Or, more specifically:
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_full_version = "2.7.14"
|
||||||
|
|
||||||
|
Or, with a `runtime.txt` file:
|
||||||
|
|
||||||
$ cat runtime.txt
|
$ cat runtime.txt
|
||||||
python-3.6.1
|
python-2.7.14
|
||||||
|
|
||||||
Runtime options include:
|
Runtime options include:
|
||||||
|
|
||||||
- `python-2.7.13`
|
- `python-3.6.4`
|
||||||
- `python-3.6.1`
|
- `python-2.7.14`
|
||||||
- `pypy-5.7.1` (unsupported, experimental)
|
|
||||||
- `pypy3-5.5.1` (unsupported, experimental)
|
|
||||||
|
|||||||
+112
-73
@@ -25,20 +25,33 @@ export BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}
|
|||||||
export PATH=:/usr/local/bin:$PATH
|
export PATH=:/usr/local/bin:$PATH
|
||||||
|
|
||||||
# Paths.
|
# 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
|
||||||
ENV_DIR=$3
|
ENV_DIR=$3
|
||||||
|
|
||||||
|
export BUILD_DIR CACHE_DIR ENV_DIR
|
||||||
|
|
||||||
|
VENDOR_URL="https://lang-python.s3.amazonaws.com/$STACK"
|
||||||
|
if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
|
||||||
|
VENDOR_URL="$BUILDPACK_VENDOR_URL"
|
||||||
|
fi
|
||||||
|
export VENDOR_URL
|
||||||
|
|
||||||
# Python defaults
|
# Python defaults
|
||||||
DEFAULT_PYTHON_VERSION="python-2.7.13"
|
DEFAULT_PYTHON_VERSION="python-3.6.4"
|
||||||
|
LATEST_3="python-3.6.4"
|
||||||
|
LATEST_2="python-2.7.14"
|
||||||
|
|
||||||
DEFAULT_PYTHON_STACK="cedar-14"
|
DEFAULT_PYTHON_STACK="cedar-14"
|
||||||
PYTHON_EXE="/app/.heroku/python/bin/python"
|
PIP_UPDATE="9.0.1"
|
||||||
PIP_VERSION="9.0.1"
|
|
||||||
|
export DEFAULT_PYTHON_VERSION DEFAULT_PYTHON_STACK PIP_UPDATE LATEST_2 LATEST_3
|
||||||
|
|
||||||
# Common Problem Warnings
|
# Common Problem Warnings
|
||||||
export WARNINGS_LOG=$(mktemp)
|
WARNINGS_LOG=$(mktemp)
|
||||||
|
export WARNINGS_LOG
|
||||||
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
|
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
|
||||||
|
|
||||||
# Setup vendored tools and pip-pop (pip-diff)
|
# Setup vendored tools and pip-pop (pip-diff)
|
||||||
@@ -55,10 +68,12 @@ unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN
|
|||||||
unset CYTOKINE_LOG_FILE GEM_PATH
|
unset CYTOKINE_LOG_FILE GEM_PATH
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# Import collection of warnings.
|
# Import collection of warnings.
|
||||||
source $BIN_DIR/warnings
|
# shellcheck source=bin/warnings
|
||||||
|
source "$BIN_DIR/warnings"
|
||||||
|
|
||||||
# we need to put a bunch of symlinks in there later
|
# we need to put a bunch of symlinks in there later
|
||||||
mkdir -p /app/.heroku
|
mkdir -p /app/.heroku
|
||||||
@@ -83,69 +98,76 @@ export LD_LIBRARY_PATH=/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRA
|
|||||||
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config:$PKG_CONFIG_PATH
|
export PKG_CONFIG_PATH=/app/.heroku/vendor/lib/pkg-config:/app/.heroku/python/lib/pkg-config:$PKG_CONFIG_PATH
|
||||||
|
|
||||||
# Switch to the repo's context.
|
# Switch to the repo's context.
|
||||||
cd $BUILD_DIR
|
cd "$BUILD_DIR"
|
||||||
|
|
||||||
# Warn for lack of Procfile.
|
|
||||||
if [[ ! -f Procfile ]]; then
|
|
||||||
puts-warn 'Warning: Your application is missing a Procfile. This file tells Heroku how to run your application.'
|
|
||||||
puts-warn 'Learn more: https://devcenter.heroku.com/articles/procfile'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prepare the cache.
|
# Prepare the cache.
|
||||||
mkdir -p $CACHE_DIR
|
mkdir -p "$CACHE_DIR"
|
||||||
|
|
||||||
# Restore old artifacts from the cache.
|
# Restore old artifacts from the cache.
|
||||||
mkdir -p .heroku
|
mkdir -p .heroku
|
||||||
|
|
||||||
cp -R $CACHE_DIR/.heroku/python .heroku/ &> /dev/null || true
|
cp -R "$CACHE_DIR/.heroku/python" .heroku/ &> /dev/null || true
|
||||||
cp -R $CACHE_DIR/.heroku/python-stack .heroku/ &> /dev/null || true
|
cp -R "$CACHE_DIR/.heroku/python-stack" .heroku/ &> /dev/null || true
|
||||||
cp -R $CACHE_DIR/.heroku/python-version .heroku/ &> /dev/null || true
|
cp -R "$CACHE_DIR/.heroku/python-version" .heroku/ &> /dev/null || true
|
||||||
cp -R $CACHE_DIR/.heroku/vendor .heroku/ &> /dev/null || true
|
cp -R "$CACHE_DIR/.heroku/vendor" .heroku/ &> /dev/null || true
|
||||||
if [[ -d $CACHE_DIR/.heroku/src ]]; then
|
if [[ -d "$CACHE_DIR/.heroku/src" ]]; then
|
||||||
cp -R $CACHE_DIR/.heroku/src .heroku/ &> /dev/null || true
|
cp -R "$CACHE_DIR/.heroku/src" .heroku/ &> /dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Experimental pre_compile hook.
|
# Experimental pre_compile hook.
|
||||||
source $BIN_DIR/steps/hooks/pre_compile
|
# shellcheck source=bin/steps/hooks/pre_compile
|
||||||
|
source "$BIN_DIR/steps/hooks/pre_compile"
|
||||||
|
|
||||||
# Sticky runtimes.
|
# Sticky runtimes.
|
||||||
if [ -f $CACHE_DIR/.heroku/python-version ]; then
|
if [ -f "$CACHE_DIR/.heroku/python-version" ]; then
|
||||||
DEFAULT_PYTHON_VERSION=$(cat $CACHE_DIR/.heroku/python-version)
|
DEFAULT_PYTHON_VERSION=$(cat "$CACHE_DIR/.heroku/python-version")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Stack fallback for non-declared caches.
|
# Stack fallback for non-declared caches.
|
||||||
if [ -f $CACHE_DIR/.heroku/python-stack ]; then
|
if [ -f "$CACHE_DIR/.heroku/python-stack" ]; then
|
||||||
CACHED_PYTHON_STACK=$(cat $CACHE_DIR/.heroku/python-stack)
|
CACHED_PYTHON_STACK=$(cat "$CACHE_DIR/.heroku/python-stack")
|
||||||
else
|
else
|
||||||
CACHED_PYTHON_STACK=$STACK
|
CACHED_PYTHON_STACK=$STACK
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export CACHED_PYTHON_STACK
|
||||||
|
|
||||||
# Pipenv Python version support.
|
# Pipenv Python version support.
|
||||||
source $BIN_DIR/steps/pipenv-python-version
|
# shellcheck source=bin/steps/pipenv-python-version
|
||||||
|
source "$BIN_DIR/steps/pipenv-python-version"
|
||||||
|
|
||||||
# If no runtime given, assume default version.
|
# If no runtime given, assume default version.
|
||||||
if [ ! -f runtime.txt ]; then
|
if [ ! -f runtime.txt ]; then
|
||||||
echo $DEFAULT_PYTHON_VERSION > runtime.txt
|
echo "$DEFAULT_PYTHON_VERSION" > runtime.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p $(dirname $PROFILE_PATH)
|
mkdir -p "$(dirname "$PROFILE_PATH")"
|
||||||
mkdir -p /app/.heroku/src
|
mkdir -p /app/.heroku/src
|
||||||
|
|
||||||
if [[ $BUILD_DIR != '/app' ]]; then
|
if [[ $BUILD_DIR != '/app' ]]; then
|
||||||
# python expects to reside in /app, so set up symlinks
|
# python expects to reside in /app, so set up symlinks
|
||||||
# we will not remove these later so subsequent buildpacks can still invoke it
|
# we will not remove these later so subsequent buildpacks can still invoke it
|
||||||
ln -nsf $BUILD_DIR/.heroku/python /app/.heroku/python
|
ln -nsf "$BUILD_DIR/.heroku/python" /app/.heroku/python
|
||||||
ln -nsf $BUILD_DIR/.heroku/vendor /app/.heroku/vendor
|
ln -nsf "$BUILD_DIR/.heroku/vendor" /app/.heroku/vendor
|
||||||
# Note: .heroku/src is copied in later.
|
# Note: .heroku/src is copied in later.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install Python.
|
# Install Python.
|
||||||
let start=$(nowms)
|
let start=$(nowms)
|
||||||
source $BIN_DIR/steps/python
|
# shellcheck source=bin/steps/python
|
||||||
|
source "$BIN_DIR/steps/python"
|
||||||
mtime "python.install.time" "${start}"
|
mtime "python.install.time" "${start}"
|
||||||
|
|
||||||
# Pipenv support.
|
# Pipenv support.
|
||||||
source $BIN_DIR/steps/pipenv
|
# shellcheck source=bin/steps/pipenv
|
||||||
|
sub_env "$BIN_DIR/steps/pipenv"
|
||||||
|
|
||||||
|
# Uninstall removed dependencies with Pip.
|
||||||
|
let start=$(nowms)
|
||||||
|
# shellcheck source=bin/steps/pip-uninstall
|
||||||
|
source "$BIN_DIR/steps/pip-uninstall"
|
||||||
|
mtime "pip.uninstall.time" "${start}"
|
||||||
|
|
||||||
|
|
||||||
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
# If no requirements.txt file given, assume `setup.py develop` is intended.
|
||||||
if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
|
if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
|
||||||
@@ -153,88 +175,105 @@ if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Fix egg-links.
|
# Fix egg-links.
|
||||||
source $BIN_DIR/steps/eggpath-fix
|
# shellcheck source=bin/steps/eggpath-fix
|
||||||
|
source "$BIN_DIR/steps/eggpath-fix"
|
||||||
|
|
||||||
# Mercurial support.
|
# Mercurial support.
|
||||||
source $BIN_DIR/steps/mercurial
|
# shellcheck source=bin/steps/mercurial
|
||||||
|
source "$BIN_DIR/steps/mercurial"
|
||||||
|
|
||||||
# Pylibmc support.
|
# Pylibmc support.
|
||||||
source $BIN_DIR/steps/pylibmc
|
# shellcheck source=bin/steps/pylibmc
|
||||||
|
source "$BIN_DIR/steps/pylibmc"
|
||||||
|
|
||||||
# Libffi support.
|
# Libffi support.
|
||||||
source $BIN_DIR/steps/cryptography
|
# shellcheck source=bin/steps/cryptography
|
||||||
|
source "$BIN_DIR/steps/cryptography"
|
||||||
|
|
||||||
# Support for Geo libraries.
|
# Support for Geo libraries.
|
||||||
sub-env $BIN_DIR/steps/geo-libs
|
# shellcheck source=bin/steps/geo-libs
|
||||||
|
sub_env "$BIN_DIR/steps/geo-libs"
|
||||||
|
|
||||||
# GDAL support.
|
# GDAL support.
|
||||||
source $BIN_DIR/steps/gdal
|
# shellcheck source=bin/steps/gdal
|
||||||
|
source "$BIN_DIR/steps/gdal"
|
||||||
|
|
||||||
# Install dependencies with Pip (where the magic happens).
|
# Install dependencies with Pip (where the magic happens).
|
||||||
let start=$(nowms)
|
let start=$(nowms)
|
||||||
source $BIN_DIR/steps/pip-install
|
# shellcheck source=bin/steps/pip-install
|
||||||
|
source "$BIN_DIR/steps/pip-install"
|
||||||
mtime "pip.install.time" "${start}"
|
mtime "pip.install.time" "${start}"
|
||||||
|
|
||||||
# Uninstall removed dependencies with Pip.
|
|
||||||
let start=$(nowms)
|
|
||||||
source $BIN_DIR/steps/pip-uninstall
|
|
||||||
mtime "pip.uninstall.time" "${start}"
|
|
||||||
|
|
||||||
# Support for NLTK corpora.
|
# Support for NLTK corpora.
|
||||||
let start=$(nowms)
|
let start=$(nowms)
|
||||||
sub-env $BIN_DIR/steps/nltk
|
sub_env "$BIN_DIR/steps/nltk"
|
||||||
mtime "nltk.download.time" "${start}"
|
mtime "nltk.download.time" "${start}"
|
||||||
|
|
||||||
# Support for pip install -e.
|
# Support for pip install -e.
|
||||||
# In CI, $BUILD_DIR is /app.
|
# In CI, $BUILD_DIR is /app.
|
||||||
if [[ ! "$BUILD_DIR" == "/app" ]]; then
|
if [[ ! "$BUILD_DIR" == "/app" ]]; then
|
||||||
rm -fr $BUILD_DIR/.heroku/src
|
rm -fr "$BUILD_DIR/.heroku/src"
|
||||||
deep-cp /app/.heroku/src $BUILD_DIR/.heroku/src
|
deep-cp /app/.heroku/src "$BUILD_DIR/.heroku/src"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Django collectstatic support.
|
# Django collectstatic support.
|
||||||
let start=$(nowms)
|
let start=$(nowms)
|
||||||
sub-env $BIN_DIR/steps/collectstatic
|
sub_env "$BIN_DIR/steps/collectstatic"
|
||||||
mtime "collectstatic.time" "${start}"
|
mtime "collectstatic.time" "${start}"
|
||||||
|
|
||||||
# Create .profile script for application runtime environment variables.
|
# Create .profile script for application runtime environment variables.
|
||||||
set-env PATH '$HOME/.heroku/python/bin:$PATH'
|
set_env PATH "\$HOME/.heroku/python/bin:\$PATH"
|
||||||
set-env PYTHONUNBUFFERED true
|
set_env PYTHONUNBUFFERED true
|
||||||
set-env PYTHONHOME /app/.heroku/python
|
set_env PYTHONHOME "\$HOME/.heroku/python"
|
||||||
set-env LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LIBRARY_PATH'
|
|
||||||
set-env LD_LIBRARY_PATH '/app/.heroku/vendor/lib:/app/.heroku/python/lib:$LD_LIBRARY_PATH'
|
set_env LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LIBRARY_PATH"
|
||||||
set-default-env LANG en_US.UTF-8
|
set_env LD_LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LD_LIBRARY_PATH"
|
||||||
set-default-env PYTHONHASHSEED random
|
|
||||||
set-default-env PYTHONPATH /app/
|
set_default_env LANG en_US.UTF-8
|
||||||
|
set_default_env PYTHONHASHSEED random
|
||||||
|
set_default_env PYTHONPATH "\$HOME"
|
||||||
|
|
||||||
|
# python expects to be in /app, if at runtime, it is not, set
|
||||||
|
# up symlinks... this can occur when the subdir buildpack is used
|
||||||
|
cat <<EOT >> "$PROFILE_PATH"
|
||||||
|
if [[ \$HOME != "/app" ]]; then
|
||||||
|
mkdir -p /app/.heroku
|
||||||
|
ln -nsf "\$HOME/.heroku/python" /app/.heroku/python
|
||||||
|
ln -nsf "\$HOME/.heroku/vendor" /app/.heroku/vendor
|
||||||
|
fi
|
||||||
|
EOT
|
||||||
|
|
||||||
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
|
||||||
cp $ROOT_DIR/vendor/WEB_CONCURRENCY.sh $WEB_CONCURRENCY_PROFILE_PATH
|
cp "$ROOT_DIR/vendor/WEB_CONCURRENCY.sh" "$WEB_CONCURRENCY_PROFILE_PATH"
|
||||||
cp $ROOT_DIR/vendor/python.gunicorn.sh $GUNICORN_PROFILE_PATH
|
cp "$ROOT_DIR/vendor/python.gunicorn.sh" "$GUNICORN_PROFILE_PATH"
|
||||||
|
|
||||||
|
|
||||||
# Experimental post_compile hook.
|
# Experimental post_compile hook.
|
||||||
source $BIN_DIR/steps/hooks/post_compile
|
# shellcheck source=bin/steps/hooks/post_compile
|
||||||
|
source "$BIN_DIR/steps/hooks/post_compile"
|
||||||
|
|
||||||
# Fix egg-links, again.
|
# Fix egg-links, again.
|
||||||
source $BIN_DIR/steps/eggpath-fix2
|
# shellcheck source=bin/steps/eggpath-fix2
|
||||||
|
source "$BIN_DIR/steps/eggpath-fix2"
|
||||||
|
|
||||||
# Store new artifacts in cache.
|
# Store new artifacts in cache.
|
||||||
|
|
||||||
rm -rf $CACHE_DIR/.heroku/python
|
rm -rf "$CACHE_DIR/.heroku/python"
|
||||||
rm -rf $CACHE_DIR/.heroku/python-version
|
rm -rf "$CACHE_DIR/.heroku/python-version"
|
||||||
rm -rf $CACHE_DIR/.heroku/python-stack
|
rm -rf "$CACHE_DIR/.heroku/python-stack"
|
||||||
rm -rf $CACHE_DIR/.heroku/vendor
|
rm -rf "$CACHE_DIR/.heroku/vendor"
|
||||||
rm -rf $CACHE_DIR/.heroku/src
|
rm -rf "$CACHE_DIR/.heroku/src"
|
||||||
|
|
||||||
mkdir -p $CACHE_DIR/.heroku
|
mkdir -p "$CACHE_DIR/.heroku"
|
||||||
cp -R .heroku/python $CACHE_DIR/.heroku/
|
cp -R .heroku/python "$CACHE_DIR/.heroku/"
|
||||||
cp -R .heroku/python-version $CACHE_DIR/.heroku/
|
cp -R .heroku/python-version "$CACHE_DIR/.heroku/"
|
||||||
cp -R .heroku/python-stack $CACHE_DIR/.heroku/ &> /dev/null || true
|
cp -R .heroku/python-stack "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||||
cp -R .heroku/vendor $CACHE_DIR/.heroku/ &> /dev/null || true
|
cp -R .heroku/vendor "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||||
if [[ -d .heroku/src ]]; then
|
if [[ -d .heroku/src ]]; then
|
||||||
cp -R .heroku/src $CACHE_DIR/.heroku/ &> /dev/null || true
|
cp -R .heroku/src "$CACHE_DIR/.heroku/" &> /dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Measure the size of the Python installation.
|
# Measure the size of the Python installation.
|
||||||
|
# shellcheck disable=SC2119
|
||||||
mmeasure 'python.size' "$(measure-size)"
|
mmeasure 'python.size' "$(measure-size)"
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
BUILD_DIR=$1
|
BUILD_DIR=$1
|
||||||
|
|
||||||
# Exit early if app is clearly not Python.
|
# Exit early if app is clearly not Python.
|
||||||
if [ ! -f $BUILD_DIR/requirements.txt ] && [ ! -f $BUILD_DIR/setup.py ] && [ ! -f $BUILD_DIR/Pipfile ]; then
|
if [ ! -f "$BUILD_DIR/requirements.txt" ] && [ ! -f "$BUILD_DIR/setup.py" ] && [ ! -f "$BUILD_DIR/Pipfile" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -1,10 +1,9 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# bin/release <build-dir>
|
# bin/release <build-dir>
|
||||||
|
|
||||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
|
||||||
BUILD_DIR=$1
|
BUILD_DIR=$1
|
||||||
|
|
||||||
MANAGE_FILE=$(cd $BUILD_DIR && find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
MANAGE_FILE=$(cd "$BUILD_DIR" && find . -maxdepth 3 -type f -name 'manage.py' | head -1)
|
||||||
MANAGE_FILE=${MANAGE_FILE:2}
|
MANAGE_FILE=${MANAGE_FILE:2}
|
||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
# - $DISABLE_COLLECTSTATIC: disables this functionality.
|
# - $DISABLE_COLLECTSTATIC: disables this functionality.
|
||||||
# - $DEBUG_COLLECTSTATIC: upon failure, print out environment variables.
|
# - $DEBUG_COLLECTSTATIC: upon failure, print out environment variables.
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
source $BIN_DIR/utils
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
# Location of 'manage.py', if it exists.
|
# Location of 'manage.py', if it exists.
|
||||||
@@ -29,13 +30,14 @@ if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALL
|
|||||||
puts-step "$ python $MANAGE_FILE collectstatic --noinput"
|
puts-step "$ python $MANAGE_FILE collectstatic --noinput"
|
||||||
|
|
||||||
# Run collectstatic, cleanup some of the noisy output.
|
# Run collectstatic, cleanup some of the noisy output.
|
||||||
python $MANAGE_FILE collectstatic --noinput --traceback 2>&1 | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent
|
export PYTHONPATH=.
|
||||||
|
python "$MANAGE_FILE" collectstatic --noinput --traceback 2>&1 | sed '/^Post-processed/d;/^Copying/d;/^$/d' | indent
|
||||||
COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"
|
COLLECTSTATIC_STATUS="${PIPESTATUS[0]}"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Display a warning if collectstatic failed.
|
# Display a warning if collectstatic failed.
|
||||||
[ $COLLECTSTATIC_STATUS -ne 0 ] && {
|
[ "$COLLECTSTATIC_STATUS" -ne 0 ] && {
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo " ! Error while running '$ python $MANAGE_FILE collectstatic --noinput'."
|
echo " ! Error while running '$ python $MANAGE_FILE collectstatic --noinput'."
|
||||||
|
|||||||
+12
-5
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This script serves as the Cryptography build step of the
|
# This script serves as the cffi build step of the
|
||||||
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
# [**Python Buildpack**](https://github.com/heroku/heroku-buildpack-python)
|
||||||
# compiler.
|
# compiler.
|
||||||
#
|
#
|
||||||
@@ -9,13 +9,19 @@
|
|||||||
#
|
#
|
||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
|
if [[ "$STACK" == "heroku-16" ]]; then
|
||||||
|
# libffi is pre-installed in the stack image so there is no need to vendor it.
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
# The location of the pre-compiled libffi binary.
|
# The location of the pre-compiled libffi binary.
|
||||||
VENDORED_LIBFFI="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libffi.tar.gz"
|
VENDORED_LIBFFI="${VENDOR_URL}/libraries/vendor/libffi.tar.gz"
|
||||||
|
|
||||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# If a package using cffi exists within requirements, use vendored libffi.
|
# If a package using cffi exists within requirements, use vendored libffi.
|
||||||
if (pip-grep -s requirements.txt argon2-cffi bcrypt cffi cryptography django[argon2] Django[argon2] django[bcrypt] Django[bcrypt] PyNaCl pyOpenSSL PyOpenSSL requests[security] misaka &> /dev/null) then
|
if (pip-grep -s requirements.txt argon2-cffi bcrypt cffi cryptography django[argon2] Django[argon2] django[bcrypt] Django[bcrypt] PyNaCl pyOpenSSL PyOpenSSL requests[security] misaka &> /dev/null) then
|
||||||
@@ -24,8 +30,9 @@ if (pip-grep -s requirements.txt argon2-cffi bcrypt cffi cryptography django[arg
|
|||||||
echo "-----> Noticed cffi. Bootstrapping libffi."
|
echo "-----> Noticed cffi. Bootstrapping libffi."
|
||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract libffi into target vendor directory.
|
# Download and extract libffi into target vendor directory.
|
||||||
curl $VENDORED_LIBFFI -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_LIBFFI" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LIBFFI=$(pwd)/vendor
|
LIBFFI=$(pwd)/vendor
|
||||||
|
export LIBFFI
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
# delete any existing egg links, to uninstall exisisting installations.
|
# delete any existing egg links, to uninstall exisisting installations.
|
||||||
find .heroku/python/lib/python*/site-packages/ -name "*.egg-link" -delete 2> /dev/null
|
find .heroku/python/lib/python*/site-packages/ -name "*.egg-link" -delete 2> /dev/null
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
set +e
|
set +e
|
||||||
# rewrite build dir in egg links to /app so things are found at runtime
|
# rewrite build dir in egg links to /app so things are found at runtime
|
||||||
find .heroku/python/lib/python*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#$(pwd)#/app#" &> /dev/null
|
find .heroku/python/lib/python*/site-packages/ -name "*.pth" -print0 2> /dev/null | xargs -r -0 -n 1 sed -i -e "s#$(pwd)#/app#" &> /dev/null
|
||||||
|
|||||||
+6
-4
@@ -10,12 +10,13 @@
|
|||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
# The location of the pre-compiled cryptography binary.
|
# The location of the pre-compiled cryptography binary.
|
||||||
VENDORED_GDAL="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
VENDORED_GDAL="${VENDOR_URL}/libraries/vendor/gdal.tar.gz"
|
||||||
|
|
||||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# If GDAL exists within requirements, use vendored gdal.
|
# If GDAL exists within requirements, use vendored gdal.
|
||||||
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||||
@@ -24,9 +25,10 @@ if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
|||||||
echo "-----> Noticed GDAL. Bootstrapping gdal."
|
echo "-----> Noticed GDAL. Bootstrapping gdal."
|
||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract cryptography into target vendor directory.
|
# Download and extract cryptography into target vendor directory.
|
||||||
curl $VENDORED_GDAL -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export GDAL=$(pwd)/vendor
|
GDAL=$(pwd)/vendor
|
||||||
|
export GDAL
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+22
-9
@@ -10,14 +10,15 @@
|
|||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
# The location of the pre-compiled cryptography binary.
|
# The location of the pre-compiled cryptography binary.
|
||||||
VENDORED_GDAL="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/gdal.tar.gz"
|
VENDORED_GDAL="${VENDOR_URL}/libraries/vendor/gdal.tar.gz"
|
||||||
VENDORED_GEOS="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/geos.tar.gz"
|
VENDORED_GEOS="${VENDOR_URL}/libraries/vendor/geos.tar.gz"
|
||||||
VENDORED_PROJ="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/proj.tar.gz"
|
VENDORED_PROJ="${VENDOR_URL}/libraries/vendor/proj.tar.gz"
|
||||||
|
|
||||||
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# If GDAL exists within requirements, use vendored gdal.
|
# If GDAL exists within requirements, use vendored gdal.
|
||||||
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
||||||
@@ -26,11 +27,23 @@ if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
|
|||||||
echo "-----> Bootstrapping gdal, geos, proj."
|
echo "-----> Bootstrapping gdal, geos, proj."
|
||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract cryptography into target vendor directory.
|
# Download and extract cryptography into target vendor directory.
|
||||||
curl $VENDORED_GDAL -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
curl $VENDORED_GEOS -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
|
curl "$VENDORED_PROJ" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
|
|
||||||
|
# Copy libjasper from build image to slug.
|
||||||
|
if [[ "$STACK" == "heroku-16" ]]; then
|
||||||
|
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export GDAL=$(pwd)/vendor
|
GDAL=$(pwd)/vendor
|
||||||
|
export GDAL
|
||||||
|
# set path for post_compile hooks
|
||||||
|
export GDAL_LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib/libgdal.so"
|
||||||
|
export GEOS_LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib/libgeos_c.so"
|
||||||
|
# set path for runtime environmeht
|
||||||
|
set_env GDAL_LIBRARY_PATH "/app/.heroku/vendor/lib/libgdal.so"
|
||||||
|
set_env GEOS_LIBRARY_PATH "/app/.heroku/vendor/lib/libgeos_c.so"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,5 @@
|
|||||||
if [ -f bin/post_compile ]; then
|
if [ -f bin/post_compile ]; then
|
||||||
echo "-----> Running post-compile hook"
|
echo "-----> Running post-compile hook"
|
||||||
chmod +x bin/post_compile
|
chmod +x bin/post_compile
|
||||||
sub-env bin/post_compile
|
sub_env bin/post_compile
|
||||||
fi
|
fi
|
||||||
@@ -3,5 +3,5 @@
|
|||||||
if [ -f bin/pre_compile ]; then
|
if [ -f bin/pre_compile ]; then
|
||||||
echo "-----> Running pre-compile hook"
|
echo "-----> Running pre-compile hook"
|
||||||
chmod +x bin/pre_compile
|
chmod +x bin/pre_compile
|
||||||
sub-env bin/pre_compile
|
sub_env bin/pre_compile
|
||||||
fi
|
fi
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Install Mercurial if it appears to be required.
|
# Install Mercurial if it appears to be required.
|
||||||
if (grep -Fiq "hg+" requirements.txt) then
|
if (grep -Fiq "hg+" requirements.txt) then
|
||||||
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
|
||||||
|
|||||||
+13
-9
@@ -10,21 +10,25 @@
|
|||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# Check that nltk was installed by pip, otherwise obviously not needed
|
# Check that nltk was installed by pip, otherwise obviously not needed
|
||||||
python -m nltk.downloader -h >/dev/null 2>&1
|
if sp-grep -s nltk; then
|
||||||
if [ $? -eq 0 ]; then
|
puts-step "Downloading NLTK corpora…"
|
||||||
puts-step "Downloading NLTK corpora..."
|
|
||||||
nltk_packages_definition="$BUILD_DIR/nltk.txt"
|
nltk_packages_definition="$BUILD_DIR/nltk.txt"
|
||||||
|
|
||||||
if [ -f "$nltk_packages_definition" ]; then
|
if [ -f "$nltk_packages_definition" ]; then
|
||||||
nltk_packages=$(tr "\n" " " < "$nltk_packages_definition")
|
|
||||||
puts-step "Downloading NLTK packages: $nltk_packages"
|
readarray -t nltk_packages < "$nltk_packages_definition"
|
||||||
python -m nltk.downloader -d $BUILD_DIR/.heroku/python/nltk_data $nltk_packages | indent
|
puts-step "Downloading NLTK packages: ${nltk_packages[*]}"
|
||||||
set-env NLTK_DATA "/app/.heroku/python/nltk_data"
|
|
||||||
|
python -m nltk.downloader -d "$BUILD_DIR/.heroku/python/nltk_data" "${nltk_packages[@]}" | indent
|
||||||
|
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
|
||||||
|
|
||||||
else
|
else
|
||||||
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
puts-warn "'nltk.txt' not found, not downloading any corpora"
|
||||||
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
|
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+25
-2
@@ -1,10 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
if [ ! "$SKIP_PIP_INSTALL" ]; then
|
if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||||
|
|
||||||
# Install dependencies with Pip.
|
# Install dependencies with Pip.
|
||||||
puts-step "Installing requirements with pip"
|
puts-step "Installing requirements with pip"
|
||||||
|
|
||||||
|
# Set PIP_EXTRA_INDEX_URL
|
||||||
|
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||||
|
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||||
|
export PIP_EXTRA_INDEX_URL
|
||||||
|
fi
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
/app/.heroku/python/bin/pip install -r $BUILD_DIR/requirements.txt --exists-action=w --src=/app/.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee $WARNINGS_LOG | cleanup | indent
|
|
||||||
|
# Measure that we're using pip.
|
||||||
|
mcount "tool.pip"
|
||||||
|
|
||||||
|
/app/.heroku/python/bin/pip install -r "$BUILD_DIR/requirements.txt" --exists-action=w --src=/app/.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | tee "$WARNINGS_LOG" | cleanup | indent
|
||||||
PIP_STATUS="${PIPESTATUS[0]}"
|
PIP_STATUS="${PIPESTATUS[0]}"
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -20,4 +35,12 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
|
|||||||
/app/.heroku/python/bin/pip freeze --disable-pip-version-check > .heroku/python/requirements-installed.txt
|
/app/.heroku/python/bin/pip freeze --disable-pip-version-check > .heroku/python/requirements-installed.txt
|
||||||
|
|
||||||
echo
|
echo
|
||||||
fi
|
|
||||||
|
# Install test dependencies, for CI.
|
||||||
|
if [ "$INSTALL_TEST" ]; then
|
||||||
|
if [[ -f "$1/requirements-test.txt" ]]; then
|
||||||
|
puts-step "Installing test dependencies…"
|
||||||
|
/app/.heroku/python/bin/pip install -r "$1/requirements-test.txt" --exists-action=w --src=./.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | cleanup | indent
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|||||||
+15
-8
@@ -1,18 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
# Install dependencies with Pip.
|
# Install dependencies with Pip.
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
if [ ! "$SKIP_PIP_INSTALL" ]; then
|
||||||
|
|
||||||
cp .heroku/python/requirements-declared.txt requirements-declared.txt
|
if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||||
|
|
||||||
pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt
|
cp .heroku/python/requirements-declared.txt requirements-declared.txt
|
||||||
|
|
||||||
rm -fr requirements-declared.txt
|
pip-diff --stale requirements-declared.txt requirements.txt --exclude setuptools pip wheel > .heroku/python/requirements-stale.txt
|
||||||
|
|
||||||
if [[ -s .heroku/python/requirements-stale.txt ]]; then
|
rm -fr requirements-declared.txt
|
||||||
puts-step "Uninstalling stale dependencies"
|
|
||||||
/app/.heroku/python/bin/pip uninstall -r .heroku/python/requirements-stale.txt -y --exists-action=w | cleanup | indent
|
if [[ -s .heroku/python/requirements-stale.txt ]]; then
|
||||||
|
puts-step "Uninstalling stale dependencies"
|
||||||
|
/app/.heroku/python/bin/pip uninstall -r .heroku/python/requirements-stale.txt -y --exists-action=w | cleanup | indent
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
|
fi
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
Regular → Executable
+71
-14
@@ -1,19 +1,76 @@
|
|||||||
# Pipenv support (Generate requriements.txt with pipenv).
|
#!/usr/bin/env bash
|
||||||
if [[ -f Pipfile ]]; then
|
|
||||||
if [[ ! -f requirements.txt ]]; then
|
|
||||||
puts-step "Installing requirements with latest pipenv..."
|
|
||||||
|
|
||||||
# Install pipenv.
|
# export CLINT_FORCE_COLOR=1
|
||||||
/app/.heroku/python/bin/pip install pipenv --upgrade &> /dev/null
|
# export PIPENV_FORCE_COLOR=1
|
||||||
|
# shellcheck source=bin/utils
|
||||||
|
source $BIN_DIR/utils
|
||||||
|
|
||||||
# Install the dependencies.
|
|
||||||
/app/.heroku/python/bin/pipenv install --system 2>&1 | indent
|
|
||||||
|
|
||||||
# Skip pip install, later.
|
if [[ -f Pipfile.lock ]]; then
|
||||||
export SKIP_PIP_INSTALL=1
|
if [[ -f .heroku/python/Pipfile.lock.sha256 ]]; then
|
||||||
|
if [[ $(openssl dgst -sha256 Pipfile.lock) == $(cat .heroku/python/Pipfile.lock.sha256) ]]; then
|
||||||
# Pip freeze, for compatibility.
|
if [[ ! "$PIPENV_ALWAYS_INSTALL" ]]; then
|
||||||
/app/.heroku/python/bin/pip freeze > requirements.txt
|
echo "Skipping installation, as Pipfile.lock hasn't changed since last deploy." | indent
|
||||||
|
echo "To disable this functionality, run the following command:"
|
||||||
|
echo ""
|
||||||
|
echo " $ heroku config:set PIPENV_ALWAYS_INSTALL=1" | indent
|
||||||
|
|
||||||
|
SKIP_PIPENV_INSTALL=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! "$SKIP_PIPENV_INSTALL" ]; then
|
||||||
|
|
||||||
|
# Pipenv support (Generate requriements.txt with pipenv).
|
||||||
|
if [[ -f Pipfile ]]; then
|
||||||
|
if [[ ! -f requirements.txt ]]; then
|
||||||
|
puts-step "Installing requirements with latest Pipenv…"
|
||||||
|
|
||||||
|
# Measure that we're using Pipenv.
|
||||||
|
mcount "tool.pipenv"
|
||||||
|
|
||||||
|
# Set PIP_EXTRA_INDEX_URL
|
||||||
|
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
|
||||||
|
PIP_EXTRA_INDEX_URL="$(cat "$ENV_DIR/PIP_EXTRA_INDEX_URL")"
|
||||||
|
export PIP_EXTRA_INDEX_URL
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if [[ -f .heroku/python/requirements-declared.txt ]]; then
|
||||||
|
# cp .heroku/python/requirements-declared.txt requirements.txt
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# Install pipenv.
|
||||||
|
/app/.heroku/python/bin/pip install pipenv --upgrade &> /dev/null
|
||||||
|
|
||||||
|
# Install the dependencies.
|
||||||
|
if [[ ! -f Pipfile.lock ]]; then
|
||||||
|
/app/.heroku/python/bin/pipenv install --system --skip-lock 2>&1 | indent
|
||||||
|
else
|
||||||
|
pipenv-to-pip Pipfile.lock > requirements.txt
|
||||||
|
"$BIN_DIR/steps/pip-uninstall"
|
||||||
|
cp requirements.txt .heroku/python/requirements-declared.txt
|
||||||
|
openssl dgst -sha256 Pipfile.lock > .heroku/python/Pipfile.lock.sha256
|
||||||
|
|
||||||
|
/app/.heroku/python/bin/pipenv install --system --deploy 2>&1 | indent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install the test dependencies, for CI.
|
||||||
|
if [ "$INSTALL_TEST" ]; then
|
||||||
|
puts-step "Installing test dependencies…"
|
||||||
|
/app/.heroku/python/bin/pipenv install --dev --system --deploy 2>&1 | cleanup | indent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Skip pip install, later.
|
||||||
|
export SKIP_PIP_INSTALL=1
|
||||||
|
|
||||||
|
# Pip freeze, for compatibility.
|
||||||
|
pip freeze > requirements.txt
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
pipenv-to-pip Pipfile.lock > requirements.txt
|
||||||
|
export SKIP_PIP_INSTALL=1
|
||||||
|
fi
|
||||||
|
|||||||
@@ -1,22 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Detect Python-version with Pipenv.
|
# Detect Python-version with Pipenv.
|
||||||
|
|
||||||
if [[ -f $BUILD_DIR/Pipfile.lock ]]; then
|
if [[ -f $BUILD_DIR/Pipfile ]]; then
|
||||||
|
|
||||||
if [[ ! -f $BUILD_DIR/runtime.txt ]]; then
|
if [[ ! -f $BUILD_DIR/runtime.txt ]]; then
|
||||||
if [[ ! -f $BUILD_DIR/Pipfile.lock ]]; then
|
if [[ ! -f $BUILD_DIR/Pipfile.lock ]]; then
|
||||||
puts-warn "No 'pipfile.lock' found! We recommend you commit this into your repository."
|
puts-warn "No 'Pipfile.lock' found! We recommend you commit this into your repository."
|
||||||
fi
|
fi
|
||||||
if [[ -f $BUILD_DIR/Pipfile.lock ]]; then
|
if [[ -f $BUILD_DIR/Pipfile.lock ]]; then
|
||||||
set +e
|
set +e
|
||||||
PYTHON=$(cat $BUILD_DIR/Pipfile.lock | jq '._meta.requires.python_version' -r)
|
PYTHON=$(jq -r '._meta.requires.python_full_version' "$BUILD_DIR/Pipfile.lock")
|
||||||
|
if [[ "$PYTHON" != "null" ]]; then
|
||||||
|
echo "python-$PYTHON" > "$BUILD_DIR/runtime.txt"
|
||||||
|
fi
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ "$PYTHON" = 2.7 ]; then
|
if [[ "$PYTHON" == "null" ]]; then
|
||||||
echo "python-2.7.13" > $BUILD_DIR/runtime.txt
|
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
|
||||||
fi
|
if [ "$PYTHON" = 2.7 ]; then
|
||||||
if [ "$PYTHON" = 3.6 ]; then
|
echo "$LATEST_2" > "$BUILD_DIR/runtime.txt"
|
||||||
echo "python-3.6.0" > $BUILD_DIR/runtime.txt
|
fi
|
||||||
|
if [ "$PYTHON" = 3.6 ]; then
|
||||||
|
echo "$LATEST_3" > "$BUILD_DIR/runtime.txt"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
+11
-5
@@ -9,12 +9,17 @@
|
|||||||
#
|
#
|
||||||
# This script is invoked by [`bin/compile`](/).
|
# This script is invoked by [`bin/compile`](/).
|
||||||
|
|
||||||
|
if [[ "$STACK" == "heroku-16" ]]; then
|
||||||
|
# libmemcached is pre-installed in the stack image so there is no need to vendor it.
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
# The location of the pre-compiled libmemcached binary.
|
# The location of the pre-compiled libmemcached binary.
|
||||||
VENDORED_MEMCACHED="https://lang-python.s3.amazonaws.com/$STACK/libraries/vendor/libmemcache.tar.gz"
|
VENDORED_MEMCACHED="${VENDOR_URL}/libraries/vendor/libmemcache.tar.gz"
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
source $BIN_DIR/utils
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
# If pylibmc exists within requirements, use vendored libmemcached.
|
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||||
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
||||||
@@ -23,8 +28,9 @@ if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
|||||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||||
mkdir -p .heroku/vendor
|
mkdir -p .heroku/vendor
|
||||||
# Download and extract libmemcached into target vendor directory.
|
# Download and extract libmemcached into target vendor directory.
|
||||||
curl $VENDORED_MEMCACHED -s | tar zxv -C .heroku/vendor &> /dev/null
|
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LIBMEMCACHED=$(pwd)/vendor
|
LIBMEMCACHED=$(pwd)/vendor
|
||||||
|
export LIBMEMCACHED
|
||||||
fi
|
fi
|
||||||
|
|||||||
+31
-18
@@ -1,10 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
runtime-fixer runtime.txt
|
runtime-fixer runtime.txt
|
||||||
PYTHON_VERSION=$(cat runtime.txt)
|
PYTHON_VERSION=$(cat runtime.txt)
|
||||||
|
|
||||||
# Install Python.
|
# The location of the pre-compiled python binary.
|
||||||
|
VENDORED_PYTHON="${VENDOR_URL}/runtimes/$PYTHON_VERSION.tar.gz"
|
||||||
|
|
||||||
|
if [[ $PYTHON_VERSION =~ ^python-2 ]]; then
|
||||||
|
if [[ "$PYTHON_VERSION" != "$LATEST_2" ]]; then
|
||||||
|
puts-warn "The latest version of Python 2 is $LATEST_2 (you are using $PYTHON_VERSION, which is unsupported)."
|
||||||
|
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_2)."
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ "$PYTHON_VERSION" != "$LATEST_3" ]]; then
|
||||||
|
puts-warn "The latest version of Python 3 is $LATEST_3 (you are using $PYTHON_VERSION, which is unsupported)."
|
||||||
|
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_3)."
|
||||||
|
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
|
||||||
|
puts-step "Stack has changed from $CACHED_PYTHON_STACK to $STACK, clearing cache"
|
||||||
|
rm -fr .heroku/python-stack .heroku/python-version .heroku/python .heroku/vendor
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -f .heroku/python-version ]; then
|
if [ -f .heroku/python-version ]; then
|
||||||
if [ ! $(cat .heroku/python-version) = $PYTHON_VERSION ]; then
|
if [ ! "$(cat .heroku/python-version)" = "$PYTHON_VERSION" ]; then
|
||||||
puts-step "Found $(cat .heroku/python-version), removing"
|
puts-step "Found $(cat .heroku/python-version), removing"
|
||||||
rm -fr .heroku/python
|
rm -fr .heroku/python
|
||||||
else
|
else
|
||||||
@@ -12,41 +36,30 @@ if [ -f .heroku/python-version ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! $STACK = $CACHED_PYTHON_STACK ]; then
|
|
||||||
rm -fr .heroku/python .heroku/python-stack .heroku/vendor
|
|
||||||
unset SKIP_INSTALL
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ ! "$SKIP_INSTALL" ]; then
|
if [ ! "$SKIP_INSTALL" ]; then
|
||||||
puts-step "Installing $PYTHON_VERSION"
|
puts-step "Installing $PYTHON_VERSION"
|
||||||
|
|
||||||
# Prepare destination directory.
|
# Prepare destination directory.
|
||||||
mkdir -p .heroku/python
|
mkdir -p .heroku/python
|
||||||
|
|
||||||
curl https://lang-python.s3.amazonaws.com/$STACK/runtimes/$PYTHON_VERSION.tar.gz -s | tar zxv -C .heroku/python &> /dev/null
|
|
||||||
mcount "version.python.$PYTHON_VERSION"
|
mcount "version.python.$PYTHON_VERSION"
|
||||||
|
|
||||||
if [[ $? != 0 ]] ; then
|
if ! curl "${VENDORED_PYTHON}" -s | tar zxv -C .heroku/python &> /dev/null; then
|
||||||
puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
|
puts-warn "Requested runtime ($PYTHON_VERSION) is not available for this stack ($STACK)."
|
||||||
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
|
puts-warn "Aborting. More info: https://devcenter.heroku.com/articles/python-support"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Record for future reference.
|
# Record for future reference.
|
||||||
echo $PYTHON_VERSION > .heroku/python-version
|
echo "$PYTHON_VERSION" > .heroku/python-version
|
||||||
echo $STACK > .heroku/python-stack
|
echo "$STACK" > .heroku/python-stack
|
||||||
FRESH_PYTHON=true
|
FRESH_PYTHON=true
|
||||||
|
|
||||||
hash -r
|
hash -r
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# If Pip isn't up to date:
|
# If Pip isn't up to date:
|
||||||
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_VERSION* ]]; then
|
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
|
||||||
WORKING_DIR=$(pwd)
|
|
||||||
|
|
||||||
TMPTARDIR=$(mktemp -d)
|
|
||||||
trap "rm -rf $TMPTARDIR" RETURN
|
|
||||||
|
|
||||||
puts-step "Installing pip"
|
puts-step "Installing pip"
|
||||||
|
|
||||||
@@ -54,7 +67,7 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_VERSION* ]]; then
|
|||||||
rm -fr /app/.heroku/python/lib/python2.7/site-packages/pip-*
|
rm -fr /app/.heroku/python/lib/python2.7/site-packages/pip-*
|
||||||
rm -fr /app/.heroku/python/lib/python2.7/site-packages/setuptools-*
|
rm -fr /app/.heroku/python/lib/python2.7/site-packages/setuptools-*
|
||||||
|
|
||||||
/app/.heroku/python/bin/python $ROOT_DIR/vendor/get-pip.py &> /dev/null
|
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" &> /dev/null
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+8
-6
@@ -1,11 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Syntax sugar.
|
# Syntax sugar.
|
||||||
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
|
BIN_DIR=$(cd "$(dirname "$0")" || return; pwd) # absolute path
|
||||||
source $BIN_DIR/utils
|
|
||||||
|
|
||||||
DISABLE_COLLECTSTATIC=1 "$(dirname ${0:-})/compile" "$1" "$2" "$3"
|
# shellcheck source=bin/utils
|
||||||
|
source "$BIN_DIR/utils"
|
||||||
|
|
||||||
if [[ -f "$1/requirements-test.txt" ]]; then
|
# Locale support for Pipenv.
|
||||||
/app/.heroku/python/bin/pip install -r "$1/requirements-test.txt" --exists-action=w --src=./.heroku/src --disable-pip-version-check --no-cache-dir 2>&1 | cleanup | indent
|
export LC_ALL=C.UTF-8
|
||||||
fi
|
export LANG=C.UTF-8
|
||||||
|
|
||||||
|
DISABLE_COLLECTSTATIC=1 INSTALL_TEST=1 "$(dirname "${0:-}")/compile" "$1" "$2" "$3"
|
||||||
@@ -1,13 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
# The standard library.
|
# The standard library.
|
||||||
if [[ ! -f /tmp/stdlib.sh ]]; then
|
if [[ ! -f /tmp/stdlib.sh ]]; then
|
||||||
curl --retry 3 -s https://lang-common.s3.amazonaws.com/buildpack-stdlib/v2/stdlib.sh > /tmp/stdlib.sh
|
curl --retry 3 -s https://lang-common.s3.amazonaws.com/buildpack-stdlib/v8/stdlib.sh > /tmp/stdlib.sh
|
||||||
fi
|
fi
|
||||||
|
# shellcheck source=/dev/null
|
||||||
source /tmp/stdlib.sh
|
source /tmp/stdlib.sh
|
||||||
|
|
||||||
if [ $(uname) == Darwin ]; then
|
if [ "$(uname)" == Darwin ]; then
|
||||||
sed() { command sed -l "$@"; }
|
sed() { command sed -l "$@"; }
|
||||||
else
|
else
|
||||||
sed() { command sed -u "$@"; }
|
sed() { command sed -u "$@"; }
|
||||||
@@ -26,12 +28,12 @@ cleanup() {
|
|||||||
|
|
||||||
# Buildpack Steps.
|
# Buildpack Steps.
|
||||||
puts-step() {
|
puts-step() {
|
||||||
echo "-----> $@"
|
echo "-----> $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Buildpack Warnings.
|
# Buildpack Warnings.
|
||||||
puts-warn() {
|
puts-warn() {
|
||||||
echo " ! $@"
|
echo " ! $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Does some serious copying.
|
# Does some serious copying.
|
||||||
@@ -51,31 +53,8 @@ deep-cp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub-env() {
|
|
||||||
|
|
||||||
WHITELIST=${2:-''}
|
|
||||||
BLACKLIST=${3:-'^(GIT_DIR|STACK|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'}
|
|
||||||
|
|
||||||
# Python-specific variables.
|
|
||||||
export PYHONHOME=$BUILD_DIR/.heroku/python
|
|
||||||
export PYTHONPATH=$BUILD_DIR/
|
|
||||||
|
|
||||||
(
|
|
||||||
if [ -d "$ENV_DIR" ]; then
|
|
||||||
for e in $(ls $ENV_DIR); do
|
|
||||||
echo "$e" | grep -E "$WHITELIST" | grep -qvE "$BLACKLIST" &&
|
|
||||||
export "$e=$(cat $ENV_DIR/$e)"
|
|
||||||
:
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
$1
|
|
||||||
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Measure the size of the Python installation.
|
# Measure the size of the Python installation.
|
||||||
measure-size() {
|
measure-size() {
|
||||||
echo "$((du -s .heroku/python 2>/dev/null || echo 0) | awk '{print $1}')"
|
echo "$(du -s .heroku/python 2>/dev/null || echo 0) | awk '{print $1}')"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
|
|
||||||
old-platform() {
|
old-platform() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building SQLite..."
|
echo "Building SQLite…"
|
||||||
|
|
||||||
|
|
||||||
SOURCE_TARBALL='https://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
|
SOURCE_TARBALL='https://www.sqlite.org/sqlite-autoconf-3070900.tar.gz'
|
||||||
|
|||||||
Vendored
+5
-4
@@ -8,16 +8,17 @@ export PATH="/app/.heroku/python/bin/:$PATH"
|
|||||||
hash -r
|
hash -r
|
||||||
|
|
||||||
|
|
||||||
echo "Building gdal..."
|
echo "Building gdal…"
|
||||||
|
|
||||||
SOURCE_TARBALL='http://download.osgeo.org/gdal/1.11.1/gdal-1.11.1.tar.gz'
|
VERSION="2.2.1"
|
||||||
|
SOURCE_TARBALL="http://download.osgeo.org/gdal/${VERSION}/gdal-${VERSION}.tar.gz"
|
||||||
|
|
||||||
curl -L $SOURCE_TARBALL | tar zx
|
curl -L $SOURCE_TARBALL | tar zx
|
||||||
|
|
||||||
cd gdal-1.11.1
|
pushd "gdal-${VERSION}"
|
||||||
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
cd ..
|
popd
|
||||||
|
|||||||
Vendored
+6
-4
@@ -8,16 +8,18 @@ export PATH="/app/.heroku/python/bin/:$PATH"
|
|||||||
hash -r
|
hash -r
|
||||||
|
|
||||||
|
|
||||||
echo "Building geos..."
|
echo "Building geos…"
|
||||||
|
|
||||||
SOURCE_TARBALL='http://download.osgeo.org/geos/geos-3.4.3.tar.bz2'
|
VERSION=3.6.2
|
||||||
|
|
||||||
|
SOURCE_TARBALL="http://download.osgeo.org/geos/geos-${VERSION}.tar.bz2"
|
||||||
|
|
||||||
curl -L $SOURCE_TARBALL | tar xj
|
curl -L $SOURCE_TARBALL | tar xj
|
||||||
|
|
||||||
cd geos-3.4.3
|
pushd "geos-${VERSION}"
|
||||||
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
cd ..
|
popd
|
||||||
|
|||||||
Vendored
+1
-1
@@ -13,7 +13,7 @@ export PATH="/app/.heroku/python/bin/:$PATH"
|
|||||||
hash -r
|
hash -r
|
||||||
|
|
||||||
|
|
||||||
echo "Building libffi..."
|
echo "Building libffi…"
|
||||||
|
|
||||||
SOURCE_TARBALL='ftp://sourceware.org/pub/libffi/libffi-3.1.tar.gz'
|
SOURCE_TARBALL='ftp://sourceware.org/pub/libffi/libffi-3.1.tar.gz'
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
-2
@@ -20,7 +20,7 @@ dep_archive_name=${dep_dirname}.tar.gz
|
|||||||
dep_url=https://launchpad.net/libmemcached/1.0/${dep_version}/+download/${dep_archive_name}
|
dep_url=https://launchpad.net/libmemcached/1.0/${dep_version}/+download/${dep_archive_name}
|
||||||
|
|
||||||
# SASL Support.
|
# SASL Support.
|
||||||
echo "-----> Building cyrus-sasl 2.1.26..."
|
echo "-----> Building cyrus-sasl 2.1.26…"
|
||||||
|
|
||||||
curl -LO ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.26.tar.gz
|
curl -LO ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.26.tar.gz
|
||||||
# FTP doesn't play well with piping into tar xz
|
# FTP doesn't play well with piping into tar xz
|
||||||
@@ -33,7 +33,7 @@ make -s -j 9
|
|||||||
make install -s
|
make install -s
|
||||||
popd
|
popd
|
||||||
|
|
||||||
echo "-----> Building libmemcached ${dep_version}..."
|
echo "-----> Building libmemcached ${dep_version}…"
|
||||||
|
|
||||||
curl -L ${dep_url} | tar xz
|
curl -L ${dep_url} | tar xz
|
||||||
pushd ${dep_dirname}
|
pushd ${dep_dirname}
|
||||||
|
|||||||
Vendored
+6
-5
@@ -8,16 +8,17 @@ export PATH="/app/.heroku/python/bin/:$PATH"
|
|||||||
hash -r
|
hash -r
|
||||||
|
|
||||||
|
|
||||||
echo "Building gdal..."
|
echo "Building gdal…"
|
||||||
|
|
||||||
SOURCE_TARBALL='http://download.osgeo.org/proj/proj-4.8.0.tar.gz'
|
VERSION=4.9.3
|
||||||
|
SOURCE_TARBALL="http://download.osgeo.org/proj/proj-${VERSION}.tar.gz"
|
||||||
|
|
||||||
curl -L $SOURCE_TARBALL | tar zx
|
curl -L $SOURCE_TARBALL | tar zx
|
||||||
|
|
||||||
cd proj-4.8.0
|
pushd "proj-${VERSION}"
|
||||||
./configure --prefix=$OUT_PREFIX --enable-static=no &&
|
./configure --prefix=$OUT_PREFIX --enable-static=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
cd ..
|
popd
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
|
cp -R pypy2-v5.3.1-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy2-v5.6.0-linux64/* $OUT_PREFIX
|
cp -R pypy2-v5.6.0-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.0-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.0-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy2-v5.7.0-linux64/* $OUT_PREFIX
|
cp -R pypy2-v5.7.0-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.1-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.1-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy2-v5.7.1-linux64/* $OUT_PREFIX
|
cp -R pypy2-v5.7.1-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
Executable
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
# Build Deps: libraries/sqlite
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
|
echo "Building PyPy…"
|
||||||
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-linux64.tar.bz2'
|
||||||
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
|
cp -R pypy2-v5.8.0-linux64/* $OUT_PREFIX
|
||||||
|
|
||||||
|
ln $OUT_PREFIX/bin/pypy $OUT_PREFIX/bin/python
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-2.4.0-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-2.4.0-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy3-2.4.0-linux64/* $OUT_PREFIX
|
cp -R pypy3-2.4.0-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3.3-v5.5.0-alpha-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3.3-v5.5.0-alpha-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy3-v5.5.0-linux64/* $OUT_PREFIX
|
cp -R pypy3-v5.5.0-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building PyPy..."
|
echo "Building PyPy…"
|
||||||
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.7.1-linux64.tar.bz2'
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.7.1-linux64.tar.bz2'
|
||||||
curl -L $SOURCE_TARBALL | tar jx
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
cp -R pypy3-v5.7.1-linux64/* $OUT_PREFIX
|
cp -R pypy3-v5.7.1-linux64/* $OUT_PREFIX
|
||||||
|
|||||||
Executable
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build Path: /app/.heroku/python/
|
||||||
|
# Build Deps: libraries/sqlite
|
||||||
|
|
||||||
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
|
echo "Building PyPy…"
|
||||||
|
SOURCE_TARBALL='https://bitbucket.org/pypy/pypy/downloads/pypy3-v5.8.0-linux64.tar.bz2'
|
||||||
|
curl -L $SOURCE_TARBALL | tar jx
|
||||||
|
cp -R pypy3-v5.8.0-linux64/* $OUT_PREFIX
|
||||||
|
|
||||||
|
ln $OUT_PREFIX/bin/pypy3 $OUT_PREFIX/bin/python
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.10/Python-2.7.10.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.10/Python-2.7.10.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.10 src
|
mv Python-2.7.10 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.11/Python-2.7.11.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.11 src
|
mv Python-2.7.11 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.12 src
|
mv Python-2.7.12 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.13/Python-2.7.13.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.13/Python-2.7.13.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.13 src
|
mv Python-2.7.13 src
|
||||||
@@ -13,3 +13,7 @@ cd src
|
|||||||
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|||||||
Executable
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/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/2.7.14/Python-2.7.14.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-2.7.14 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --enable-unicode=ucs4 --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/2.7.9/Python-2.7.9.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/2.7.9/Python-2.7.9.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-2.7.9 src
|
mv Python-2.7.9 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.2/Python-3.5.2.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/3.5.2/Python-3.5.2.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-3.5.2 src
|
mv Python-3.5.2 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.3/Python-3.5.3.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/3.5.3/Python-3.5.3.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-3.5.3 src
|
mv Python-3.5.3 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.0/Python-3.6.0.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/3.6.0/Python-3.6.0.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-3.6.0 src
|
mv Python-3.6.0 src
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
OUT_PREFIX=$1
|
OUT_PREFIX=$1
|
||||||
|
|
||||||
echo "Building Python..."
|
echo "Building Python…"
|
||||||
SOURCE_TARBALL='https://python.org/ftp/python/3.6.1/Python-3.6.1.tgz'
|
SOURCE_TARBALL='https://python.org/ftp/python/3.6.1/Python-3.6.1.tgz'
|
||||||
curl -L $SOURCE_TARBALL | tar xz
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
mv Python-3.6.1 src
|
mv Python-3.6.1 src
|
||||||
|
|||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/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.6.2/Python-3.6.2.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.6.2 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/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.6.3/Python-3.6.3.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.6.3 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/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.6.4/Python-3.6.4.tgz'
|
||||||
|
curl -L $SOURCE_TARBALL | tar xz
|
||||||
|
mv Python-3.6.4 src
|
||||||
|
cd src
|
||||||
|
|
||||||
|
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove unneeded test directories, similar to the official Docker Python images:
|
||||||
|
# https://github.com/docker-library/python
|
||||||
|
find "${OUT_PREFIX}" \( -type d -a \( -name test -o -name tests \) \) -exec rm -rf '{}' +
|
||||||
|
|
||||||
|
ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||||
@@ -1 +1,3 @@
|
|||||||
|
docopt==0.6.2
|
||||||
bob-builder==0.0.13
|
bob-builder==0.0.13
|
||||||
|
boto==2.48.0
|
||||||
|
|||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
cffi
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
django
|
||||||
Vendored
+2
-1
@@ -1 +1,2 @@
|
|||||||
wordnet
|
city_database
|
||||||
|
stopwords
|
||||||
|
|||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
python-2.7.13
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.python.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
requests = "*"
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_full_version = "3.6.3"
|
||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "22a052f4d1cfe6518b2f236fe45c3208c587a9ab1323bdd390632e27278b541e"
|
||||||
|
},
|
||||||
|
"host-environment-markers": {
|
||||||
|
"implementation_name": "cpython",
|
||||||
|
"implementation_version": "3.6.3",
|
||||||
|
"os_name": "posix",
|
||||||
|
"platform_machine": "x86_64",
|
||||||
|
"platform_python_implementation": "CPython",
|
||||||
|
"platform_release": "16.7.0",
|
||||||
|
"platform_system": "Darwin",
|
||||||
|
"platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
|
||||||
|
"python_full_version": "3.6.3",
|
||||||
|
"python_version": "3.6",
|
||||||
|
"sys_platform": "darwin"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_full_version": "3.6.3"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"url": "https://pypi.python.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"certifi": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694",
|
||||||
|
"sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0"
|
||||||
|
],
|
||||||
|
"version": "==2017.11.5"
|
||||||
|
},
|
||||||
|
"chardet": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
|
||||||
|
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
|
||||||
|
],
|
||||||
|
"version": "==3.0.4"
|
||||||
|
},
|
||||||
|
"idna": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4",
|
||||||
|
"sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"
|
||||||
|
],
|
||||||
|
"version": "==2.6"
|
||||||
|
},
|
||||||
|
"requests": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
|
||||||
|
"sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
|
||||||
|
],
|
||||||
|
"version": "==2.18.4"
|
||||||
|
},
|
||||||
|
"urllib3": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
|
||||||
|
"sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
|
||||||
|
],
|
||||||
|
"version": "==1.22"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
[packages]
|
||||||
|
"delegator.py" = "*"
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "397f2c55e3558ea57d292e3fc19b34e483770e5ec02cdedfb1f330680cd26635"
|
||||||
|
},
|
||||||
|
"host-environment-markers": {
|
||||||
|
"implementation_name": "cpython",
|
||||||
|
"implementation_version": "3.6.3",
|
||||||
|
"os_name": "posix",
|
||||||
|
"platform_machine": "x86_64",
|
||||||
|
"platform_python_implementation": "CPython",
|
||||||
|
"platform_release": "16.7.0",
|
||||||
|
"platform_system": "Darwin",
|
||||||
|
"platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
|
||||||
|
"python_full_version": "3.6.3",
|
||||||
|
"python_version": "3.6",
|
||||||
|
"sys_platform": "darwin"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.python.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"delegator.py": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:2575c4adc923ad0b8fdaa433f862b2b7cf21982717fb23cc895fd8f249ea820c",
|
||||||
|
"sha256:495e11ada66648650171a6c9a188df4eb050b235abff8771f41ee8a064eb9ded"
|
||||||
|
],
|
||||||
|
"version": "==0.0.13"
|
||||||
|
},
|
||||||
|
"pexpect": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:f853b52afaf3b064d29854771e2db509ef80392509bde2dd7a6ecf2dfc3f0018",
|
||||||
|
"sha256:3d132465a75b57aa818341c6521392a06cc660feb3988d7f1074f39bd23c9a92"
|
||||||
|
],
|
||||||
|
"version": "==4.2.1"
|
||||||
|
},
|
||||||
|
"ptyprocess": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:e8c43b5eee76b2083a9badde89fd1bbce6c8942d1045146e100b7b5e014f4f1a",
|
||||||
|
"sha256:e64193f0047ad603b71f202332ab5527c5e52aa7c8b609704fc28c0dc20c4365"
|
||||||
|
],
|
||||||
|
"version": "==0.5.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
python-2.7.13
|
python-2.7.14
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
python-3.6.0
|
|
||||||
@@ -1,14 +1,24 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
|
||||||
testPipenv() {
|
testPipenv() {
|
||||||
compile "pipenv"
|
compile "pipenv"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testPipenvLock() {
|
||||||
|
compile "pipenv-lock"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
testPipenvVersion() {
|
testPipenvVersion() {
|
||||||
compile "pipenv-version"
|
compile "pipenv-version"
|
||||||
assertCaptured "3.6.0"
|
assertCaptured "3.6.4"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testPipenvFullVersion() {
|
||||||
|
compile "pipenv-full-version"
|
||||||
|
assertCaptured "3.6.3"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,13 +27,17 @@ testNoRequirements() {
|
|||||||
assertCapturedError
|
assertCapturedError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testGEOS() {
|
||||||
testNLTK() {
|
BUILD_WITH_GEO_LIBRARIES=1 compile "geos"
|
||||||
compile "nltk"
|
assertCaptured "geos"
|
||||||
assertCaptured "wordnet"
|
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testNLTK() {
|
||||||
|
compile "nltk"
|
||||||
|
assertCaptured "Downloading NLTK packages: city_database stopwords"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
testSetupPy() {
|
testSetupPy() {
|
||||||
compile "setup-py"
|
compile "setup-py"
|
||||||
@@ -44,6 +58,12 @@ testPsycopg2() {
|
|||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testCffi() {
|
||||||
|
compile "cffi"
|
||||||
|
assertCaptured "cffi"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
testPylibmc() {
|
testPylibmc() {
|
||||||
compile "pylibmc"
|
compile "pylibmc"
|
||||||
assertCaptured "pylibmc"
|
assertCaptured "pylibmc"
|
||||||
@@ -52,17 +72,36 @@ testPylibmc() {
|
|||||||
|
|
||||||
testPython2() {
|
testPython2() {
|
||||||
compile "python2"
|
compile "python2"
|
||||||
assertCaptured "python-2.7.13"
|
assertCaptured "python-2.7.14"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
testPython3() {
|
testPython3() {
|
||||||
compile "python3"
|
compile "python3"
|
||||||
assertCaptured "python-3.6.0"
|
assertCaptured "python-3.6.4"
|
||||||
assertCapturedSuccess
|
assertCapturedSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testSmartRequirements() {
|
||||||
|
local cache_dir="$(mktmpdir)"
|
||||||
|
compile "requirements-standard" "$cache_dir"
|
||||||
|
assertFile "requests" ".heroku/python/requirements-declared.txt"
|
||||||
|
assertCapturedSuccess
|
||||||
|
compile "psycopg2" "$cache_dir"
|
||||||
|
assertCaptured "Uninstalling requests"
|
||||||
|
assertFile "psycopg2" ".heroku/python/requirements-declared.txt"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
testStackChange() {
|
||||||
|
local cache_dir="$(mktmpdir)"
|
||||||
|
mkdir -p "${cache_dir}/.heroku"
|
||||||
|
echo "different-stack" > "${cache_dir}/.heroku/python-stack"
|
||||||
|
compile "requirements-standard" "$cache_dir"
|
||||||
|
assertCaptured "clearing cache"
|
||||||
|
assertFile "$STACK" ".heroku/python-stack"
|
||||||
|
assertCapturedSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pushd $(dirname 0) >/dev/null
|
pushd $(dirname 0) >/dev/null
|
||||||
|
|||||||
+3
-3
@@ -25,9 +25,9 @@ SHUNIT_ERROR=2
|
|||||||
# enable strict mode by default
|
# enable strict mode by default
|
||||||
SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
|
SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
|
||||||
|
|
||||||
_shunit_warn() { echo "shunit2:WARN $@" >&2; }
|
_shunit_warn() { echo "shunit2:WARN $*" >&2; }
|
||||||
_shunit_error() { echo "shunit2:ERROR $@" >&2; }
|
_shunit_error() { echo "shunit2:ERROR $*" >&2; }
|
||||||
_shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; }
|
_shunit_fatal() { echo "shunit2:FATAL $*" >&2; exit ${SHUNIT_ERROR}; }
|
||||||
|
|
||||||
# specific shell checks
|
# specific shell checks
|
||||||
if [ -n "${ZSH_VERSION:-}" ]; then
|
if [ -n "${ZSH_VERSION:-}" ]; then
|
||||||
|
|||||||
+6
-1
@@ -36,7 +36,7 @@ capture()
|
|||||||
|
|
||||||
LAST_COMMAND="$@"
|
LAST_COMMAND="$@"
|
||||||
|
|
||||||
$@ >${STD_OUT} 2>${STD_ERR}
|
"$@" >${STD_OUT} 2>${STD_ERR}
|
||||||
RETURN=$?
|
RETURN=$?
|
||||||
rtrn=${RETURN} # deprecated
|
rtrn=${RETURN} # deprecated
|
||||||
}
|
}
|
||||||
@@ -150,6 +150,11 @@ _assertContains()
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
fail "${msg:-${default_msg}}"
|
fail "${msg:-${default_msg}}"
|
||||||
|
|
||||||
|
if [ "${haystack_type}" == "file" ]; then
|
||||||
|
echo
|
||||||
|
cat "${haystack}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+6
-6
@@ -5,25 +5,25 @@ case $(ulimit -u) in
|
|||||||
# Standard-1X (+Free, +Hobby) Dyno
|
# Standard-1X (+Free, +Hobby) Dyno
|
||||||
256)
|
256)
|
||||||
export DYNO_RAM=512
|
export DYNO_RAM=512
|
||||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-02}
|
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-2}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# Standard-2X Dyno
|
# Standard-2X Dyno
|
||||||
512)
|
512)
|
||||||
export DYNO_RAM=1024
|
export DYNO_RAM=1024
|
||||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-04}
|
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-4}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# Performance-M Dyno
|
# Performance-M Dyno
|
||||||
16384)
|
16384)
|
||||||
export DYNO_RAM=2560
|
export DYNO_RAM=2560
|
||||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-08}
|
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-8}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# Performance-L Dyno
|
# Performance-L Dyno
|
||||||
32768)
|
32768)
|
||||||
export DYNO_RAM=6656
|
export DYNO_RAM=14336
|
||||||
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-011}
|
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-11}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
|
|||||||
Vendored
+1
@@ -41,6 +41,7 @@ class Requirements(object):
|
|||||||
if not getattr(requirement.req, 'name', None):
|
if not getattr(requirement.req, 'name', None):
|
||||||
# Prior to pip 8.1.2 the attribute `name` did not exist.
|
# Prior to pip 8.1.2 the attribute `name` did not exist.
|
||||||
requirement.req.name = requirement.req.project_name
|
requirement.req.name = requirement.req.project_name
|
||||||
|
requirement.req.name = requirement.req.name.lower()
|
||||||
self.requirements.append(requirement.req)
|
self.requirements.append(requirement.req)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
INFILE = sys.argv[1]
|
||||||
|
|
||||||
|
with open(INFILE, 'rb') as f:
|
||||||
|
lockfile = json.load(f)
|
||||||
|
|
||||||
|
packages = []
|
||||||
|
for package in lockfile.get('default', {}):
|
||||||
|
try:
|
||||||
|
packages.append('{0}{1}'.format(package, lockfile['default'][package]['version']))
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print('\n'.join(packages))
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
Vendored
+3
@@ -1,2 +1,5 @@
|
|||||||
# Automatic configuration for Gunicorn's ForwardedAllowIPS setting.
|
# Automatic configuration for Gunicorn's ForwardedAllowIPS setting.
|
||||||
export FORWARDED_ALLOW_IPS='*'
|
export FORWARDED_ALLOW_IPS='*'
|
||||||
|
|
||||||
|
# Automatic configuration for Gunicorn's stdout access log setting.
|
||||||
|
export GUNICORN_CMD_ARGS=${GUNICORN_CMD_ARGS:-"--access-logfile -"}
|
||||||
|
|||||||
Vendored
+3
-3
@@ -25,9 +25,9 @@ SHUNIT_ERROR=2
|
|||||||
# enable strict mode by default
|
# enable strict mode by default
|
||||||
SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
|
SHUNIT_STRICT=${SHUNIT_STRICT:-${SHUNIT_TRUE}}
|
||||||
|
|
||||||
_shunit_warn() { echo "shunit2:WARN $@" >&2; }
|
_shunit_warn() { echo "shunit2:WARN $*" >&2; }
|
||||||
_shunit_error() { echo "shunit2:ERROR $@" >&2; }
|
_shunit_error() { echo "shunit2:ERROR $*" >&2; }
|
||||||
_shunit_fatal() { echo "shunit2:FATAL $@" >&2; exit ${SHUNIT_ERROR}; }
|
_shunit_fatal() { echo "shunit2:FATAL $*" >&2; exit ${SHUNIT_ERROR}; }
|
||||||
|
|
||||||
# specific shell checks
|
# specific shell checks
|
||||||
if [ -n "${ZSH_VERSION:-}" ]; then
|
if [ -n "${ZSH_VERSION:-}" ]; then
|
||||||
|
|||||||
Vendored
+1
-1
@@ -36,7 +36,7 @@ capture()
|
|||||||
|
|
||||||
LAST_COMMAND="$@"
|
LAST_COMMAND="$@"
|
||||||
|
|
||||||
$@ >${STD_OUT} 2>${STD_ERR}
|
"$@" >${STD_OUT} 2>${STD_ERR}
|
||||||
RETURN=$?
|
RETURN=$?
|
||||||
rtrn=${RETURN} # deprecated
|
rtrn=${RETURN} # deprecated
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user