Compare commits

..

12 Commits

Author SHA1 Message Date
kennethreitz a7c20eea42 Python 3 default for buildpack (#409)
* update default python to 3.6.1

* v110

* nltk python2
2017-06-20 09:14:01 -07:00
kennethreitz 0a4cc2c476 pypy3-5.8.0 (#414) 2017-06-15 15:54:40 -04:00
Ed Morley cbb718bb8b Fix pip uninstall by moving it prior to pip install (#413)
The pip-uninstall step stopped working when it was moved to after
the pip-install step in f27a84e.

This regression was temporarily fixed by part of #397, however that
PR was reverted in #404.

Adds a test to hopefully catch any future regressions :-)

Fixes #393.
2017-06-14 17:15:52 -04:00
kennethreitz db95cdd3f3 new pylibmc test (#408) 2017-06-05 13:47:48 -04:00
kennethreitz 04f3ddbc86 updates (#407)
* silently use sp-grep

* history

* update license
2017-06-05 13:34:15 -04:00
kennethreitz f06f5676e8 silently use sp-grep (#406) 2017-06-05 13:31:57 -04:00
kennethreitz c8c8995d70 Next version (#405)
* python 3.5.3

* v108

* new setuptools version

* removed unneeded variable
2017-06-03 17:51:44 -04:00
kennethreitz 4ee3baaded Revert "Don't install packages that could mess packaging up" (#404)
* Revert "Fix pyyaml (#402)"

This reverts commit ff94908505.

* Revert "Don't install packages that could mess packaging up (#397)"

This reverts commit 5496c02f9f.
2017-06-03 17:36:19 -04:00
kennethreitz ff94908505 Fix pyyaml (#402)
* Revert "use pkg_resources to check for distributions (#395)"

This reverts commit 9b185f99d5.

* use sp-grep for django detection

* sp-grep

* fix setuptools script
2017-06-02 15:23:05 -04:00
kennethreitz 5496c02f9f Don't install packages that could mess packaging up (#397)
* updated changelog

* remove setuptools sanity check

* update changelog

* pip-clean

* changelog note

* refactor codebase to improve package name detection

* fix version string

* cleanup

* add messaging, improve execution

* do uninstall first
2017-05-30 20:03:57 -04:00
Ed Morley 8d6d14b671 Update to bob-builder v0.0.13 (#399)
The recent fixes on bob-builder master have now been released.
2017-05-30 19:50:05 -04:00
kennethreitz 98dc586a99 Setuptools (#396)
* updated changelog

* remove setuptools sanity check
2017-05-30 11:36:10 -04:00
16 changed files with 174 additions and 41 deletions
+30
View File
@@ -1,5 +1,35 @@
# Python Buildpack Changelog
# 110
Update Default Python to 3.6.1, bugfixes.
- Fixed automatic pip uninstall of dependencies removed from requirements.txt.
# 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 -1
View File
@@ -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:
+6 -12
View File
@@ -32,11 +32,10 @@ CACHE_DIR=$2
ENV_DIR=$3
# Python defaults
DEFAULT_PYTHON_VERSION="python-2.7.13"
DEFAULT_PYTHON_VERSION="python-3.6.1"
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
@@ -176,16 +170,16 @@ sub-env $BIN_DIR/steps/geo-libs
# GDAL support.
source $BIN_DIR/steps/gdal
# Install dependencies with Pip (where the magic happens).
let start=$(nowms)
source $BIN_DIR/steps/pip-install
mtime "pip.install.time" "${start}"
# Uninstall removed dependencies with Pip.
let start=$(nowms)
source $BIN_DIR/steps/pip-uninstall
mtime "pip.uninstall.time" "${start}"
# Install dependencies with Pip (where the magic happens).
let start=$(nowms)
source $BIN_DIR/steps/pip-install
mtime "pip.install.time" "${start}"
# Support for NLTK corpora.
let start=$(nowms)
sub-env $BIN_DIR/steps/nltk
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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."
-11
View File
@@ -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
+12
View File
@@ -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
+18
View File
@@ -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
View File
@@ -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
View File
@@ -0,0 +1 @@
python-2.7.13
+1
View File
@@ -0,0 +1 @@
pylibmc
+16
View File
@@ -44,6 +44,12 @@ testPsycopg2() {
assertCapturedSuccess
}
testPylibmc() {
compile "pylibmc"
assertCaptured "pylibmc"
assertCapturedSuccess
}
testPython2() {
compile "python2"
assertCaptured "python-2.7.13"
@@ -56,6 +62,16 @@ testPython3() {
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
}
+46 -11
View File
@@ -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__':
Vendored Executable
+38
View File
@@ -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()