From 107c00d796101463d5a01ede7b1077b6890d4ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Bj=C3=A4reholt?= Date: Mon, 5 Jul 2021 16:02:22 +0200 Subject: [PATCH 1/2] feat: added basic webview widget --- aw_qt/webview.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 aw_qt/webview.py diff --git a/aw_qt/webview.py b/aw_qt/webview.py new file mode 100644 index 0000000..6592d0e --- /dev/null +++ b/aw_qt/webview.py @@ -0,0 +1,74 @@ +import sys +import signal + +from PyQt5.QtCore import QUrl, QTimer +from PyQt5.QtWidgets import QApplication, QWidget + +from PyQt5.QtWebEngineWidgets import ( + QWebEngineView, + QWebEnginePage, + QWebEngineSettings, +) + + +class MyBrowser(QWebEnginePage): + """Settings for the browser.""" + + def userAgentForUrl(self, url): + """Returns a User Agent that will be seen by the website.""" + return "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" + + +class Browser(QWebEngineView): + def __init__(self, *args, **kwargs): + self.view = QWebEngineView.__init__(self, *args, **kwargs) + # self.view.setPage(MyBrowser()) + self.setWindowTitle("Loading...") + self.titleChanged.connect(self.adjustTitle) + # super(Browser).connect(self.ui.webView,QtCore.SIGNAL("titleChanged (const QString&)"), self.adjustTitle) + + def load(self, url): + self.setUrl(QUrl(url)) + + def adjustTitle(self): + self.setWindowTitle(self.title()) + + def disableJS(self): + settings = QWebEngineSettings.globalSettings() + settings.setAttribute(QWebEngineSettings.JavascriptEnabled, False) + + +def exit() -> None: + print("Shutdown initiated, stopping all services...") + # Terminate entire process group, just in case. + # os.killpg(0, signal.SIGINT) + + QApplication.quit() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + app.setApplicationName("ActivityWatch") + + # Without this, Ctrl+C will have no effect + signal.signal(signal.SIGINT, lambda *args: exit()) + # Ensure cleanup happens on SIGTERM + signal.signal(signal.SIGTERM, lambda *args: exit()) + + timer = QTimer() + timer.start(100) # You may change this if you wish. + timer.timeout.connect(lambda: None) # Let the interpreter run each 500 ms. + + # widget = QWidget() + # widget.show() + + view = Browser() + # view.showMaximized() + view.load("http://localhost:5600") + view.show() + + QApplication.setQuitOnLastWindowClosed(False) + + print("Initialized") + + app.exec_() From 20a2ec52de4ea780fab841754e5b32facd3b11a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Bj=C3=A4reholt?= Date: Wed, 7 Jul 2021 15:30:12 +0200 Subject: [PATCH 2/2] feat: progress on webview --- aw_qt/trayicon.py | 17 ++- aw_qt/webview.py | 31 ++-- poetry.lock | 375 +++++++++++++++++++++++++--------------------- pyproject.toml | 1 + 4 files changed, 240 insertions(+), 184 deletions(-) diff --git a/aw_qt/trayicon.py b/aw_qt/trayicon.py index 9428b81..4081ca2 100644 --- a/aw_qt/trayicon.py +++ b/aw_qt/trayicon.py @@ -3,9 +3,9 @@ import signal import os import subprocess -from collections import defaultdict -from typing import Any, DefaultDict, List, Optional, Dict import webbrowser +from typing import Any, Optional, Dict + from PyQt5 import QtCore from PyQt5.QtWidgets import ( @@ -21,6 +21,7 @@ import aw_core from .manager import Manager, Module +from .webview import create_webview logger = logging.getLogger(__name__) @@ -44,7 +45,10 @@ def get_env() -> Dict[str, str]: def open_url(url: str) -> None: - if sys.platform == "linux": + experimental = True + if experimental: + create_webview(parent=widget) + elif sys.platform == "linux": env = get_env() subprocess.Popen(["xdg-open", url], env=env) else: @@ -87,13 +91,17 @@ def __init__( self.manager = manager self.testing = testing - self.root_url = "http://localhost:{port}".format(port=5666 if self.testing else 5600) + self.root_url = "http://localhost:{port}".format( + port=5666 if self.testing else 5600 + ) self.activated.connect(self.on_activated) self._build_rootmenu() def on_activated(self, reason: QSystemTrayIcon.ActivationReason) -> None: + logger.info("Clicked trayicon") if reason == QSystemTrayIcon.DoubleClick: + logger.info("Double-clicked trayicon") open_webui(self.root_url) def _build_rootmenu(self) -> None: @@ -229,6 +237,7 @@ def run(manager: Manager, testing: bool = False) -> Any: ) sys.exit(1) + global widget widget = QWidget() if sys.platform == "darwin": icon = QIcon(":/black-monochrome-logo.png") diff --git a/aw_qt/webview.py b/aw_qt/webview.py index 6592d0e..6d22515 100644 --- a/aw_qt/webview.py +++ b/aw_qt/webview.py @@ -21,8 +21,13 @@ def userAgentForUrl(self, url): class Browser(QWebEngineView): def __init__(self, *args, **kwargs): - self.view = QWebEngineView.__init__(self, *args, **kwargs) - # self.view.setPage(MyBrowser()) + QWebEngineView.__init__(self, *args, **kwargs) + self.setPage(MyBrowser()) + + settings = QWebEngineSettings.globalSettings() + settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True) + settings.setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True) + self.setWindowTitle("Loading...") self.titleChanged.connect(self.adjustTitle) # super(Browser).connect(self.ui.webView,QtCore.SIGNAL("titleChanged (const QString&)"), self.adjustTitle) @@ -33,10 +38,6 @@ def load(self, url): def adjustTitle(self): self.setWindowTitle(self.title()) - def disableJS(self): - settings = QWebEngineSettings.globalSettings() - settings.setAttribute(QWebEngineSettings.JavascriptEnabled, False) - def exit() -> None: print("Shutdown initiated, stopping all services...") @@ -46,6 +47,14 @@ def exit() -> None: QApplication.quit() +def create_webview(parent): + view = Browser(parent=parent) + # view.showMaximized() + view.load("http://localhost:5666/") + view.show() + print("Opened webview") + + if __name__ == "__main__": app = QApplication(sys.argv) app.setApplicationName("ActivityWatch") @@ -59,13 +68,9 @@ def exit() -> None: timer.start(100) # You may change this if you wish. timer.timeout.connect(lambda: None) # Let the interpreter run each 500 ms. - # widget = QWidget() - # widget.show() - - view = Browser() - # view.showMaximized() - view.load("http://localhost:5600") - view.show() + widget = QWidget() + create_webview(widget) + widget.show() QApplication.setQuitOnLastWindowClosed(False) diff --git a/poetry.lock b/poetry.lock index 874e985..64e5aa6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,26 +1,26 @@ [[package]] -name = "altgraph" -version = "0.17" -description = "Python graph (network) package" category = "dev" +description = "Python graph (network) package" +name = "altgraph" optional = false python-versions = "*" +version = "0.17" [[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +name = "appdirs" optional = false python-versions = "*" +version = "1.4.4" [[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" category = "main" +description = "Classes Without Boilerplate" +name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "21.2.0" [package.extras] dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] @@ -29,16 +29,16 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)" tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] -name = "aw-core" -version = "0.5.3" -description = "Core library for ActivityWatch" category = "main" +description = "Core library for ActivityWatch" +name = "aw-core" optional = false python-versions = ">=3.7,<4.0" +version = "0.5.4" [package.dependencies] appdirs = ">=1.4.3,<2.0.0" -deprecation = ">=2.0.7,<3.0.0" +deprecation = "*" iso8601 = ">=0.1.12,<0.2.0" jsonschema = ">=3.1,<4.0" peewee = ">=3.0.0,<4.0.0" @@ -46,37 +46,37 @@ python-json-logger = ">=0.1.11,<0.2.0" strict-rfc3339 = ">=0.7,<0.8" TakeTheTime = ">=0.3.1,<0.4.0" timeslot = "*" -tomlkit = ">=0.6.0,<0.7.0" +tomlkit = "*" [package.extras] mongo = ["pymongo (>=3.10.0,<4.0.0)"] [[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" category = "main" +description = "Composable command line interface toolkit" +name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "7.1.2" [[package]] -name = "deprecation" -version = "2.1.0" -description = "A library to handle automated deprecations" category = "main" +description = "A library to handle automated deprecations" +name = "deprecation" optional = false python-versions = "*" +version = "2.1.0" [package.dependencies] packaging = "*" [[package]] -name = "flake8" -version = "3.9.2" -description = "the modular source code checker: pep8 pyflakes and co" category = "dev" +description = "the modular source code checker: pep8 pyflakes and co" +name = "flake8" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "3.9.2" [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} @@ -85,20 +85,20 @@ pycodestyle = ">=2.7.0,<2.8.0" pyflakes = ">=2.3.0,<2.4.0" [[package]] -name = "future" -version = "0.18.2" -description = "Clean single-source support for Python 3 and 2" category = "dev" +description = "Clean single-source support for Python 3 and 2" +name = "future" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" [[package]] -name = "importlib-metadata" -version = "4.5.0" -description = "Read metadata from Python packages" category = "main" +description = "Read metadata from Python packages" +name = "importlib-metadata" optional = false python-versions = ">=3.6" +version = "4.6.1" [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -106,23 +106,24 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] -name = "iso8601" -version = "0.1.14" -description = "Simple module to parse ISO 8601 dates" category = "main" +description = "Simple module to parse ISO 8601 dates" +name = "iso8601" optional = false python-versions = "*" +version = "0.1.14" [[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" category = "main" +description = "An implementation of JSON Schema validation for Python" +name = "jsonschema" optional = false python-versions = "*" +version = "3.2.0" [package.dependencies] attrs = ">=17.4.0" @@ -135,31 +136,31 @@ format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] [[package]] -name = "macholib" -version = "1.14" -description = "Mach-O header analysis and editing" category = "dev" +description = "Mach-O header analysis and editing" +name = "macholib" optional = false python-versions = "*" +version = "1.14" [package.dependencies] altgraph = ">=0.15" [[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" category = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" optional = false python-versions = "*" +version = "0.6.1" [[package]] -name = "mypy" -version = "0.902" -description = "Optional static typing for Python" category = "dev" +description = "Optional static typing for Python" +name = "mypy" optional = false python-versions = ">=3.5" +version = "0.910" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -172,66 +173,66 @@ dmypy = ["psutil (>=4.0)"] python2 = ["typed-ast (>=1.4.0,<1.5.0)"] [[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." category = "dev" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +name = "mypy-extensions" optional = false python-versions = "*" +version = "0.4.3" [[package]] -name = "packaging" -version = "20.9" -description = "Core utilities for Python packages" category = "main" +description = "Core utilities for Python packages" +name = "packaging" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" +version = "21.0" [package.dependencies] pyparsing = ">=2.0.2" [[package]] -name = "peewee" -version = "3.14.4" -description = "a little orm" category = "main" +description = "a little orm" +name = "peewee" optional = false python-versions = "*" +version = "3.14.4" [[package]] -name = "pefile" -version = "2021.5.24" -description = "Python PE parsing module" category = "dev" +description = "Python PE parsing module" +name = "pefile" optional = false python-versions = ">=3.6.0" +version = "2021.5.24" [package.dependencies] future = "*" [[package]] -name = "pycodestyle" -version = "2.7.0" -description = "Python style guide checker" category = "dev" +description = "Python style guide checker" +name = "pycodestyle" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.7.0" [[package]] -name = "pyflakes" -version = "2.3.1" -description = "passive checker of Python programs" category = "dev" +description = "passive checker of Python programs" +name = "pyflakes" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.3.1" [[package]] -name = "pyinstaller" -version = "4.3" -description = "PyInstaller bundles a Python application and all its dependencies into a single package." category = "dev" +description = "PyInstaller bundles a Python application and all its dependencies into a single package." +name = "pyinstaller" optional = false python-versions = ">=3.6" +version = "4.3" [package.dependencies] altgraph = "*" @@ -246,179 +247,191 @@ encryption = ["tinyaes (>=1.0.0)"] hook_testing = ["pytest (>=2.7.3)", "execnet (>=1.5.0)", "psutil"] [[package]] -name = "pyinstaller-hooks-contrib" -version = "2021.1" -description = "Community maintained hooks for PyInstaller" category = "dev" +description = "Community maintained hooks for PyInstaller" +name = "pyinstaller-hooks-contrib" optional = false python-versions = "*" +version = "2021.2" [[package]] -name = "pyobjc-core" -version = "7.3" -description = "Python<->ObjC Interoperability Module" category = "main" +description = "Python<->ObjC Interoperability Module" +name = "pyobjc-core" optional = false python-versions = ">=3.6" +version = "7.3" [[package]] -name = "pyobjc-framework-cocoa" -version = "7.3" -description = "Wrappers for the Cocoa frameworks on macOS" category = "main" +description = "Wrappers for the Cocoa frameworks on macOS" +name = "pyobjc-framework-cocoa" optional = false python-versions = ">=3.6" +version = "7.3" [package.dependencies] pyobjc-core = ">=7.3" [[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" category = "main" +description = "Python parsing module" +name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "2.4.7" [[package]] -name = "pyqt5" -version = "5.15.2" -description = "Python bindings for the Qt cross platform application toolkit" category = "main" +description = "Python bindings for the Qt cross platform application toolkit" +name = "pyqt5" optional = false python-versions = ">=3.5" +version = "5.15.2" [package.dependencies] PyQt5-sip = ">=12.8,<13" [[package]] -name = "pyqt5-sip" -version = "12.9.0" -description = "The sip module support for PyQt5" category = "main" +description = "The sip module support for PyQt5" +name = "pyqt5-sip" optional = false python-versions = ">=3.5" +version = "12.9.0" [[package]] -name = "pyqt5-stubs" -version = "5.14.2.2" -description = "PEP561 stub files for the PyQt5 framework" category = "dev" +description = "PEP561 stub files for the PyQt5 framework" +name = "pyqt5-stubs" optional = false python-versions = "*" +version = "5.14.2.2" [[package]] -name = "pyrsistent" -version = "0.17.3" -description = "Persistent/Functional/Immutable data structures" category = "main" +description = "Python bindings for the Qt WebEngine framework" +name = "pyqtwebengine" optional = false python-versions = ">=3.5" +version = "5.15.2" + +[package.dependencies] +PyQt5 = ">=5.15" +PyQt5-sip = ">=12.8,<13" [[package]] -name = "python-json-logger" -version = "0.1.11" -description = "A python library adding a json log formatter" category = "main" +description = "Persistent/Functional/Immutable data structures" +name = "pyrsistent" +optional = false +python-versions = ">=3.6" +version = "0.18.0" + +[[package]] +category = "main" +description = "A python library adding a json log formatter" +name = "python-json-logger" optional = false python-versions = ">=2.7" +version = "0.1.11" [[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" category = "dev" +description = "" +name = "pywin32-ctypes" optional = false python-versions = "*" +version = "0.2.0" [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.16.0" [[package]] -name = "strict-rfc3339" -version = "0.7" -description = "Strict, simple, lightweight RFC3339 functions" category = "main" +description = "Strict, simple, lightweight RFC3339 functions" +name = "strict-rfc3339" optional = false python-versions = "*" +version = "0.7" [[package]] -name = "takethetime" -version = "0.3.1" -description = "Take The Time, a time-taking library for Python" category = "main" +description = "Take The Time, a time-taking library for Python" +name = "takethetime" optional = false python-versions = "*" +version = "0.3.1" [[package]] -name = "timeslot" -version = "0.1.2" -description = "Data type for representing time slots with a start and end." category = "main" +description = "Data type for representing time slots with a start and end." +name = "timeslot" optional = false python-versions = ">=3.6,<4.0" +version = "0.1.2" [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" +description = "Python Library for Tom's Obvious, Minimal Language" +name = "toml" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.10.2" [[package]] -name = "tomlkit" -version = "0.6.0" -description = "Style preserving TOML library" category = "main" +description = "Style preserving TOML library" +name = "tomlkit" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.7.2" [[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typed-ast" optional = false python-versions = "*" +version = "1.4.3" [[package]] -name = "types-click" -version = "7.1.1" -description = "Typing stubs for click" category = "dev" +description = "Typing stubs for click" +name = "types-click" optional = false python-versions = "*" +version = "7.1.2" [[package]] -name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" +description = "Backported and Experimental Type Hints for Python 3.5+" +name = "typing-extensions" optional = false python-versions = "*" +version = "3.10.0.0" [[package]] -name = "zipp" -version = "3.4.1" -description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" +description = "Backport of pathlib-compatible object wrapper for zip files" +name = "zipp" optional = false python-versions = ">=3.6" +version = "3.5.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] +content-hash = "0fa8366da592fb13bd0d42d39fbab5fa26a3437b8789b40a0161f9d8c6d88321" lock-version = "1.1" python-versions = "^3.7" -content-hash = "26cb436c8ddfd05346db97043cd860df6483d1daea7d575efd7fc5768c08f40e" [metadata.files] altgraph = [ @@ -434,8 +447,8 @@ attrs = [ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] aw-core = [ - {file = "aw-core-0.5.3.tar.gz", hash = "sha256:6f7867103ebb8b07bf788ed02fd55dee51d1038f2a3a0e9fd82d1a7897bf6acb"}, - {file = "aw_core-0.5.3-py3-none-any.whl", hash = "sha256:0d7f361d234476ee4198c19819c2cd84551c69d99169b08491d8d926fd5a78fc"}, + {file = "aw-core-0.5.4.tar.gz", hash = "sha256:0450eb4958330021d6e65a11da41e41e534d504fcde188114eb06fca6fb4ea20"}, + {file = "aw_core-0.5.4-py3-none-any.whl", hash = "sha256:0b3324b4f8913506c467e6519ceccacf05a39bc095217ce86a0a4e40460c1acc"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, @@ -453,8 +466,8 @@ future = [ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, - {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, + {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, + {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, ] iso8601 = [ {file = "iso8601-0.1.14-py2.py3-none-any.whl", hash = "sha256:e7e1122f064d626e17d47cd5106bed2c620cb38fe464999e0ddae2b6d2de6004"}, @@ -473,37 +486,37 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mypy = [ - {file = "mypy-0.902-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3f12705eabdd274b98f676e3e5a89f247ea86dc1af48a2d5a2b080abac4e1243"}, - {file = "mypy-0.902-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2f9fedc1f186697fda191e634ac1d02f03d4c260212ccb018fabbb6d4b03eee8"}, - {file = "mypy-0.902-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0756529da2dd4d53d26096b7969ce0a47997123261a5432b48cc6848a2cb0bd4"}, - {file = "mypy-0.902-cp35-cp35m-win_amd64.whl", hash = "sha256:68a098c104ae2b75e946b107ef69dd8398d54cb52ad57580dfb9fc78f7f997f0"}, - {file = "mypy-0.902-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd01c599cf9f897b6b6c6b5d8b182557fb7d99326bcdf5d449a0fbbb4ccee4b9"}, - {file = "mypy-0.902-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e89880168c67cf4fde4506b80ee42f1537ad66ad366c101d388b3fd7d7ce2afd"}, - {file = "mypy-0.902-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ebe2bc9cb638475f5d39068d2dbe8ae1d605bb8d8d3ff281c695df1670ab3987"}, - {file = "mypy-0.902-cp36-cp36m-win_amd64.whl", hash = "sha256:f89bfda7f0f66b789792ab64ce0978e4a991a0e4dd6197349d0767b0f1095b21"}, - {file = "mypy-0.902-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:746e0b0101b8efec34902810047f26a8c80e1efbb4fc554956d848c05ef85d76"}, - {file = "mypy-0.902-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0190fb77e93ce971954c9e54ea61de2802065174e5e990c9d4c1d0f54fbeeca2"}, - {file = "mypy-0.902-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b5dfcd22c6bab08dfeded8d5b44bdcb68c6f1ab261861e35c470b89074f78a70"}, - {file = "mypy-0.902-cp37-cp37m-win_amd64.whl", hash = "sha256:b5ba1f0d5f9087e03bf5958c28d421a03a4c1ad260bf81556195dffeccd979c4"}, - {file = "mypy-0.902-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9ef5355eaaf7a23ab157c21a44c614365238a7bdb3552ec3b80c393697d974e1"}, - {file = "mypy-0.902-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:517e7528d1be7e187a5db7f0a3e479747307c1b897d9706b1c662014faba3116"}, - {file = "mypy-0.902-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fd634bc17b1e2d6ce716f0e43446d0d61cdadb1efcad5c56ca211c22b246ebc8"}, - {file = "mypy-0.902-cp38-cp38-win_amd64.whl", hash = "sha256:fc4d63da57ef0e8cd4ab45131f3fe5c286ce7dd7f032650d0fbc239c6190e167"}, - {file = "mypy-0.902-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:353aac2ce41ddeaf7599f1c73fed2b75750bef3b44b6ad12985a991bc002a0da"}, - {file = "mypy-0.902-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae94c31bb556ddb2310e4f913b706696ccbd43c62d3331cd3511caef466871d2"}, - {file = "mypy-0.902-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8be7bbd091886bde9fcafed8dd089a766fa76eb223135fe5c9e9798f78023a20"}, - {file = "mypy-0.902-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:4efc67b9b3e2fddbe395700f91d5b8deb5980bfaaccb77b306310bd0b9e002eb"}, - {file = "mypy-0.902-cp39-cp39-win_amd64.whl", hash = "sha256:9f1d74eeb3f58c7bd3f3f92b8f63cb1678466a55e2c4612bf36909105d0724ab"}, - {file = "mypy-0.902-py3-none-any.whl", hash = "sha256:a26d0e53e90815c765f91966442775cf03b8a7514a4e960de7b5320208b07269"}, - {file = "mypy-0.902.tar.gz", hash = "sha256:9236c21194fde5df1b4d8ebc2ef2c1f2a5dc7f18bcbea54274937cae2e20a01c"}, + {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, + {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, + {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, + {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, + {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, + {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, + {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, + {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, + {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, + {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, + {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, + {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, + {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, + {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, + {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, + {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, + {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, + {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, + {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, + {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, + {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, + {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, + {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] peewee = [ {file = "peewee-3.14.4.tar.gz", hash = "sha256:9e356b327c2eaec6dd42ecea6f4ddded025793dba906a3d065a0452e726c51a2"}, @@ -523,8 +536,8 @@ pyinstaller = [ {file = "pyinstaller-4.3.tar.gz", hash = "sha256:5ecf8bbc230d7298a796e52bb745b95eee12878d141f1645612c99246ecd23f2"}, ] pyinstaller-hooks-contrib = [ - {file = "pyinstaller-hooks-contrib-2021.1.tar.gz", hash = "sha256:892310e6363655838485ee748bf1c5e5cade7963686d9af8650ee218a3e0b031"}, - {file = "pyinstaller_hooks_contrib-2021.1-py2.py3-none-any.whl", hash = "sha256:27558072021857d89524c42136feaa2ffe4f003f1bdf0278f9b24f6902c1759c"}, + {file = "pyinstaller-hooks-contrib-2021.2.tar.gz", hash = "sha256:7f5d0689b30da3092149fc536a835a94045ac8c9f0e6dfb23ac171890f5ea8f2"}, + {file = "pyinstaller_hooks_contrib-2021.2-py2.py3-none-any.whl", hash = "sha256:57964f93eb69255c49159ffdf052aae893feed223b0f69773dfd010ca6c569d9"}, ] pyobjc-core = [ {file = "pyobjc-core-7.3.tar.gz", hash = "sha256:5081aedf8bb40aac1a8ad95adac9e44e148a882686ded614adf46bb67fd67574"}, @@ -575,8 +588,35 @@ pyqt5-sip = [ pyqt5-stubs = [ {file = "PyQt5-stubs-5.14.2.2.tar.gz", hash = "sha256:b1a84b12bbeed74d95cc7fb4fd2df0a6711bd43e9a2651e552c83930c7b81638"}, ] +pyqtwebengine = [ + {file = "PyQtWebEngine-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-abi3-macosx_10_13_intel.whl", hash = "sha256:e9f4a09cce6d8ab8b6c7e7a11e21f606ae713ff275c749839aa4d871a799fccc"}, + {file = "PyQtWebEngine-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:db99bdf6c01c84bcc7369b0c49702e40451bc48372d4281777e17dbb84874c1a"}, + {file = "PyQtWebEngine-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-none-win32.whl", hash = "sha256:fe5a02d4cf2327b6a930f8146589842b7664ac703cfddf1f83172423a32e3164"}, + {file = "PyQtWebEngine-5.15.2-5.15.2-cp35.cp36.cp37.cp38.cp39-none-win_amd64.whl", hash = "sha256:8ba247d0873bbeaee70f273cafbfa985a93947b2b8df23059607ec3595fee128"}, + {file = "PyQtWebEngine-5.15.2.tar.gz", hash = "sha256:4d72fea774071ce6f76e341a3d2c5d595886c9906a9b9493239c841cce54a634"}, +] pyrsistent = [ - {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, + {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, + {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, ] python-json-logger = [ {file = "python-json-logger-0.1.11.tar.gz", hash = "sha256:b7a31162f2a01965a5efb94453ce69230ed208468b0bbc7fdfc56e6d8df2e281"}, @@ -604,8 +644,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomlkit = [ - {file = "tomlkit-0.6.0-py2.py3-none-any.whl", hash = "sha256:e5d5f20809c2b09276a6c5d98fb0202325aee441a651db84ac12e0812ab7e569"}, - {file = "tomlkit-0.6.0.tar.gz", hash = "sha256:74f976908030ff164c0aa1edabe3bf83ea004b3daa5b0940b9c86a060c004e9a"}, + {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, + {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, ] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, @@ -640,7 +680,8 @@ typed-ast = [ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] types-click = [ - {file = "types_click-7.1.1-py2.py3-none-any.whl", hash = "sha256:b1db0fb31a6d4a31c4282c231827cbdab628b0d504b016937822d943cd5e40a5"}, + {file = "types-click-7.1.2.tar.gz", hash = "sha256:040897284e4f9466825c3865f708a985a8e7ba4d8e22cb9198ffb7b522160850"}, + {file = "types_click-7.1.2-py2.py3-none-any.whl", hash = "sha256:4722746f1ec9fd3fc8b1d7fb8c840604dc22f9e32bcc7a31a36d6d85cc2bce24"}, ] typing-extensions = [ {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, @@ -648,6 +689,6 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, ] diff --git a/pyproject.toml b/pyproject.toml index 588dbee..3693a7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ aw-qt = "aw_qt:main" python = "^3.7" aw-core = "^0.5" PyQt5 = "5.15.2" +pyqtwebengine = "*" pyobjc-framework-Cocoa = { version = "^7.0", platform = "darwin" } click = "^7.1.2"