mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| db95cdd3f3 | |||
| 04f3ddbc86 | |||
| f06f5676e8 | |||
| c8c8995d70 | |||
| 4ee3baaded | |||
| ff94908505 | |||
| 5496c02f9f | |||
| 8d6d14b671 | |||
| 98dc586a99 |
@@ -1,5 +1,29 @@
|
||||
# Python Buildpack Changelog
|
||||
|
||||
# 109
|
||||
|
||||
Fix output for collectstatic step.
|
||||
|
||||
# 108
|
||||
|
||||
Updated setuptools.
|
||||
|
||||
# 107
|
||||
|
||||
Bugfix for C dependency installation.
|
||||
|
||||
# 106
|
||||
|
||||
Don't install packages that could mess up packaging.
|
||||
|
||||
- The Python buildpack will automatically remove `six`, `pyparsing`, `appdirs`,
|
||||
`setuptools`, and `distribute` from a `requirements.txt` file now, as these
|
||||
packages are provided by the Python buildpack.
|
||||
|
||||
# 105
|
||||
|
||||
Improvements to output messaging.
|
||||
|
||||
# 104
|
||||
|
||||
General improvements.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License:
|
||||
|
||||
Copyright (C) 2016 Heroku, Inc.
|
||||
Copyright (C) 2017 Heroku, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@ DEFAULT_PYTHON_VERSION="python-2.7.13"
|
||||
DEFAULT_PYTHON_STACK="cedar-14"
|
||||
PYTHON_EXE="/app/.heroku/python/bin/python"
|
||||
PIP_VERSION="9.0.1"
|
||||
SETUPTOOLS_VERSION="32.1.0"
|
||||
|
||||
# Common Problem Warnings
|
||||
export WARNINGS_LOG=$(mktemp)
|
||||
@@ -145,11 +144,6 @@ let start=$(nowms)
|
||||
source $BIN_DIR/steps/python
|
||||
mtime "python.install.time" "${start}"
|
||||
|
||||
# Sanity check for setuptools/distribute.
|
||||
let start=$(nowms)
|
||||
source $BIN_DIR/steps/setuptools
|
||||
mtime "setuptools.install.time" "${start}"
|
||||
|
||||
# Pipenv support.
|
||||
source $BIN_DIR/steps/pipenv
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ MANAGE_FILE=${MANAGE_FILE:-fakepath}
|
||||
[ -f .heroku/collectstatic_disabled ] && DISABLE_COLLECTSTATIC=1
|
||||
|
||||
# Ensure that Django is explicitly specified in requirements.txt
|
||||
pip-grep -s Django && DJANGO_INSTALLED=1
|
||||
sp-grep -s django && DJANGO_INSTALLED=1
|
||||
|
||||
|
||||
if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then
|
||||
|
||||
@@ -18,7 +18,7 @@ PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
source $BIN_DIR/utils
|
||||
|
||||
# If a package using cffi exists within requirements, use vendored libffi.
|
||||
if (pip-grep -s argon2-cffi bcrypt cffi cryptography PyNaCl pyOpenSSL PyOpenSSL 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
|
||||
|
||||
if [ ! -d ".heroku/vendor/lib/libffi-3.1" ]; then
|
||||
echo "-----> Noticed cffi. Bootstrapping libffi."
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ PKG_CONFIG_PATH="/app/.heroku/vendor/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
source $BIN_DIR/utils
|
||||
|
||||
# If GDAL exists within requirements, use vendored gdal.
|
||||
if (pip-grep -s GDAL pygdal &> /dev/null) then
|
||||
if (pip-grep -s requirements.txt GDAL gdal pygdal &> /dev/null) then
|
||||
|
||||
if [ ! -f ".heroku/vendor/bin/gdalserver" ]; then
|
||||
echo "-----> Noticed GDAL. Bootstrapping gdal."
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ source $BIN_DIR/utils
|
||||
|
||||
|
||||
# If pylibmc exists within requirements, use vendored libmemcached.
|
||||
if (pip-grep -s pylibmc &> /dev/null) then
|
||||
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
|
||||
|
||||
if [ ! -d ".heroku/vendor/lib/sasl2" ]; then
|
||||
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Syntax sugar.
|
||||
source $BIN_DIR/utils
|
||||
|
||||
if (pip-grep -s setuptools distribute &> /dev/null) then
|
||||
|
||||
puts-warn 'The package setuptools/distribute is listed in requirements.txt.'
|
||||
puts-warn 'Please remove to ensure expected behavior. '
|
||||
|
||||
fi
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build Path: /app/.heroku/python/
|
||||
# Build Deps: libraries/sqlite
|
||||
|
||||
OUT_PREFIX=$1
|
||||
|
||||
echo "Building Python..."
|
||||
SOURCE_TARBALL='https://python.org/ftp/python/3.5.3/Python-3.5.3.tgz'
|
||||
curl -L $SOURCE_TARBALL | tar xz
|
||||
mv Python-3.5.3 src
|
||||
cd src
|
||||
|
||||
./configure --prefix=$OUT_PREFIX --with-ensurepip=no
|
||||
make
|
||||
make install
|
||||
|
||||
# ln $OUT_PREFIX/bin/python3 $OUT_PREFIX/bin/python
|
||||
|
||||
+1
-2
@@ -1,2 +1 @@
|
||||
# TODO: Replace this once the bob-builder changes on master are released:
|
||||
https://github.com/kennethreitz/bob-builder/archive/54211376a8fb49c67ecbd6798bd45b55f4d125f4.zip
|
||||
bob-builder==0.0.13
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
pylibmc
|
||||
@@ -44,6 +44,12 @@ testPsycopg2() {
|
||||
assertCapturedSuccess
|
||||
}
|
||||
|
||||
testPylibmc() {
|
||||
compile "pylibmc"
|
||||
assertCaptured "pylibmc"
|
||||
assertCapturedSuccess
|
||||
}
|
||||
|
||||
testPython2() {
|
||||
compile "python2"
|
||||
assertCaptured "python-2.7.13"
|
||||
|
||||
Vendored
+46
-11
@@ -2,26 +2,58 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Usage:
|
||||
pip-grep [-s] <package>...
|
||||
pip-grep [-s] <reqfile> <package>...
|
||||
|
||||
Options:
|
||||
-h --help Show this screen.
|
||||
"""
|
||||
import os
|
||||
from docopt import docopt
|
||||
from pkg_resources import DistributionNotFound, get_distribution
|
||||
from pip.req import parse_requirements
|
||||
from pip.index import PackageFinder
|
||||
from pip._vendor.requests import session
|
||||
|
||||
requests = session()
|
||||
|
||||
|
||||
def has_any_distribution(names, silent=False):
|
||||
for name in names:
|
||||
try:
|
||||
get_distribution(name)
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
class Requirements(object):
|
||||
def __init__(self, reqfile=None):
|
||||
super(Requirements, self).__init__()
|
||||
self.path = reqfile
|
||||
self.requirements = []
|
||||
|
||||
if reqfile:
|
||||
self.load(reqfile)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Requirements \'{}\'>'.format(self.path)
|
||||
|
||||
def load(self, reqfile):
|
||||
if not os.path.exists(reqfile):
|
||||
raise ValueError('The given requirements file does not exist.')
|
||||
|
||||
finder = PackageFinder([], [], session=requests)
|
||||
for requirement in parse_requirements(reqfile, finder=finder, session=requests):
|
||||
if requirement.req:
|
||||
if not getattr(requirement.req, 'name', None):
|
||||
# Prior to pip 8.1.2 the attribute `name` did not exist.
|
||||
requirement.req.name = requirement.req.project_name
|
||||
self.requirements.append(requirement.req)
|
||||
|
||||
|
||||
def grep(reqfile, packages, silent=False):
|
||||
try:
|
||||
r = Requirements(reqfile)
|
||||
except ValueError:
|
||||
if not silent:
|
||||
print('Package {name} found!'.format(name=name))
|
||||
print('There was a problem loading the given requirement file.')
|
||||
exit(os.EX_NOINPUT)
|
||||
|
||||
exit(0)
|
||||
for req in r.requirements:
|
||||
if req.name in packages:
|
||||
if not silent:
|
||||
print('Package {} found!'.format(req.name))
|
||||
exit(0)
|
||||
|
||||
if not silent:
|
||||
print('Not found.')
|
||||
@@ -31,7 +63,10 @@ def has_any_distribution(names, silent=False):
|
||||
|
||||
def main():
|
||||
args = docopt(__doc__, version='pip-grep')
|
||||
has_any_distribution(names=args['<package>'], silent=args['-s'])
|
||||
|
||||
kwargs = {'reqfile': args['<reqfile>'], 'packages': args['<package>'], 'silent': args['-s']}
|
||||
|
||||
grep(**kwargs)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Usage:
|
||||
sp-grep [-s] <package>...
|
||||
|
||||
Options:
|
||||
-h --help Show this screen.
|
||||
"""
|
||||
from docopt import docopt
|
||||
from pkg_resources import DistributionNotFound, get_distribution
|
||||
|
||||
|
||||
def has_any_distribution(names, silent=False):
|
||||
for name in names:
|
||||
try:
|
||||
get_distribution(name)
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
|
||||
if not silent:
|
||||
print('Package {name} found!'.format(name=name))
|
||||
|
||||
exit(0)
|
||||
|
||||
if not silent:
|
||||
print('Not found.')
|
||||
|
||||
exit(1)
|
||||
|
||||
|
||||
def main():
|
||||
args = docopt(__doc__, version='sp-grep')
|
||||
has_any_distribution(names=args['<package>'], silent=args['-s'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user