From 250d8356cd48c737690896c929d758e7ccd3d3e4 Mon Sep 17 00:00:00 2001 From: deeplow Date: Fri, 15 Dec 2023 12:50:30 +0000 Subject: [PATCH] Hash-verify container pip install & merge build-image Ensure that when the container image is installing pymupdf (unavailable in the repos) with verified hashes. To do so, it has the pymupdf dependency declared in a "container" group in `pyproject.toml`, which then gets exported into a requirements.txt, which is then used for hash-verification when building the container. Because this required modifying the container image build scripts, they were all merged to avoid duplicate code. This was an overdue change anyways. --- .github/workflows/ci.yml | 2 +- .gitignore | 1 + BUILD.md | 8 ++-- Dockerfile | 7 ++- RELEASE.md | 4 +- dev_scripts/qa.py | 10 ++-- install/common/build-image.py | 85 ++++++++++++++++++++++++++++++++++ install/linux/build-image.sh | 14 ------ install/macos/build-image.sh | 14 ------ install/windows/build-image.py | 60 ------------------------ poetry.lock | 77 ++++++++++++++++-------------- pyproject.toml | 5 +- 12 files changed, 148 insertions(+), 139 deletions(-) create mode 100644 install/common/build-image.py delete mode 100755 install/linux/build-image.sh delete mode 100755 install/macos/build-image.sh delete mode 100644 install/windows/build-image.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ac8c04..966ae2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,7 +63,7 @@ jobs: build-dev - name: Build Dangerzone image - run: ./install/linux/build-image.sh + run: python3 ./install/common/build-image.py - name: Build Dangerzone .deb run: | diff --git a/.gitignore b/.gitignore index 450565d..0a71e01 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ install/windows/Dangerzone.wxs share/container.tar share/container.tar.gz share/image-id.txt +container/container-pip-requirements.txt \ No newline at end of file diff --git a/BUILD.md b/BUILD.md index 8c3c84a..f393d55 100644 --- a/BUILD.md +++ b/BUILD.md @@ -41,7 +41,7 @@ poetry install Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Run from source tree: @@ -96,7 +96,7 @@ poetry install Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Run from source tree: @@ -292,7 +292,7 @@ brew install create-dmg Build the dangerzone container image: ```sh -./install/macos/build-image.sh +python3 ./install/common/build-image.py ``` Run from source tree: @@ -353,7 +353,7 @@ poetry install Build the dangerzone container image: ```sh -python .\install\windows\build-image.py +python3 .\install\common\build-image.py ``` After that you can launch dangerzone during development with: diff --git a/Dockerfile b/Dockerfile index 35f2532..a337f55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,7 @@ FROM alpine:latest ARG TESSDATA_CHECKSUM=d0e3bb6f3b4e75748680524a1d116f2bfb145618f8ceed55b279d15098a530f9 ARG H2ORESTART_CHECKSUM=5db816a1e57b510456633f55e693cb5ef3675ef8b35df4f31c90ab9d4c66071a +ARG REQUIREMENTS_TXT # Install dependencies RUN apk --no-cache -U upgrade && \ @@ -16,9 +17,11 @@ RUN apk --no-cache -U upgrade && \ tesseract-ocr \ font-noto-cjk +# Install PyMuPDF via hash-checked requirements file +COPY ${REQUIREMENTS_TXT} /tmp/requirements.txt RUN apk --no-cache add --virtual .builddeps g++ gcc make python3-dev py3-pip \ - && pip install --break-system-packages --upgrade PyMuPDF \ - && apk del .builddeps # FIXME freeze w/ hashes + && pip install --break-system-packages --require-hashes -r /tmp/requirements.txt \ + && apk del .builddeps # Download the trained models from the latest GitHub release of Tesseract, and # store them under /usr/share/tessdata. This is basically what distro packages diff --git a/RELEASE.md b/RELEASE.md index e5ac210..6ed60e2 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -309,7 +309,7 @@ cd dangerzone Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Create a .deb: @@ -341,7 +341,7 @@ cd dangerzone Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Create a .rpm: diff --git a/dev_scripts/qa.py b/dev_scripts/qa.py index b57e50e..b923985 100755 --- a/dev_scripts/qa.py +++ b/dev_scripts/qa.py @@ -237,7 +237,7 @@ poetry install Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Run from source tree: @@ -293,7 +293,7 @@ poetry install Build the latest container: ```sh -./install/linux/build-image.sh +python3 ./install/common/build-image.py ``` Run from source tree: @@ -351,7 +351,7 @@ poetry install Build the dangerzone container image: ```sh -python .\install\windows\build-image.py +python3 .\install\common\build-image.py ``` After that you can launch dangerzone during development with: @@ -723,7 +723,7 @@ class QAWindows(QABase): @QABase.task("Build Dangerzone container image", ref=REF_BUILD, auto=True) def build_image(self): - self.run("python", r".\install\windows\build-image.py") + self.run("python", r".\install\common\build-image.py") @classmethod def get_id(cls): @@ -782,7 +782,7 @@ class QALinux(QABase): @QABase.task("Build Dangerzone image", ref="REF_BUILD", auto=True) def build_container_image(self): - self.shell_run("./install/linux/build-image.sh") + self.shell_run("python3 ./install/common/build-image.py") # FIXME: We need to automate this part, simply by checking that the created # image is in `share/image-id.txt`. self.prompt("Ensure that the environment uses the created image") diff --git a/install/common/build-image.py b/install/common/build-image.py new file mode 100644 index 0000000..08fc01a --- /dev/null +++ b/install/common/build-image.py @@ -0,0 +1,85 @@ +import gzip +import os +import platform +import subprocess +from pathlib import Path + +BUILD_CONTEXT = "dangerzone/" +TAG = "dangerzone.rocks/dangerzone:latest" +REQUIREMENTS_TXT = "container-pip-requirements.txt" +if platform.system() in ["Darwin", "Windows"]: + CONTAINER_RUNTIME = "docker" +elif platform.system() == "Linux": + CONTAINER_RUNTIME = "podman" + + +def main(): + print("exporting container pip dependencies") + export_container_pip_dependencies() + + print("Building container image") + subprocess.run( + [ + CONTAINER_RUNTIME, + "build", + "--pull", + BUILD_CONTEXT, + "--build-arg", + f"REQUIREMENTS_TXT={REQUIREMENTS_TXT}", + "-f", + "Dockerfile", + "--tag", + TAG, + ] + ) + + print("Saving container image") + cmd = subprocess.Popen( + [ + CONTAINER_RUNTIME, + "save", + TAG, + ], + stdout=subprocess.PIPE, + ) + + print("Compressing container image") + chunk_size = 4 << 12 + with gzip.open("share/container.tar.gz", "wb") as gzip_f: + while True: + chunk = cmd.stdout.read(chunk_size) + if len(chunk) > 0: + gzip_f.write(chunk) + else: + break + + cmd.wait(5) + + print("Looking up the image id") + image_id = subprocess.check_output( + [ + CONTAINER_RUNTIME, + "image", + "list", + "--format", + "{{.ID}}", + TAG, + ], + text=True, + ) + with open("share/image-id.txt", "w") as f: + f.write(image_id) + + +def export_container_pip_dependencies(): + container_requirements_txt = subprocess.check_output( + ["poetry", "export", "--only", "container"], universal_newlines=True + ) + # XXX Export container dependencies and exclude pymupdfb since it is not needed in container + req_txt_pymupdfb_stripped = container_requirements_txt.split("pymupdfb")[0] + with open(Path(BUILD_CONTEXT) / REQUIREMENTS_TXT, "w") as f: + f.write(req_txt_pymupdfb_stripped) + + +if __name__ == "__main__": + main() diff --git a/install/linux/build-image.sh b/install/linux/build-image.sh deleted file mode 100755 index 8470ebb..0000000 --- a/install/linux/build-image.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -set -e - -TAG=dangerzone.rocks/dangerzone:latest - -echo "Building container image" -podman build --pull dangerzone/ -f Dockerfile --tag $TAG - -echo "Saving and compressing container image" -podman save $TAG | gzip > share/container.tar.gz - -echo "Looking up the image id" -podman images -q --filter=reference=$TAG > share/image-id.txt diff --git a/install/macos/build-image.sh b/install/macos/build-image.sh deleted file mode 100755 index 29e462b..0000000 --- a/install/macos/build-image.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -set -e - -TAG=dangerzone.rocks/dangerzone:latest - -echo "Building container image" -docker build --pull dangerzone/ -f Dockerfile --tag $TAG - -echo "Saving and compressing container image" -docker save $TAG | gzip > share/container.tar.gz - -echo "Looking up the image id" -docker images -q --filter=reference=$TAG > share/image-id.txt diff --git a/install/windows/build-image.py b/install/windows/build-image.py deleted file mode 100644 index 92c2581..0000000 --- a/install/windows/build-image.py +++ /dev/null @@ -1,60 +0,0 @@ -import gzip -import os -import subprocess - - -def main(): - print("Building container image") - subprocess.run( - [ - "docker", - "build", - "--pull", - "dangerzone/", - "-f", - "Dockerfile", - "--tag", - "dangerzone.rocks/dangerzone:latest", - ] - ) - - print("Saving container image") - cmd = subprocess.Popen( - [ - "docker", - "save", - "dangerzone.rocks/dangerzone:latest", - ], - stdout=subprocess.PIPE, - ) - - print("Compressing container image") - chunk_size = 4 << 12 - with gzip.open("share/container.tar.gz", "wb") as gzip_f: - while True: - chunk = cmd.stdout.read(chunk_size) - if len(chunk) > 0: - gzip_f.write(chunk) - else: - break - - cmd.wait(5) - - print("Looking up the image id") - image_id = subprocess.check_output( - [ - "docker", - "image", - "list", - "--format", - "{{.ID}}", - "dangerzone.rocks/dangerzone:latest", - ], - text=True, - ) - with open("share/image-id.txt", "w") as f: - f.write(image_id) - - -if __name__ == "__main__": - main() diff --git a/poetry.lock b/poetry.lock index bda5854..5dae30e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -667,55 +667,60 @@ files = [ [[package]] name = "pymupdf" -version = "1.23.8" +version = "1.23.6" description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." optional = false python-versions = ">=3.8" files = [ - {file = "PyMuPDF-1.23.8-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:34dbdddd71ccb494a8e729580acf895febcbfd6681d6f85403e8ead665a01016"}, - {file = "PyMuPDF-1.23.8-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:74f1d35a6b2cdbb45bb3e8d14336a4afc227e7339ce1b632aa29ace49313bfe6"}, - {file = "PyMuPDF-1.23.8-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:03985273a69bb980ae5640ac8e1e193b53a61a175bb446ee7fabc78fd9409a71"}, - {file = "PyMuPDF-1.23.8-cp310-none-win32.whl", hash = "sha256:099ec6b82f7082731c966f9d2874d5638884e864e31d4b50b1ad3b0954497399"}, - {file = "PyMuPDF-1.23.8-cp310-none-win_amd64.whl", hash = "sha256:a3b54705c152f60c7b8abea40253731caa7aebc5c10e5547e8d12f93546c5b1e"}, - {file = "PyMuPDF-1.23.8-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:4f62b2940d88ffcc706c1a5d21efa24a01b65d1c87f0d4669d03b136c984098b"}, - {file = "PyMuPDF-1.23.8-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:58ab6e7121550767ff4e595800317c9acc8d5c1a3ddaf9116f257bb8159af501"}, - {file = "PyMuPDF-1.23.8-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:ed917f7b66c332e5fb6bcda2dcb71b6eddeca24e4d0ea7984e0cb3628fbee894"}, - {file = "PyMuPDF-1.23.8-cp311-none-win32.whl", hash = "sha256:dec10e23b2dd813fe75d60db0af38b4b640ad6066cb57afe3536273d8740d15e"}, - {file = "PyMuPDF-1.23.8-cp311-none-win_amd64.whl", hash = "sha256:9d272e46cd08e65c5811ad9be84bf4fd5f559e538eae87694d5a4685585c633e"}, - {file = "PyMuPDF-1.23.8-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:e083fbd3a6c1292ddd564cf7187cf0a333ef79c73afb31532e0b26129df3d3b4"}, - {file = "PyMuPDF-1.23.8-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:fde13b2e5233a77e2b27e80e83d4f8ae3532e77f4870233e62d09b2c0349389c"}, - {file = "PyMuPDF-1.23.8-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:157518a1f595ff469423f3e867a53468137a43d97041d624d72aab44eea28c67"}, - {file = "PyMuPDF-1.23.8-cp312-none-win32.whl", hash = "sha256:8e6dcb03473058022354de687a6264309b27582e140eea0688bc96529c27228b"}, - {file = "PyMuPDF-1.23.8-cp312-none-win_amd64.whl", hash = "sha256:07947f0e1e7439ceb244009ec27c23a6cf44f5ac6c39c23259ea64f54af37acc"}, - {file = "PyMuPDF-1.23.8-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:d6cda66e13d2aaf2db081db63be852379b27636e46a8e0384983696ac4719de8"}, - {file = "PyMuPDF-1.23.8-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:238aff47b54cb36b0b0ad2f3dedf19b17a457064c78fc239a4529cc61f5fdbf3"}, - {file = "PyMuPDF-1.23.8-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:c3b7fabd4ffad84a25c1daf2074deae1c129ce77a390a2d37598ecbc6f2b0bc8"}, - {file = "PyMuPDF-1.23.8-cp38-none-win32.whl", hash = "sha256:2b20ec14018ca81243d4386da538d208c8969cb441dabed5fd2a5bc52863e18c"}, - {file = "PyMuPDF-1.23.8-cp38-none-win_amd64.whl", hash = "sha256:809eb5633bb3851a535a66a96212123289a6adf54b5cd187d50233a056740afd"}, - {file = "PyMuPDF-1.23.8-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:129369a2981725841824d8c2369800b0cfb4e88b57d58ef512c3bbeeb43968c4"}, - {file = "PyMuPDF-1.23.8-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8e745754a9ffcd4475cd077c6423b02c77f5c98dd654c613511def033608c430"}, - {file = "PyMuPDF-1.23.8-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:b6fa6c229e0dd83b8edf9a36952c41508ee6736dfa9ab706e3c9f5fb0953b214"}, - {file = "PyMuPDF-1.23.8-cp39-none-win32.whl", hash = "sha256:e96badb750f9952978615d0c61297f5bb7af718c9c318a09d70b8ba6e03c8cd8"}, - {file = "PyMuPDF-1.23.8-cp39-none-win_amd64.whl", hash = "sha256:4cca014862818330acdb4aa14ce7a792cb9e8cf3e81446340664c1af87dcb57c"}, - {file = "PyMuPDF-1.23.8.tar.gz", hash = "sha256:d8d60fded2a9b72b3535940bbee2066e4927cfaf66e1179f1bb06a8fdda6d4af"}, + {file = "PyMuPDF-1.23.6-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:c4eb71b88a22c1008f764b3121b36a9d25340f9920b870508356050a365d9ca1"}, + {file = "PyMuPDF-1.23.6-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:3ce2d3678dbf822cff213b1902f2e59756313e543efd516a2b4f15bb0353bd6c"}, + {file = "PyMuPDF-1.23.6-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:2e27857a15c8a810d0b66455b8c8a79013640b6267a9b4ea808a5fe1f47711f2"}, + {file = "PyMuPDF-1.23.6-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:5cd05700c8f18c9dafef63ac2ed3b1099ca06017ca0c32deea13093cea1b8671"}, + {file = "PyMuPDF-1.23.6-cp310-none-win32.whl", hash = "sha256:951d280c1daafac2fd6a664b031f7f98b27eb2def55d39c92a19087bd8041c5d"}, + {file = "PyMuPDF-1.23.6-cp310-none-win_amd64.whl", hash = "sha256:19d1711d5908c4527ad2deef5af2d066649f3f9a12950faf30be5f7251d18abc"}, + {file = "PyMuPDF-1.23.6-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:3f0f9b76bc4f039e7587003cbd40684d93a98441549dd033cab38ca07d61988d"}, + {file = "PyMuPDF-1.23.6-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e047571d799b30459ad7ee0bc6e68900a7f6b928876f956c976f279808814e72"}, + {file = "PyMuPDF-1.23.6-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:1cbcf05c06f314fdf3042ceee674e9a0ac7fae598347d5442e2138c6046d4e82"}, + {file = "PyMuPDF-1.23.6-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:e33f8ec5ba7265fe78b30332840b8f454184addfa79f9c27f160f19789aa5ffd"}, + {file = "PyMuPDF-1.23.6-cp311-none-win32.whl", hash = "sha256:2c141f33e2733e48de8524dfd2de56d889feef0c7773b20a8cd216c03ab24793"}, + {file = "PyMuPDF-1.23.6-cp311-none-win_amd64.whl", hash = "sha256:8fd9c4ee1dd4744a515b9190d8ba9133348b0d94c362293ed77726aa1c13b0a6"}, + {file = "PyMuPDF-1.23.6-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:4d06751d5cd213e96f84f2faaa71a51cf4d641851e07579247ca1190121f173b"}, + {file = "PyMuPDF-1.23.6-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:526b26a5207e923aab65877ad305644402851823a352cb92d362053426899354"}, + {file = "PyMuPDF-1.23.6-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:0f852d125defc26716878b1796f4d68870e9065041d00cf46bde317fd8d30e68"}, + {file = "PyMuPDF-1.23.6-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:5bdf7020b90987412381acc42427dd1b7a03d771ee9ec273de003e570164ec1a"}, + {file = "PyMuPDF-1.23.6-cp312-none-win32.whl", hash = "sha256:e2d64799c6d9a3735be9e162a5d11061c0b7fbcb1e5fc7446e0993d0f815a93a"}, + {file = "PyMuPDF-1.23.6-cp312-none-win_amd64.whl", hash = "sha256:c8ea81964c1433ea163ad4b53c56053a87a9ef6e1bd7a879d4d368a3988b60d1"}, + {file = "PyMuPDF-1.23.6-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:761501a4965264e81acdd8f2224f993020bf24474e9b34fcdb5805a6826eda1c"}, + {file = "PyMuPDF-1.23.6-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:fd8388e82b6045807d19addf310d8119d32908e89f76cc8bbf8cf1ec36fce947"}, + {file = "PyMuPDF-1.23.6-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:4ac9673a6d6ee7e80cb242dacb43f9ca097b502d9c5e44687dbdffc2bce7961a"}, + {file = "PyMuPDF-1.23.6-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:6e319c1f49476e07b9a12017c2d031687617713f8a46b7adcec03c636ed04607"}, + {file = "PyMuPDF-1.23.6-cp38-none-win32.whl", hash = "sha256:1103eea4ab727e32b9cb93347b35f71562033018c333a7f3a17d115e980fea4a"}, + {file = "PyMuPDF-1.23.6-cp38-none-win_amd64.whl", hash = "sha256:991a37e1cba43775ce094da87cf0bf72172a5532a09644003276bc8bfdfe9f1a"}, + {file = "PyMuPDF-1.23.6-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:57725e15872f7ab67a9fb3e06e5384d1047b2121e85755c93a6d4266d3ca8983"}, + {file = "PyMuPDF-1.23.6-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:224c341fe254adda97c8f06a4c5838cdbcf609fa89e70b1fb179752533378f2f"}, + {file = "PyMuPDF-1.23.6-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:271bdf6059bb8347f9c9c6b721329bd353a933681b1fc62f43241b410e7ab7ae"}, + {file = "PyMuPDF-1.23.6-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:57e22bea69690450197b34dcde16bd9fe0265ac4425b4033535ccc5c044246fb"}, + {file = "PyMuPDF-1.23.6-cp39-none-win32.whl", hash = "sha256:2885a26220a32fb45ea443443b72194bb7107d6862d8d546b59e4ad0c8a1f2c9"}, + {file = "PyMuPDF-1.23.6-cp39-none-win_amd64.whl", hash = "sha256:361cab1be45481bd3dc4e00ec82628ebc189b4f4b6fd9bd78a00cfeed54e0034"}, + {file = "PyMuPDF-1.23.6.tar.gz", hash = "sha256:618b8e884190ac1cca9df1c637f87669d2d532d421d4ee7e4763c848dc4f3a1e"}, ] [package.dependencies] -PyMuPDFb = "1.23.7" +PyMuPDFb = "1.23.6" [[package]] name = "pymupdfb" -version = "1.23.7" +version = "1.23.6" description = "MuPDF shared libraries for PyMuPDF." optional = false python-versions = ">=3.8" files = [ - {file = "PyMuPDFb-1.23.7-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:3fddd302121a2109c31d0b2d554ef4afc426b67baa60221daf1bc277951ae4ef"}, - {file = "PyMuPDFb-1.23.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:aef672f303691904c8951f811f5de3e2ba09d1804571a7f002145ed535cedbdd"}, - {file = "PyMuPDFb-1.23.7-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ca5a93fac4777f1d2de61fec2e0b96cf649c75bd60bc44f6b6547f8aaccb8a70"}, - {file = "PyMuPDFb-1.23.7-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adb43972f75500fae50279919d589a49b91ed7a74ec03e811c5000727dd63cea"}, - {file = "PyMuPDFb-1.23.7-py3-none-win32.whl", hash = "sha256:f65e6dbf48daa2348ae708d76ed8310cc5eb9fc78eb335c5cade5dcaa3d52979"}, - {file = "PyMuPDFb-1.23.7-py3-none-win_amd64.whl", hash = "sha256:7552793efa6976574b8b7840fd0091773c410e6048bc7cbf4b2eb3ed92d0b7a5"}, + {file = "PyMuPDFb-1.23.6-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:e5af77580aad3d1103aeec57009d156bfca429cecda14a17c573fcbe97bafb30"}, + {file = "PyMuPDFb-1.23.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9925816cbe3e05e920f9be925e5752c2eef42b793885b62075bb0f6a69178598"}, + {file = "PyMuPDFb-1.23.6-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:009e2cff166059e13bf71f93919e688f46b8fc11d122433574cfb0cc9134690e"}, + {file = "PyMuPDFb-1.23.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7132b30e6ad6ff2013344e3a481b2287fe0be3710d80694807dd6e0d8635f085"}, + {file = "PyMuPDFb-1.23.6-py3-none-win32.whl", hash = "sha256:9d24ddadc204e895bee5000ddc7507c801643548e59f5a56aad6d32981d17eeb"}, + {file = "PyMuPDFb-1.23.6-py3-none-win_amd64.whl", hash = "sha256:7bef75988e6979b10ca804cf9487f817aae43b0fff1c6e315b3b9ee0cf1cc32f"}, ] [[package]] @@ -1032,4 +1037,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "4acc82ad80de4f49f087fe51229efbf5fa5c657a34c1099d1d3362e3e2b668c8" +content-hash = "03520c6992b44c693148266b3ad875976d9161dcb19c74c57e0deb1c414a5f96" diff --git a/pyproject.toml b/pyproject.toml index 9297e53..3cf5354 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,10 @@ pytest-cov = "^3.0.0" strip-ansi = "*" [tool.poetry.group.qubes.dependencies] -pymupdf = "^1.23.7" +pymupdf = "^1.23.6" + +[tool.poetry.group.container.dependencies] +pymupdf = "1.23.6" [tool.isort] profile = "black"