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, wait=1)

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
wait int

number of seconds the devsever waits before checking for updated content

1
Source code in blag/devserver.py
52
53
54
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
83
84
85
86
87
88
def autoreload(args: argparse.Namespace, wait: int=1) -> 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
    wait
        number of seconds the devsever waits before checking for updated
        content

    """
    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:
        # make sure the devsever does not crash when the build fails with an
        # exception
        try:
            mtime = get_last_modified(dirs)
            if mtime > last_mtime:
                last_mtime = mtime
                logger.info("Change detected, rebuilding...")
                blag.build(args)
            time.sleep(wait)
        except Exception:
            logger.exception("Error occurred during rebuild:")
            logger.info("Devserver did not crash, you may continue editing.")

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
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()