From 4f1632e3cd3b09cf53782b57133b21d770c41501 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Sat, 6 Nov 2021 14:12:57 +0100 Subject: [PATCH 1/4] Immediately rebuild once when entering autoreload --- blag/devserver.py | 7 ++++++- tests/test_devserver.py | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/blag/devserver.py b/blag/devserver.py index 2160709..c293633 100644 --- a/blag/devserver.py +++ b/blag/devserver.py @@ -55,6 +55,9 @@ def autoreload(args): last modified time). If the last modified time has changed, a rebuild is triggered. + A rebuild is also performed immediately when this method is called + to avoid serving stale contents. + Parameters ---------- args : argparse.Namespace @@ -62,7 +65,9 @@ def autoreload(args): """ dirs = [args.input_dir, args.template_dir, args.static_dir] logger.info(f'Monitoring {dirs} for changes...') - last_mtime = get_last_modified(dirs) + # make sure we trigger the rebuild immediately when we enter the + # loop to avoid serving stale contents + last_mtime = 0 while True: mtime = get_last_modified(dirs) if mtime > last_mtime: diff --git a/tests/test_devserver.py b/tests/test_devserver.py index f06d45c..604a517 100644 --- a/tests/test_devserver.py +++ b/tests/test_devserver.py @@ -1,4 +1,5 @@ import time +import threading from blag import devserver @@ -19,3 +20,45 @@ def test_get_last_modified(cleandir): assert t2 > t1 assert t2 == t3 + + +def test_autoreload_builds_immediately(args): + # create a dummy file that can be build + with open('content/test.md', 'w') as fh: + fh.write('boo') + + t = threading.Thread(target=devserver.autoreload, + args=(args, ), + daemon=True,) + t0 = devserver.get_last_modified(['build']) + t.start() + # try for 5 seconds... + for i in range(5): + time.sleep(1) + t1 = devserver.get_last_modified(['build']) + print(t1) + if t1 > t0: + break + assert t1 > t0 + + +def test_autoreload(args): + t = threading.Thread(target=devserver.autoreload, + args=(args, ), + daemon=True,) + t.start() + + t0 = devserver.get_last_modified(['build']) + + # create a dummy file that can be build + with open('content/test.md', 'w') as fh: + fh.write('boo') + + # try for 5 seconds... + for i in range(5): + time.sleep(1) + t1 = devserver.get_last_modified(['build']) + print(t1) + if t1 > t0: + break + assert t1 > t0 From 78316725cfd1c1e331da1ef723f593031cb93b6c Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Sat, 6 Nov 2021 14:51:46 +0100 Subject: [PATCH 2/4] =?UTF-8?q?remove=20warning=20in=20test=20due=20to=20t?= =?UTF-8?q?hreading=20race=20condition=20we=20don=C2=B4t=20care=20about?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blag/devserver.py | 2 +- tests/test_devserver.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/blag/devserver.py b/blag/devserver.py index c293633..0ff3611 100644 --- a/blag/devserver.py +++ b/blag/devserver.py @@ -72,7 +72,7 @@ def autoreload(args): mtime = get_last_modified(dirs) if mtime > last_mtime: last_mtime = mtime - logger.debug('Change detected, rebuilding...') + logger.info('Change detected, rebuilding...') blag.build(args) time.sleep(1) diff --git a/tests/test_devserver.py b/tests/test_devserver.py index 604a517..7f56a40 100644 --- a/tests/test_devserver.py +++ b/tests/test_devserver.py @@ -1,6 +1,8 @@ import time import threading +import pytest + from blag import devserver @@ -42,6 +44,7 @@ def test_autoreload_builds_immediately(args): assert t1 > t0 +@pytest.mark.filterwarnings("ignore::pytest.PytestUnhandledThreadExceptionWarning") # noqa def test_autoreload(args): t = threading.Thread(target=devserver.autoreload, args=(args, ), @@ -54,11 +57,10 @@ def test_autoreload(args): with open('content/test.md', 'w') as fh: fh.write('boo') - # try for 5 seconds... + # try for 5 seconds to see if we rebuild once... for i in range(5): time.sleep(1) t1 = devserver.get_last_modified(['build']) - print(t1) if t1 > t0: break assert t1 > t0 From 0fb01e3249c526e1513783b81c2d4796492eb710 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Sat, 6 Nov 2021 14:53:56 +0100 Subject: [PATCH 3/4] updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f063132..00edab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [unreleased] +* `make serve` now rebuilds immediately once after called to avoid serving + stale files * updated dependencies: * feedgenerator 2.0.0 * jinja2 3.0.1 From 2366a2ae86131327a79c686e0083d251029c1a04 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Sat, 6 Nov 2021 14:57:37 +0100 Subject: [PATCH 4/4] print the devserver URL to output --- blag/devserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/blag/devserver.py b/blag/devserver.py index 0ff3611..dbc7386 100644 --- a/blag/devserver.py +++ b/blag/devserver.py @@ -89,4 +89,5 @@ def serve(args): directory=args.output_dir)) proc = multiprocessing.Process(target=autoreload, args=(args,)) proc.start() + logger.info("\n\n Devserver Started -- visit http://localhost:8000\n") httpd.serve_forever()