mirror of
https://github.com/certbot/certbot.git
synced 2026-07-30 16:14:44 +02:00
Pin dependencies in oldest tests (#5316)
* Add tools/merge_requirements.py
* Revert "Fix oldest tests by pinning Google DNS deps (#5000)"
This reverts commit f68fba2be2.
* Add tools/oldest_constraints.txt
* Remove oldest constraints from tox.ini
* Rename dev constraints file
* Update tools/pip_install.sh
* Update install_and_test.sh
* Fix pip_install.sh
* Don't cat when you can cp
* Add ng-httpsclient to dev constraints for oldest tests
* Bump tested setuptools version
* Update dev_constraints comment
* Better document oldest dependencies
* test against oldest versions we say we require
* Update dev constraints
* Properly handle empty lines
* Update constraints gen in pip_install
* Remove duplicated zope.component
* Reduce pyasn1-modules dependency
* Remove blank line
* pin back google-api-python-client
* pin back uritemplate
* pin josepy for oldest tests
* Undo changes to install_and_test.sh
* Update install_and_test.sh description
* use split instead of partition
This commit is contained in:
@@ -1,16 +1,15 @@
|
|||||||
# Specifies Python package versions for packages not specified in
|
# Specifies Python package versions for packages not specified in
|
||||||
# letsencrypt-auto's requirements file. We should avoid listing packages in
|
# letsencrypt-auto's requirements file.
|
||||||
# both places because if both files are used as constraints for the same pip
|
|
||||||
# invocation, some constraints may be ignored due to pip's lack of dependency
|
|
||||||
# resolution.
|
|
||||||
alabaster==0.7.10
|
alabaster==0.7.10
|
||||||
apipkg==1.4
|
apipkg==1.4
|
||||||
|
asn1crypto==0.22.0
|
||||||
astroid==1.3.5
|
astroid==1.3.5
|
||||||
|
attrs==17.3.0
|
||||||
Babel==2.5.1
|
Babel==2.5.1
|
||||||
backports.shutil-get-terminal-size==1.0.0
|
backports.shutil-get-terminal-size==1.0.0
|
||||||
boto3==1.4.7
|
boto3==1.4.7
|
||||||
botocore==1.7.41
|
botocore==1.7.41
|
||||||
cloudflare==1.8.1
|
cloudflare==1.5.1
|
||||||
coverage==4.4.2
|
coverage==4.4.2
|
||||||
decorator==4.1.2
|
decorator==4.1.2
|
||||||
dns-lexicon==2.1.14
|
dns-lexicon==2.1.14
|
||||||
@@ -19,7 +18,7 @@ docutils==0.14
|
|||||||
execnet==1.5.0
|
execnet==1.5.0
|
||||||
future==0.16.0
|
future==0.16.0
|
||||||
futures==3.1.1
|
futures==3.1.1
|
||||||
google-api-python-client==1.6.4
|
google-api-python-client==1.5
|
||||||
httplib2==0.10.3
|
httplib2==0.10.3
|
||||||
imagesize==0.7.1
|
imagesize==0.7.1
|
||||||
ipdb==0.10.3
|
ipdb==0.10.3
|
||||||
@@ -27,20 +26,22 @@ ipython==5.5.0
|
|||||||
ipython-genutils==0.2.0
|
ipython-genutils==0.2.0
|
||||||
Jinja2==2.9.6
|
Jinja2==2.9.6
|
||||||
jmespath==0.9.3
|
jmespath==0.9.3
|
||||||
|
josepy==1.0.1
|
||||||
|
logger==1.4
|
||||||
logilab-common==1.4.1
|
logilab-common==1.4.1
|
||||||
MarkupSafe==1.0
|
MarkupSafe==1.0
|
||||||
oauth2client==4.1.2
|
ndg-httpsclient==0.3.2
|
||||||
|
oauth2client==2.0.0
|
||||||
pathlib2==2.3.0
|
pathlib2==2.3.0
|
||||||
pexpect==4.2.1
|
pexpect==4.2.1
|
||||||
pickleshare==0.7.4
|
pickleshare==0.7.4
|
||||||
pkg-resources==0.0.0
|
|
||||||
pkginfo==1.4.1
|
pkginfo==1.4.1
|
||||||
pluggy==0.5.2
|
pluggy==0.5.2
|
||||||
prompt-toolkit==1.0.15
|
prompt-toolkit==1.0.15
|
||||||
ptyprocess==0.5.2
|
ptyprocess==0.5.2
|
||||||
py==1.4.34
|
py==1.4.34
|
||||||
pyasn1==0.3.7
|
pyasn1==0.1.9
|
||||||
pyasn1-modules==0.1.5
|
pyasn1-modules==0.0.10
|
||||||
Pygments==2.2.0
|
Pygments==2.2.0
|
||||||
pylint==1.4.2
|
pylint==1.4.2
|
||||||
pytest==3.2.5
|
pytest==3.2.5
|
||||||
@@ -48,7 +49,7 @@ pytest-cov==2.5.1
|
|||||||
pytest-forked==0.2
|
pytest-forked==0.2
|
||||||
pytest-xdist==1.20.1
|
pytest-xdist==1.20.1
|
||||||
python-dateutil==2.6.1
|
python-dateutil==2.6.1
|
||||||
python-digitalocean==1.12
|
python-digitalocean==1.11
|
||||||
PyYAML==3.12
|
PyYAML==3.12
|
||||||
repoze.sphinx.autointerface==0.8
|
repoze.sphinx.autointerface==0.8
|
||||||
requests-file==1.4.2
|
requests-file==1.4.2
|
||||||
@@ -65,6 +66,6 @@ tox==2.9.1
|
|||||||
tqdm==4.19.4
|
tqdm==4.19.4
|
||||||
traitlets==4.3.2
|
traitlets==4.3.2
|
||||||
twine==1.9.1
|
twine==1.9.1
|
||||||
uritemplate==3.0.0
|
uritemplate==0.6
|
||||||
virtualenv==15.1.0
|
virtualenv==15.1.0
|
||||||
wcwidth==0.1.7
|
wcwidth==0.1.7
|
||||||
@@ -2,8 +2,9 @@
|
|||||||
# pip installs the requested packages in editable mode and runs unit tests on
|
# pip installs the requested packages in editable mode and runs unit tests on
|
||||||
# them. Each package is installed and tested in the order they are provided
|
# them. Each package is installed and tested in the order they are provided
|
||||||
# before the script moves on to the next package. If CERTBOT_NO_PIN is set not
|
# before the script moves on to the next package. If CERTBOT_NO_PIN is set not
|
||||||
# set to 1, packages are installed using certbot-auto's requirements file as
|
# set to 1, packages are installed using pinned versions of all of our
|
||||||
# constraints.
|
# dependencies. See pip_install.sh for more information on the versions pinned
|
||||||
|
# to.
|
||||||
|
|
||||||
if [ "$CERTBOT_NO_PIN" = 1 ]; then
|
if [ "$CERTBOT_NO_PIN" = 1 ]; then
|
||||||
pip_install="pip install -q -e"
|
pip_install="pip install -q -e"
|
||||||
|
|||||||
Executable
+61
@@ -0,0 +1,61 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Merges multiple Python requirements files into one file.
|
||||||
|
|
||||||
|
Requirements files specified later take precedence over earlier ones. Only
|
||||||
|
simple SomeProject==1.2.3 format is currently supported.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def read_file(file_path):
|
||||||
|
"""Reads in a Python requirements file.
|
||||||
|
|
||||||
|
:param str file_path: path to requirements file
|
||||||
|
|
||||||
|
:returns: mapping from a project to its pinned version
|
||||||
|
:rtype: dict
|
||||||
|
|
||||||
|
"""
|
||||||
|
d = {}
|
||||||
|
with open(file_path) as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if line and not line.startswith('#'):
|
||||||
|
project, version = line.split('==')
|
||||||
|
if not version:
|
||||||
|
raise ValueError("Unexpected syntax '{0}'".format(line))
|
||||||
|
d[project] = version
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def print_requirements(requirements):
|
||||||
|
"""Prints requirements to stdout.
|
||||||
|
|
||||||
|
:param dict requirements: mapping from a project to its pinned version
|
||||||
|
|
||||||
|
"""
|
||||||
|
print('\n'.join('{0}=={1}'.format(k, v)
|
||||||
|
for k, v in sorted(requirements.items())))
|
||||||
|
|
||||||
|
|
||||||
|
def merge_requirements_files(*files):
|
||||||
|
"""Merges multiple requirements files together and prints the result.
|
||||||
|
|
||||||
|
Requirement files specified later in the list take precedence over earlier
|
||||||
|
files.
|
||||||
|
|
||||||
|
:param tuple files: paths to requirements files
|
||||||
|
|
||||||
|
"""
|
||||||
|
d = {}
|
||||||
|
for f in files:
|
||||||
|
d.update(read_file(f))
|
||||||
|
print_requirements(d)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
merge_requirements_files(*sys.argv[1:])
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# This file contains the oldest versions of our dependencies we say we require
|
||||||
|
# in our packages or versions we need to support to maintain compatibility with
|
||||||
|
# the versions included in the various Linux distros where we are packaged.
|
||||||
|
|
||||||
|
# CentOS/RHEL 7 EPEL constraints
|
||||||
|
cffi==1.6.0
|
||||||
|
chardet==2.2.1
|
||||||
|
configobj==4.7.2
|
||||||
|
ipaddress==1.0.16
|
||||||
|
mock==1.0.1
|
||||||
|
ndg-httpsclient==0.3.2
|
||||||
|
ply==3.4
|
||||||
|
pyasn1==0.1.9
|
||||||
|
pycparser==2.14
|
||||||
|
pyOpenSSL==0.13.1
|
||||||
|
pyparsing==1.5.6
|
||||||
|
pyRFC3339==1.0
|
||||||
|
python-augeas==0.5.0
|
||||||
|
six==1.9.0
|
||||||
|
# setuptools 0.9.8 is the actual version packaged, but some other dependencies
|
||||||
|
# in this file require setuptools>=1.0 and there are no relevant changes for us
|
||||||
|
# between these versions.
|
||||||
|
setuptools==1.0.0
|
||||||
|
urllib3==1.10.2
|
||||||
|
zope.component==4.1.0
|
||||||
|
zope.event==4.0.3
|
||||||
|
zope.interface==4.0.5
|
||||||
|
|
||||||
|
# Debian Jessie Backports constraints
|
||||||
|
PyICU==1.8
|
||||||
|
colorama==0.3.2
|
||||||
|
enum34==1.0.3
|
||||||
|
html5lib==0.999
|
||||||
|
idna==2.0
|
||||||
|
pbr==1.8.0
|
||||||
|
pytz==2012rc0
|
||||||
|
|
||||||
|
# Our setup.py constraints
|
||||||
|
cloudflare==1.5.1
|
||||||
|
cryptography==1.2.0
|
||||||
|
google-api-python-client==1.5
|
||||||
|
oauth2client==2.0
|
||||||
|
parsedatetime==1.3
|
||||||
|
pyparsing==1.5.5
|
||||||
|
python-digitalocean==1.11
|
||||||
|
requests[security]==2.4.1
|
||||||
|
|
||||||
|
# Ubuntu Xenial constraints
|
||||||
|
ConfigArgParse==0.10.0
|
||||||
|
funcsigs==0.4
|
||||||
|
zope.hookable==4.0.4
|
||||||
+20
-11
@@ -1,17 +1,26 @@
|
|||||||
#!/bin/sh -e
|
#!/bin/bash -e
|
||||||
# pip installs packages using pinned package versions
|
# pip installs packages using pinned package versions. If CERTBOT_OLDEST is set
|
||||||
|
# to 1, a combination of tools/oldest_constraints.txt and
|
||||||
|
# tools/dev_constraints.txt is used, otherwise, a combination of certbot-auto's
|
||||||
|
# requirements file and tools/dev_constraints.txt is used. The other file
|
||||||
|
# always takes precedence over tools/dev_constraints.txt.
|
||||||
|
|
||||||
# get the root of the Certbot repo
|
# get the root of the Certbot repo
|
||||||
my_path=$("$(dirname $0)/readlink.py" $0)
|
tools_dir=$(dirname $("$(dirname $0)/readlink.py" $0))
|
||||||
repo_root=$(dirname $(dirname $my_path))
|
dev_constraints="$tools_dir/dev_constraints.txt"
|
||||||
requirements="$repo_root/letsencrypt-auto-source/pieces/dependency-requirements.txt"
|
merge_reqs="$tools_dir/merge_requirements.py"
|
||||||
certbot_auto_constraints=$(mktemp)
|
test_constraints=$(mktemp)
|
||||||
trap "rm -f $certbot_auto_constraints" EXIT
|
trap "rm -f $test_constraints" EXIT
|
||||||
# extract pinned requirements without hashes
|
|
||||||
sed -n -e 's/^\([^[:space:]]*==[^[:space:]]*\).*$/\1/p' $requirements > $certbot_auto_constraints
|
if [ "$CERTBOT_OLDEST" = 1 ]; then
|
||||||
dev_constraints="$(dirname $my_path)/pip_constraints.txt"
|
cp "$tools_dir/oldest_constraints.txt" "$test_constraints"
|
||||||
|
else
|
||||||
|
repo_root=$(dirname "$tools_dir")
|
||||||
|
certbot_requirements="$repo_root/letsencrypt-auto-source/pieces/dependency-requirements.txt"
|
||||||
|
sed -n -e 's/^\([^[:space:]]*==[^[:space:]]*\).*$/\1/p' "$certbot_requirements" > "$test_constraints"
|
||||||
|
fi
|
||||||
|
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
# install the requested packages using the pinned requirements as constraints
|
# install the requested packages using the pinned requirements as constraints
|
||||||
pip install -q --constraint $certbot_auto_constraints --constraint $dev_constraints "$@"
|
pip install -q --constraint <("$merge_reqs" "$dev_constraints" "$test_constraints") "$@"
|
||||||
|
|||||||
@@ -11,9 +11,8 @@ envlist = modification,py{26,33,34,35,36},cover,lint
|
|||||||
pip_install = {toxinidir}/tools/pip_install_editable.sh
|
pip_install = {toxinidir}/tools/pip_install_editable.sh
|
||||||
# pip installs the requested packages in editable mode and runs unit tests on
|
# pip installs the requested packages in editable mode and runs unit tests on
|
||||||
# them. Each package is installed and tested in the order they are provided
|
# them. Each package is installed and tested in the order they are provided
|
||||||
# before the script moves on to the next package. If CERTBOT_NO_PIN is set not
|
# before the script moves on to the next package. All dependencies are pinned
|
||||||
# set to 1, packages are installed using certbot-auto's requirements file as
|
# to a specific version for increased stability for developers.
|
||||||
# constraints.
|
|
||||||
install_and_test = {toxinidir}/tools/install_and_test.sh
|
install_and_test = {toxinidir}/tools/install_and_test.sh
|
||||||
py26_packages =
|
py26_packages =
|
||||||
acme[dev] \
|
acme[dev] \
|
||||||
@@ -82,36 +81,7 @@ commands =
|
|||||||
{[testenv]commands}
|
{[testenv]commands}
|
||||||
setenv =
|
setenv =
|
||||||
{[testenv]setenv}
|
{[testenv]setenv}
|
||||||
CERTBOT_NO_PIN=1
|
CERTBOT_OLDEST=1
|
||||||
deps =
|
|
||||||
PyOpenSSL==0.13
|
|
||||||
cffi==1.5.2
|
|
||||||
configargparse==0.10.0
|
|
||||||
configargparse==0.10.0
|
|
||||||
configobj==4.7.2
|
|
||||||
cryptography==1.2.3
|
|
||||||
enum34==0.9.23
|
|
||||||
google-api-python-client==1.5
|
|
||||||
idna==2.0
|
|
||||||
ipaddress==1.0.16
|
|
||||||
mock==1.0.1
|
|
||||||
ndg-httpsclient==0.3.2
|
|
||||||
oauth2client==2.0
|
|
||||||
parsedatetime==1.4
|
|
||||||
pyasn1-modules==0.0.5
|
|
||||||
pyasn1==0.1.9
|
|
||||||
pyparsing==1.5.6
|
|
||||||
pyrfc3339==1.0
|
|
||||||
pytest==3.2.5
|
|
||||||
python-augeas==0.4.1
|
|
||||||
pytz==2012c
|
|
||||||
requests[security]==2.6.0
|
|
||||||
setuptools==0.9.8
|
|
||||||
six==1.9.0
|
|
||||||
urllib3==1.10
|
|
||||||
zope.component==4.0.2
|
|
||||||
zope.event==4.0.1
|
|
||||||
zope.interface==4.0.5
|
|
||||||
|
|
||||||
[testenv:py27_install]
|
[testenv:py27_install]
|
||||||
basepython = python2.7
|
basepython = python2.7
|
||||||
|
|||||||
Reference in New Issue
Block a user