Merge pull request #17 from venthur/fix_autoreload

Fix autoreload
This commit is contained in:
Bastian Venthur
2021-11-06 15:00:08 +01:00
committed by GitHub
3 changed files with 55 additions and 2 deletions

View File

@@ -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

View File

@@ -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()

View File

@@ -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