diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..aeb4de8 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,27 @@ +name: Publish + +on: workflow_dispatch + +jobs: + publish: + name: Publish to PyPI + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + contents: read + steps: + - name: Checkout Source + uses: actions/checkout@v7 + + - name: Install UV and Python + uses: astral-sh/setup-uv@v8.2.0 + with: + python-version: "3.13" + enable-cache: true + + - name: Build Package + run: uv build + + - name: Publish Package + run: uv publish diff --git a/.github/workflows/syntax.yml b/.github/workflows/syntax.yml index 4b63c70..0b32e0c 100644 --- a/.github/workflows/syntax.yml +++ b/.github/workflows/syntax.yml @@ -17,18 +17,23 @@ jobs: with: python-version: "3" architecture: x64 + - name: Checkout Source - uses: actions/checkout@v4 + uses: actions/checkout@v7 + - name: Install Dependencies run: pip install -r requirements.txt -r requirements-dev.txt + - name: Ruff Check run: | ruff --version ruff check + - name: Pyright Check run: | pyright --version pyright + - name: Isort Check run: | isort --version diff --git a/.gitignore b/.gitignore index baa91da..ed6a744 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,11 @@ .venv/ .ruff_cache/ *.pyc -uv.lock + +# Build +__pycache__/ +dist/ +build/ # Tests .pytest_cache diff --git a/pyproject.toml b/pyproject.toml index 9d1d1e3..c332ea7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,15 +93,11 @@ ignore = [ [tool.ruff.lint.per-file-ignores] "tests/*" = ["ANN", "SLF", "TC", "PLC2701"] -"utils/*" = ["ANN", "SLF", "TC"] [tool.ruff.format] quote-style = "double" [tool.pyright] include = ["subtle"] -exclude = ["**/__pycache__"] - reportIncompatibleMethodOverride = false - pythonVersion = "3.11" diff --git a/subtle/__init__.py b/subtle/__init__.py index 1718536..9e9a47a 100644 --- a/subtle/__init__.py +++ b/subtle/__init__.py @@ -3,7 +3,7 @@ ================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,14 +39,13 @@ # ============ __package__ = "subtle" -__copyright__ = "Copyright 2024, Veronica Berglyd Olsen" +__copyright__ = "Copyright (C) Veronica Berglyd Olsen" __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "0.1.0" -__hexversion__ = "0x000100a0" -__date__ = "2024-10-11" +__version__ = "26.1" +__date__ = "2026-06-24" logger = logging.getLogger(__name__) @@ -161,7 +160,7 @@ def main(sysArgs: list | None = None) -> GuiMain | None: cHandle.setFormatter(logging.Formatter(fmt=logFmt, style="{")) pkgLogger.addHandler(cHandle) - logger.info("Starting Subtle %s (%s) %s", __version__, __hexversion__, __date__) + logger.info("Starting Subtle %s (%s)", __version__, __date__) # Finish initialising config CONFIG.initialise() diff --git a/subtle/assets/subtle.svg b/subtle/assets/subtle.svg new file mode 100644 index 0000000..312cdc2 --- /dev/null +++ b/subtle/assets/subtle.svg @@ -0,0 +1,3 @@ + + + diff --git a/subtle/common.py b/subtle/common.py index 690d816..ed6a594 100644 --- a/subtle/common.py +++ b/subtle/common.py @@ -3,7 +3,7 @@ ========================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/config.py b/subtle/config.py index c4f77d5..8380b11 100644 --- a/subtle/config.py +++ b/subtle/config.py @@ -3,7 +3,7 @@ ==================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -165,6 +165,14 @@ def getSetting(self, key: str) -> str: """Get a generic string setting.""" return str(self._data["Settings"].get(key, "")) + def assetPath(self, resource: str, kind: str | None = None) -> Path: + """Return the path to an asset.""" + path = self._appPath / "assets" + if kind: + path /= kind + return path / resource + + ## # Setters ## diff --git a/subtle/constants.py b/subtle/constants.py index a2facb8..5baa2e3 100644 --- a/subtle/constants.py +++ b/subtle/constants.py @@ -3,7 +3,7 @@ ================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/core/icons.py b/subtle/core/icons.py index 2d605e0..1eb9131 100644 --- a/subtle/core/icons.py +++ b/subtle/core/icons.py @@ -3,7 +3,7 @@ ============== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/core/media.py b/subtle/core/media.py index 8ab7120..f9bbc0e 100644 --- a/subtle/core/media.py +++ b/subtle/core/media.py @@ -3,7 +3,7 @@ =========================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/core/mediafile.py b/subtle/core/mediafile.py index a6edc19..d53dae9 100644 --- a/subtle/core/mediafile.py +++ b/subtle/core/mediafile.py @@ -3,7 +3,7 @@ ============================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/core/mkvextract.py b/subtle/core/mkvextract.py index 318f3f6..5c3c0c6 100644 --- a/subtle/core/mkvextract.py +++ b/subtle/core/mkvextract.py @@ -3,7 +3,7 @@ ================================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/core/spellcheck.py b/subtle/core/spellcheck.py index b5d2e78..02ddf30 100644 --- a/subtle/core/spellcheck.py +++ b/subtle/core/spellcheck.py @@ -3,7 +3,7 @@ ====================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/formats/base.py b/subtle/formats/base.py index 18343d2..09a75e2 100644 --- a/subtle/formats/base.py +++ b/subtle/formats/base.py @@ -3,7 +3,7 @@ ======================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/formats/pgssubs.py b/subtle/formats/pgssubs.py index 3aebd3c..af4fb50 100644 --- a/subtle/formats/pgssubs.py +++ b/subtle/formats/pgssubs.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/formats/srtsubs.py b/subtle/formats/srtsubs.py index cff6869..0b540e1 100644 --- a/subtle/formats/srtsubs.py +++ b/subtle/formats/srtsubs.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/formats/ssasubs.py b/subtle/formats/ssasubs.py index 74cff44..819ff9d 100644 --- a/subtle/formats/ssasubs.py +++ b/subtle/formats/ssasubs.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/filetree.py b/subtle/gui/filetree.py index 5bd8b02..dab347d 100644 --- a/subtle/gui/filetree.py +++ b/subtle/gui/filetree.py @@ -3,7 +3,7 @@ ====================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/highlighter.py b/subtle/gui/highlighter.py index 6affab3..57c7396 100644 --- a/subtle/gui/highlighter.py +++ b/subtle/gui/highlighter.py @@ -3,7 +3,7 @@ =========================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/imageviewer.py b/subtle/gui/imageviewer.py index 83012e5..54f9b26 100644 --- a/subtle/gui/imageviewer.py +++ b/subtle/gui/imageviewer.py @@ -3,7 +3,7 @@ ========================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/mediaview.py b/subtle/gui/mediaview.py index cd4f45a..0f566b5 100644 --- a/subtle/gui/mediaview.py +++ b/subtle/gui/mediaview.py @@ -3,7 +3,7 @@ ======================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/subsview.py b/subtle/gui/subsview.py index 05e5d74..c3ce82e 100644 --- a/subtle/gui/subsview.py +++ b/subtle/gui/subsview.py @@ -3,7 +3,7 @@ ========================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/texteditor.py b/subtle/gui/texteditor.py index a12e715..b6e8029 100644 --- a/subtle/gui/texteditor.py +++ b/subtle/gui/texteditor.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/gui/toolspanel.py b/subtle/gui/toolspanel.py index 28bf875..9982d0d 100644 --- a/subtle/gui/toolspanel.py +++ b/subtle/gui/toolspanel.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/guimain.py b/subtle/guimain.py index 8e627b7..817ce0d 100644 --- a/subtle/guimain.py +++ b/subtle/guimain.py @@ -3,7 +3,7 @@ ======================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,7 +38,8 @@ from subtle.ocr.tesseract import TesseractOCR from PyQt6.QtCore import Qt -from PyQt6.QtWidgets import QMainWindow, QSplitter +from PyQt6.QtGui import QIcon +from PyQt6.QtWidgets import QApplication, QMainWindow, QSplitter if TYPE_CHECKING: from PyQt6.QtGui import QCloseEvent @@ -67,6 +68,11 @@ def __init__(self) -> None: logger.debug("Ready: GUI") logger.info("Subtle is ready ...") + mIcon = CONFIG.assetPath("icons") / "subtle.svg" + self.nwIcon = QIcon(str(mIcon)) if mIcon.exists() else QIcon() + self.setWindowIcon(self.nwIcon) + QApplication.setWindowIcon(self.nwIcon) + # Cached Data # =========== diff --git a/subtle/ocr/base.py b/subtle/ocr/base.py index 646220a..79375f7 100644 --- a/subtle/ocr/base.py +++ b/subtle/ocr/base.py @@ -3,7 +3,7 @@ ======================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/ocr/tesseract.py b/subtle/ocr/tesseract.py index 2686e31..0a1cd60 100644 --- a/subtle/ocr/tesseract.py +++ b/subtle/ocr/tesseract.py @@ -3,7 +3,7 @@ ============================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/subtle/shared.py b/subtle/shared.py index f9d0838..4193ab4 100644 --- a/subtle/shared.py +++ b/subtle/shared.py @@ -3,7 +3,7 @@ =========================== This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tests/test_common.py b/tests/test_common.py index cd6ae56..c3122e6 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -3,7 +3,7 @@ ======================= This file is a part of Subtle -Copyright 2024, Veronica Berglyd Olsen +Copyright (C) Veronica Berglyd Olsen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..565569d --- /dev/null +++ b/uv.lock @@ -0,0 +1,87 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "pyenchant" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/ad/64925c937e41be75c7067c85757b3d45b148e9111187b37693269f583156/pyenchant-3.3.0.tar.gz", hash = "sha256:825288246b5debc9436f91967650974ef0d5636458502619e322c476f1283891", size = 60696, upload-time = "2025-09-14T16:23:12.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/b0/35926bad6885fb7bc24aa7e1b45e6d86540c6c57ee4abc4fed1ef58d4ec0/pyenchant-3.3.0-py3-none-any.whl", hash = "sha256:3da00b1d01314d85aac733bb997415d7a3e875666dc81735ddcf320aa36b7a70", size = 58363, upload-time = "2025-09-14T16:23:04.297Z" }, + { url = "https://files.pythonhosted.org/packages/d6/7f/1d7b8ad86c2a841d940df7b965fa727e052b95d539e4c563da685c25d0d2/pyenchant-3.3.0-py3-none-win32.whl", hash = "sha256:1d55e075645a6edbb3c590fb42f9e02b4d455e4affe28a2227d5cb6d4868e626", size = 37787278, upload-time = "2025-09-14T16:23:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ae/5624803b62ecb0a20248f0d28ed3f78c78746a032582a016d4b2890c7899/pyenchant-3.3.0-py3-none-win_amd64.whl", hash = "sha256:04a5bd0e022ebe2e8c6d9e498ec3d650602e264ec5486e9c6a1b7f99c9507c49", size = 37427576, upload-time = "2025-09-14T16:23:09.574Z" }, +] + +[[package]] +name = "pyqt6" +version = "6.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyqt6-qt6" }, + { name = "pyqt6-sip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/47/b25c13eca5bebc6505394d0223e46d7ebf0c57dcac2ed908d7d19b18ab6b/pyqt6-6.11.0.tar.gz", hash = "sha256:45dd60aa69976de1918b5ced6b4e7b6a25abd2a919ecef5fd5826ecc76718889", size = 1087430, upload-time = "2026-03-30T09:16:13.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/44/fcd3dd3f64c83c96bf9bce76ec16cca64bd9b91702c3d08fd8e3dafc73d9/pyqt6-6.11.0-cp310-abi3-macosx_10_14_universal2.whl", hash = "sha256:f7100bc7f72b12581ec479a733f4ad11b8002668e6786e8a445ab6f4d1c743d4", size = 12429735, upload-time = "2026-03-30T09:16:03.713Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a0/bd1399740dfa80c0a94d20b02d89962a31458233dcf70eaa09bfbccf3d0f/pyqt6-6.11.0-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8555277989fa7d114cb3c3443fd261d566909f7268ceedd41d93a5f02d37ec05", size = 8334632, upload-time = "2026-03-30T09:16:06.066Z" }, + { url = "https://files.pythonhosted.org/packages/d3/db/425b184ac2430ba1978bb507ffd285ec007a872644e2ae5df13332dbcb05/pyqt6-6.11.0-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:0734959955adde095af9a074213a7f73386d1bbbddfc27346b4c0621641a692e", size = 8321484, upload-time = "2026-03-30T09:16:08.135Z" }, + { url = "https://files.pythonhosted.org/packages/6f/85/dd9f03d78d87460e109e0121cd6201c5802bdd655656bf2780e964870fea/pyqt6-6.11.0-cp310-abi3-win_amd64.whl", hash = "sha256:bd11b459c54dca068e988a42cf838303334f0d441b9d16d92ae6719fcb5ac6ba", size = 6844358, upload-time = "2026-03-30T09:16:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/cd/75/970b041bde4372cc6739c5ef9db1de83a6b36e788e4992e598baa35b2255/pyqt6-6.11.0-cp310-abi3-win_arm64.whl", hash = "sha256:b6324e3501b19b4292c7a55b1f22e82d3e80e519e383ce4fe79b4a754c6f0288", size = 5933984, upload-time = "2026-03-30T09:16:11.817Z" }, +] + +[[package]] +name = "pyqt6-qt6" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/cb/ef930289bcd3b4be77a619d6b89ccdd0f53d753053a45f69ed590fd49777/pyqt6_qt6-6.11.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:694486f18b7ab9b1edcdb50e0c9f5cb726e096107da90ae7b0e810f18e2002b3", size = 70402836, upload-time = "2026-05-15T11:18:24.893Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/d016af2de1975a0d90c9a911e3d82b2e8c8fe899f8af746ade42186f3845/pyqt6_qt6-6.11.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fd05b31a3c83111b6eb82bb472ccfe531ef823f70d085b82fd1edc5ad2553c54", size = 64167714, upload-time = "2026-05-15T11:18:48.848Z" }, + { url = "https://files.pythonhosted.org/packages/e1/be/21d0df9bde717131f4245f8801676120d466afe198c4641c9e4982cf85fe/pyqt6_qt6-6.11.1-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:254af349e0ef4b2fa581f86ee9d65eb797bb1d4f0c01ae5ceaa7b2446b458be9", size = 85897589, upload-time = "2026-05-15T11:19:21.864Z" }, + { url = "https://files.pythonhosted.org/packages/08/69/f6b9cafceed9790c62a7ca3044562d38545bbfcfaf222846482ac2f9bd56/pyqt6_qt6-6.11.1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:039b1ab619d63d06a87cacf84b581a2b61a30c9ad5bb677553e738afe4dc433a", size = 84996419, upload-time = "2026-05-15T11:19:52.647Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f1/70e83c23bf897c7f5025aa100482f482038ef70232dc27b407659d941fbf/pyqt6_qt6-6.11.1-py3-none-win_amd64.whl", hash = "sha256:7486c80512e823f2d3087e67f854f0556b345f4368040a853c8dc4d30fd3fe69", size = 78416766, upload-time = "2026-05-15T11:20:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/93/b0/9183ec9c206a0c3cba5719f0911e88a3486167137456a0f9318f07ce000d/pyqt6_qt6-6.11.1-py3-none-win_arm64.whl", hash = "sha256:120efbedf833e5bbbc3d64ebdb139b44ff34e60f34410c7b1c2c26d230380bda", size = 59961004, upload-time = "2026-05-15T11:20:49.065Z" }, +] + +[[package]] +name = "pyqt6-sip" +version = "13.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/24/a753e1af94b9ae5b2da63d4598457308da3cdbf0838c959381db086ccc86/pyqt6_sip-13.11.1.tar.gz", hash = "sha256:869c5b48afe38e55b1ee0dd72182b0886e968cc509b98023ff50010b013ce1be", size = 92574, upload-time = "2026-03-09T13:01:35.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/fa/049879f61888462099dcbab495ad16df770cca2432330cca0767ab8e87cb/pyqt6_sip-13.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0ec2128c174db352bec1c8d23a437e970e8d5a78ac50315d8dfc671fcf7a7da", size = 111056, upload-time = "2026-03-09T13:01:07.998Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/6ee861c53f3f7e6c5dd34a441d17aad1dfb3d50ce1f1a024cc9194ac3db3/pyqt6_sip-13.11.1-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6aa6c15ad3a9bb86e69119baff77b4ac17c47e55ee567abff616a4652051a6cc", size = 289930, upload-time = "2026-03-09T13:01:11.122Z" }, + { url = "https://files.pythonhosted.org/packages/ca/39/c975733d7204a594e6ae51d3a810aad539d09718aa3ceeb0dd28cb3276bd/pyqt6_sip-13.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee652b272373c4f9287625ef32ad4ec1f0755c24928dc958a870b7a928b288c", size = 315827, upload-time = "2026-03-09T13:01:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d6/c40e8ae38a6e2bce9e837b64688f55746bfdad1aa557eb733fb5e90edd7c/pyqt6_sip-13.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:98db8ed37cf08130e1ee74b8ff47a6bfb8c3cdfe826310597a630a50e47feedc", size = 54029, upload-time = "2026-03-09T13:01:12.261Z" }, + { url = "https://files.pythonhosted.org/packages/fb/63/ec8c21ef9edffb55af42c637325d72eca4ea90a73ab714aaa1429c757e85/pyqt6_sip-13.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:3af7a49dce4c35c5464309232c81cc1da5ec6074f46d2957831ee4031b8eefa6", size = 48458, upload-time = "2026-03-09T13:01:13.689Z" }, + { url = "https://files.pythonhosted.org/packages/46/27/47598e701d284497216bf97bf8b6a69f5e61412e716c232ff2b7e6cb2100/pyqt6_sip-13.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ba9d362dd1e54b43bc2594f8841e1e39d24789716d28f08e5c9282af9fca342c", size = 112564, upload-time = "2026-03-09T13:01:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/95/cb/116f9b328636765f3bce97d9e10ec041c54bbe92beb0617edb86c2b615c1/pyqt6_sip-13.11.1-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0df15849946cea969d3ff2b24b76149262b6044aea2c5403e4f70c24c973a4c8", size = 299564, upload-time = "2026-03-09T13:01:17.292Z" }, + { url = "https://files.pythonhosted.org/packages/1b/be/fe2321285e8f683e705d199dbb458131f1850dc5966155a19c40100c85bb/pyqt6_sip-13.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52b2b27fc77d9447a8dc1c6de1aaccc22d41e48697aafb2f2f20b8984bb02a5", size = 321210, upload-time = "2026-03-09T13:01:15.904Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9b/7d4b10f9cba1b6f581dfb4860b9d11898da55a5ed3b8a6e7a1bf9f7084d0/pyqt6_sip-13.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d1c67179c1924b28e3d7f04585639e7a7c0946f62390efc6ccf2a6206e595d3", size = 53351, upload-time = "2026-03-09T13:01:19.327Z" }, + { url = "https://files.pythonhosted.org/packages/06/72/6c4e6f21cafa4bed40d2b0c1563525b0d8bfcb5734493696f4cfd043b45f/pyqt6_sip-13.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:d83543125fe9fdb153e7e446c3b4d056d80ab5953644660633ab3f80e7784194", size = 48746, upload-time = "2026-03-09T13:01:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/ee/0b/dc76c463c203e630b2c6417d4d5e337e919a265ac1c10127ef413551f5de/pyqt6_sip-13.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0c6d097aae7df312519e2b36e001bd796f6a2ce060ab8b9ed793daa8f407fe2e", size = 112552, upload-time = "2026-03-09T13:01:21.493Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e3/65b605759859d38231ce7544065d4c61f891eb7766c351318e2a0b08a473/pyqt6_sip-13.11.1-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a72f4ebdab16a8a484019ff593de90d8013d3286b678c6ba1c0bdb117f4fcb13", size = 299932, upload-time = "2026-03-09T13:01:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/60/f7/c10d2dd5bf503a1de83bd163467bd323f12af016866c2814743b5b1efe1c/pyqt6_sip-13.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b68e442efc4275651bf63f2c43713e242924fd948909e31cf8f20d783ca505e9", size = 321497, upload-time = "2026-03-09T13:01:22.724Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1f/e7e5ad77a76c00db5c8c1b9960f2b0672ec1978b971bb3509858cd7a9458/pyqt6_sip-13.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca24bfd4d5d8274e338433df9ac41930650088c00018d3313c6bd8de21772a02", size = 53371, upload-time = "2026-03-09T13:01:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/36/ef/a7acaf44980aed6fe26f1320e265db528fecb6a47ac67829c7cd011e9821/pyqt6_sip-13.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:f532144c43f2fddcccf2e25df50cdb4a744edb4ce4ba5ed2d0f2cef825197f2f", size = 48745, upload-time = "2026-03-09T13:01:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/20/1d/62c633faedef5bb3b8c7486a72e8a6466adaa2a14efcfccf85bb23426748/pyqt6_sip-13.11.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:cb931c1af45294bbe8039c5cfda184e3023f5dc766fc884964010eedd8fd85db", size = 112678, upload-time = "2026-03-09T13:01:28.15Z" }, + { url = "https://files.pythonhosted.org/packages/03/72/5a3d9ffef0caa7e1bc7a35d6300f6099bfccd1d8a485b4320ba20013a2d9/pyqt6_sip-13.11.1-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:353d613129316e9f7eda6bbe821deb7b7ffa14483499189171fd8a246873f9ac", size = 299560, upload-time = "2026-03-09T13:01:32.134Z" }, + { url = "https://files.pythonhosted.org/packages/98/f4/886f901f1e04da717a11e180ba19a9c7fc62da170966d57206006f173bda/pyqt6_sip-13.11.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcadd68e09ee24cdda8f8bfcba52e59c9b297055d2c450f0eb89afa61a8dc31a", size = 321846, upload-time = "2026-03-09T13:01:29.817Z" }, + { url = "https://files.pythonhosted.org/packages/96/f2/b68fd566f7f86dbb53d933489e70487cabaea0e0161690e4899653bbc7fb/pyqt6_sip-13.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:581e287bf42587593b88b30d9db06ed0fccbf40f345a5bd3ec3f00a5692e2430", size = 55055, upload-time = "2026-03-09T13:01:33.467Z" }, + { url = "https://files.pythonhosted.org/packages/8d/42/efb7ced69f7d1d31eb8f19b2d778aeb182be7e070569d02b9057ac478e3e/pyqt6_sip-13.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:42b62530a9b6a9c6e29c2941b8ab78258652da0aeae4eb1fc9a0631d19a7a7b2", size = 49597, upload-time = "2026-03-09T13:01:34.49Z" }, +] + +[[package]] +name = "subtle-gui" +version = "0.0.0" +source = { editable = "." } +dependencies = [ + { name = "pyenchant" }, + { name = "pyqt6" }, +] + +[package.metadata] +requires-dist = [ + { name = "pyenchant", specifier = ">=3.0.0" }, + { name = "pyqt6", specifier = ">=6.4" }, +]