Skip to main content

Fill template files with structured data

Project description

NAME

kera — Fill template files with structured data

SYNOPSIS

kera plate_files... data_files...

OPTIONS

-o, --out : The directory in which to write all files. Defaults to the current directory.

INSTALL

kera can be installed using the pip package manager.

pipx install kera

DESCRIPTION

This program takes a collection of template files (.plate) and a collection of data files (.json or .yaml) and then uses the data to fill placeholder "keys" in the templates. Each individual data file produces an output for each individual template file.

To represent a simple key in a template file, surround it in double hashes:

= ##title##
by ##name## on ##date##

##content##

And provide the data in your format of choice:

{
    "title": "kera",
    "name": "Carston Wiebe",
    "date": "JAN 01 1970",
    "content": "Fill template files with structured data."
}

This results in:

= kera
by Carston Wiebe on JAN 01 1970

Fill template files with structured data.

Template files can have the extension .plate, but any file that isn't a data file will be read as a template by default.

Supported data filetypes are:

  • JSON
  • YAML

If you want to use a data file as a template file, it must have the .plate extension, e.g. .json.plate

The default filename of the filled template is the name of the data file (minus extension), an underscore, and the name of the template file (with extension, minus .plate if present). These output files can be redirected to a different directory with the --out option.

As an example:

$ ls
> 123.sql 456.sql.plate abc.json def.yml
$ kera --out output 123.sql 456.sql.plate abc.json def.yml
$ ls output
> abc_123.sql abc_456.sql def_123.sql def_456.sql

kera also supports conditional keys and collection keys. Conditional keys can be represented as such:

##[ condition ]{{ if true }}{{ if false (optional) }}

The condition is simply a key found in the data, and it is true if the value of the key is truthy according to Python. If the key is not found, it is automatically false. The "body" of the conditional slot is treated as normal body text, you can include other slots inside it and nest slots as much as you wish. For instance:

<div class="profile">
    <h3>##name##</h3>
    <ul class="inline">
        ##[pronouns]{{ <li>##pronouns##</li> }}
        ##[language]{{ <li>##language##</li> }}
        ##[join-date]{{ <li>Joined ##joined-date##</li> }}
    </ul>
    ##[desc]{{
        ##desc##
    }}{{
        <p>No bio provided.</p>
    }}
</div>

With this, you process full profiles:

name: Scofflaw Saxwulf
pronouns: he/him
language: ENG | FIN
join-date: AUG 23 2025
desc: <p>INSERT INTERESTING BIO HERE</p>
<div class="profile">
    <h3>Scofflaw Saxwulf</h3>
    <ul class="inline">
        <li>he/him</li>
        <li>ENG | FIN</li>
        <li>Joined </li>
    </ul>
    <p>INSERT INTERESTING BIO HERE</p>
</div>

And partial profiles:

name: Lusaka Hernesto
pronouns: she/her
<div class="profile">
    <h3>Lusaka Hernesto</h3>
    <ul class="inline">
        <li>she/her</li>
        
        
    </ul>
    <p>No bio provided.</p>
</div>

Collection keys are represented as:

##collection{{ body for each collection member }}

In a collection body, the "scope" that contains available keys is not the original data, but rather the keys nested insided the collection key. This is easier shown than explained:

table: Person
joins:
  - table: Place
    alias: a
    join-on: addressId

  - table: Place
    alias: w
    join-on: workAddressId

  - table: Job
    alias: j
    join-on: workId
SELECT  *
FROM    ##table##
##joins{{
    JOIN    ##table## ##alias## ON ##join-on## = ##alias##.id
}};
SELECT  *
FROM    Person
JOIN    Place a ON addressId = a.id
JOIN    Place w ON workAddressId = w.id
JOIN    Job j ON workId = j.id;

By default each member of the collection is joined with a newline, but you can alter this by providing a join string before the collection body:

table: Record
columns:
  - name: create_date
    type: DATE

  - name: update_date
    type: DATE

  - name: id
    type: INTEGER

  - name: content
    type: TEXT
CREATE PROCEDURE insert_into_##table##
( ##columns(\n, ){{
    p_##name## IN ##type##
  }}
)
BEGIN

    INSERT
    INTO    ##table##
            ( ##columns(\n            , ){{
                ##name##
              }}
            )
    VALUES  ( ##columns(\n            , ){{
                p_##name##
              }}
            );

END insert_into_##table##;
CREATE PROCEDURE insert_into_Record
( p_create_date IN DATE
, p_update_date IN DATE
, p_id IN INTEGER
, p_content IN TEXT
)
BEGIN

    INSERT
    INTO    Record
            ( create_date
            , update_date
            , id
            , content
            )
    VALUES  ( p_create_date
            , p_update_date
            , p_id
            , p_content
            );

END insert_into_Record;

BUGS

  1. If a key in YAML is made up of numbers and only numbers, the YAML parser will store it as an integer, which won't be resolved properly when kera tries to retrieve it as a string. To prevent this, surround such keys with double quotes:

    # bad:
    1: this won't be resolved
    # good:
    "1": this WILL be resolved
    

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kera-1.0.0.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kera-1.0.0-py2.py3-none-any.whl (7.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file kera-1.0.0.tar.gz.

File metadata

  • Download URL: kera-1.0.0.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.2

File hashes

Hashes for kera-1.0.0.tar.gz
Algorithm Hash digest
SHA256 6154df166c99e8604dc8c39e452638c5c92a955e3133d6163027ca06ca283fbe
MD5 8d2e97b8ca25276ff1de3e1e8d717066
BLAKE2b-256 486173a240203ffd7ece67eec3a04e753cbdf303856b44f62d2d9c68dd999c25

See more details on using hashes here.

File details

Details for the file kera-1.0.0-py2.py3-none-any.whl.

File metadata

  • Download URL: kera-1.0.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 7.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.2

File hashes

Hashes for kera-1.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 a1b50b9f42bf3c1f391cd216d157cdabc11f4f659eb6b765ab79fb3aa413f211
MD5 2d1ac1b9e053a0d6c0b48cac2e2e834a
BLAKE2b-256 052816494823a065d236a5ce4de763ff89da6e5965d21e53fd465d8ab4a17f09

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page