diff --git a/.github/ISSUE_TEMPLATE/bug_report_linux.yml b/.github/ISSUE_TEMPLATE/bug_report_linux.yml index 1ab1ea9..89de676 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_linux.yml +++ b/.github/ISSUE_TEMPLATE/bug_report_linux.yml @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - Hi, and thanks for taking the time to open this bug report. + Hi, and thanks for taking the time to open this bug report. - type: textarea id: what-happened attributes: @@ -21,7 +21,7 @@ body: label: Linux distribution description: | What is the name and version of your Linux distribution? You can find it out with `cat /etc/os-release` - placeholder: Ubuntu 20.04.6 LTS + placeholder: Ubuntu 22.04.5 LTS validations: required: true - type: textarea diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 108cb37..cd888a8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,8 +33,6 @@ jobs: strategy: matrix: include: - - distro: ubuntu - version: "20.04" - distro: ubuntu version: "22.04" - distro: ubuntu diff --git a/.github/workflows/check_repos.yml b/.github/workflows/check_repos.yml index a6ef5e9..1992449 100644 --- a/.github/workflows/check_repos.yml +++ b/.github/workflows/check_repos.yml @@ -25,8 +25,6 @@ jobs: version: "24.04" # noble - distro: ubuntu version: "22.04" # jammy - - distro: ubuntu - version: "20.04" # focal - distro: debian version: "trixie" # 13 - distro: debian @@ -34,18 +32,6 @@ jobs: - distro: debian version: "11" # bullseye steps: - - name: Add Podman repo for Ubuntu Focal - if: matrix.distro == 'ubuntu' && matrix.version == 20.04 - run: | - apt-get update && apt-get -y install curl wget gnupg2 - . /etc/os-release - sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' \ - > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" - wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O- \ - | apt-key add - - apt update - apt-get install python-all -y - - name: Add packages.freedom.press PGP key (gpg) if: matrix.version != 'trixie' run: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c2d0ad..fc89978 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,8 +186,6 @@ jobs: strategy: matrix: include: - - distro: ubuntu - version: "20.04" - distro: ubuntu version: "22.04" - distro: ubuntu @@ -255,8 +253,6 @@ jobs: strategy: matrix: include: - - distro: ubuntu - version: "20.04" - distro: ubuntu version: "22.04" - distro: ubuntu @@ -383,8 +379,6 @@ jobs: strategy: matrix: include: - - distro: ubuntu - version: "20.04" - distro: ubuntu version: "22.04" - distro: ubuntu diff --git a/BUILD.md b/BUILD.md index 6fc817a..4a7c51e 100644 --- a/BUILD.md +++ b/BUILD.md @@ -34,29 +34,6 @@ Install dependencies: - - - - -
-
- :memo: Expand this section if you are on Ubuntu 20.04 (Focal). -
- - The default Python version that ships with Ubuntu Focal (3.8) is not - compatible with PySide6, which requires Python 3.9 or greater. - - You can install Python 3.9 using the `python3.9` package. - - ```bash - sudo apt install -y python3.9 - ``` - - Poetry will automatically pick up the correct version when running. -
-
- - ```sh sudo apt install -y podman dh-python build-essential make libqt6gui6 \ pipx python3 python3-dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 28aa945..791abcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ since 0.4.1, and this project adheres to [Semantic Versioning](https://semver.or ## [Unreleased](https://github.com/freedomofpress/dangerzone/compare/v0.8.1...HEAD) -- +- Platform support: Drop support for Ubuntu Focal, since it's nearing end-of-life ([#1018](https://github.com/freedomofpress/dangerzone/issues/1018)) ## [0.8.1](https://github.com/freedomofpress/dangerzone/compare/v0.8.1...0.8.0) diff --git a/INSTALL.md b/INSTALL.md index a8e5d2e..32621f9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -25,7 +25,6 @@ Dangerzone is available for: - Ubuntu 24.10 (oracular) - Ubuntu 24.04 (noble) - Ubuntu 22.04 (jammy) -- Ubuntu 20.04 (focal) - Debian 13 (trixie) - Debian 12 (bookworm) - Debian 11 (bullseye) @@ -40,35 +39,7 @@ Dangerzone is available for:
- :memo: Expand this section if you are on Ubuntu 20.04 (Focal). -
- - Dangerzone requires [Podman](https://podman.io/), which is not available - through the official Ubuntu Focal repos. To proceed with the Dangerzone - installation, you need to add an extra OpenSUSE repo that provides Podman to - Ubuntu Focal users. You can follow the instructions below, which have been - copied from the [official Podman blog](https://podman.io/new/2021/06/16/new.html): - - ```bash - sudo apt-get update && sudo apt-get install curl wget gnupg2 -y - . /etc/os-release - sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' \ - > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" - wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O- \ - | sudo apt-key add - - sudo apt update - ``` - -
- - - - - - -
-
- :information_source: Backport notice for Ubuntu 24.04 (Noble) users regarding the conmon package + :information_source: Backport notice for Ubuntu 22.04 (Jammy) users regarding the conmon package
The `conmon` version that Podman uses and Ubuntu Jammy ships, has a bug diff --git a/dangerzone/gui/main_window.py b/dangerzone/gui/main_window.py index 80301e1..bb87371 100644 --- a/dangerzone/gui/main_window.py +++ b/dangerzone/gui/main_window.py @@ -55,13 +55,6 @@ about updates.

HAMBURGER_MENU_SIZE = 30 -WARNING_MESSAGE = """\ -

Warning: Ubuntu Focal systems and their derivatives will -stop being supported in subsequent Dangerzone releases. We encourage you to upgrade to a -more recent version of your operating system in order to get security updates.

-""" - - def load_svg_image(filename: str, width: int, height: int) -> QtGui.QPixmap: """Load an SVG image from a filename. @@ -192,6 +185,9 @@ class MainWindow(QtWidgets.QMainWindow): header_layout.addWidget(self.hamburger_button) header_layout.addSpacing(15) + # Content widget, contains all the window content except waiting widget + self.content_widget = ContentWidget(self.dangerzone) + if self.dangerzone.isolation_provider.should_wait_install(): # Waiting widget replaces content widget while container runtime isn't available self.waiting_widget: WaitingWidget = WaitingWidgetContainer(self.dangerzone) @@ -201,9 +197,6 @@ class MainWindow(QtWidgets.QMainWindow): self.waiting_widget = WaitingWidget() self.dangerzone.is_waiting_finished = True - # Content widget, contains all the window content except waiting widget - self.content_widget = ContentWidget(self.dangerzone) - # Only use the waiting widget if container runtime isn't available if self.dangerzone.is_waiting_finished: self.waiting_widget.hide() @@ -626,17 +619,6 @@ class ContentWidget(QtWidgets.QWidget): self.dangerzone = dangerzone self.conversion_started = False - self.warning_label = None - if platform.system() == "Linux": - # Add the warning message only for ubuntu focal - os_release_path = Path("/etc/os-release") - if os_release_path.exists(): - os_release = os_release_path.read_text() - if "Ubuntu 20.04" in os_release or "focal" in os_release: - self.warning_label = QtWidgets.QLabel(WARNING_MESSAGE) - self.warning_label.setWordWrap(True) - self.warning_label.setProperty("style", "warning") - # Doc selection widget self.doc_selection_widget = DocSelectionWidget(self.dangerzone) self.doc_selection_widget.documents_selected.connect(self.documents_selected) @@ -662,8 +644,6 @@ class ContentWidget(QtWidgets.QWidget): # Layout layout = QtWidgets.QVBoxLayout() - if self.warning_label: - layout.addWidget(self.warning_label) # Add warning at the top layout.addWidget(self.settings_widget, stretch=1) layout.addWidget(self.documents_list, stretch=1) layout.addWidget(self.doc_selection_wrapper, stretch=1) @@ -894,22 +874,16 @@ class SettingsWidget(QtWidgets.QWidget): self.safe_extension_name_layout.setSpacing(0) self.safe_extension_name_layout.addWidget(self.safe_extension_filename) self.safe_extension_name_layout.addWidget(self.safe_extension) - # FIXME: Workaround for https://github.com/freedomofpress/dangerzone/issues/339. - # We should drop this once we drop Ubuntu Focal support. - if hasattr(QtGui, "QRegularExpressionValidator"): - QRegEx = QtCore.QRegularExpression - QRegExValidator = QtGui.QRegularExpressionValidator - else: - QRegEx = QtCore.QRegExp # type: ignore [assignment] - QRegExValidator = QtGui.QRegExpValidator # type: ignore [assignment] - self.dot_pdf_validator = QRegExValidator(QRegEx(r".*\.[Pp][Dd][Ff]")) + self.dot_pdf_validator = QtGui.QRegularExpressionValidator( + QtCore.QRegularExpression(r".*\.[Pp][Dd][Ff]") + ) if platform.system() == "Linux": illegal_chars_regex = r"[/]" elif platform.system() == "Darwin": illegal_chars_regex = r"[\\]" else: illegal_chars_regex = r"[\"*/:<>?\\|]" - self.illegal_chars_regex = QRegEx(illegal_chars_regex) + self.illegal_chars_regex = QtCore.QRegularExpression(illegal_chars_regex) self.safe_extension_layout = QtWidgets.QHBoxLayout() self.safe_extension_layout.addWidget(self.save_checkbox) self.safe_extension_layout.addWidget(self.safe_extension_label) diff --git a/dangerzone/util.py b/dangerzone/util.py index bcad701..1fa3025 100644 --- a/dangerzone/util.py +++ b/dangerzone/util.py @@ -58,7 +58,7 @@ def get_tessdata_dir() -> pathlib.Path: pathlib.Path("/usr/share/tessdata/"), # on some Debian pathlib.Path("/usr/share/tesseract/tessdata/"), # on Fedora pathlib.Path("/usr/share/tesseract-ocr/tessdata/"), # ? (documented) - pathlib.Path("/usr/share/tesseract-ocr/4.00/tessdata/"), # on Ubuntu Focal + pathlib.Path("/usr/share/tesseract-ocr/4.00/tessdata/"), # on Debian Bullseye pathlib.Path("/usr/share/tesseract-ocr/5/tessdata/"), # on Debian Trixie ] diff --git a/dev_scripts/env.py b/dev_scripts/env.py index ff4e489..a739004 100755 --- a/dev_scripts/env.py +++ b/dev_scripts/env.py @@ -60,24 +60,6 @@ Run Dangerzone in the end-user environment: """ -# NOTE: For Ubuntu 20.04 specifically, we need to install some extra deps, mainly for -# Podman. This needs to take place both in our dev and end-user environment. See the -# corresponding note in our Installation section: -# -# https://github.com/freedomofpress/dangerzone/blob/main/INSTALL.md#ubuntu-debian -DOCKERFILE_UBUNTU_2004_DEPS = r""" -ARG DEBIAN_FRONTEND=noninteractive - -RUN apt-get update \ - && apt-get install -y python-all python3.9 curl wget gnupg2 \ - && rm -rf /var/lib/apt/lists/* -RUN . /etc/os-release \ - && sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_$VERSION_ID/ /' \ - > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" \ - && wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_$VERSION_ID/Release.key -O- \ - | apt-key add - -""" - # XXX: overcome the fact that ubuntu images (starting on 23.04) ship with the 'ubuntu' # user by default https://bugs.launchpad.net/cloud-images/+bug/2005129 # Related issue https://github.com/freedomofpress/dangerzone/pull/461 @@ -115,15 +97,7 @@ RUN apt-get update \ && apt-get install -y --no-install-recommends dh-python make build-essential \ git {qt_deps} pipx python3 python3-pip python3-venv dpkg-dev debhelper python3-setuptools \ && rm -rf /var/lib/apt/lists/* -# NOTE: `pipx install poetry` fails on Ubuntu Focal, when installed through APT. By -# installing the latest version, we sidestep this issue. -RUN bash -c 'if [[ "$(pipx --version)" < "1" ]]; then \ - apt-get update \ - && apt-get remove -y pipx \ - && apt-get install -y --no-install-recommends python3-pip \ - && pip install pipx \ - && rm -rf /var/lib/apt/lists/*; \ - else true; fi' +RUN pipx install poetry RUN apt-get update \ && apt-get install -y --no-install-recommends mupdf thunar \ && rm -rf /var/lib/apt/lists/* @@ -573,12 +547,7 @@ class Env: # See https://github.com/freedomofpress/dangerzone/issues/482 qt_deps = "libqt6gui6 libxcb-cursor0" install_deps = DOCKERFILE_BUILD_DEV_DEBIAN_DEPS - if self.distro == "ubuntu" and self.version in ("20.04", "focal"): - qt_deps = "libqt5gui5 libxcb-cursor0" # Ubuntu Focal has only Qt5. - install_deps = ( - DOCKERFILE_UBUNTU_2004_DEPS + DOCKERFILE_BUILD_DEV_DEBIAN_DEPS - ) - elif self.distro == "ubuntu" and self.version in ("22.04", "jammy"): + if self.distro == "ubuntu" and self.version in ("22.04", "jammy"): # Ubuntu Jammy misses a dependency to `libxkbcommon-x11-0`, which we can # install indirectly via `qt6-qpa-plugins`. qt_deps += " qt6-qpa-plugins" @@ -642,11 +611,7 @@ class Env: install_cmd = "dnf install -y" else: install_deps = DOCKERFILE_BUILD_DEBIAN_DEPS - if self.distro == "ubuntu" and self.version in ("20.04", "focal"): - install_deps = ( - DOCKERFILE_UBUNTU_2004_DEPS + DOCKERFILE_BUILD_DEBIAN_DEPS - ) - elif self.distro == "ubuntu" and self.version in ("22.04", "jammy"): + if self.distro == "ubuntu" and self.version in ("22.04", "jammy"): # Ubuntu Jammy requires a more up-to-date conmon # package (see https://github.com/freedomofpress/dangerzone/issues/685) install_deps = DOCKERFILE_CONMON_UPDATE + DOCKERFILE_BUILD_DEBIAN_DEPS diff --git a/dev_scripts/qa.py b/dev_scripts/qa.py index ef2b321..12526a2 100755 --- a/dev_scripts/qa.py +++ b/dev_scripts/qa.py @@ -251,29 +251,6 @@ Install dependencies:
- - - - -
-
- :memo: Expand this section if you are on Ubuntu 20.04 (Focal). -
- - The default Python version that ships with Ubuntu Focal (3.8) is not - compatible with PySide6, which requires Python 3.9 or greater. - - You can install Python 3.9 using the `python3.9` package. - - ```bash - sudo apt install -y python3.9 - ``` - - Poetry will automatically pick up the correct version when running. -
-
- - ```sh sudo apt install -y podman dh-python build-essential make libqt6gui6 \ pipx python3 python3-dev @@ -1035,11 +1012,6 @@ class QADebianTrixie(QADebianBased): VERSION = "trixie" -class QAUbuntu2004(QADebianBased): - DISTRO = "ubuntu" - VERSION = "20.04" - - class QAUbuntu2204(QADebianBased): DISTRO = "ubuntu" VERSION = "22.04" diff --git a/dodo.py b/dodo.py index 2022ffa..4584b74 100644 --- a/dodo.py +++ b/dodo.py @@ -9,7 +9,7 @@ from doit.action import CmdAction ARCH = "arm64" if platform.machine() == "arm64" else "i686" VERSION = open("share/version.txt").read().strip() FEDORA_VERSIONS = ["40", "41"] -DEBIAN_VERSIONS = ["bullseye", "focal", "jammy", "mantic", "noble", "trixie"] +DEBIAN_VERSIONS = ["bullseye", "jammy", "mantic", "noble", "trixie"] ### Global parameters diff --git a/install/linux/debian-vendor-pymupdf.py b/install/linux/debian-vendor-pymupdf.py index 9cb5ccc..8cdd66c 100755 --- a/install/linux/debian-vendor-pymupdf.py +++ b/install/linux/debian-vendor-pymupdf.py @@ -31,23 +31,6 @@ def main(): cmd = ["poetry", "export", "--only", "debian"] container_requirements_txt = subprocess.check_output(cmd) - # XXX: Hack for Ubuntu Focal. - # - # The `requirements.txt` file is generated from our `pyproject.toml` file, and thus - # specifies that the minimum Python version is 3.9. This was to accommodate to - # PySide6, which is installed in macOS / Windows via `poetry` and works with Python - # 3.9+. [1] - # - # The Python version in Ubuntu Focal though is 3.8. This generally was not much of - # an issue, since we used the package manager to install dependencies. However, it - # becomes an issue when we want to vendor the PyMuPDF package, using `pip`. In order - # to sidestep this virtual limitation, we can just change the Python version in the - # generated `requirements.txt` file in Ubuntu Focal from 3.9 to 3.8. - # - # [1] https://github.com/freedomofpress/dangerzone/pull/818 - if sys.version.startswith("3.8"): - container_requirements_txt = container_requirements_txt.replace(b"3.9", b"3.8") - logger.info(f"Vendoring PyMuPDF under '{args.dest}'") # We prefer to call the CLI version of `pip`, instead of importing it directly, as # instructed here: diff --git a/install/linux/install-podman-ubuntu-focal.sh b/install/linux/install-podman-ubuntu-focal.sh deleted file mode 100755 index 34351ec..0000000 --- a/install/linux/install-podman-ubuntu-focal.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Development script for installing Podman on Ubuntu Focal. Mainly to be used as -# part of our CI pipelines, where we may install Podman on environments that -# don't have sudo. - -set -e - -if [[ "$EUID" -ne 0 ]]; then - SUDO=sudo -else - SUDO= -fi - -provide() { - $SUDO apt-get update - $SUDO apt-get install curl wget gnupg2 -y - source /etc/os-release - $SUDO sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' \ - > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" - wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O- \ - | $SUDO apt-key add - - $SUDO apt-get update -qq -y -} - -install() { - $SUDO apt-get -qq --yes install podman - podman --version -} - -if [[ "$1" == "--repo-only" ]]; then - provide -elif [[ "$1" == "" ]]; then - provide - install -else - echo "Unexpected argument: $1" - echo "Usage: $0 [--repo-only]" - exit 1 -fi diff --git a/poetry.lock b/poetry.lock index 2b28f93..c50550e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -486,13 +486,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] [package.dependencies] @@ -831,19 +831,18 @@ setuptools = ">=42.0.0" [[package]] name = "pymupdf" -version = "1.24.11" +version = "1.25.3" description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "PyMuPDF-1.24.11-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:24c35ba9e731027ff24566b90d4986e9aac75e1ce47589b25de51e3c687ddb73"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:20c8eb65b855a33411246d6697a3f3166727fe2d8585753cf0db648730104be6"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32fd013e3c844f105c0a6a43ee82acc7cd0c900f6ff14f5eed9492840bbcbdd9"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2efb793644df99db0fe2468149048175cf25c5803997828efc9152aca838f5f2"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9b7ac5b8ec3daec17f2e830962ed091610e576a5e531d2fe28c437fbd69b1969"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-win32.whl", hash = "sha256:6fda6c7ed7e6ad74d9cfac5c3837ef42efd58c506440e2513a0a200bc3c4dbc0"}, - {file = "PyMuPDF-1.24.11-cp38-abi3-win_amd64.whl", hash = "sha256:745ce77532702d6ddeeecb47306d3669629aa5ff82708318cd652881f493b0ba"}, - {file = "PyMuPDF-1.24.11.tar.gz", hash = "sha256:6e45e57f14ac902029d4aacf07684958d0e58c769f47d9045b2048d0a3d20155"}, + {file = "pymupdf-1.25.3-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:96878e1b748f9c2011aecb2028c5f96b5a347a9a91169130ad0133053d97915e"}, + {file = "pymupdf-1.25.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:6ef753005b72ebfd23470f72f7e30f61e21b0b5e748045ec5b8f89e6e3068d62"}, + {file = "pymupdf-1.25.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46d90c4f9e62d1856e8db4b9f04a202ff4a7f086a816af73abdc86adb7f5e25a"}, + {file = "pymupdf-1.25.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5de51efdbe4d486b6c1111c84e8a231cbfb426f3d6ff31ab530ad70e6f39756"}, + {file = "pymupdf-1.25.3-cp39-abi3-win32.whl", hash = "sha256:bca72e6089f985d800596e22973f79cc08af6cbff1d93e5bda9248326a03857c"}, + {file = "pymupdf-1.25.3-cp39-abi3-win_amd64.whl", hash = "sha256:4fb357438c9129fbf939b5af85323434df64e36759c399c376b62ad6da95498c"}, + {file = "pymupdf-1.25.3.tar.gz", hash = "sha256:b640187c64c5ac5d97505a92e836da299da79c2f689f3f94a67a37a493492193"}, ] [[package]] @@ -1009,29 +1008,27 @@ test = ["Pygments (>=2.0)", "anyio", "docutils (>=0.12)", "pytest (>=4.0)", "pyt [[package]] name = "pywin32" -version = "308" +version = "309" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, - {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, - {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, - {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, - {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, - {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, - {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, - {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, - {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, - {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, - {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, - {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, - {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, - {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, - {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, - {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, - {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, - {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, + {file = "pywin32-309-cp310-cp310-win32.whl", hash = "sha256:5b78d98550ca093a6fe7ab6d71733fbc886e2af9d4876d935e7f6e1cd6577ac9"}, + {file = "pywin32-309-cp310-cp310-win_amd64.whl", hash = "sha256:728d08046f3d65b90d4c77f71b6fbb551699e2005cc31bbffd1febd6a08aa698"}, + {file = "pywin32-309-cp310-cp310-win_arm64.whl", hash = "sha256:c667bcc0a1e6acaca8984eb3e2b6e42696fc035015f99ff8bc6c3db4c09a466a"}, + {file = "pywin32-309-cp311-cp311-win32.whl", hash = "sha256:d5df6faa32b868baf9ade7c9b25337fa5eced28eb1ab89082c8dae9c48e4cd51"}, + {file = "pywin32-309-cp311-cp311-win_amd64.whl", hash = "sha256:e7ec2cef6df0926f8a89fd64959eba591a1eeaf0258082065f7bdbe2121228db"}, + {file = "pywin32-309-cp311-cp311-win_arm64.whl", hash = "sha256:54ee296f6d11db1627216e9b4d4c3231856ed2d9f194c82f26c6cb5650163f4c"}, + {file = "pywin32-309-cp312-cp312-win32.whl", hash = "sha256:de9acacced5fa82f557298b1fed5fef7bd49beee04190f68e1e4783fbdc19926"}, + {file = "pywin32-309-cp312-cp312-win_amd64.whl", hash = "sha256:6ff9eebb77ffc3d59812c68db33c0a7817e1337e3537859499bd27586330fc9e"}, + {file = "pywin32-309-cp312-cp312-win_arm64.whl", hash = "sha256:619f3e0a327b5418d833f44dc87859523635cf339f86071cc65a13c07be3110f"}, + {file = "pywin32-309-cp313-cp313-win32.whl", hash = "sha256:008bffd4afd6de8ca46c6486085414cc898263a21a63c7f860d54c9d02b45c8d"}, + {file = "pywin32-309-cp313-cp313-win_amd64.whl", hash = "sha256:bd0724f58492db4cbfbeb1fcd606495205aa119370c0ddc4f70e5771a3ab768d"}, + {file = "pywin32-309-cp313-cp313-win_arm64.whl", hash = "sha256:8fd9669cfd41863b688a1bc9b1d4d2d76fd4ba2128be50a70b0ea66b8d37953b"}, + {file = "pywin32-309-cp38-cp38-win32.whl", hash = "sha256:617b837dc5d9dfa7e156dbfa7d3906c009a2881849a80a9ae7519f3dd8c6cb86"}, + {file = "pywin32-309-cp38-cp38-win_amd64.whl", hash = "sha256:0be3071f555480fbfd86a816a1a773880ee655bf186aa2931860dbb44e8424f8"}, + {file = "pywin32-309-cp39-cp39-win32.whl", hash = "sha256:72ae9ae3a7a6473223589a1621f9001fe802d59ed227fd6a8503c9af67c1d5f4"}, + {file = "pywin32-309-cp39-cp39-win_amd64.whl", hash = "sha256:88bc06d6a9feac70783de64089324568ecbc65866e2ab318eab35da3811fd7ef"}, ] [[package]] @@ -1068,40 +1065,40 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.9.6" +version = "0.9.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba"}, - {file = "ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504"}, - {file = "ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5"}, - {file = "ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217"}, - {file = "ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6"}, - {file = "ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897"}, - {file = "ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08"}, - {file = "ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656"}, - {file = "ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d"}, - {file = "ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa"}, - {file = "ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a"}, - {file = "ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9"}, + {file = "ruff-0.9.10-py3-none-linux_armv6l.whl", hash = "sha256:eb4d25532cfd9fe461acc83498361ec2e2252795b4f40b17e80692814329e42d"}, + {file = "ruff-0.9.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:188a6638dab1aa9bb6228a7302387b2c9954e455fb25d6b4470cb0641d16759d"}, + {file = "ruff-0.9.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5284dcac6b9dbc2fcb71fdfc26a217b2ca4ede6ccd57476f52a587451ebe450d"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47678f39fa2a3da62724851107f438c8229a3470f533894b5568a39b40029c0c"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99713a6e2766b7a17147b309e8c915b32b07a25c9efd12ada79f217c9c778b3e"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524ee184d92f7c7304aa568e2db20f50c32d1d0caa235d8ddf10497566ea1a12"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df92aeac30af821f9acf819fc01b4afc3dfb829d2782884f8739fb52a8119a16"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de42e4edc296f520bb84954eb992a07a0ec5a02fecb834498415908469854a52"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d257f95b65806104b6b1ffca0ea53f4ef98454036df65b1eda3693534813ecd1"}, + {file = "ruff-0.9.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60dec7201c0b10d6d11be00e8f2dbb6f40ef1828ee75ed739923799513db24c"}, + {file = "ruff-0.9.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d838b60007da7a39c046fcdd317293d10b845001f38bcb55ba766c3875b01e43"}, + {file = "ruff-0.9.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ccaf903108b899beb8e09a63ffae5869057ab649c1e9231c05ae354ebc62066c"}, + {file = "ruff-0.9.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f9567d135265d46e59d62dc60c0bfad10e9a6822e231f5b24032dba5a55be6b5"}, + {file = "ruff-0.9.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5f202f0d93738c28a89f8ed9eaba01b7be339e5d8d642c994347eaa81c6d75b8"}, + {file = "ruff-0.9.10-py3-none-win32.whl", hash = "sha256:bfb834e87c916521ce46b1788fbb8484966e5113c02df216680102e9eb960029"}, + {file = "ruff-0.9.10-py3-none-win_amd64.whl", hash = "sha256:f2160eeef3031bf4b17df74e307d4c5fb689a6f3a26a2de3f7ef4044e3c484f1"}, + {file = "ruff-0.9.10-py3-none-win_arm64.whl", hash = "sha256:5fd804c0327a5e5ea26615550e706942f348b197d5475ff34c19733aee4b2e69"}, + {file = "ruff-0.9.10.tar.gz", hash = "sha256:9bacb735d7bada9cfb0f2c227d3658fc443d90a727b47f206fb33f52f3c0eac7"}, ] [[package]] name = "setuptools" -version = "75.8.0" +version = "75.9.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" files = [ - {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, - {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, + {file = "setuptools-75.9.1-py3-none-any.whl", hash = "sha256:0a6f876d62f4d978ca1a11ab4daf728d1357731f978543ff18ecdbf9fd071f73"}, + {file = "setuptools-75.9.1.tar.gz", hash = "sha256:b6eca2c3070cdc82f71b4cb4bb2946bc0760a210d11362278cf1ff394e6ea32c"}, ] [package.extras] @@ -1224,18 +1221,17 @@ files = [ [[package]] name = "types-pygments" -version = "2.19.0.20250219" +version = "2.19.0.20250305" description = "Typing stubs for Pygments" optional = false python-versions = ">=3.9" files = [ - {file = "types_Pygments-2.19.0.20250219-py3-none-any.whl", hash = "sha256:5e3e1f660665b3a2ea946dda794b8d5b05772d789181704b523d646e8a7f4382"}, - {file = "types_pygments-2.19.0.20250219.tar.gz", hash = "sha256:a4a279338c96f3d4f2eb2c4d7c6c5593c88108b185bb5c664f943f781170cd14"}, + {file = "types_pygments-2.19.0.20250305-py3-none-any.whl", hash = "sha256:ca88aae5ec426f9b107c0f7adc36dc096d2882d930a49f679eaf4b8b643db35d"}, + {file = "types_pygments-2.19.0.20250305.tar.gz", hash = "sha256:044c50e80ecd4128c00a7268f20355e16f5c55466d3d49dfda09be920af40b4b"}, ] [package.dependencies] types-docutils = "*" -types-setuptools = "*" [[package]] name = "types-pyside2" @@ -1250,29 +1246,18 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20241016" +version = "2.32.0.20250306" description = "Typing stubs for requests" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, - {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, + {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"}, + {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"}, ] [package.dependencies] urllib3 = ">=2" -[[package]] -name = "types-setuptools" -version = "75.8.0.20250210" -description = "Typing stubs for setuptools" -optional = false -python-versions = ">=3.9" -files = [ - {file = "types_setuptools-75.8.0.20250210-py3-none-any.whl", hash = "sha256:a217d7b4d59be04c29e23d142c959a0f85e71292fd3fc4313f016ca11f0b56dc"}, - {file = "types_setuptools-75.8.0.20250210.tar.gz", hash = "sha256:c1547361b2441f07c94e25dce8a068e18c611593ad4b6fdd727b1a8f5d1fda33"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -1323,4 +1308,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.14" -content-hash = "bd66b4a55c137f803902b235627ca4399c30d5428be8be925ca8d2a394c5dc80" +content-hash = "d8a5861e3c50aec2b3b787c87b9b8f8ceab5240f152af9db87451ef4e33a8a32" diff --git a/pyproject.toml b/pyproject.toml index fcdea48..b8cf646 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ pytest-subprocess = "^1.5.2" pytest-rerunfailures = "^14.0" [tool.poetry.group.debian.dependencies] -pymupdf = "1.24.11" # Last version to support python 3.8 (needed for Ubuntu Focal support) +pymupdf = "^1.24.11" [tool.poetry.group.dev.dependencies] httpx = "^0.27.2"