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.3.tar.gz (67.5 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.3-py3-none-any.whl (78.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: protein_lang-0.5.3.tar.gz
  • Upload date:
  • Size: 67.5 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.3.tar.gz
Algorithm Hash digest
SHA256 2326257089c3a9d06af53bdd944276dfa65d9c220d6db46d2d97d94f527a722d
MD5 2bce2ef046dd802558a00112d5a46a00
BLAKE2b-256 808cf15c7f780c871bd5b84f8fc15381f2e5cbbaf3b5dfd75c3c162fec60ac8f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: protein_lang-0.5.3-py3-none-any.whl
  • Upload date:
  • Size: 78.3 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3901af9c0bce2be312be171a0ace2f98d0533c63b9e2ce6f5362253be69c55ae
MD5 b663131c039a2aec5d5924802da84cfa
BLAKE2b-256 b9af6843f4371df81d87744abbba60753cc1376a19806998e9994cf22a509fad

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