Skip to main content

Protein: a macro language for data composition and templating

Project description

Protein, a Data Composer and Templating Tool

Problem

Nowadays, a lot of software is piloted by data files, typically JSON or YAML files.

JSON and YAML are excellent file formats but they are essentially static. Sometimes, the content of a file must change according to circumstances (typically when the environment changes or when you have different configuratons for test or production, etc.).

Manually maintaining different versions with the same boiler-plate data can be time-consuming and error-prone.

Introducing Protein

What if we had a way to generate a new data file (or more than one) according to a single set of source data?

The purpose of Protein is to help programmers prepare data files in various formats, (JSON, YAML, but also HTML, etc.) with rules that produce your data according to source data.

It extends standard YAML with constructs for variable declaration, conditionals, iteration, functions, importing and exporting YAML files, and importing Python modules.

YAMLpp is a macro language, since it manipulates the YAML tree on which it resides.

Here is a simple example:

YAMLpp:

.local:
  name: "Alice"

message: "Hello, {{ name }}!"

Output:

message: "Hello, Alice!"

General principles

The language is composed of constructs, which are denoted keys starting with a dot (.), such as .local, .if, .switch, etc.

The YAMLpp preprocessor uses these constructs modify the tree, and the constructs disappear.

The result is pure YAML.

Protein obeys the rules of YAML syntax:

  • It provides declarative constructs without breaking YAML syntax.
  • It allows modular, reusable, and expressive constructs that create YAML files

🚀 Quickstart

Installation

pip install protein-lang

Command-line usage

protein input.yaml -o output.yaml
  • input.yaml → your YAML file with YAMLpp directives
  • output.yaml → the fully expanded YAML after preprocessing

To consult the help:

protein --help

🔧 A Sample of Protein Constructs

Construct Purpose Minimal Example
.local Define local variables valid for siblings and descendants. .local:
name: "Alice"
message: "Hello {{ name }}"
.do Execute a sequence or map of instructions. .do:
- step: "Init"
- step: "Run"
.foreach Iterate over values with a loop body. .local:
items: [1,2]
.foreach:
.values: [x, items]
.do:
- val: "{{ x }}"
.switch Branch to a different node based on an expression and cases. .switch:
.expr: "{{ color }}"
.cases:
red: {msg: "Stop"}
.default: {msg: "?"}
.if Conditional node creation with then and else. .if:
.cond: "{{ x>0 }}"
.then: {res: "Pos"}
.else: {res: "Neg"}
.load Insert and preprocess another YAMLpp (or YAML) file. .import_module: "other.yaml"
.function Define a reusable block with arguments and a body. .function:
.name: "greet"
.args: ["n"]
.do:
- msg: "Hi {{ n }}"
.call Invoke a previously defined function with arguments. .call:
.name: "greet"
.args: ["Bob"]
.import_module Import a Python module exposing functions, filters, and variables. .module: "module.py"
.export Export a portion of the tree into an external file. .export:
.filename: "out.yaml"
.do:
- foo: "bar"

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

protein_lang-0.6.0.tar.gz (61.0 kB view details)

Uploaded Source

Built Distribution

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

protein_lang-0.6.0-py3-none-any.whl (72.7 kB view details)

Uploaded Python 3

File details

Details for the file protein_lang-0.6.0.tar.gz.

File metadata

  • Download URL: protein_lang-0.6.0.tar.gz
  • Upload date:
  • Size: 61.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for protein_lang-0.6.0.tar.gz
Algorithm Hash digest
SHA256 a007014cf755217a55b4cfe218280793993766fe9859adbf29c09e92c61b1f9c
MD5 db04308d7e9a4e618a9b02ec948aa718
BLAKE2b-256 7559e4ecfc6baa78613fd643fc9b1b2cfe1658551da162ea44425a55b74f9b1c

See more details on using hashes here.

File details

Details for the file protein_lang-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: protein_lang-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 72.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for protein_lang-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 aba0ec4c9b96361923c0a7a2422f8333d41517b3360c0037ba9cb313ff959314
MD5 c2bd18c74e5723d64044fe41ae5ba51e
BLAKE2b-256 0f04780b556c6e0f9b18332d182962c60627427a53bad5330d499f4ec7a4d2e9

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