Skip to content

YAML language extension, which allows to use jinja2 syntax conditional blocks

License

Notifications You must be signed in to change notification settings

maybelinot/yamx

Repository files navigation

YAMX

extend your YAML configuration with jinja2 expressions


Usage

Create

Create your first config with template syntax

# starship.yml

type: Exploration vessel
{% if toggles.speed_improved %}
speed: 50
max_speed: 100
{% else %}
max_speed: 35
speed: 20
{% endif %}
name: Starship Enterprise

weapons:
  - name: Laser Blaster
    fire_rate: 2.0
    damage: 20
    ammo_capacity: 50
  {% if toggles.new_missiles_weapon %}
  - damage: 100
    fire_rate: 0.1
    ammo_capacity: 10
    name: Missiles
  {% endif %}

Extra functionality

Some parts of the library don't have general support yet and available only as set of extra tools to work with specific format of conditions such as

defines.get("FEATURE_FLAG")

toggles.FEATURE_FLAG

toggles.get("FEATURE_FLAG")

toggles["FEATURE_FLAG"]

config_flags.NAME

config_flags.get("NAME")

config_flags["NAME"]

Operations not and and are supported for them.

Extract toggle names used in config

from yamx import YAMX
from yamx.extra import extract_toggles

yamx = YAMX()

with open("starship.yml") as fp:
  data = yamx.load(fp)


toggles = extract_toggles(data)

assert toggles == {"speed_improved", "new_missiles_weapon"}

Resolve jinja logic configuration with yamx.extra.resolve_toggles

from immutables import Map

from yamx import YAMX
from yamx.extra import resolve_toggles, ResolvingContext

yamx = YAMX()

with open("starship.yml") as fp:
  data = yamx.load(fp)


context = {
  "toggles": ResolvingContext({
    "speed_improved":True,
    "new_missiles_weapon":False,
  })
}
resolved_data = resolve_toggles(data, context)

assert resolved_data["speed"] == 50

Format

Format file structure and sort attribute keys with sort_keys

from yamx import YAMX

yamx = YAMX(sort_keys=True)

with open("data.yaml") as f:
    data = yamx.load(f)

data_raw = yamx.dump_to_string(data)
print(data_raw)
name: Starship Enterprise
type: Exploration vessel
{% if features["speed_improved"] %}
speed: 50
max_speed: 100
{% else %}
speed: 20
max_speed: 35
{% endif %}

weapons:
  - name: Laser Blaster
    damage: 20
    fire_rate: 2.0
    ammo_capacity: 50
  {% if features["new_missiles_weapon"] %}
  - name: Missiles
    damage: 100
    fire_rate: 0.1
    ammo_capacity: 10
  {% endif %}

Development

Linter

run linter with

make lint

Testing

run tests with

make test

About

YAML language extension, which allows to use jinja2 syntax conditional blocks

Resources

License

Stars

Watchers

Forks

Packages

No packages published