From b077e2298432079a160b4e6d2c95cd1da5f4eb89 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Sun, 7 Mar 2021 13:24:53 +0100 Subject: [PATCH 1/4] WIP --- blag/blag.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/blag/blag.py b/blag/blag.py index 0e1955f..75542c0 100644 --- a/blag/blag.py +++ b/blag/blag.py @@ -76,6 +76,29 @@ def parse_args(args=None): quickstart_parser = commands.add_parser('quickstart') quickstart_parser.set_defaults(func=quickstart) + serve_parser = commands.add_parser('serve') + serve_parser.set_defaults(func=serve) + serve_parser.add_argument( + '-i', '--input-dir', + default='content', + help='Input directory (default: content)', + ) + serve_parser.add_argument( + '-o', '--output-dir', + default='build', + help='Ouptut directory (default: build)', + ) + serve_parser.add_argument( + '-t', '--template-dir', + default='templates', + help='Template directory (default: templates)', + ) + serve_parser.add_argument( + '-s', '--static-dir', + default='static', + help='Static directory (default: static)', + ) + return parser.parse_args(args) @@ -352,5 +375,47 @@ def quickstart(args): config.write(fh) +def get_last_modified(): + + last_mtime = 0 + + for dir in 'content', 'static', 'templates': + for root, dirs, files in os.walk(dir): + for f in files: + mtime = os.stat(os.path.join(root, f)).st_mtime + if mtime > last_mtime: + last_mtime = mtime + + return last_mtime + + +def autoreload(args): + import time + last_mtime = get_last_modified() + while True: + mtime = get_last_modified() + if mtime > last_mtime: + last_mtime = mtime + logger.debug('ping!') + build(args) + time.sleep(1) + + +def serve(args): + import multiprocessing + from http.server import SimpleHTTPRequestHandler, HTTPServer + from functools import partial + + + httpd = HTTPServer(('', 8000), partial(SimpleHTTPRequestHandler, directory='build')) + + p1 = multiprocessing.Process(target=autoreload, args=(args,)) + #p2 = # todo start http server + + p1.start() + #p2.start() + httpd.serve_forever() + + if __name__ == '__main__': main() From dc6547290b52d1d2b1ee3f8e7be8cd206c0f3923 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Fri, 19 Mar 2021 11:22:11 +0100 Subject: [PATCH 2/4] added devserver --- blag/blag.py | 58 +++++++++-------------------------------- tests/test_devserver.py | 30 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 45 deletions(-) create mode 100644 tests/test_devserver.py diff --git a/blag/blag.py b/blag/blag.py index 75542c0..7c3bfaa 100644 --- a/blag/blag.py +++ b/blag/blag.py @@ -19,6 +19,7 @@ from jinja2 import Environment, ChoiceLoader, FileSystemLoader, PackageLoader import feedgenerator from blag.markdown import markdown_factory, convert_markdown +from blag.devserver import serve logger = logging.getLogger(__name__) logging.basicConfig( @@ -50,7 +51,10 @@ def parse_args(args=None): commands = parser.add_subparsers(dest='command') commands.required = True - build_parser = commands.add_parser('build') + build_parser = commands.add_parser( + 'build', + help='Build website.', + ) build_parser.set_defaults(func=build) build_parser.add_argument( '-i', '--input-dir', @@ -73,10 +77,16 @@ def parse_args(args=None): help='Static directory (default: static)', ) - quickstart_parser = commands.add_parser('quickstart') + quickstart_parser = commands.add_parser( + 'quickstart', + help="Quickstart blag, creating necessary configuration.", + ) quickstart_parser.set_defaults(func=quickstart) - serve_parser = commands.add_parser('serve') + serve_parser = commands.add_parser( + 'serve', + help="Start development server.", + ) serve_parser.set_defaults(func=serve) serve_parser.add_argument( '-i', '--input-dir', @@ -375,47 +385,5 @@ def quickstart(args): config.write(fh) -def get_last_modified(): - - last_mtime = 0 - - for dir in 'content', 'static', 'templates': - for root, dirs, files in os.walk(dir): - for f in files: - mtime = os.stat(os.path.join(root, f)).st_mtime - if mtime > last_mtime: - last_mtime = mtime - - return last_mtime - - -def autoreload(args): - import time - last_mtime = get_last_modified() - while True: - mtime = get_last_modified() - if mtime > last_mtime: - last_mtime = mtime - logger.debug('ping!') - build(args) - time.sleep(1) - - -def serve(args): - import multiprocessing - from http.server import SimpleHTTPRequestHandler, HTTPServer - from functools import partial - - - httpd = HTTPServer(('', 8000), partial(SimpleHTTPRequestHandler, directory='build')) - - p1 = multiprocessing.Process(target=autoreload, args=(args,)) - #p2 = # todo start http server - - p1.start() - #p2.start() - httpd.serve_forever() - - if __name__ == '__main__': main() diff --git a/tests/test_devserver.py b/tests/test_devserver.py new file mode 100644 index 0000000..5490a93 --- /dev/null +++ b/tests/test_devserver.py @@ -0,0 +1,30 @@ +import time + +import pytest + +from tempfile import TemporaryDirectory +from blag import devserver + + +@pytest.fixture +def tempdir(): + with TemporaryDirectory() as dir: + yield dir + + +def test_get_last_modified(tempdir): + # take initial time + t1 = devserver.get_last_modified([tempdir]) + + # wait a bit, create a file and measure again + time.sleep(0.1) + with open(f'{tempdir}/test', 'w') as fh: + fh.write('boo') + t2 = devserver.get_last_modified([tempdir]) + + # wait a bit and take time again + time.sleep(0.1) + t3 = devserver.get_last_modified([tempdir]) + + assert t2 > t1 + assert t2 == t3 From aac2d70feda1dd9eca8dca2490fdd1511a0c5522 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Fri, 19 Mar 2021 11:22:56 +0100 Subject: [PATCH 3/4] updated readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f383708..c278938 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ blag is named after [the blag of the webcomic xkcd][blagxkcd]. * Theming support using [Jinja2][] templates * Generation of Atom feeds for blog content * Fenced code blocks and syntax highlighting using [Pygments][] +* Integrated devserver blag runs on Linux, Mac and Windows and requires Python >= 3.8 From 7f832a144550228a8fe512c01f887efb52a919d5 Mon Sep 17 00:00:00 2001 From: Bastian Venthur Date: Fri, 19 Mar 2021 11:24:58 +0100 Subject: [PATCH 4/4] added missing devserver.py m( --- blag/devserver.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 blag/devserver.py diff --git a/blag/devserver.py b/blag/devserver.py new file mode 100644 index 0000000..56fda8c --- /dev/null +++ b/blag/devserver.py @@ -0,0 +1,60 @@ +import os +import logging +import time +import multiprocessing +from http.server import SimpleHTTPRequestHandler, HTTPServer +from functools import partial + +from blag import blag + + +logger = logging.getLogger(__name__) + + +def get_last_modified(dirs): + """Get the last modified time. + + This method recursively goes through `dirs` and returns the most + recent modification time time found. + + Parameters + ---------- + dirs : list[str] + list of directories to search + + Returns + ------- + int : most recent modification time found in `dirs` + + """ + last_mtime = 0 + + for dir in dirs: + for root, dirs, files in os.walk(dir): + for f in files: + mtime = os.stat(os.path.join(root, f)).st_mtime + if mtime > last_mtime: + last_mtime = mtime + + return last_mtime + + +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) + while True: + mtime = get_last_modified(dirs) + if mtime > last_mtime: + last_mtime = mtime + logger.debug('Change detected, rebuilding...') + blag.build(args) + time.sleep(1) + + +def serve(args): + httpd = HTTPServer(('', 8000), partial(SimpleHTTPRequestHandler, + directory=args.output_dir)) + proc = multiprocessing.Process(target=autoreload, args=(args,)) + proc.start() + httpd.serve_forever()