mirror of
https://github.com/ankitects/anki.git
synced 2025-09-25 17:26:36 -04:00
Add dev tools for live-reloading Anki's web views (#2151)
* Add dev tools for live-reloading the web stack while running Anki * Handle CDP connection errors more graciously * Include sass in web stack watchers * Refactor monitored folder and event definition * Switch to more specific build target Thanks to @hikaru-y * Add PyChromeDevTools to dev requirements * Update rebuild-web for ninja * Satisfy mypy * Remove ts-watch Superseded by web-watch (the version here was also still based around bazel) * Simplify calls to other build tools Given that `./ninja qt/aqt` has to be run from the project root anyways, it doesn't make sense to use calls relative to `rebuild-web` in an ill-guided effort to lower dependencies on hard-coded paths. * Remove remaining script-relative tool path
This commit is contained in:
parent
3357389309
commit
2270ff425a
6 changed files with 101 additions and 14 deletions
|
@ -9,6 +9,7 @@ mypy-protobuf
|
||||||
pip-tools
|
pip-tools
|
||||||
pylint
|
pylint
|
||||||
pytest
|
pytest
|
||||||
|
PyChromeDevTools
|
||||||
fluent.syntax
|
fluent.syntax
|
||||||
types-decorator
|
types-decorator
|
||||||
types-flask
|
types-flask
|
||||||
|
|
|
@ -368,6 +368,9 @@ protobuf==4.21.9 \
|
||||||
# via
|
# via
|
||||||
# -r requirements.bundle.txt
|
# -r requirements.bundle.txt
|
||||||
# mypy-protobuf
|
# mypy-protobuf
|
||||||
|
pychromedevtools==0.4 \
|
||||||
|
--hash=sha256:453f889b11c58fed348206d1b6e91a0bbfe23a319365c586ae462214ecb513ce
|
||||||
|
# via -r requirements.dev.in
|
||||||
pylint==2.15.5 \
|
pylint==2.15.5 \
|
||||||
--hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \
|
--hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \
|
||||||
--hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004
|
--hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004
|
||||||
|
@ -420,7 +423,9 @@ pytoml==0.1.21 \
|
||||||
requests==2.28.1 \
|
requests==2.28.1 \
|
||||||
--hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \
|
--hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \
|
||||||
--hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349
|
--hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349
|
||||||
# via -r requirements.bundle.txt
|
# via
|
||||||
|
# -r requirements.bundle.txt
|
||||||
|
# pychromedevtools
|
||||||
send2trash==1.8.0 \
|
send2trash==1.8.0 \
|
||||||
--hash=sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d \
|
--hash=sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d \
|
||||||
--hash=sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08
|
--hash=sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08
|
||||||
|
@ -525,6 +530,10 @@ waitress==2.1.2 \
|
||||||
--hash=sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a \
|
--hash=sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a \
|
||||||
--hash=sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba
|
--hash=sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba
|
||||||
# via -r requirements.bundle.txt
|
# via -r requirements.bundle.txt
|
||||||
|
websocket-client==1.4.2 \
|
||||||
|
--hash=sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574 \
|
||||||
|
--hash=sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59
|
||||||
|
# via pychromedevtools
|
||||||
werkzeug==2.2.2 \
|
werkzeug==2.2.2 \
|
||||||
--hash=sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f \
|
--hash=sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f \
|
||||||
--hash=sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5
|
--hash=sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5
|
||||||
|
|
12
tools/rebuild-web
Executable file
12
tools/rebuild-web
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
# Manually trigger a rebuild and reload of Anki's web stack
|
||||||
|
|
||||||
|
# NOTE: This script needs to be run from the project root
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
./ninja qt/aqt
|
||||||
|
./out/pyenv/bin/python tools/reload_webviews.py
|
55
tools/reload_webviews.py
Executable file
55
tools/reload_webviews.py
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
"""
|
||||||
|
Trigger a reload of Anki's web views using QtWebEngine' Chromium
|
||||||
|
Remote Debugging interface.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import PyChromeDevTools # type: ignore[import]
|
||||||
|
|
||||||
|
DEFAULT_HOST = "localhost"
|
||||||
|
DEFAULT_PORT = 8080
|
||||||
|
|
||||||
|
|
||||||
|
def print_error(message: str):
|
||||||
|
print(f"Error: {message}", file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser("reload_webviews")
|
||||||
|
parser.add_argument(
|
||||||
|
"--host",
|
||||||
|
help=f"Host via which the Chrome session can be reached, e.g. {DEFAULT_HOST}",
|
||||||
|
type=str,
|
||||||
|
default=DEFAULT_HOST,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--port",
|
||||||
|
help=f"Port via which the Chrome session can be reached, e.g. {DEFAULT_PORT}",
|
||||||
|
type=str,
|
||||||
|
default=DEFAULT_PORT,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
try:
|
||||||
|
chrome = PyChromeDevTools.ChromeInterface(host=args.host, port=args.port)
|
||||||
|
except Exception as e:
|
||||||
|
print_error(
|
||||||
|
f"Could not establish connection to Chromium remote debugger. Exception:\n{e}"
|
||||||
|
)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if chrome.tabs is None:
|
||||||
|
print_error("Was unable to get active web views.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
for tab_index, tab_data in enumerate(chrome.tabs):
|
||||||
|
print(f"Reloading page: {tab_data['title']}")
|
||||||
|
chrome.connect(tab=tab_index, update_tabs=False)
|
||||||
|
chrome.Page.reload()
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Monitor the ts folder and rebuild aqt's data each time
|
|
||||||
# it changes, for testing pages locally.
|
|
||||||
#
|
|
||||||
# On a Mac, useful to combine with ts-run.
|
|
||||||
|
|
||||||
# run once at startup
|
|
||||||
cmd='printf \\033c\\n; bazel build qt:runanki'
|
|
||||||
sh -c "$cmd"
|
|
||||||
|
|
||||||
# then monitor for changes
|
|
||||||
fswatch -r -o ts | xargs -n1 -I{} sh -c "$cmd"
|
|
23
tools/web-watch
Executable file
23
tools/web-watch
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
# Monitor all web-related folders and rebuild and reload Anki's web stack
|
||||||
|
# when a change is detected.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
MONITORED_FOLDERS=("ts/" "sass/" "qt/aqt/data/web/")
|
||||||
|
MONITORED_EVENTS=("Created" "Updated" "Removed")
|
||||||
|
|
||||||
|
on_change_detected="printf \\033c\\n; \"./tools/rebuild-web\""
|
||||||
|
|
||||||
|
event_args=""
|
||||||
|
for event in "${MONITORED_EVENTS[@]}"; do
|
||||||
|
event_args+="--event ${event} "
|
||||||
|
done
|
||||||
|
|
||||||
|
# poll_monitor comes with a slight performance penalty, but seems to more
|
||||||
|
# reliably identify file system events across both macOS and Linux
|
||||||
|
fswatch -r -o -m poll_monitor ${event_args[@]} \
|
||||||
|
"${MONITORED_FOLDERS[@]}" | xargs -n1 -I{} sh -c "$on_change_detected"
|
Loading…
Reference in a new issue