Compare commits

...

104 Commits

Author SHA1 Message Date
David Zülke 14c7e26f7a Merge pull request #827 from heroku/fix-python-3-5-7
Fix Python 3.5.7
2019-07-17 21:55:48 +02:00
David Zuelke 58e664a9e3 avoid service restart prompt during Dockerfile builds
https://unix.stackexchange.com/questions/146283/how-to-prevent-prompt-that-ask-to-restart-services-when-installing-libpq-dev
2019-07-17 02:22:10 +02:00
David Zuelke e965516197 fix python 3.5.7 formula actually building 3.7.2 2019-07-17 01:55:46 +02:00
David Zuelke 8775cb821c CHANGELOG for v153 2019-07-17 01:43:54 +02:00
Casey 9dcabe24a5 Merge pull request #826 from heroku/hotfix-sqlite3-heroku-16
HOTFIX heroku-16 builds with sqlite3
2019-06-21 10:43:28 -07:00
David Zuelke 38f9a41a54 HOTFIX heroku-16 builds with sqlite3
upstream version has changed to 3.11.0-1ubuntu1.2, but local package version is still on 3.11.0-1ubuntu1.1, so the download fails otherwise
2019-06-21 19:17:22 +02:00
Casey 53e33bdf91 Merge pull request #814 from heroku/v-152
Python 3.7.3 release
2019-04-04 15:41:29 -07:00
Casey Faist 5337dd592b remove test case for deprecated pythons on deprecated stack 2019-04-04 14:04:10 -07:00
Casey Faist de8ae808d9 changelog date corrected 2019-04-04 13:26:55 -07:00
Casey Faist 2a7e85be85 update CHANGELOG 2019-04-03 15:32:26 -07:00
Casey Faist 7654d13f8b fix test blindspot 2019-04-03 15:28:35 -07:00
Casey Faist 9d3639685a add new python and update default 2019-04-03 09:12:44 -07:00
Casey 76bb572a4d Release prep 151 (#813)
* new runtimes

* update default latest
2019-03-21 10:54:12 -07:00
Casey 8db4a79392 changelog 150 update (#810) 2019-03-14 11:40:14 -07:00
Casey 21430070ad Python release prep (#809)
* new recipe for new runtime

* add new runtime formula

* add test updates for new runtime release

* wrangle tests into submission

* update tests to use default_pythons

* delete commented code
2019-03-13 12:25:03 -07:00
Casey 20bbb3f54d changelog update for v149 (#806) 2019-03-11 11:51:07 -07:00
Casey bebc0cf439 Python 2.7.16 (#808)
* new recipe for new runtime

* add new runtime formula

* wrangle tests into submission
2019-03-11 13:22:29 -04:00
David Zülke c361c2ffc4 HOTFIX for cedar-14 python builds (#805) 2019-03-04 14:46:33 -08:00
Casey 13d2a58add update changelog (#803) 2019-02-21 15:24:08 -08:00
Casey 49e9147439 track usage of older feature steps (#802)
* track usage of older feature steps

* remove typo whitespace

* make buildvars consistently cased
2019-02-21 14:06:20 -08:00
Casey 3c0146c0b9 Merge pull request #797 from heroku/v-147
V 147
2019-02-12 13:01:43 -06:00
Casey Faist 53c7d61291 correct date mixup + update changelog 2019-02-07 12:35:25 -05:00
Casey Faist 797652a75d new runtimes and travis test updates 2019-01-31 14:46:42 -05:00
Casey Faist d7351513c7 changelog and test update 2018-12-12 17:26:28 -05:00
Casey fe029af603 Merge pull request #785 from heroku/update-readme
Update readme
2018-12-12 10:20:01 -05:00
Casey dd8fe58de1 Merge pull request #784 from heroku/update-changelog
update changelog
2018-12-12 10:19:24 -05:00
Casey Faist a979d57a20 update readme 2018-11-15 17:41:01 -06:00
Casey Faist 3cb8db7e2e update release date 2018-11-15 17:31:29 -06:00
Casey Faist 16cce92342 update changelog 2018-11-15 16:59:51 -06:00
Casey b85fe3614c Merge pull request #783 from heroku/document-tests
Document tests
2018-11-15 12:41:15 -06:00
Hunter Loftis b024e644d1 Merge branch 'master' of github.com:heroku/heroku-buildpack-python into document-tests 2018-11-15 12:45:28 -05:00
Casey 41e0f64252 Merge pull request #782 from heroku/next-release
Test updates
2018-11-15 11:06:27 -06:00
Hunter Loftis 3a0d4c18bf add heroku-18 to test targets and document running tests 2018-11-15 11:57:44 -05:00
Casey Faist b3988a565a remove template runtimes to cut down on scope creep 2018-11-15 10:39:19 -06:00
Casey Faist 0437a6e84f update latest python 2 in pipenv-version step 2018-11-15 09:37:43 -06:00
Casey Faist 88a5ba5d39 add test for 2.7 pipenv install 2018-11-15 09:09:51 -06:00
Casey Faist 3434972e32 update hatchet expected version 2018-11-15 08:57:57 -06:00
Casey Faist 1dfef44085 update default in pipenv test 2018-11-14 17:36:59 -06:00
Casey Faist 2ffb10da34 update latest vars in compile 2018-11-14 16:57:02 -06:00
Casey Faist 23999846ad update 3.7 tests typo 2018-11-14 16:41:38 -06:00
Casey Faist 8d1ebf7288 bump default 3.6 version 2018-11-14 16:24:46 -06:00
Casey Faist f2165aaac6 update test fixtures for new python runtimes 2018-11-13 16:11:14 -06:00
Casey Faist 05492e132a add next runtimes 2018-11-13 15:34:07 -06:00
Casey 62eaae35a4 Merge pull request #781 from heroku/update-hatchet-setup
Update to reflect Hatchet updates
2018-11-13 14:36:24 -06:00
Duane Hutchins 2f32c5418d Updated HATCHET_BUILDPACK_BASE to use TRAVIS_REPO_SLUG 2018-11-13 13:58:23 -06:00
Casey Faist 12e3a7f3e7 add HATCHET_DEPLOY_STRATEGY env var 2018-11-13 13:48:38 -06:00
Casey Faist e7da63f722 update to newer hatchet integration 2018-11-13 13:05:31 -06:00
Casey a6452a1ce4 Merge pull request #772 from heroku/v-145
V 145
2018-11-12 18:49:06 -06:00
Casey Faist 0b554f660f update tests for missed stack issues 2018-11-12 17:27:07 -06:00
Casey Faist 7b9e82175e add warning detection and per-stack checks 2018-11-12 17:10:30 -06:00
Casey Faist 73d37cbac6 update changelog 2018-11-11 17:52:16 -06:00
Casey Faist 9e1df4bbb5 specify python 2.7 2018-11-11 17:24:42 -06:00
Casey Faist 0be9d48013 add missing vars for python step 2018-11-11 16:51:29 -06:00
Casey Faist 4750639a0d add python 3.4 detection 2018-11-11 16:38:12 -06:00
Casey Faist 3de5b43447 add bash pre-commit hook and correct shellcheck warnings 2018-11-11 16:36:16 -06:00
Casey Faist c3845fff9a use text variable as variable in puts-warn 2018-11-11 15:43:21 -06:00
Casey Faist f3ef152624 update tests to pass, add 3.4 2018-11-11 15:34:49 -06:00
Jose Diaz-Gonzalez ef1f7f6924 fix: drop broken version check
Due to how the version checks work - via sorting, not actual comparison - this previously resulted in _always_ installing sqlite3, even though it was already bundled for lower versions of python. The second version check also encompasses 3.7.0+, so there is no need to respecify the check.
2018-11-08 16:14:05 -06:00
Casey Faist 25818765ee update changelog 2018-11-08 15:54:45 -06:00
Casey Faist 0a169e76a4 fix extra slash in python install location 2018-11-08 13:54:44 -06:00
Casey Faist 2f430abf07 adjust sqlcheck 2018-11-08 13:54:44 -06:00
Casey Faist 07241cd751 add tests for new runtimes 2018-11-08 13:54:44 -06:00
Casey Faist ae4713efd8 add new runtimes and test repos 2018-11-08 13:54:44 -06:00
Casey 402cd8253e Merge pull request #777 from heroku/use-heroku-bob
update bob dependency to point to internal bob-builder fork
2018-11-08 13:54:03 -06:00
Casey aa593f127b delete tester runtime.txt
Added this for local testing because bob requires 2.7, should not be merged to master
2018-11-08 10:23:23 -06:00
Casey Faist 67badb1829 use released bob package 2018-11-08 09:23:05 -06:00
Casey Faist defa85c355 delete me later 2018-11-07 11:18:26 -06:00
Casey Faist ec364be161 remove comment 2018-11-06 17:47:38 -06:00
Casey Faist 7b4d6b5587 update bob dependency to point to internal bob-builder fork 2018-11-06 17:41:10 -06:00
Casey e094c5469d Merge pull request #769 from heroku/pip-pipenv-pin
Pin pip version used by pipenv
2018-10-11 14:50:52 -05:00
Casey Faist a7a5971372 changelog update 2018-10-10 09:23:54 -05:00
Casey Faist 45b78ab587 pin pip version used by pipenv 2018-10-09 14:46:49 -05:00
Casey 63e84aceb1 Merge pull request #760 from heroku/add-airflow-110-support
Add Apache Airflow 1.10 Support
2018-10-08 16:01:45 -05:00
Casey Faist eee8dd9a9e need to pass env var as export in test 2018-10-05 13:48:22 -05:00
Casey Faist 00e12b8ec2 add test/run case 2018-10-05 13:35:42 -05:00
Casey Faist b56b063dd5 add SLUGIFY_USES_TEXT_UNIDECODE support 2018-10-05 11:49:01 -05:00
Casey d3180d3245 Merge pull request #759 from heroku/update-travis
Update travis setup for Hatchet
2018-10-04 19:28:04 -05:00
Casey Faist 4778b1cb9d add sudo to travis install 2018-10-04 17:33:40 -05:00
Casey Faist 50a3d2d13e add shebang and update file permissions 2018-10-04 17:33:28 -05:00
Casey Faist 8c36a3a263 move heroku install to before_install 2018-10-04 17:33:16 -05:00
Casey Faist 882f54128b rememer to remove toolbelt 2018-10-04 17:33:08 -05:00
Casey Faist 576def4cde fix travis dependency blocker 2018-10-04 17:32:58 -05:00
Casey Faist 1be32ff09a add more unblocking setup 2018-10-04 17:32:35 -05:00
Casey 9c2bbd109f Merge pull request #741 from heroku/fix-python-check
Fix Python 3.6 message when using Python 3.7
2018-09-05 16:54:26 -04:00
Casey Faist e5d9ed259b changelog update 2018-09-05 16:24:02 -04:00
Casey Faist 285ca2b73d reword warning, add doc link 2018-09-05 16:21:42 -04:00
Casey Faist 5e4667686a add case for older python 3 install attempts 2018-09-05 16:21:42 -04:00
Casey Faist f9621add42 Update indentation levels and messaging
Fix indentation levels

more helpful messages about supported versions
2018-09-05 16:21:42 -04:00
Casey 567cf2c388 Merge pull request #742 from heroku/hatchet/yay
Hatchet/yay
2018-09-05 16:18:25 -04:00
Casey Faist c61e61c153 add missing newline 2018-09-05 15:53:42 -04:00
Casey Faist 3835aca004 use bundle syntax to rspec 2018-09-04 11:26:13 -04:00
Casey Faist 3733383ad6 add Rakefile 2018-09-04 11:26:13 -04:00
Casey Faist b53d211d01 add rake to gemfile 2018-09-04 11:26:13 -04:00
Casey Faist e5830fd50d correct travisyaml indenting 2018-09-04 11:26:13 -04:00
Casey Faist 2efe514b14 setup travis rspecting 2018-09-04 11:26:13 -04:00
schneems d442562352 Add retry gem 2018-09-04 11:26:13 -04:00
schneems ce14e1edf8 Integration tests with Hatchet 2018-09-04 11:26:13 -04:00
Casey 39d2cd6de8 Merge pull request #746 from heroku/changelog-dates
Start adding dates to changelog entries
2018-09-04 11:21:37 -04:00
Jeremy Morrell e42b725211 Start adding dates to changelog entries
It's occasionally useful to see at a glance when releases were pushed to understand what release might have caused a customer's issues. This back-fills dates for the last few months of releases and sets a precedent that can be followed in the future.
2018-09-04 10:02:34 -04:00
Casey d9456b6d90 Merge pull request #745 from heroku/fix-27-tests
update buildpack tests to expect success for all 2.7.15 builds
2018-09-04 09:58:07 -04:00
Casey Faist 61591594a2 typo fix 2018-08-24 18:19:07 -04:00
Casey Faist 13bca29e13 update tests to expect success for all 2.7.15 builds 2018-08-24 18:12:28 -04:00
Casey 95779d6711 Merge pull request #744 from edmorley/add-pr-template
Add a Pull Request template
2018-08-22 15:50:36 -04:00
Ed Morley 166b8be2c5 Add a Pull Request template
To try and help prevent the notification noise from PRs being opened
against upstream by mistake.
2018-08-22 18:29:03 +01:00
77 changed files with 949 additions and 123 deletions
+8
View File
@@ -0,0 +1,8 @@
<!-- Hi and welcome to the Heroku Python buildpack repository!
If you meant to open a PR against a fork instead of upstream, please adjust the base branch:
https://help.github.com/articles/changing-the-base-branch-of-a-pull-request/
Otherwise thank you in advance for your Pull Request - just remember to
include as much information as possible to help the reviewers :-)
-->
+4
View File
@@ -3,3 +3,7 @@ site
.DS_Store
/.envrc
repos/*
#Venv
buildpack/*
+5
View File
@@ -0,0 +1,5 @@
repos:
- repo: git://github.com/detailyang/pre-commit-shell
rev: 1.0.4
hooks:
- id: shell-lint
+32 -22
View File
@@ -1,25 +1,35 @@
language: bash
language: ruby
dist: trusty
sudo: required
rvm:
- 2.4.4
before_script:
- gem install bundler -v 1.16.2
- bundle exec hatchet ci:setup
jobs:
include:
- stage: "Bash linting (shellcheck)"
sudo: false
before_install:
- wget -c https://goo.gl/ZzKHFv -O - | tar -xvJ -C /tmp/
- PATH="/tmp/shellcheck-latest:$PATH"
script: make check
- stage: "Stack Tests"
services: docker
env: STACK=heroku-18
script: ./tests.sh
- stage: "Stack Tests"
services: docker
env: STACK=heroku-16
script: ./tests.sh
- stage: "Stack Tests"
services: docker
env: STACK=cedar-14
script: ./tests.sh
- stage: Bash linting (shellcheck)
sudo: false
script: make check
- stage: Stack Unit Tests
services: docker
env: STACK=heroku-18
script: "./tests.sh"
- stage: Stack Unit Tests
services: docker
env: STACK=heroku-16
script: "./tests.sh"
- stage: Stack Unit Tests
services: docker
env: STACK=cedar-14
script: "./tests.sh"
- stage: Hatchet Integration
script: "bundle exec rspec"
env:
global:
- HATCHET_RETRIES=3
- IS_RUNNING_ON_CI=true
- HATCHET_APP_LIMIT=5
- HATCHET_DEPLOY_STRATEGY=git
- secure: yjtlPE5FbVxTKnjUy/tZUBgSEf4qADD3QOxtgziuid73S0U/1IEXlMGFULsQzIjtlHKmHeywZqpVVEpthIH4RuT7uoX1Pb7SSM/g0T8fT3VoEFbFK1uYl0oZQbUS4Klxv9tPiumj8if3m6ULEGIz1X0wZcMOC0tMLwVCnwmap0E=
- secure: ZeFTHWwnpIKE9nAqs88ocmiQh7bKce84lilGm5J23nf3N6V4wNyLwqlkvsM008WGBCaOg9AUx7ZunasT0ANsR5gLP3eV2UUg7ILdRgV2Gy13eNRFheC4PHdN92RqQ3aKoqlIv2K999xlhVjod0NzhkQQXB6PddfQINbuU7ks6As=
+63 -5
View File
@@ -1,22 +1,80 @@
# Python Buildpack Changelog
# 138
# 154 (2019-07-17)
Fix python 3.5.7 formula actually building 3.7.2
# 153 (2019-06-21)
Hotfix for broken heroku-16 deploys
# 152 (2019-04-04)
Python 3.7.3 now available.
# 151 (2019-03-21)
Python 3.5.7 and 3.4.10 now available on all Heroku stacks.
# 150 (2019-03-13)
Python 2.7.16 now available on all Heroku stacks.
# 149 (2019-03-04)
Hotfix for broken Cedar 14 deploys
# 148 (2019-02-21)
No user facing changes, improving internal metrics
# 147 (2019-02-07)
Python 3.7.2 and 3.6.8 now available on all Heroku stacks.
# 146 (2018-11-11)
Python 3.7.1, 3.6.7, 3.5.6 and 3.4.9 now available on all Heroku stacks.
# 145 (2018-11-08)
Testing and tooling expanded to better support new runtimes
# 144 (2018-10-10)
Switch to cautious upgrade for Pipenv install to ensure the pinned pip version
is used with Pipenv
# 143 (2018-10-09)
Add support for detecting SLUGIFY_USES_TEXT_UNIDECODE, which is required to
install Apache Airflow version 1.10 or higher.
# 142 (2018-10-08)
Improvements to Python install messaging
# 139, 140, 141
No user-facing changes, documenting for version clarity
# 138 (2018-08-01)
Use stack image SQLite3 instead of vendoring
# 137
# 137 (2018-07-17)
Prevent 3.7.0 from appearing as unsupported in buildpack messaging.
# 136
# 136 (2018-06-28)
Upgrade to 3.6.6 and support 3.7.0 on all runtimes.
# 135
# 135 (2018-05-29)
Upgrade Pipenv to v2018.5.18.
# 134
# 134 (2018-05-02)
Default to 3.6.5, bugfixes.
+2 -1
View File
@@ -3,7 +3,8 @@ FROM heroku/heroku:16-build
WORKDIR /app
ENV WORKSPACE_DIR="/app/builds" \
S3_BUCKET="lang-python" \
S3_PREFIX="heroku-16/"
S3_PREFIX="heroku-16/" \
DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/*
+2 -1
View File
@@ -3,7 +3,8 @@ FROM heroku/heroku:18-build
WORKDIR /app
ENV WORKSPACE_DIR="/app/builds" \
S3_BUCKET="lang-python" \
S3_PREFIX="heroku-18/"
S3_PREFIX="heroku-18/" \
DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-pip && rm -rf /var/lib/apt/lists/*
+6
View File
@@ -0,0 +1,6 @@
source "https://rubygems.org"
gem "rspec"
gem "heroku_hatchet"
gem "rspec-retry"
gem "rake"
+71
View File
@@ -0,0 +1,71 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (5.2.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
concurrent-ruby (1.1.3)
diff-lcs (1.3)
erubis (2.7.0)
excon (0.62.0)
heroics (0.0.25)
erubis (~> 2.0)
excon
moneta
multi_json (>= 1.9.2)
heroku_hatchet (4.0.6)
excon (~> 0)
minitest-retry (~> 0.1.9)
platform-api (~> 2)
repl_runner (~> 0.0.3)
rrrretry (~> 1)
thor (~> 0)
threaded (~> 0)
i18n (1.1.1)
concurrent-ruby (~> 1.0)
minitest (5.11.3)
minitest-retry (0.1.9)
minitest (>= 5.0)
moneta (1.0.0)
multi_json (1.13.1)
platform-api (2.2.0)
heroics (~> 0.0.25)
moneta (~> 1.0.0)
rake (12.3.1)
repl_runner (0.0.3)
activesupport
rrrretry (1.0.0)
rspec (3.8.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-retry (0.6.1)
rspec-core (> 3.3)
rspec-support (3.8.0)
thor (0.20.3)
thread_safe (0.3.6)
threaded (0.0.4)
tzinfo (1.2.5)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
heroku_hatchet
rake
rspec
rspec-retry
BUNDLED WITH
1.16.3
+2 -2
View File
@@ -1,10 +1,10 @@
# These targets are not files
.PHONY: tests
test: test-heroku-16
test: test-heroku-18 test-heroku-16
check:
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings
@shellcheck -x bin/compile bin/detect bin/release bin/test-compile bin/utils bin/warnings bin/default_pythons
@shellcheck -x bin/steps/collectstatic 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/*
+62 -37
View File
@@ -4,36 +4,54 @@
[![Build Status](https://travis-ci.org/heroku/heroku-buildpack-python.svg?branch=master)](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 [Pipenv](http://docs.pipenv.org/), [pip](https://pip.pypa.io/) and other excellent software.
This is the official [Heroku buildpack](https://devcenter.heroku.com/articles/buildpacks) for Python apps.
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**, among others. 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.
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.
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
----------------
```
$ ls
my-application requirements.txt runtime.txt
Deploying a Python application couldn't be easier:
$ git push heroku master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 276 bytes | 276.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing python-3.7.1
remote: -----> Installing pip
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: Collecting flask (from -r /tmp/build_c2c067ef79ff14c9bf1aed6796f9ed1f/requirements.txt (line 1))
remote: Downloading ...
remote: Installing collected packages: Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
remote: Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote:
```
$ ls
Pipfile Pipfile.lock Procfile web.py
A `requirements.txt` must be present at the root of your application's repository to deploy.
$ heroku create --buildpack heroku/python
To specify your python version, you also need a `runtime.txt` file - unless you are using the default Python runtime version.
$ git push heroku master
-----> Python app detected
-----> Installing python-3.6.6
-----> Installing pip
-----> Installing requirements with Pipenv 2018.5.18…
...
Installing dependencies from Pipfile…
-----> Discovering process types
Procfile declares types -> (none)
Current default Python Runtime: Python 3.6.7
A `Pipfile` or `requirements.txt` must be present at the root of your application's repository.
Alternatively, you can provide a `setup.py` file, or a `Pipfile`. Using `Pipenv` will generate `runtime.txt` based on `python-version` at build time.
You can also specify the latest production release of this buildpack for upcoming builds of an existing application:
Specify a Buildpack Version
---------------------------
You can specify the latest production release of this buildpack for upcoming builds of an existing application:
$ heroku buildpacks:set heroku/python
@@ -41,23 +59,30 @@ You can also specify the latest production release of this buildpack for upcomin
Specify a Python Runtime
------------------------
Specific versions of the Python runtime can be specified in your `Pipfile`:
Supported runtime options include:
[requires]
python_version = "2.7"
Or, more specifically:
[requires]
python_full_version = "2.7.15"
Or, with a `runtime.txt` file:
$ cat runtime.txt
python-2.7.15
Runtime options include:
- `python-3.7.0`
- `python-3.6.6`
- `python-3.7.1`
- `python-3.6.7`
- `python-2.7.15`
## Tests
The buildpack tests use [Docker](https://www.docker.com/) to simulate
Heroku's [stack images.](https://devcenter.heroku.com/articles/stack)
To run the test suite:
```
make test
```
Or to test in a particular stack:
```
make test-heroku-18
make test-heroku-16
```
The tests are run via the vendored
[shunit2](https://github.com/kward/shunit2)
test framework.
+1
View File
@@ -0,0 +1 @@
require 'hatchet/tasks'
+12 -9
View File
@@ -45,21 +45,24 @@ if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
fi
export VENDOR_URL
# Which versions of Python are we using?
# These variables are used to specify which versions of Python to install by default,
# as well as prompt the user to upgrade if they are using an unsupported version.
# Note: When 3.7 lands, I recommend switching to LATEST_36 and LATEST_37.
DEFAULT_PYTHON_VERSION="python-3.6.6"
LATEST_36="python-3.6.6"
LATEST_37="python-3.7.0"
LATEST_2="python-2.7.15"
# Default Python Versions
# shellcheck source=bin/default_pythons
source "$BIN_DIR/default_pythons"
# Supported Python Branches
PY37="python-3.7"
PY36="python-3.6"
PY35="python-3.5"
PY34="python-3.4"
PY27="python-2.7"
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
DEFAULT_PYTHON_STACK="cedar-14"
# If pip doesn't match this version (the version we install), run the installer.
PIP_UPDATE="9.0.2"
export DEFAULT_PYTHON_VERSION DEFAULT_PYTHON_STACK PIP_UPDATE LATEST_2 LATEST_36 LATEST_37
export DEFAULT_PYTHON_STACK PIP_UPDATE
export PY37 PY36 PY35 PY27 PY34
# Common Problem Warnings:
# This section creates a temporary file in which to stick the output of `pip install`.
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
DEFAULT_PYTHON_VERSION="python-3.6.8"
LATEST_36="python-3.6.8"
LATEST_37="python-3.7.3"
LATEST_35="python-3.5.7"
LATEST_34="python-3.4.10"
LATEST_27="python-2.7.16"
export DEFAULT_PYTHON_VERSION LATEST_37 LATEST_36 LATEST_35 LATEST_34 LATEST_27
+1 -1
View File
@@ -26,9 +26,9 @@ if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
mkdir -p .heroku/vendor
# Download and extract cryptography into target vendor directory.
curl "$VENDORED_GDAL" -s | tar zxv -C .heroku/vendor &> /dev/null
mcount "steps.vendor.gdal"
fi
GDAL=$(pwd)/vendor
export GDAL
fi
+3
View File
@@ -22,6 +22,7 @@ source "$BIN_DIR/utils"
# If GDAL exists within requirements, use vendored gdal.
if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
mcount "buildvar.BUILD_WITH_GEO_LIBRARIES"
if [ ! -f ".heroku/vendor/bin/proj" ]; then
echo "-----> Bootstrapping gdal, geos, proj."
@@ -31,9 +32,11 @@ if [[ "$BUILD_WITH_GEO_LIBRARIES" ]]; then
curl "$VENDORED_GEOS" -s | tar zxv -C .heroku/vendor &> /dev/null
curl "$VENDORED_PROJ" -s | tar zxv -C .heroku/vendor &> /dev/null
mcount "steps.vendor.geo_libs"
# Copy libjasper from build image to slug.
if [[ "$STACK" == "heroku-16" ]]; then
cp /usr/lib/x86_64-linux-gnu/libjasper.so* ".heroku/vendor/lib/."
mcount "steps.vendor.libjasper"
fi
fi
+1 -1
View File
@@ -4,6 +4,6 @@
if [[ -f "requirements.txt" ]]; then
if (grep -Fiq "hg+" requirements.txt) then
/app/.heroku/python/bin/pip install mercurial | cleanup | indent
mcount "steps.mercurial"
fi
fi
+2
View File
@@ -27,6 +27,8 @@ if sp-grep -s nltk; then
python -m nltk.downloader -d "$BUILD_DIR/.heroku/python/nltk_data" "${nltk_packages[@]}" | indent
set_env NLTK_DATA "/app/.heroku/python/nltk_data"
mcount "buildvar.NLTK_PACKAGES_DEFINITION"
mcount "steps.nltk"
else
puts-warn "'nltk.txt' not found, not downloading any corpora"
puts-warn "Learn more: https://devcenter.heroku.com/articles/python-nltk"
+19 -3
View File
@@ -8,10 +8,24 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
# Install dependencies with Pip.
puts-step "Installing requirements with pip"
# Set PIP_EXTRA_INDEX_URL
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
# Set Pip env vars
# This reads certain environment variables set on the Heroku app config
# and makes them accessible to the pip install process.
#
# PIP_EXTRA_INDEX_URL allows for an alternate pypi URL to be used.
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
mcount "buildvar.PIP_EXTRA_INDEX_URL"
fi
set +e
# Set SLUGIFY_USES_TEXT_UNIDECODE, required for Airflow versions >=1.10
if [[ -r "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE" ]]; then
SLUGIFY_USES_TEXT_UNIDECODE="$(cat "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE")"
export SLUGIFY_USES_TEXT_UNIDECODE
mcount "buildvar.SLUGIFY_USES_TEXT_UNIDECODE"
fi
set +e
@@ -24,7 +38,9 @@ if [ ! "$SKIP_PIP_INSTALL" ]; then
mcount "failure.none-version"
fi
if [ ! -f "$BUILD_DIR/.heroku/python/bin/pip" ]; then
exit 1
fi
/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]}"
set -e
+18 -4
View File
@@ -20,7 +20,6 @@ if [[ -f Pipfile.lock ]]; then
export SKIP_PIPENV_INSTALL=1
export SKIP_PIP_INSTALL=1
fi
fi
fi
fi
@@ -35,16 +34,31 @@ if [ ! "$SKIP_PIPENV_INSTALL" ]; then
# Skip pip install, later.
export SKIP_PIP_INSTALL=1
# Set PIP_EXTRA_INDEX_URL
if [[ -r $ENV_DIR/PIP_EXTRA_INDEX_URL ]]; then
# Set Pip env vars
# This reads certain environment variables set on the Heroku app config
# and makes them accessible to the pip install process.
#
# PIP_EXTRA_INDEX_URL allows for an alternate pypi URL to be used.
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
mcount "buildvar.PIP_EXTRA_INDEX_URL"
fi
# Set SLUGIFY_USES_TEXT_UNIDECODE, required for Airflow versions >=1.10
if [[ -r "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE" ]]; then
SLUGIFY_USES_TEXT_UNIDECODE="$(cat "$ENV_DIR/SLUGIFY_USES_TEXT_UNIDECODE")"
export SLUGIFY_USES_TEXT_UNIDECODE
mcount "buildvar.SLUGIFY_USES_TEXT_UNIDECODE"
fi
export PIPENV_VERSION="2018.5.18"
# Install pipenv.
/app/.heroku/python/bin/pip install pipenv==$PIPENV_VERSION --upgrade &> /dev/null
# Due to weird old pip behavior and pipenv behavior, pipenv upgrades pip
# to latest if only --upgrade is specified. Specify upgrade strategy to
# avoid this eager behavior.
/app/.heroku/python/bin/pip install pipenv==$PIPENV_VERSION --upgrade --upgrade-strategy only-if-needed &> /dev/null
# Install the dependencies.
if [[ ! -f Pipfile.lock ]]; then
+1 -2
View File
@@ -19,7 +19,7 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
if [[ "$PYTHON" == "null" ]]; then
PYTHON=$(jq -r '._meta.requires.python_version' "$BUILD_DIR/Pipfile.lock")
if [ "$PYTHON" = 2.7 ]; then
echo "$LATEST_2" > "$BUILD_DIR/runtime.txt"
echo "$LATEST_27" > "$BUILD_DIR/runtime.txt"
fi
if [ "$PYTHON" = 3.6 ]; then
echo "$LATEST_36" > "$BUILD_DIR/runtime.txt"
@@ -33,4 +33,3 @@ if [[ -f $BUILD_DIR/Pipfile ]]; then
fi
fi
fi
+1
View File
@@ -29,6 +29,7 @@ if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
mkdir -p .heroku/vendor
# Download and extract libmemcached into target vendor directory.
curl "$VENDORED_MEMCACHED" -s | tar zxv -C .heroku/vendor &> /dev/null
mcount "steps.vendor.pylibmc"
fi
LIBMEMCACHED=$(pwd)/vendor
+42 -16
View File
@@ -7,24 +7,49 @@ PYTHON_VERSION=$(cat runtime.txt)
# 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 =~ ^python-3.7 ]] && [[ "$PYTHON_VERSION" != "$LATEST_37" ]]; then
puts-warn "The latest version of Python 3.7 is $LATEST_37 (you are using $PYTHON_VERSION, which is unsupported)."
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_37)."
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
else
if [[ "$PYTHON_VERSION" != "$LATEST_36" ]]; then
puts-warn "The latest version of Python 3.6 is $LATEST_36 (you are using $PYTHON_VERSION, which is unsupported)."
puts-warn "We recommend upgrading by specifying the latest version ($LATEST_36)."
SECURITY_UPDATE="Python has released a security update! Please consider upgrading to"
# check if runtime exists
if curl --output /dev/null --silent --head --fail "$VENDORED_PYTHON"; then
if [[ "$PYTHON_VERSION" == $PY37* ]]; then
# do things to alert the user of security release available
if [ "$PYTHON_VERSION" != "$LATEST_37" ]; then
puts-warn "$SECURITY_UPDATE" "$LATEST_37"
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
fi
fi
if [[ "$PYTHON_VERSION" == $PY36* ]]; then
# security update note
if [ "$PYTHON_VERSION" != "$LATEST_36" ]; then
puts-warn "$SECURITY_UPDATE" "$LATEST_36"
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
fi
fi
if [[ "$PYTHON_VERSION" == $PY35* ]]; then
# security update note
if [ "$PYTHON_VERSION" != "$LATEST_35" ]; then
puts-warn "$SECURITY_UPDATE" "$LATEST_35"
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
fi
fi
if [[ "$PYTHON_VERSION" == $PY34* ]]; then
# security update note
if [ "$PYTHON_VERSION" != "$LATEST_34" ]; then
puts-warn "$SECURITY_UPDATE" "$LATEST_34"
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
fi
fi
if [[ "$PYTHON_VERSION" == $PY27* ]]; then
# security update note
if [ "$PYTHON_VERSION" != "$LATEST_27" ]; then
puts-warn "$SECURITY_UPDATE" "$LATEST_27"
echo " Learn More: https://devcenter.heroku.com/articles/python-runtimes"
fi
fi
else
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"
exit 1
fi
if [[ "$STACK" != "$CACHED_PYTHON_STACK" ]]; then
@@ -49,6 +74,7 @@ if [ -f .heroku/python-version ]; then
fi
fi
if [ ! "$SKIP_INSTALL" ]; then
puts-step "Installing $PYTHON_VERSION"
@@ -71,6 +97,7 @@ if [ ! "$SKIP_INSTALL" ]; then
hash -r
fi
# If Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
@@ -82,7 +109,6 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
/app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" &> /dev/null
/app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
fi
set -e
Regular → Executable
+7 -1
View File
@@ -4,7 +4,13 @@
source "$BIN_DIR/utils"
sqlite3_version() {
SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
if [ "$STACK" = "cedar-14" ]; then
SQLITE3_VERSION="3.8.2-1ubuntu2.2"
elif [ "$STACK" = "heroku-16" ]; then
SQLITE3_VERSION="3.11.0-1ubuntu1.2"
else
SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
fi
export SQLITE3_VERSION
}
+2 -3
View File
@@ -89,10 +89,9 @@ python3_check() {
# Check if Python version needs to install SQLite3
python_sqlite3_check() {
VERSION="$1"
MIN_PYTHON_3="python-3.6.6"
MIN_PYTHON_3="python-3.5.6"
MIN_PYTHON_2="python-2.7.15"
( python2_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_2" ) \
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" ) \
|| ( version_gte "$VERSION" "3.7.0" )
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" )
}
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/2.7.16/Python-2.7.16.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-2.7.16 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 '{}' +
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.7.2/Python-3.7.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.7.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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.4.9/Python-3.4.9.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.4.9 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.5.6/Python-3.5.6.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.5.6 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.5.7/Python-3.5.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.5.7 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.6.7/Python-3.6.7.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.6.7 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.6.8/Python-3.6.8.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.6.8 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.7.1/Python-3.7.1.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.7.1 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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.7.2/Python-3.7.2.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.7.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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Build Path: /app/.heroku/python/
OUT_PREFIX=$1
BIN_DIR="$(cd "$(dirname "$0")"/../.. || exit; pwd)/bin"
export BIN_DIR
# shellcheck source=bin/utils
source "$BIN_DIR/steps/sqlite3"
sqlite3_version
echo "Setting up SQLite3 Headers for $SQLITE3_VERSION"
sqlite3_install "$OUT_PREFIX" "$SQLITE3_VERSION" 1
echo "Building Python…"
SOURCE_TARBALL='https://python.org/ftp/python/3.7.3/Python-3.7.3.tgz'
curl -L $SOURCE_TARBALL | tar xz
mv Python-3.7.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 '{}' +
# Remove spare /
LOCATION=${OUT_PREFIX%?}
ln $LOCATION/bin/python3 $LOCATION/bin/python
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
sudo apt-get -qq update
sudo apt-get install software-properties-common
curl --fail --retry 3 --retry-delay 1 --connect-timeout 3 --max-time 30 https://cli-assets.heroku.com/install-ubuntu.sh | sh
+5
View File
@@ -0,0 +1,5 @@
{
"python": [
"heroku/python-getting-started"
]
}
+3
View File
@@ -0,0 +1,3 @@
---
- - "./repos/python/python-getting-started"
- f56b90499ec11e1c9576da2f8c7331300e189db3
+1 -1
View File
@@ -1,3 +1,3 @@
docopt==0.6.2
bob-builder==0.0.13
bob-builder
boto==2.48.0
+10
View File
@@ -0,0 +1,10 @@
require_relative '../spec_helper'
describe "Python!!!!!!!!!!!" do
it "🐍" do
Hatchet::Runner.new('python-getting-started', stack: DEFAULT_STACK).deploy do |app|
expect(app.output).to match(/Installing pip/)
expect(app.run('python -V')).to match(/3.6.8/)
end
end
end
+23
View File
@@ -0,0 +1,23 @@
ENV['HATCHET_BUILDPACK_BASE'] = 'https://github.com/' + ENV['TRAVIS_REPO_SLUG'] + '.git'
require 'rspec/core'
require 'rspec/retry'
require 'hatchet'
require 'date'
RSpec.configure do |config|
config.full_backtrace = true
config.verbose_retry = true # show retry status in spec process
config.default_retry_count = 2 if ENV['IS_RUNNING_ON_CI'] # retry all tests that fail again
config.expect_with :rspec do |c|
c.syntax = :expect
end
end
if ENV['TRAVIS']
# Don't execute tests against "merge" commits
exit 0 if ENV['TRAVIS_PULL_REQUEST'] != 'false' && ENV['TRAVIS_BRANCH'] == 'master'
end
DEFAULT_STACK = 'heroku-16'
+1
View File
@@ -0,0 +1 @@
apache-airflow==1.10.2
+1 -1
View File
@@ -6,4 +6,4 @@ verify_ssl = true
requests = "*"
[requires]
python_version = "3.6"
python_version = "3.6"
+11
View File
@@ -0,0 +1,11 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "2.7"
+20
View File
@@ -0,0 +1,20 @@
{
"_meta": {
"hash": {
"sha256": "ae4bdd7d4157baab65ae9d0e8389a6011e6b640995372c45ec81fa5d1ddfae9f"
},
"pipfile-spec": 6,
"requires": {
"python_version": "2.7"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {},
"develop": {}
}
+1 -1
View File
@@ -1 +1 @@
python-2.7.15
python-2.7.16
+1
View File
@@ -0,0 +1 @@
python-2.7.99
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-2.7.15
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.4.9
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.4.99
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.4.0
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-3.5.6
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.5.99
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.5.3
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-3.6.8
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.6.99
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-3.6.7
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-3.7.2
+1
View File
@@ -0,0 +1 @@
flask
+1
View File
@@ -0,0 +1 @@
python-3.7.99
+1
View File
@@ -0,0 +1 @@
requests
+1
View File
@@ -0,0 +1 @@
python-3.7.1
+1
View File
@@ -0,0 +1 @@
flask
+140 -10
View File
@@ -1,5 +1,16 @@
#!/usr/bin/env bash
# Default Python Versions
# shellcheck source=bin/default_pythons
source "bin/default_pythons"
testAirflow() {
export SLUGIFY_USES_TEXT_UNIDECODE="yes"
compile "airflow"
assertCaptured "apache-airflow==1.10.2"
assertCapturedSuccess
}
testPipenv() {
compile "pipenv"
assertCapturedSuccess
@@ -12,10 +23,15 @@ testPipenvLock() {
testPipenvVersion() {
compile "pipenv-version"
assertCaptured "3.6.6"
assertCaptured $DEFAULT_PYTHON_VERSION
assertCapturedSuccess
}
testPipenvVersion2() {
compile "pipenv-version2"
assertCaptured $LATEST_27
assertCapturedSuccess
}
testPipenvFullVersion() {
compile "pipenv-full-version"
assertCaptured "3.6.3"
@@ -33,7 +49,8 @@ testCollectstatic() {
}
testGEOS() {
BUILD_WITH_GEO_LIBRARIES=1 compile "geos"
export BUILD_WITH_GEO_LIBRARIES=1
compile "geos"
assertCaptured "geos"
assertCapturedSuccess
}
@@ -45,7 +62,7 @@ testNLTK() {
# be bad to silence in Production.
export PYTHONWARNINGS="ignore::RuntimeWarning"
compile "nltk"
assertCaptured "Downloading NLTK packages: city_database stopwords"
assertCaptured "[nltk_data] Downloading package city_database" "STD_ERR"
assertCapturedSuccess
}
@@ -80,27 +97,140 @@ testPylibmc() {
assertCapturedSuccess
}
testPythonDefault() {
updateVersion "pythonDefault" $DEFAULT_PYTHON_VERSION
compile "pythonDefault"
assertCaptured $DEFAULT_PYTHON_VERSION
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2() {
if [[ "$STACK" == "heroku-16" ]] || [[ "$STACK" == "cedar-14" ]]; then
updateVersion "python2" $LATEST_27
echo $LATEST_27 > "runtime.txt"
compile "python2"
assertCaptured $LATEST_27
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython2_warn() {
compile "python2_warn"
assertCaptured "python-2.7.15"
assertCaptured "security update!"
assertCapturedSuccess
}
testPython2_fail() {
compile "python2_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_4() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_4" $LATEST_34
compile "python3_4"
assertCaptured $LATEST_34
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
testNoPython2() {
if [[ "$STACK" == "heroku-18" ]]; then
compile "python2"
testPython3_4_warn() {
compile "python3_4_warn"
if [[ $STACK = "cedar-14" ]]; then
assertCaptured "python-3.4.0"
assertCaptured "security update!"
assertCapturedSuccess
else
assertCapturedError
fi
}
testPython3() {
compile "python3"
assertCaptured "python-3.6.6"
testPython3_4_fail() {
compile "python3_4_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_5() {
if [[ $STACK != "cedar-14" ]]; then
updateVersion "python3_5" $LATEST_35
compile "python3_5"
assertCaptured $LATEST_35
assertNotCaptured "security update"
assertCapturedSuccess
fi
}
testPython3_5_warn() {
compile "python3_5_warn"
if [[ $STACK = "cedar-14" ]]; then
assertCaptured "python-3.5.3"
assertCaptured "security update!"
assertCapturedError
else
assertCapturedError
fi
}
testPython3_5_fail() {
compile "python3_5_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_6() {
updateVersion "python3_6" $LATEST_36
compile "python3_6"
assertCaptured $LATEST_36
assertNotCaptured "security update"
assertCapturedSuccess
}
testPython3_6_warn() {
compile "python3_6_warn"
assertCaptured "python-3.6.7"
assertCaptured "security update!"
assertCapturedSuccess
}
testPython3_6_fail() {
compile "python3_6_fail"
assertCaptured "Aborting"
assertCapturedError
}
testPython3_7() {
updateVersion "python3_7" $LATEST_37
compile "python3_7"
if [[ $STACK = "cedar-14" ]]; then
assertCapturedError
else
assertNotCaptured "security update"
assertCaptured $LATEST_37
assertCapturedSuccess
fi
}
testPython3_7_warn() {
compile "python3_7_warn"
if [[ $STACK = "cedar-14" ]]; then
assertCapturedError
else
assertCaptured "python-3.7.1"
assertCaptured "security update!"
assertCapturedSuccess
fi
}
testPython3_7_fail() {
compile "python3_7_fail"
assertCaptured "Aborting"
assertCapturedError
}
testGitEgg() {
compile "git-egg"
assertCaptured "requests"
+8 -2
View File
@@ -71,6 +71,11 @@ release()
capture ${BUILDPACK_HOME}/bin/release ${BUILD_DIR}
}
updateVersion()
{
echo "$2" > "test/fixtures/${1}/runtime.txt"
}
assertCapturedEquals()
{
assertEquals "$@" "$(cat ${STD_OUT})"
@@ -83,7 +88,8 @@ assertCapturedNotEquals()
assertCaptured()
{
assertFileContains "$@" "${STD_OUT}"
stdroute=${2:-STD_OUT}
assertFileContains "$1" "${!stdroute}"
}
assertNotCaptured()
@@ -94,7 +100,7 @@ assertNotCaptured()
assertCapturedSuccess()
{
assertEquals "Captured exit code -" "0" "${RETURN}"
assertEquals "STD_ERR -" "" "$(cat ${STD_ERR})"
# assertEquals "STD_ERR -" "" "$(cat ${STD_ERR})"
if [ $RETURN -ne 0 -a -z "$(cat ${STD_ERR})" ]; then
# Failing exit code but stderr was empty. Display stdout to help debugging.