Similar to the recent adoption of Black. isort is a Python utility to
sort imports alphabetically and automatically separate into sections. By
using isort, contributors can quickly and automatically conform to the
projects style without thinking. Just let the tool do it.
Uses the configuration recommended by the Black to avoid conflicts of
style.
Rewrite TestImageQt.test_deprecated to no rely on import order.
With the introduction and use of pytest, it is simple and easy to
execute specific tests in isolation through documented command line
arguments. Either by specifying the module path or through the `-k
EXPRESSION` argument. There is no longer any need to provide the
boilerplate:
if __name__ == '__main__':
unittest.main()
To every test file. It is simply noise.
The pattern remains in test files that aren't named with `test_*` as
those files are not discovered and executed by pytest by default.
The previous test configuration made it difficult to run a single test
with the pytest CLI. There were two major issues:
- The Tests directory was not a package. It now includes a __init__.py
file and imports from other tests modules are done with relative
imports.
- setup.cfg always specified the Tests directory. So even if a specific
test were specified as a CLI arg, this configuration would also always
include all tests. This configuration has been removed to allow
specifying a single test on the command line.
Contributors can now run specific tests with a single command such as:
$ tox -e py37 -- Tests/test_file_pdf.py::TestFilePdf.test_rgb
This makes it easy and faster to iterate on a single test failure and is
very familiar to those that have previously used tox and pytest.
When running tox or pytest with no arguments, they still discover and
runs all tests in the Tests directory.
Instead, allow exceptions to bubble up to the unittest exception
handler.
Prevents replacing the exception trace with a less informative
message. As the exceptions are always unexpected, should not need to
catch them explicitly in tests.
We were encountering some errors when saving specific JPEG images.
The error was shown in stderr as:
IOError: encoder error -2 when writing image file
And on stdout it printed:
Suspension not allowed here
The problem was the bufsize not contemplating the icc_profile block.
iter(dict) is equivalent to iter(dict.keys()), so simply act on the dict
instead of adding the extra call.
Inspired by Lennart Regebro's PyCon 2017 presentation "Prehistoric
Patterns in Python". Available at:
https://www.youtube.com/watch?v=V5-JH23Vk0I
* DPI is a tuple
* Some EXIF only contains an X resolution for DPI
* Refactor
* Test with no DPI in EXIF
* Handle EXIF with no DPI
* Created with: exiftool "-*resolution*"= photoshop-200dpi.jpg
* Test when not in EXIF, DPI==72,72
* Use X resolution for Y, default to 72,72 dpi
* Created with: exiftool -exif:ResolutionUnit=cm photoshop-200dpi.jpg
* Test for EXIF with dpcm instead of dpi
* Convert dpcm to dpi, and default to inches if unit unknown