Merge pull request #4336 from hugovk/travis_arch

Test on new Travis CPUs
This commit is contained in:
Andrew Murray 2020-01-13 20:02:21 +11:00 committed by GitHub
commit 8606ae0721
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 61 additions and 26 deletions

View File

@ -16,9 +16,13 @@ pip install pyroma
pip install test-image-results pip install test-image-results
pip install numpy pip install numpy
if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then
# arm64, ppc64le, s390x CPUs:
# "ERROR: Could not find a version that satisfies the requirement pyqt5"
if [[ $TRAVIS_CPU_ARCH == "amd64" ]]; then
sudo apt-get -qq install pyqt5-dev-tools sudo apt-get -qq install pyqt5-dev-tools
pip install pyqt5!=5.14.1 pip install pyqt5!=5.14.1
fi fi
fi
# docs only on Python 3.8 # docs only on Python 3.8
if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then pip install -r requirements.txt ; fi if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then pip install -r requirements.txt ; fi

10
.ci/test.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/bash
set -e
python -m pytest -v -x --cov PIL --cov Tests --cov-report term Tests
# Docs
if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ] && [ "$TRAVIS_CPU_ARCH" == "amd64" ]; then
make doccheck
fi

View File

@ -50,7 +50,7 @@ jobs:
pip install wheel pip install wheel
sudo apt-get install -qq ruby-dev sudo apt-get install -qq ruby-dev
PATH="$PATH:~/.local/bin" PATH="$PATH:~/.local/bin"
.travis/after_success.sh .ci/after_success.sh
env: env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}

View File

@ -36,7 +36,7 @@ jobs:
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: key:
${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/.travis/*.sh') }} ${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/.ci/*.sh') }}
restore-keys: | restore-keys: |
${{ matrix.os }}-${{ matrix.python-version }}- ${{ matrix.os }}-${{ matrix.python-version }}-
@ -46,7 +46,7 @@ jobs:
with: with:
path: ~/Library/Caches/pip path: ~/Library/Caches/pip
key: key:
${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/.travis/*.sh') }} ${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/.ci/*.sh') }}
restore-keys: | restore-keys: |
${{ matrix.os }}-${{ matrix.python-version }}- ${{ matrix.os }}-${{ matrix.python-version }}-
@ -61,7 +61,7 @@ jobs:
- name: Install Linux dependencies - name: Install Linux dependencies
if: startsWith(matrix.os, 'ubuntu') if: startsWith(matrix.os, 'ubuntu')
run: | run: |
.travis/install.sh .ci/install.sh
- name: Install macOS dependencies - name: Install macOS dependencies
if: startsWith(matrix.os, 'macOS') if: startsWith(matrix.os, 'macOS')
@ -70,11 +70,11 @@ jobs:
- name: Build - name: Build
run: | run: |
.travis/build.sh .ci/build.sh
- name: Test - name: Test
run: | run: |
.travis/test.sh .ci/test.sh
- name: Upload errors - name: Upload errors
uses: actions/upload-artifact@v1 uses: actions/upload-artifact@v1
@ -86,7 +86,7 @@ jobs:
- name: After success - name: After success
if: success() if: success()
run: | run: |
.travis/after_success.sh .ci/after_success.sh
env: env:
MATRIX_OS: ${{ matrix.os }} MATRIX_OS: ${{ matrix.os }}
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}

View File

@ -6,8 +6,7 @@ notifications:
irc: "chat.freenode.net#pil" irc: "chat.freenode.net#pil"
# Run fast lint first to get fast feedback. # Run fast lint first to get fast feedback.
# Run slow PyPy next, to give it a headstart and reduce waiting time. # Run slower CPUs next, to give them a headstart and reduce waiting time.
# Run latest 3.x next, to get quick compatibility results.
# Then run the remainder. # Then run the remainder.
matrix: matrix:
@ -16,6 +15,14 @@ matrix:
- python: "3.6" - python: "3.6"
name: "Lint" name: "Lint"
env: LINT="true" env: LINT="true"
- python: "3.6"
arch: arm64
- python: "3.7"
arch: ppc64le
- python: "3.5"
arch: s390x
- python: "pypy3" - python: "pypy3"
name: "PyPy3 Xenial" name: "PyPy3 Xenial"
- python: "3.8" - python: "3.8"
@ -38,7 +45,7 @@ install:
if [ "$LINT" == "true" ]; then if [ "$LINT" == "true" ]; then
pip install tox pip install tox
else else
.travis/install.sh; .ci/install.sh;
fi fi
script: script:
@ -46,12 +53,12 @@ script:
if [ "$LINT" == "true" ]; then if [ "$LINT" == "true" ]; then
tox -e lint tox -e lint
else else
.travis/build.sh .ci/build.sh
.travis/test.sh .ci/test.sh
fi fi
after_success: after_success:
- | - |
if [ "$LINT" == "" ]; then if [ "$LINT" == "" ]; then
.travis/after_success.sh .ci/after_success.sh
fi fi

View File

@ -1,8 +0,0 @@
#!/bin/bash
set -e
python -m pytest -v -x --cov PIL --cov Tests --cov-report term Tests
# Docs
if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then make doccheck; fi

View File

@ -26,4 +26,4 @@ global-exclude .git*
global-exclude *.pyc global-exclude *.pyc
global-exclude *.so global-exclude *.so
prune .azure-pipelines prune .azure-pipelines
prune .travis prune .ci

View File

@ -348,6 +348,10 @@ def on_ci():
) )
def is_big_endian():
return sys.byteorder == "big"
def is_win32(): def is_win32():
return sys.platform.startswith("win32") return sys.platform.startswith("win32")

View File

@ -1,8 +1,9 @@
from io import BytesIO from io import BytesIO
import pytest
from PIL import Image, Jpeg2KImagePlugin from PIL import Image, Jpeg2KImagePlugin
from .helper import PillowTestCase from .helper import PillowTestCase, is_big_endian, on_ci
codecs = dir(Image.core) codecs = dir(Image.core)
@ -165,11 +166,13 @@ class TestFileJpeg2k(PillowTestCase):
jp2.load() jp2.load()
self.assertEqual(jp2.mode, "I;16") self.assertEqual(jp2.mode, "I;16")
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_16bit_monochrome_jp2_like_tiff(self): def test_16bit_monochrome_jp2_like_tiff(self):
with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit:
with Image.open("Tests/images/16bit.cropped.jp2") as jp2: with Image.open("Tests/images/16bit.cropped.jp2") as jp2:
self.assert_image_similar(jp2, tiff_16bit, 1e-3) self.assert_image_similar(jp2, tiff_16bit, 1e-3)
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_16bit_monochrome_j2k_like_tiff(self): def test_16bit_monochrome_j2k_like_tiff(self):
with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit:
with Image.open("Tests/images/16bit.cropped.j2k") as j2k: with Image.open("Tests/images/16bit.cropped.j2k") as j2k:

View File

@ -2,9 +2,17 @@ import unittest
import zlib import zlib
from io import BytesIO from io import BytesIO
import pytest
from PIL import Image, ImageFile, PngImagePlugin from PIL import Image, ImageFile, PngImagePlugin
from .helper import PillowLeakTestCase, PillowTestCase, hopper, is_win32 from .helper import (
PillowLeakTestCase,
PillowTestCase,
hopper,
is_big_endian,
is_win32,
on_ci,
)
try: try:
from PIL import _webp from PIL import _webp
@ -72,6 +80,7 @@ class TestFilePng(PillowTestCase):
png.crc(cid, s) png.crc(cid, s)
return chunks return chunks
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_sanity(self): def test_sanity(self):
# internal version number # internal version number

View File

@ -1,6 +1,7 @@
import pytest
from PIL import Image from PIL import Image
from .helper import PillowTestCase from .helper import PillowTestCase, is_big_endian, on_ci
try: try:
from PIL import _webp from PIL import _webp
@ -36,6 +37,7 @@ class TestFileWebpAnimation(PillowTestCase):
self.assertEqual(im.n_frames, 42) self.assertEqual(im.n_frames, 42)
self.assertTrue(im.is_animated) self.assertTrue(im.is_animated)
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_write_animation_L(self): def test_write_animation_L(self):
""" """
Convert an animated GIF to animated WebP, then compare the Convert an animated GIF to animated WebP, then compare the
@ -61,6 +63,7 @@ class TestFileWebpAnimation(PillowTestCase):
im.load() im.load()
self.assert_image_similar(im, orig.convert("RGBA"), 25.0) self.assert_image_similar(im, orig.convert("RGBA"), 25.0)
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_write_animation_RGB(self): def test_write_animation_RGB(self):
""" """
Write an animated WebP from RGB frames, and ensure the frames Write an animated WebP from RGB frames, and ensure the frames

View File

@ -1,9 +1,11 @@
import pytest
from PIL import Image from PIL import Image
from .helper import PillowTestCase, hopper from .helper import PillowTestCase, hopper, is_big_endian, on_ci
class TestImageGetExtrema(PillowTestCase): class TestImageGetExtrema(PillowTestCase):
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_extrema(self): def test_extrema(self):
def extrema(mode): def extrema(mode):
return hopper(mode).getextrema() return hopper(mode).getextrema()
@ -18,6 +20,7 @@ class TestImageGetExtrema(PillowTestCase):
self.assertEqual(extrema("CMYK"), ((0, 255), (0, 255), (0, 255), (0, 0))) self.assertEqual(extrema("CMYK"), ((0, 255), (0, 255), (0, 255), (0, 0)))
self.assertEqual(extrema("I;16"), (1, 255)) self.assertEqual(extrema("I;16"), (1, 255))
@pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian")
def test_true_16(self): def test_true_16(self):
with Image.open("Tests/images/16_bit_noise.tif") as im: with Image.open("Tests/images/16_bit_noise.tif") as im:
self.assertEqual(im.mode, "I;16") self.assertEqual(im.mode, "I;16")