All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
FileRenderer
(and thusDirectoryRenderer
) now use\n
line endings in the resulting file. This should probably just be an option with the default being to preserve the line ending format of the template file, but since this is being used to render files that should run on Linux and apparently incorrect line endings mess up the shebang reading and sht like that so I'm applying this "sht fix" for now.
- A new
DirectoryRenderer
andDirectoryTemplate
to render entire directories of templates in one go - Support for
{% skip_if %}
and{% setfilename %}
tags to control directory names and skipping by adding them to a file called__stencil_meta__
placed in any directory in aDirectoryTemplate
- The ability to run directory rendering via command line with the
-d
flag
- A new
{% setfilename %}
tag where you can set the desired filename of the rendered file dynamically in the tags body with normal template code e.g. using the template context
- The
FileRenderer
can now define a directory as output location which will result in the rendered file to be the same as the input template file name (if any) unless set explicitly via the{% setfilename %}
tag.
- FileRenderer was hitting an infinite loop
- Added dynamic path extension to include cwd to enable
${__PY__:...}
injecting from project roots
- Bumped the version requirement of Alviss to 3.3 to get support for the new
${__PY__:...}
expressions in order to inject module versions into Alviss contexts for CI/CD manifests
- New Extension that adds a
{% skip_if %}
tag where you can insert any condition (e.g. checking the Context) and if it evals as True, aCancelRendering
exception is raised and caught by the Renderers causing them to silently just skip rendering that template.- The
StringRenderer
returnsNone
- The
StoutRenderer
prints out nothing - The
FileRenderer
doesn't create an output file
- The
- Added unittests for the
{% skip_if %}
tag
- A bug in the
guess_template_by_argument
method that raised exceptions while checking to see if a given string could be interpreted as a path to an existing file (which should be allowed to fail silently and then the string returned as aStringTemplate
)
Embedding Extension & Base64 Filter update
- The
EmbedExtension
to the Jinja2 environment used that enables using the{% embed 'my_file.txt' %}
to embed the requested file "as-is" (so not parsed as a template or anything like that) into templates wholesale with these optional arguments:indent
(default: 0) to indent each line of the embedded file by a certain number of spaces, e.g. for embedding into YAML files, where indent is syntactically importantalviss
(default:False
) to run the embedded file though the Alviss "render_loader" before embedding the resultsenv
(default:False
) to make the Alviss parser render${__ENV__:...}
expressionsfidelius
(default:False
) to make the Alviss parser render${__FID__:...}
expressions
- The main use case here was considered things like creating Kubernetes File Config maps where e.g. config file content is embedded wholesale into the manifest's YAML
- The
base64
filter to the Jinja2 environment used to quicly encode context variables as base64 encoded strings- The main use case here was considered things like rendering of Kubernetes Secret manifests where keys need to be base64 encoded
- A "shortcut" method called
render_stencil
for quicly rendering tostr
(via theStringRenderer
) in code that takes two simple kwargs calledtemplate
andcontext
and will use the appropriate Template and Context implementations based on the type and/or value of those arguments (see below) - Two utility functions that attempt to instantiate the appropriate Template and
Context types based on the argument types supplied as
template
andcontext
:- A template that is an instance of
pathlib.Path
will be aFileTemplate
- A template that is a multi-line
str
will be aStringTemplate
- A template that is a single-line
str
will:- First attempt to see if it refers to a template name that Jinja2 can load,
and return a
FileTemplate
if so - Then it'll see if the string can be interpreted as a file system path to a
file that exists, and then return a
FileTemplate
- If all that fails, it'll just assume the
str
is the template itself and return aStringTemplate
- First attempt to see if it refers to a template name that Jinja2 can load,
and return a
- A context that is an instance of
pathlib.Path
or astr
will be anAlvissContext
- A context that is a
dict
will be aDictContext
- A template that is an instance of
- A bunch of "proper" unittests for the new embedding and filter functions
- The
FileTemplate
now uses the Jinja2 environment'sFileSystemLoader
, pre-seeded with search paths of the current working directory (os.getcwd()
) as well as the root directory of the script being executed (sys.argv[0]
) plus whatever paths are defined in theSTENCIL_TEMPLATE_PATH
environment variable, if any (multiple paths seperated by;
)- This change enables and vastly simplifies using the Jinaj2 built in
expressions like
{% extends ... %}
and{% include ... %}
"out of the box" so to speak as well as making custom{% marcro ... %}
files to include.
- This change enables and vastly simplifies using the Jinaj2 built in
expressions like
Initial release
- The project in its entirety
- Template types:
FileTemplate
StringTemplate
- Context types:
DictContext
KeyWordArgumentContext
AlvissContext
- Renderer Types
StringRenderer
StdOutRenderer
FileRenderer