Skip to content

blag.devserver

Development Server.

This module provides functionality for blag's development server. It automatically detects changes in certain directories and rebuilds the site if necessary.

autoreload(args)

Start the autoreloader.

This method monitors the given directories for changes (i.e. the 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:

Name Type Description Default
args Namespace

contains the input-, template- and static dir

required
Source code in blag/devserver.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def autoreload(args: argparse.Namespace) -> NoReturn:
    """Start the autoreloader.

    This method monitors the given directories for changes (i.e. the
    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
        contains the input-, template- and static dir

    """
    dirs = [args.input_dir, args.template_dir, args.static_dir]
    logger.info(f"Monitoring {dirs} for changes...")
    # make sure we trigger the rebuild immediately when we enter the
    # loop to avoid serving stale contents
    last_mtime = 0.0
    while True:
        mtime = get_last_modified(dirs)
        if mtime > last_mtime:
            last_mtime = mtime
            logger.info("Change detected, rebuilding...")
            blag.build(args)
        time.sleep(1)

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:

Name Type Description Default
dirs list[str]

list of directories to search

required

Returns:

Type Description
float

most recent modification time found in dirs

Source code in blag/devserver.py
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def get_last_modified(dirs: list[str]) -> float:
    """Get the last modified time.

    This method recursively goes through `dirs` and returns the most
    recent modification time time found.

    Parameters
    ----------
    dirs
        list of directories to search

    Returns
    -------
    float
        most recent modification time found in `dirs`

    """
    last_mtime = 0.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

serve(args)

Start the webserver and the autoreloader.

Parameters:

Name Type Description Default
args Namespace

contains the input-, template- and static dir

required
Source code in blag/devserver.py
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
def serve(args: argparse.Namespace) -> None:
    """Start the webserver and the autoreloader.

    Parameters
    ----------
    args
        contains the input-, template- and static dir

    """
    httpd = HTTPServer(
        ("", 8000),
        partial(SimpleHTTPRequestHandler, 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()