Concepts
There are three relevant concepts for the configuration that are provided by Novella itself:
Options
An option is defined using the NovellaContext.option()
function and allows you to define a command-line option that
is parsed by Novella when running your build script.
option
"site_directory" "d"
description: "The directory in which to generate the final HTML."
default: "_site"
Actions
Actions are plugins that execute some logic when its their turn and are declared using the NovellaContext.do()
function. Inside the configuration closure of actions, the NovellaContext.options
dictionary can be used to
read option values that have been passed via the CLI.
do "copy-files" {
paths = [ "content", "mkdocs.yml" ]
}
Every action has a name, and by default that name will be the name of the action type ID that is the first argument
to the do()
method. You can override this name using the name
keyword argument. The name can be used to access
the action at a later point in the build script using the NovellaContext.action()
method.
template "mkdocs"
action "preprocess-markdown" { # This action was created by the mkdocs template
use "pydoc" # Make use of the pydoc preprocessor plugin (note: requires Pydoc-Markdown)
}
Note
New actions can be implemented using the novella.action.Action
base class and registering the subclass under
the novella.actions
entrypoint.
Users can also create action logic on-the-fly by passing a closure to the do()
method instead of an action ID.
The dependencies of the action can be managed from the configuration closure. Actions created this way need to
have a name
set explicitly.
# ...
def api_pages = {
"Configuration": "my_package.config",
"Client": "my_package.client",
}
# Generate some files in the build directory (here by the variable "directory" which is available
# through the Novella build context exposed in the action closure).
do
name: "generate-api-pages"
closure: {
precedes "preprocess-markdown"
}
action: {
for title, package in api_pages.items():
def filename = directory / 'content' / 'api' / (package + '.md')
filename.parent.mkdir(parents=True, exist_ok=True)
filename.write_text('---\ntitle: {}\n---\n@pydoc {}\n'.format(title, package))
}
Templates
A template is a plugin that takes over definition of the Novella pipeline to avoid some boilerplate in your
configuration script. Templates are invoked via the NovellaContext.template()
function and can also be
configured using "init" and "post" closures (before the template is executed and after, respectively). Novella
itself delivers an mkdocs
template out of the box.
template "mkdocs"
action "mkdocs-update-config" {
apply_defaults = False
}
Note
New templates can be implemented using the novella.template.Template
base class and registering the subclass
under the novella.templates
entrypoint.
Build process
Novella is intended as a build system for processing (i.e. updating) existing files. In order to not modify any
original files, every build is executed in a temporary build directory that the required files are copied to using
the copy-files
action. This should remind you of Docker builds, where files are copied into the build container
using the ADD
or COPY
commands, only that Novella obviously is not running in as an isolated environment.
do "copy-files" {
paths = [ 'content/' ]
}
The paths here will be watched for changes, allowing Novella to restart the pipeline if that feature is enabled
(either by passing the -r,--use-reloader
option or if any action supports reloading (like the action that runs
MkDocs in the mkdocs
template).