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.5.4.tar.gz (71.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.5.4-py3-none-any.whl (82.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: protein_lang-0.5.4.tar.gz
  • Upload date:
  • Size: 71.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.5.4.tar.gz
Algorithm Hash digest
SHA256 64a5629bfc477740c9d03217f35549fd5cd5c4e34b63ec6883fe721140586e1e
MD5 6e0492aa76a43699931408078fc9d618
BLAKE2b-256 1e780488676c8c84a8b3bf362394f68949d3f3b52a087a5fbbbe1d568d06b322

See more details on using hashes here.

File details

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

File metadata

  • Download URL: protein_lang-0.5.4-py3-none-any.whl
  • Upload date:
  • Size: 82.9 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.5.4-py3-none-any.whl
Algorithm Hash digest
SHA256 2ba633b0420d8d944c5bf27ed143830d5614334e5f10666137f3434e2cbc9511
MD5 62f76d3f07318bdda09510c81b38abd8
BLAKE2b-256 2627d266266a8114b21bb956514beaf7083508a2c49b8587085e71d757dd52f6

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