mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-06-05 21:53:15 +03:00
Merge pull request #755 from wiredfool/multithread-testing-travis
Multithread testing- travis
This commit is contained in:
commit
febfe2f574
|
@ -9,3 +9,6 @@ exclude_lines =
|
||||||
# Don't complain if non-runnable code isn't run:
|
# Don't complain if non-runnable code isn't run:
|
||||||
if 0:
|
if 0:
|
||||||
if __name__ == .__main__.:
|
if __name__ == .__main__.:
|
||||||
|
# Don't complain about debug code
|
||||||
|
if Image.DEBUG:
|
||||||
|
if DEBUG:
|
13
.travis.yml
13
.travis.yml
|
@ -3,7 +3,7 @@ language: python
|
||||||
notifications:
|
notifications:
|
||||||
irc: "chat.freenode.net#pil"
|
irc: "chat.freenode.net#pil"
|
||||||
|
|
||||||
env: MAX_CONCURRENCY=4
|
env: MAX_CONCURRENCY=4 NOSE_PROCESSES=4 NOSE_PROCESS_TIMEOUT=30
|
||||||
|
|
||||||
python:
|
python:
|
||||||
- "pypy"
|
- "pypy"
|
||||||
|
@ -14,9 +14,9 @@ python:
|
||||||
- 3.4
|
- 3.4
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- "sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake"
|
- "sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev cmake"
|
||||||
- "pip install cffi"
|
- "pip install cffi"
|
||||||
- "pip install coveralls nose pyroma"
|
- "pip install coveralls nose pyroma nose-cov"
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" == "2.6" ]; then pip install unittest2; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" == "2.6" ]; then pip install unittest2; fi
|
||||||
|
|
||||||
# webp
|
# webp
|
||||||
|
@ -35,10 +35,13 @@ script:
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then time nosetests Tests/test_*.py; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then time nosetests Tests/test_*.py; fi
|
||||||
|
|
||||||
# Cover the others
|
# Cover the others
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then time coverage run --append --include=PIL/* selftest.py; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then coverage run --parallel-mode --include=PIL/* selftest.py; fi
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then time coverage run --append --include=PIL/* -m nose Tests/test_*.py; fi
|
# write html report, then ignore. Coverage needs to be combined first
|
||||||
|
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py; fi
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
- ls -l .coverage*
|
||||||
|
- coverage combine
|
||||||
- coverage report
|
- coverage report
|
||||||
- coveralls
|
- coveralls
|
||||||
- pip install pep8 pyflakes
|
- pip install pep8 pyflakes
|
||||||
|
|
31
Makefile
31
Makefile
|
@ -1,3 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
pre:
|
pre:
|
||||||
virtualenv .
|
virtualenv .
|
||||||
bin/pip install -r requirements.txt
|
bin/pip install -r requirements.txt
|
||||||
|
@ -9,3 +11,32 @@ pre:
|
||||||
check-manifest
|
check-manifest
|
||||||
pyroma .
|
pyroma .
|
||||||
viewdoc
|
viewdoc
|
||||||
|
|
||||||
|
clean:
|
||||||
|
python setup.py clean
|
||||||
|
rm PIL/*.so || true
|
||||||
|
find . -name __pycache__ | xargs rm -r
|
||||||
|
|
||||||
|
install:
|
||||||
|
python setup.py install
|
||||||
|
python selftest.py --installed
|
||||||
|
|
||||||
|
test: install
|
||||||
|
python test-installed.py
|
||||||
|
|
||||||
|
inplace: clean
|
||||||
|
python setup.py build_ext --inplace
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
# requires nose-cov
|
||||||
|
coverage erase
|
||||||
|
coverage run --parallel-mode --include=PIL/* selftest.py
|
||||||
|
nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py
|
||||||
|
# doesn't combine properly before report,
|
||||||
|
# writing report instead of displaying invalid report
|
||||||
|
rm -r htmlcov || true
|
||||||
|
coverage combine
|
||||||
|
coverage report
|
||||||
|
|
||||||
|
test-dep:
|
||||||
|
pip install coveralls nose nose-cov pep8 pyflakes
|
||||||
|
|
|
@ -3,39 +3,30 @@ Helper functions.
|
||||||
"""
|
"""
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import sys
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
|
||||||
if sys.version_info[:2] <= (2, 6):
|
if sys.version_info[:2] <= (2, 6):
|
||||||
import unittest2 as unittest
|
import unittest2 as unittest
|
||||||
else:
|
else:
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
# This should be imported into every test_XXX.py file to report
|
|
||||||
# any remaining temp files at the end of the run.
|
|
||||||
def tearDownModule():
|
def tearDownModule():
|
||||||
import glob
|
#remove me later
|
||||||
import os
|
pass
|
||||||
import tempfile
|
|
||||||
temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
|
|
||||||
tempfiles = glob.glob(os.path.join(temp_root, "temp_*"))
|
|
||||||
if tempfiles:
|
|
||||||
print("===", "remaining temporary files")
|
|
||||||
for file in tempfiles:
|
|
||||||
print(file)
|
|
||||||
print("-"*68)
|
|
||||||
|
|
||||||
|
|
||||||
class PillowTestCase(unittest.TestCase):
|
class PillowTestCase(unittest.TestCase):
|
||||||
|
|
||||||
currentResult = None # holds last result object passed to run method
|
def __init__(self, *args, **kwargs):
|
||||||
_tempfiles = []
|
unittest.TestCase.__init__(self, *args, **kwargs)
|
||||||
|
self.currentResult = None # holds last result object passed to run method
|
||||||
|
|
||||||
def run(self, result=None):
|
def run(self, result=None):
|
||||||
self.addCleanup(self.delete_tempfiles)
|
|
||||||
self.currentResult = result # remember result for use later
|
self.currentResult = result # remember result for use later
|
||||||
unittest.TestCase.run(self, result) # call superclass run method
|
unittest.TestCase.run(self, result) # call superclass run method
|
||||||
|
|
||||||
def delete_tempfiles(self):
|
def delete_tempfile(self, path):
|
||||||
try:
|
try:
|
||||||
ok = self.currentResult.wasSuccessful()
|
ok = self.currentResult.wasSuccessful()
|
||||||
except AttributeError: # for nosetests
|
except AttributeError: # for nosetests
|
||||||
|
@ -44,19 +35,12 @@ class PillowTestCase(unittest.TestCase):
|
||||||
|
|
||||||
if ok:
|
if ok:
|
||||||
# only clean out tempfiles if test passed
|
# only clean out tempfiles if test passed
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import tempfile
|
|
||||||
for file in self._tempfiles:
|
|
||||||
try:
|
|
||||||
os.remove(file)
|
|
||||||
except OSError:
|
|
||||||
pass # report?
|
|
||||||
temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
|
|
||||||
try:
|
try:
|
||||||
os.rmdir(temp_root)
|
os.remove(path)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass # report?
|
||||||
|
else:
|
||||||
|
print("=== orphaned temp file: %s" %path)
|
||||||
|
|
||||||
def assert_almost_equal(self, a, b, msg=None, eps=1e-6):
|
def assert_almost_equal(self, a, b, msg=None, eps=1e-6):
|
||||||
self.assertLess(
|
self.assertLess(
|
||||||
|
@ -139,27 +123,13 @@ class PillowTestCase(unittest.TestCase):
|
||||||
self.assertTrue(found)
|
self.assertTrue(found)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def tempfile(self, template, *extra):
|
def tempfile(self, template):
|
||||||
import os
|
assert template[:5] in ("temp.", "temp_")
|
||||||
import os.path
|
(fd, path) = tempfile.mkstemp(template[4:], template[:4])
|
||||||
import sys
|
os.close(fd)
|
||||||
import tempfile
|
|
||||||
files = []
|
self.addCleanup(self.delete_tempfile, path)
|
||||||
root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
|
return path
|
||||||
try:
|
|
||||||
os.mkdir(root)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
for temp in (template,) + extra:
|
|
||||||
assert temp[:5] in ("temp.", "temp_")
|
|
||||||
name = os.path.basename(sys.argv[0])
|
|
||||||
name = temp[:4] + os.path.splitext(name)[0][4:]
|
|
||||||
name = name + "_%d" % len(self._tempfiles) + temp[4:]
|
|
||||||
name = os.path.join(root, name)
|
|
||||||
files.append(name)
|
|
||||||
self._tempfiles.extend(files)
|
|
||||||
return files[0]
|
|
||||||
|
|
||||||
|
|
||||||
# helpers
|
# helpers
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,8 @@ class TestFontPcf(PillowTestCase):
|
||||||
self.assertIsInstance(font, FontFile.FontFile)
|
self.assertIsInstance(font, FontFile.FontFile)
|
||||||
self.assertEqual(len([_f for _f in font.glyph if _f]), 192)
|
self.assertEqual(len([_f for _f in font.glyph if _f]), 192)
|
||||||
|
|
||||||
tempname = self.tempfile("temp.pil", "temp.pbm")
|
tempname = self.tempfile("temp.pil")
|
||||||
|
self.addCleanup(self.delete_tempfile, tempname[:-4]+'.pbm')
|
||||||
font.save(tempname)
|
font.save(tempname)
|
||||||
return tempname
|
return tempname
|
||||||
|
|
||||||
|
|
|
@ -20,5 +20,13 @@ if len(sys.argv) == 1:
|
||||||
if ('--no-path-adjustment' not in sys.argv) and ('-P' not in sys.argv):
|
if ('--no-path-adjustment' not in sys.argv) and ('-P' not in sys.argv):
|
||||||
sys.argv.insert(1, '--no-path-adjustment')
|
sys.argv.insert(1, '--no-path-adjustment')
|
||||||
|
|
||||||
|
if 'NOSE_PROCESSES' not in os.environ:
|
||||||
|
for arg in sys.argv:
|
||||||
|
if '--processes' in arg:
|
||||||
|
break
|
||||||
|
else: # for
|
||||||
|
sys.argv.insert(1, '--processes=-1') # -1 == number of cores
|
||||||
|
sys.argv.insert(1, '--process-timeout=30')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
nose.main()
|
nose.main()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user