diff --git a/CHANGELOG.md b/CHANGELOG.md index 1623e3d..13030c4 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 diff --git a/blag/devserver.py b/blag/devserver.py index 2160709..dbc7386 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,12 +65,14 @@ 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: last_mtime = mtime - logger.debug('Change detected, rebuilding...') + logger.info('Change detected, rebuilding...') blag.build(args) time.sleep(1) @@ -84,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() diff --git a/tests/test_devserver.py b/tests/test_devserver.py index f06d45c..7f56a40 100644 --- a/tests/test_devserver.py +++ b/tests/test_devserver.py @@ -1,4 +1,7 @@ import time +import threading + +import pytest from blag import devserver @@ -19,3 +22,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 + + +@pytest.mark.filterwarnings("ignore::pytest.PytestUnhandledThreadExceptionWarning") # noqa +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 to see if we rebuild once... + for i in range(5): + time.sleep(1) + t1 = devserver.get_last_modified(['build']) + if t1 > t0: + break + assert t1 > t0