From 87da03c1ecdfbc8efb4af2233ba67bb4628c2110 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Thu, 21 Jan 2021 12:22:29 +0100 Subject: [PATCH 01/13] Added example to for moving to poppler/pillow Check if it runs on Windows/Linux/MacOS in the CI. We might need to deliver OS specific poppler builds with the tool. --- examples/poppler_pillow.py | 41 +++++++ poetry.lock | 228 ++++++++++++++++++++++--------------- pyproject.toml | 2 +- 3 files changed, 180 insertions(+), 91 deletions(-) create mode 100644 examples/poppler_pillow.py diff --git a/examples/poppler_pillow.py b/examples/poppler_pillow.py new file mode 100644 index 0000000..b3c29ea --- /dev/null +++ b/examples/poppler_pillow.py @@ -0,0 +1,41 @@ +"""Example for imaging that avoids ImageMagick/Wand.""" + +import datetime +import os + +from PIL import Image, ImageDraw + +from poppler import PageRenderer, load_from_file +from poppler.cpp.image import format_enum as ImageFormat # pylint: disable=no-name-in-module + +from tests.conftest import PDF_FULL_FEATURES as TEST_PDF + +pdf_document = load_from_file(TEST_PDF) + +time = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') +os.makedirs(f'poppler_pillow/{time}') + +COLOR = (255, 0, 0) # Red +TRANSPARENCY = 0.25 # Degree of transparency, 0-100% +OPACITY = int(255 * TRANSPARENCY) + +for idx in range(1, 4): + # poppler + page = pdf_document.create_page(idx) + renderer = PageRenderer() + renderer.image_format = ImageFormat.argb32 # rgb 32 bit with alpha channel + image = renderer.render_page(page, xres=600, yres=600) # resolution affects rendering time + + # Pillow + im = Image.frombytes('RGBA', (image.width, image.height), image.data, 'raw', str(image.format)) + + overlay = Image.new('RGBA', im.size, COLOR + (0,)) # create overlay on top of PDF image + draw = ImageDraw.Draw(overlay) # create a context for drawing things on it + draw.rectangle((400, 225, 700, 700), fill=COLOR + (OPACITY,)) # draw a rectangle + im = Image.alpha_composite(im, overlay) # mix the alpha channels + im = im.convert('RGB') # Remove alpha for saving in jpg format. + im = im.crop((100, 100, 2000, 2500)) # crop the image + with open(f'poppler_pillow/{time}/{idx}_pillow.png', 'wb') as f: + im.save(f, format='png') + + image.save(f'poppler_pillow/{time}/{idx}_poppler.png', 'png') # save original poppler image (without drawing) diff --git a/poetry.lock b/poetry.lock index 5e873c7..4c9a427 100644 --- a/poetry.lock +++ b/poetry.lock @@ -220,7 +220,7 @@ python = "<3.8" [[package]] name = "flake8-blind-except" -version = "0.1.1" +version = "0.2.0" description = "A flake8 extension that checks for blind except: statements" category = "dev" optional = false @@ -463,7 +463,7 @@ zipp = ">=0.5" [[package]] name = "importlib-resources" -version = "4.1.1" +version = "5.1.0" description = "Read resources from Python packages" category = "dev" optional = false @@ -471,8 +471,8 @@ python-versions = ">=3.6" marker = "python_version < \"3.7\"" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] [package.dependencies] [package.dependencies.zipp] @@ -523,6 +523,18 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "m2r" +version = "0.2.1" +description = "Markdown and reStructuredText in a single file." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +docutils = "*" +mistune = "*" + [[package]] name = "markupsafe" version = "1.1.1" @@ -556,6 +568,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "more-itertools" version = "8.6.0" @@ -590,7 +610,7 @@ python-versions = "*" [[package]] name = "numpy" -version = "1.19.4" +version = "1.19.5" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -618,7 +638,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pdfminer.six" -version = "20200517" +version = "20200517.dev1" description = "PDF parser and analyzer" category = "dev" optional = false @@ -638,12 +658,12 @@ python = ">=3.1" [package.source] url = "https://github.com/useblocks/pdfminer.six" -reference = "42d17f9c2e156dac6b1da2d909391d3a734e40fb" +reference = "b76ff63b7cdcc7bba6229fcf9af087cdc47922f7" type = "git" [[package]] name = "pdfplumber" -version = "0.5.21" +version = "0.5.21.dev1" description = "Plumb a PDF for detailed information about each char, rectangle, and line." category = "dev" optional = false @@ -659,7 +679,7 @@ wand = "*" [package.source] url = "https://github.com/useblocks/pdfplumber.git" -reference = "768d73df4b78e5878b7a01c339bbbf9969e7ddb3" +reference = "1bb876ccb885c80985aa63f11c639f4ec77bdd61" type = "git" [[package]] @@ -731,7 +751,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.7.3" +version = "2.7.4" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false @@ -788,7 +808,7 @@ python = "<3.8" [[package]] name = "pytest-cov" -version = "2.10.1" +version = "2.11.1" description = "Pytest plugin for measuring coverage." category = "dev" optional = false @@ -798,7 +818,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] [package.dependencies] -coverage = ">=4.4" +coverage = ">=5.2.1" pytest = ">=4.6" [[package]] @@ -842,6 +862,14 @@ marker = "python_version >= \"3.6\"" [package.dependencies] six = ">=1.5" +[[package]] +name = "python-poppler" +version = "0.2.2" +description = "A Python binding to poppler-cpp" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "pytz" version = "2020.5" @@ -852,11 +880,11 @@ python-versions = "*" [[package]] name = "pyyaml" -version = "5.3.1" +version = "5.4.1" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "regex" @@ -947,7 +975,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "3.4.2" +version = "3.4.3" description = "Python documentation generator" category = "main" optional = false @@ -979,7 +1007,7 @@ sphinxcontrib-serializinghtml = "*" [[package]] name = "sphinx-rtd-theme" -version = "0.5.0" +version = "0.5.1" description = "Read the Docs theme for Sphinx" category = "main" optional = false @@ -1040,13 +1068,14 @@ test = ["pytest", "flake8", "mypy"] [[package]] name = "sphinxcontrib-needs" -version = "0.5.6" +version = "0.6.0" description = "Sphinx needs extension for managing needs/requirements and specifications" category = "main" optional = false python-versions = "*" [package.dependencies] +m2r = "*" six = "*" [package.dependencies.matplotlib] @@ -1102,7 +1131,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tox" -version = "3.20.1" +version = "3.21.2" description = "tox is a generic virtualenv management and test command line tool" category = "dev" optional = false @@ -1110,7 +1139,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.extras] docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] -testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)"] +testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)", "pathlib2 (>=2.3.3)"] [package.dependencies] colorama = ">=0.4.1" @@ -1123,12 +1152,12 @@ toml = ">=0.9.4" virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" [package.dependencies.importlib-metadata] -version = ">=0.12,<3" +version = ">=0.12" python = "<3.8" [[package]] name = "tqdm" -version = "4.55.1" +version = "4.56.0" description = "Fast, Extensible Progress Meter" category = "main" optional = true @@ -1177,7 +1206,7 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.2.2" +version = "20.4.0" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1185,7 +1214,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.extras] docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-xdist (>=1.31.0)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] [package.dependencies] appdirs = ">=1.4.3,<2" @@ -1205,7 +1234,7 @@ python = "<3.7" name = "wand" version = "0.6.5" description = "Ctypes-based simple MagickWand API binding for Python" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1250,7 +1279,7 @@ docs = ["sphinx", "sphinx_rtd_theme", "sphinxcontrib-needs", "sphinxcontrib-plan [metadata] lock-version = "1.0" python-versions = "^3.6" -content-hash = "17240f5a5ca8b6eaa9d399c48b0aeefa7abdb42abd0ab364f69603ce66bbe6a0" +content-hash = "af07da850ae7eaec5842ca649f47165143e16c41717e4631218f72aaec48bc06" [metadata.files] alabaster = [ @@ -1380,8 +1409,7 @@ flake8 = [ {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] flake8-blind-except = [ - {file = "flake8-blind-except-0.1.1.tar.gz", hash = "sha256:aca3356633825544cec51997260fe31a8f24a1a2795ce8e81696b9916745e599"}, - {file = "flake8_blind_except-0.1.1-py2.7.egg", hash = "sha256:0d7d1adb4cabf2268d6eebb815a7a5014bcb7e8419f7a74339c46d0b8847b858"}, + {file = "flake8-blind-except-0.2.0.tar.gz", hash = "sha256:02a860a1a19cb602c006a3fe0778035b0d14d3f57929b4b798bc7d6684f204e5"}, ] flake8-bugbear = [ {file = "flake8-bugbear-20.11.1.tar.gz", hash = "sha256:528020129fea2dea33a466b9d64ab650aa3e5f9ffc788b70ea4bc6cf18283538"}, @@ -1457,8 +1485,8 @@ importlib-metadata = [ {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, ] importlib-resources = [ - {file = "importlib_resources-4.1.1-py3-none-any.whl", hash = "sha256:0a948d0c8c3f9344de62997e3f73444dbba233b1eaf24352933c2d264b9e4182"}, - {file = "importlib_resources-4.1.1.tar.gz", hash = "sha256:6b45007a479c4ec21165ae3ffbe37faf35404e2041fac6ae1da684f38530ca73"}, + {file = "importlib_resources-5.1.0-py3-none-any.whl", hash = "sha256:885b8eae589179f661c909d699a546cf10d83692553e34dca1bf5eb06f7f6217"}, + {file = "importlib_resources-5.1.0.tar.gz", hash = "sha256:bfdad047bce441405a49cf8eb48ddce5e56c696e185f59147a8b79e75e9e6380"}, ] isort = [ {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, @@ -1525,6 +1553,9 @@ lazy-object-proxy = [ {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"}, {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"}, ] +m2r = [ + {file = "m2r-0.2.1.tar.gz", hash = "sha256:bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99"}, +] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, @@ -1591,6 +1622,10 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] more-itertools = [ {file = "more-itertools-8.6.0.tar.gz", hash = "sha256:b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf"}, {file = "more_itertools-8.6.0-py3-none-any.whl", hash = "sha256:8e1a2a43b2f2727425f2b5839587ae37093f19153dc26c0927d1048ff6557330"}, @@ -1616,40 +1651,40 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] numpy = [ - {file = "numpy-1.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949"}, - {file = "numpy-1.19.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4"}, - {file = "numpy-1.19.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad"}, - {file = "numpy-1.19.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83"}, - {file = "numpy-1.19.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764"}, - {file = "numpy-1.19.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6"}, - {file = "numpy-1.19.4-cp36-cp36m-win32.whl", hash = "sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1"}, - {file = "numpy-1.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb"}, - {file = "numpy-1.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2"}, - {file = "numpy-1.19.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2"}, - {file = "numpy-1.19.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9"}, - {file = "numpy-1.19.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757"}, - {file = "numpy-1.19.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15"}, - {file = "numpy-1.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387"}, - {file = "numpy-1.19.4-cp37-cp37m-win32.whl", hash = "sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36"}, - {file = "numpy-1.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c"}, - {file = "numpy-1.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909"}, - {file = "numpy-1.19.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c"}, - {file = "numpy-1.19.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893"}, - {file = "numpy-1.19.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab"}, - {file = "numpy-1.19.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9"}, - {file = "numpy-1.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db"}, - {file = "numpy-1.19.4-cp38-cp38-win32.whl", hash = "sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac"}, - {file = "numpy-1.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce"}, - {file = "numpy-1.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63"}, - {file = "numpy-1.19.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37"}, - {file = "numpy-1.19.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414"}, - {file = "numpy-1.19.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc"}, - {file = "numpy-1.19.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3"}, - {file = "numpy-1.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753"}, - {file = "numpy-1.19.4-cp39-cp39-win32.whl", hash = "sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f"}, - {file = "numpy-1.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b"}, - {file = "numpy-1.19.4-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08"}, - {file = "numpy-1.19.4.zip", hash = "sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512"}, + {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76"}, + {file = "numpy-1.19.5-cp36-cp36m-win32.whl", hash = "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a"}, + {file = "numpy-1.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827"}, + {file = "numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28"}, + {file = "numpy-1.19.5-cp37-cp37m-win32.whl", hash = "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7"}, + {file = "numpy-1.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d"}, + {file = "numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc"}, + {file = "numpy-1.19.5-cp38-cp38-win32.whl", hash = "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2"}, + {file = "numpy-1.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa"}, + {file = "numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60"}, + {file = "numpy-1.19.5-cp39-cp39-win32.whl", hash = "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e"}, + {file = "numpy-1.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e"}, + {file = "numpy-1.19.5-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73"}, + {file = "numpy-1.19.5.zip", hash = "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4"}, ] packaging = [ {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, @@ -1749,8 +1784,8 @@ pyflakes = [ {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, ] pygments = [ - {file = "Pygments-2.7.3-py3-none-any.whl", hash = "sha256:f275b6c0909e5dafd2d6269a656aa90fa58ebf4a74f8fcf9053195d226b24a08"}, - {file = "Pygments-2.7.3.tar.gz", hash = "sha256:ccf3acacf3782cbed4a989426012f1c535c9a90d3a7fc3f16d231b9372d2b716"}, + {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, + {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, ] pylint = [ {file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"}, @@ -1765,8 +1800,8 @@ pytest = [ {file = "pytest-5.3.5.tar.gz", hash = "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d"}, ] pytest-cov = [ - {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, - {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, + {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, + {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, ] pytest-forked = [ {file = "pytest-forked-1.3.0.tar.gz", hash = "sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca"}, @@ -1780,22 +1815,35 @@ python-dateutil = [ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, ] +python-poppler = [ + {file = "python-poppler-0.2.2.tar.gz", hash = "sha256:6843398adc9c290035646c4cf3c7bfcea9c8e04390bb9cd8fdc9bd063fb77880"}, +] pytz = [ {file = "pytz-2020.5-py2.py3-none-any.whl", hash = "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4"}, {file = "pytz-2020.5.tar.gz", hash = "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"}, ] pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] regex = [ {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, @@ -1890,12 +1938,12 @@ sortedcontainers = [ {file = "sortedcontainers-2.3.0.tar.gz", hash = "sha256:59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1"}, ] sphinx = [ - {file = "Sphinx-3.4.2-py3-none-any.whl", hash = "sha256:b8aa4eb5502c53d3b5ca13a07abeedacd887f7770c198952fd5b9530d973e767"}, - {file = "Sphinx-3.4.2.tar.gz", hash = "sha256:77dec5ac77ca46eee54f59cf477780f4fb23327b3339ef39c8471abb829c1285"}, + {file = "Sphinx-3.4.3-py3-none-any.whl", hash = "sha256:c314c857e7cd47c856d2c5adff514ac2e6495f8b8e0f886a8a37e9305dfea0d8"}, + {file = "Sphinx-3.4.3.tar.gz", hash = "sha256:41cad293f954f7d37f803d97eb184158cfd90f51195131e94875bc07cd08b93c"}, ] sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-0.5.0-py2.py3-none-any.whl", hash = "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"}, - {file = "sphinx_rtd_theme-0.5.0.tar.gz", hash = "sha256:22c795ba2832a169ca301cd0a083f7a434e09c538c70beb42782c073651b707d"}, + {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, + {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, ] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, @@ -1914,8 +1962,8 @@ sphinxcontrib-jsmath = [ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] sphinxcontrib-needs = [ - {file = "sphinxcontrib-needs-0.5.6.tar.gz", hash = "sha256:385c9ed876f6b092a6ca28e6e39b7014a4cc64be262afdf9b03851b63e561134"}, - {file = "sphinxcontrib_needs-0.5.6-py3-none-any.whl", hash = "sha256:5c22803afdc8d324cb65071bacb8b7438e250052021df14cbeac515b377f1de8"}, + {file = "sphinxcontrib-needs-0.6.0.tar.gz", hash = "sha256:fb7c163410e32b286435f53e4ce06cf91f9de59262abc7ae7b6170373105060e"}, + {file = "sphinxcontrib_needs-0.6.0-py3-none-any.whl", hash = "sha256:b4fae74e1fcf185ab2da39a67702beb2ac407cb774f6ebcb7a6cf6f2c8362c0e"}, ] sphinxcontrib-plantuml = [ {file = "sphinxcontrib-plantuml-0.19.tar.gz", hash = "sha256:98b9f02282907b0c5b7a93a446c4649909aaf5785d2da0dd263c8ad68e00e288"}, @@ -1933,12 +1981,12 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tox = [ - {file = "tox-3.20.1-py2.py3-none-any.whl", hash = "sha256:42ce19ce5dc2f6d6b1fdc5666c476e1f1e2897359b47e0aa3a5b774f335d57c2"}, - {file = "tox-3.20.1.tar.gz", hash = "sha256:4321052bfe28f9d85082341ca8e233e3ea901fdd14dab8a5d3fbd810269fbaf6"}, + {file = "tox-3.21.2-py2.py3-none-any.whl", hash = "sha256:0aa777ee466f2ef18e6f58428c793c32378779e0a321dbb8934848bc3e78998c"}, + {file = "tox-3.21.2.tar.gz", hash = "sha256:f501808381c01c6d7827c2f17328be59c0a715046e94605ddca15fb91e65827d"}, ] tqdm = [ - {file = "tqdm-4.55.1-py2.py3-none-any.whl", hash = "sha256:b8b46036fd00176d0870307123ef06bb851096964fa7fc578d789f90ce82c3e4"}, - {file = "tqdm-4.55.1.tar.gz", hash = "sha256:556c55b081bd9aa746d34125d024b73f0e2a0e62d5927ff0e400e20ee0a03b9a"}, + {file = "tqdm-4.56.0-py2.py3-none-any.whl", hash = "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a"}, + {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, ] typed-ast = [ {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, @@ -1985,8 +2033,8 @@ urllib3 = [ {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, ] virtualenv = [ - {file = "virtualenv-20.2.2-py2.py3-none-any.whl", hash = "sha256:54b05fc737ea9c9ee9f8340f579e5da5b09fb64fd010ab5757eb90268616907c"}, - {file = "virtualenv-20.2.2.tar.gz", hash = "sha256:b7a8ec323ee02fb2312f098b6b4c9de99559b462775bc8fe3627a73706603c1b"}, + {file = "virtualenv-20.4.0-py2.py3-none-any.whl", hash = "sha256:227a8fed626f2f20a6cdb0870054989f82dd27b2560a911935ba905a2a5e0034"}, + {file = "virtualenv-20.4.0.tar.gz", hash = "sha256:219ee956e38b08e32d5639289aaa5bd190cfbe7dafcb8fa65407fca08e808f9c"}, ] wand = [ {file = "Wand-0.6.5-py2.py3-none-any.whl", hash = "sha256:473af4a143d2c87693cc43dbd6f64d91ccfd7f0506cf4da53851cd34f114b39d"}, diff --git a/pyproject.toml b/pyproject.toml index 79fcc45..258b5b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ pycryptodome = "^3.9.9" sortedcontainers = "^2.3.0" pillow = "^8.1.0" unicodecsv = "^0.14.1" -wand = "^0.6.5" +python-poppler = "^0.2.2" # optional deps for docs, needed to make RTD work with pyproject.toml # see https://github.com/readthedocs/readthedocs.org/issues/4912#issuecomment-664002569 From 817b63bc16593bad23cc7c077dff4a4520b4acb4 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Thu, 21 Jan 2021 12:48:57 +0100 Subject: [PATCH 02/13] Added test case for example code --- tests/test_poppler_pillow.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/test_poppler_pillow.py diff --git a/tests/test_poppler_pillow.py b/tests/test_poppler_pillow.py new file mode 100644 index 0000000..737bbe5 --- /dev/null +++ b/tests/test_poppler_pillow.py @@ -0,0 +1,7 @@ +"""Test case for Github Actions to test the poppler/pillow solution on all OS and Python versions.""" + + +def test_run_poppler_pillow_example(): + """Import executes the code directly.""" + from examples import poppler_pillow # pylint: disable=import-outside-toplevel + del poppler_pillow From 1a03e29b1b7ccdb902628969bd4c370b1c0d9b64 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Thu, 21 Jan 2021 13:36:28 +0100 Subject: [PATCH 03/13] Added installing poppler-utils for ubuntu --- .github/workflows/tox.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index e616bd9..7fb2876 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -23,6 +23,11 @@ jobs: with: python-version: ${{ join(matrix.python-version, '.') }} + - name: Install poppler-utils for ubuntu-latest + run: | + sudo apt install poppler-utils + if: matrix.os == 'ubuntu-latest' + - name: Copy policy file for ubuntu-latest (needed to use ImageMagic in visual debugging tox tests) run: | sudo cp .github/workflows/policy.xml /etc/ImageMagick-6/policy.xml From 70897398b52d5f68d8a33700df8460c10f5913af Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 10:24:28 +0100 Subject: [PATCH 04/13] Added libpoppler-cpp-dev to ubuntu-latest --- .github/workflows/tox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index 7fb2876..b054010 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -23,9 +23,9 @@ jobs: with: python-version: ${{ join(matrix.python-version, '.') }} - - name: Install poppler-utils for ubuntu-latest + - name: Install libpoppler-cpp-dev for ubuntu-latest run: | - sudo apt install poppler-utils + sudo apt install libpoppler-cpp-dev if: matrix.os == 'ubuntu-latest' - name: Copy policy file for ubuntu-latest (needed to use ImageMagic in visual debugging tox tests) From f39239889deafb10a2dce18e65aa57142e645633 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 10:29:39 +0100 Subject: [PATCH 05/13] Added libpoppler to flake8_pylint_docs_black --- .github/workflows/tox.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index b054010..d15d840 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -57,6 +57,11 @@ jobs: with: python-version: 3.8 + - name: Install libpoppler-cpp-dev for ubuntu-latest + run: | + sudo apt install libpoppler-cpp-dev + if: matrix.os == 'ubuntu-latest' + - name: Install poetry and tox run: | python -m pip install poetry tox From 83f2596ab24a761111986cb173a50f18b1dc89ef Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 10:37:36 +0100 Subject: [PATCH 06/13] Fix libpoppler-cpp-dev install --- .github/workflows/tox.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index d15d840..a56f251 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -57,10 +57,9 @@ jobs: with: python-version: 3.8 - - name: Install libpoppler-cpp-dev for ubuntu-latest + - name: Install libpoppler-cpp-dev run: | sudo apt install libpoppler-cpp-dev - if: matrix.os == 'ubuntu-latest' - name: Install poetry and tox run: | From 2dc388c4f51381a854d11b8c888aefca84a5ac13 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 10:56:40 +0100 Subject: [PATCH 07/13] Fixed black issue --- tests/test_poppler_pillow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_poppler_pillow.py b/tests/test_poppler_pillow.py index 737bbe5..3a7a320 100644 --- a/tests/test_poppler_pillow.py +++ b/tests/test_poppler_pillow.py @@ -4,4 +4,5 @@ def test_run_poppler_pillow_example(): """Import executes the code directly.""" from examples import poppler_pillow # pylint: disable=import-outside-toplevel + del poppler_pillow From 9f70823b418fce7de2c36ede24985bdaf67330f9 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 10:57:08 +0100 Subject: [PATCH 08/13] flake8: ignored B902 warning pylint handles it --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index a625692..694d65a 100644 --- a/tox.ini +++ b/tox.ini @@ -71,6 +71,7 @@ ignore= P101 # flake8-string-format: format string does contain unindexed parameters W503 # line break before binary operator (black prefers this style) RST304 # Unknown interpreted text role (comes up often for ref, class) + B902 # blind except Exception: statement (using pylint for this) [pytest] testpaths = tests From 23e68c930d9cfd164a463925ef13c2ce6744e1ea Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 11:03:54 +0100 Subject: [PATCH 09/13] Split the matrix into the various OS Single OS builds shall not stop the other OS builds. Failing often occurs due to a structural problem on one OS. --- .github/workflows/tox.yml | 54 +++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index a56f251..67b9193 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -7,13 +7,37 @@ on: branches: [ master ] jobs: - pytest: + + pytest-windows: + + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [[3,6], [3,7], [3,8], [3,9]] + os: [windows-latest] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ join(matrix.python-version, '.') }} + uses: actions/setup-python@v2 + with: + python-version: ${{ join(matrix.python-version, '.') }} + + - name: Install poetry and tox + run: | + python -m pip install poetry tox + - name: Run tox env pytest + run: | + tox -e py${{ join(matrix.python-version, '') }} + + pytest-linux: runs-on: ${{ matrix.os }} strategy: matrix: python-version: [[3,6], [3,7], [3,8], [3,9]] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest] steps: - uses: actions/checkout@v2 @@ -26,17 +50,37 @@ jobs: - name: Install libpoppler-cpp-dev for ubuntu-latest run: | sudo apt install libpoppler-cpp-dev - if: matrix.os == 'ubuntu-latest' - name: Copy policy file for ubuntu-latest (needed to use ImageMagic in visual debugging tox tests) run: | sudo cp .github/workflows/policy.xml /etc/ImageMagick-6/policy.xml - if: matrix.os == 'ubuntu-latest' + + - name: Install poetry and tox + run: | + python -m pip install poetry tox + - name: Run tox env pytest + run: | + tox -e py${{ join(matrix.python-version, '') }} + + pytest-macos: + + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [[3,6], [3,7], [3,8], [3,9]] + os: [macos-latest] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ join(matrix.python-version, '.') }} + uses: actions/setup-python@v2 + with: + python-version: ${{ join(matrix.python-version, '.') }} - name: Install ImageMagick on macos-latest run: | brew install freetype imagemagick - if: matrix.os == 'macos-latest' - name: Install poetry and tox run: | From 162d9e33b1aaec82f1be531f9374b4da973e7221 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 11:11:43 +0100 Subject: [PATCH 10/13] Added msbuild setup for windows --- .github/workflows/tox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index 67b9193..afc4715 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -19,6 +19,9 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Setup MSBuild.exe + uses: warrenbuckley/Setup-MSBuild@v1 + - name: Set up Python ${{ join(matrix.python-version, '.') }} uses: actions/setup-python@v2 with: From d45fd4dd1b76c96381b9093b820d4ff2d236cbe8 Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 11:12:54 +0100 Subject: [PATCH 11/13] Added install poppler to macos --- .github/workflows/tox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index afc4715..48bd74e 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -83,7 +83,7 @@ jobs: - name: Install ImageMagick on macos-latest run: | - brew install freetype imagemagick + brew install freetype imagemagick poppler - name: Install poetry and tox run: | From 91984770e40d05376f7b38fd23cf4b8e6958dd3f Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 11:42:53 +0100 Subject: [PATCH 12/13] Change msbuild provider to MS --- .github/workflows/tox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index 48bd74e..e91f4a2 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -19,8 +19,8 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Setup MSBuild.exe - uses: warrenbuckley/Setup-MSBuild@v1 + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 - name: Set up Python ${{ join(matrix.python-version, '.') }} uses: actions/setup-python@v2 From 5d3b423324ebfc76cc84f58657dc9c1eff9ad83d Mon Sep 17 00:00:00 2001 From: Marco Heinemann Date: Fri, 22 Jan 2021 11:51:52 +0100 Subject: [PATCH 13/13] Removed empty lines --- .github/workflows/tox.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index e91f4a2..a1449b1 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -9,7 +9,6 @@ on: jobs: pytest-windows: - runs-on: ${{ matrix.os }} strategy: matrix: @@ -35,7 +34,6 @@ jobs: tox -e py${{ join(matrix.python-version, '') }} pytest-linux: - runs-on: ${{ matrix.os }} strategy: matrix: @@ -66,7 +64,6 @@ jobs: tox -e py${{ join(matrix.python-version, '') }} pytest-macos: - runs-on: ${{ matrix.os }} strategy: matrix: @@ -93,7 +90,6 @@ jobs: tox -e py${{ join(matrix.python-version, '') }} flake8_pylint_docs_black: - runs-on: ubuntu-latest steps: