Skip to content
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
128 changes: 34 additions & 94 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,110 +6,55 @@ notifications:
# Run slow PyPy* first, to give them a headstart and reduce waiting time.
# Run latest 3.x and 2.x next, to get quick compatibility results.
# Then run the remainder.
python:
- "pypy"
- "pypy3"
- 3.6
- 2.7
- "2.7_with_system_site_packages" # For PyQt4
- 3.5
- 3.4
- 3.3
- nightly

matrix:
fast_finish: true
allow_failures:
- python: nightly
include:
- python: "pypy"
- python: "pypy3"
- python: '3.6'
- python: '2.7'
- env: DOCKER="alpine"
- env: DOCKER="ubuntu-trusty-x86"
- env: DOCKER="ubuntu-xenial-amd64"
- env: DOCKER="ubuntu-precise-amd64"
- python: "2.7_with_system_site_packages" # For PyQt4
- python: '3.5'
- python: '3.4'
- python: '3.3'
- python: 'nightly'

dist: trusty

install:
- "travis_retry sudo apt-get update"
- "travis_retry sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick"
- "travis_retry pip install cffi"
- "travis_retry pip install nose"
- "travis_retry pip install check-manifest"
- "travis_retry pip install olefile"
# Pyroma tests sometimes hang on PyPy; skip
- if [ $TRAVIS_PYTHON_VERSION != "pypy" ]; then travis_retry pip install pyroma; fi

- "travis_retry pip install coverage"

# docs only on python 2.7
- if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then travis_retry pip install -r requirements.txt ; fi

# clean checkout for manifest
- mkdir /tmp/check-manifest && cp -a . /tmp/check-manifest

# webp
- pushd depends && ./install_webp.sh && popd
sudo: required

# openjpeg
- pushd depends && ./install_openjpeg.sh && popd
services:
- docker

# libimagequant
- pushd depends && ./install_imagequant.sh && popd

# extra test images
- pushd depends && ./install_extra_test_images.sh && popd
install:
- if [ "$DOCKER" == "" ]; then .travis/install.sh; fi

before_install:
- if [ "$DOCKER" ]; then docker pull pythonpillow/$DOCKER; fi

before_script:
# Qt needs a display for some of the tests, and it's only run on the system site packages install
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"

script:
- coverage erase
- python setup.py clean
- CFLAGS="-coverage" python setup.py build_ext --inplace

- coverage run --append --include=PIL/* selftest.py
- coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py
- pushd /tmp/check-manifest && check-manifest --ignore ".coveragerc,.editorconfig,*.yml,*.yaml,tox.ini" && popd

# Docs
- if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then make install && make doccheck; fi

after_success:
# gather the coverage data
- travis_retry sudo apt-get -qq install lcov
- lcov --capture --directory . -b . --output-file coverage.info
# filter to remove system headers
- lcov --remove coverage.info '/usr/*' -o coverage.filtered.info
# convert to json
- travis_retry gem install coveralls-lcov
- coveralls-lcov -v -n coverage.filtered.info > coverage.c.json

- coverage report
- travis_retry pip install coveralls-merge
- coveralls-merge coverage.c.json

- travis_retry pip install pep8 pyflakes
- pep8 --statistics --count PIL/*.py
- pep8 --statistics --count Tests/*.py
- pyflakes *.py | tee >(wc -l)
- pyflakes PIL/*.py | tee >(wc -l)
- pyflakes Tests/*.py | tee >(wc -l)

# Coverage and quality reports on just the latest diff.
# (Installation is very slow on Py3, so just do it for Py2.)
- if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then depends/diffcover-install.sh; fi
- if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then depends/diffcover-run.sh; fi

# after_all
- |
if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py
python travis_after_all.py
export $(cat .to_export_back)
if [ "$BUILD_LEADER" = "YES" ]; then
if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then
echo "All jobs succeded! Triggering macOS build..."
# Trigger a macOS build at the pillow-wheels repo
./build_children.sh
else
echo "Some jobs failed"
fi
fi
fi
if [ "$DOCKER" == "" ]; then
.travis/script.sh
else
docker run -v $TRAVIS_BUILD_DIR:/Pillow pythonpillow/$DOCKER
fi

after_success:
- .travis/after_success.sh

after_failure:
- |
if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
Expand All @@ -131,11 +76,6 @@ after_script:
echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS
fi

matrix:
fast_finish: true
allow_failures:
- python: nightly

env:
global:
# travis encrypt AUTH_TOKEN=
Expand Down
46 changes: 46 additions & 0 deletions .travis/after_success.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/bin/bash

# gather the coverage data
sudo apt-get -qq install lcov
lcov --capture --directory . -b . --output-file coverage.info
# filter to remove system headers
lcov --remove coverage.info '/usr/*' -o coverage.filtered.info
# convert to json
gem install coveralls-lcov
coveralls-lcov -v -n coverage.filtered.info > coverage.c.json

coverage report
pip install coveralls-merge
coveralls-merge coverage.c.json

if [ "$DOCKER" == "" ]; then
pip install pep8 pyflakes
pep8 --statistics --count PIL/*.py
pep8 --statistics --count Tests/*.py
pyflakes *.py | tee >(wc -l)
pyflakes PIL/*.py | tee >(wc -l)
pyflakes Tests/*.py | tee >(wc -l)
fi
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These can give different results for Python 2 and Python 3, and usually take less than 10 seconds. Perhaps keep it for all? Or was it particularly slow for some of the new Dockers?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, I could have sworn that this was in the .travis.yml file that I was pulling from, but I can't find it now, and I've rebased enough that it's lost.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I've just taken these off the dockers. (Note that TRAVIS_PYTHON_VERSION in the docker runs is the python version in travis, not in the docker image, so it's pretty much irrelevant at this point, and could fundamentally mismatch)


if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then
# Coverage and quality reports on just the latest diff.
# (Installation is very slow on Py3, so just do it for Py2.)
depends/diffcover-install.sh
depends/diffcover-run.sh
fi

# after_all

if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py
python travis_after_all.py
export $(cat .to_export_back)
if [ "$BUILD_LEADER" = "YES" ]; then
if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then
echo "All jobs succeded! Triggering macOS build..."
# Trigger a macOS build at the pillow-wheels repo
./build_children.sh
else
echo "Some jobs failed"
fi
fi
34 changes: 34 additions & 0 deletions .travis/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash

set -e

sudo apt-get update
sudo apt-get -qq install libfreetype6-dev liblcms2-dev\
python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick
pip install cffi
pip install nose
pip install check-manifest
pip install olefile
# Pyroma tests sometimes hang on PyPy; skip
if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then pip install pyroma; fi

pip install coverage

# docs only on python 2.7
if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then pip install -r requirements.txt ; fi

# clean checkout for manifest
mkdir /tmp/check-manifest && cp -a . /tmp/check-manifest

# webp
pushd depends && ./install_webp.sh && popd

# openjpeg
pushd depends && ./install_openjpeg.sh && popd

# libimagequant
pushd depends && ./install_imagequant.sh && popd

# extra test images
pushd depends && ./install_extra_test_images.sh && popd

14 changes: 14 additions & 0 deletions .travis/script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

set -e

coverage erase
python setup.py clean
CFLAGS="-coverage" python setup.py build_ext --inplace

coverage run --append --include=PIL/* selftest.py
coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py
pushd /tmp/check-manifest && check-manifest --ignore ".coveragerc,.editorconfig,*.yml,*.yaml,tox.ini" && popd

# Docs
if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then make install && make doccheck; fi
7 changes: 6 additions & 1 deletion Tests/test_numpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,12 @@ def test_1bit(self):
img = Image.fromarray(arr * 255).convert('1')
self.assertEqual(img.mode, '1')
arr_back = numpy.array(img)
numpy.testing.assert_array_equal(arr, arr_back)
# numpy 1.8 and earlier return this as a boolean. (trusty/precise)
if arr_back.dtype == numpy.bool:
arr_bool = numpy.array([[1, 0, 0, 1, 0], [0, 1, 0, 0, 0]], 'bool')
numpy.testing.assert_array_equal(arr_bool, arr_back)
else:
numpy.testing.assert_array_equal(arr, arr_back)

def test_save_tiff_uint16(self):
# Tests that we're getting the pixel value in the right byte order.
Expand Down
8 changes: 7 additions & 1 deletion Tests/test_scipy.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from helper import unittest, PillowTestCase

from distutils.version import StrictVersion
try:
import numpy as np
from numpy.testing import assert_equal

from scipy import misc
import scipy
HAS_SCIPY = True
except ImportError:
HAS_SCIPY = False
Expand All @@ -27,6 +28,11 @@ def test_imresize(self):
im1 = misc.imresize(im, T(1.101))
self.assertEqual(im1.shape, (11, 22))

# this test fails prior to scipy 0.14.0b1
# https://github.com/scipy/scipy/commit/855ff1fff805fb91840cf36b7082d18565fc8352
@unittest.skipIf(HAS_SCIPY and
(StrictVersion(scipy.__version__) < StrictVersion('0.14.0')),
"Test fails on scipy < 0.14.0")
def test_imresize4(self):
im = np.array([[1, 2],
[3, 4]])
Expand Down