Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use pkg_resources to check for distributions #395

Merged
merged 1 commit into from
May 30, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Python Buildpack Changelog

# 104

unreleased

- Use `pkg_resources` to check if a distribution is installed instead of
parsing `requirements.txt`. ([#395][395])

[395]: https://github.com/heroku/heroku-buildpack-python/pull/395

## 103

Bug fixes and improvements.
Expand Down
2 changes: 1 addition & 1 deletion bin/steps/collectstatic
Original file line number Diff line number Diff line change
Expand Up @@ -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 requirements.txt django Django && DJANGO_INSTALLED=1
pip-grep -s Django && DJANGO_INSTALLED=1


if [ ! "$DISABLE_COLLECTSTATIC" ] && [ -f "$MANAGE_FILE" ] && [ "$DJANGO_INSTALLED" ]; then
Expand Down
2 changes: 1 addition & 1 deletion bin/steps/cryptography
Original file line number Diff line number Diff line change
Expand Up @@ -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 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 argon2-cffi bcrypt cffi cryptography PyNaCl pyOpenSSL PyOpenSSL misaka &> /dev/null) then

if [ ! -d ".heroku/vendor/lib/libffi-3.1" ]; then
echo "-----> Noticed cffi. Bootstrapping libffi."
Expand Down
2 changes: 1 addition & 1 deletion bin/steps/gdal
Original file line number Diff line number Diff line change
Expand Up @@ -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 requirements.txt GDAL gdal pygdal &> /dev/null) then
if (pip-grep -s GDAL pygdal &> /dev/null) then

if [ ! -f ".heroku/vendor/bin/gdalserver" ]; then
echo "-----> Noticed GDAL. Bootstrapping gdal."
Expand Down
2 changes: 1 addition & 1 deletion bin/steps/pylibmc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ source $BIN_DIR/utils


# If pylibmc exists within requirements, use vendored libmemcached.
if (pip-grep -s requirements.txt pylibmc &> /dev/null) then
if (pip-grep -s pylibmc &> /dev/null) then

if [ ! -d ".heroku/vendor/lib/sasl2" ]; then
echo "-----> Noticed pylibmc. Bootstrapping libmemcached."
Expand Down
2 changes: 1 addition & 1 deletion bin/steps/setuptools
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Syntax sugar.
source $BIN_DIR/utils

if (pip-grep -s requirements.txt setuptools distribute &> /dev/null) then
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. '
Expand Down
57 changes: 11 additions & 46 deletions vendor/pip-pop/pip-grep
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,26 @@
# -*- coding: utf-8 -*-

"""Usage:
pip-grep [-s] <reqfile> <package>...
pip-grep [-s] <package>...

Options:
-h --help Show this screen.
"""
import os
from docopt import docopt
from pip.req import parse_requirements
from pip.index import PackageFinder
from pip._vendor.requests import session
from pkg_resources import DistributionNotFound, get_distribution

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('There was a problem loading the given requirement file.')
exit(os.EX_NOINPUT)
print('Package {name} found!'.format(name=name))

for req in r.requirements:
if req.name in packages:
if not silent:
print('Package {} found!'.format(req.name))
exit(0)
exit(0)

if not silent:
print('Not found.')
Expand All @@ -63,10 +31,7 @@ def grep(reqfile, packages, silent=False):

def main():
args = docopt(__doc__, version='pip-grep')

kwargs = {'reqfile': args['<reqfile>'], 'packages': args['<package>'], 'silent': args['-s']}

grep(**kwargs)
has_any_distribution(names=args['<package>'], silent=args['-s'])


if __name__ == '__main__':
Expand Down