跳转到主要内容

YAML & JSON模板引擎

项目描述

Emrichen – YAML & JSON模板引擎

Build Status PyPI version

Emrichen接受用YAML或JSON编写的模板,处理诸如变量替换之类的标签,并输出YAML或JSON。

与基于文本的模板系统相比,Emrichen在生成YAML或JSON方面更出色,因为它可以在YAML(或JSON)内部工作。

是否尝试过将列表或字典替换到YAML文档中,但遇到了缩进问题?太糟糕了!处理引号和双反斜杠转义?不!

在Emrichen中,变量以熟悉的JSON类型输入,这使得这些问题不再成为问题。Emrichen是一种实用且强大的生成YAML和JSON的方法。

考虑以下生成最小Kubernetes部署的模板:

!Defaults
tag: latest
image: !Format "nginx:{tag}"
replicas: 3
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: !Var replicas
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: !Var image
        ports:
        - containerPort: 80

这个小模板已经展示了Emrichen的三个强大标签:提供变量默认值的!Defaults;执行简单变量替换的!Var;以及执行字符串格式化的!Format

将其放入一个文件中,例如nginx.in.yaml(我们使用.in.yaml表示模板),并使用以下命令渲染它

emrichen nginx.in.yaml

喜欢JSON输出?

emrichen --output-format json nginx.in.yaml

想要更改标签?

emrichen --define tag=1-alpine nginx.in.yaml

注意如何懒惰地评估image – 您不需要覆盖image即可更改tag

以下表格列出了支持的标签。有很多标签。如果您需要尚未提供的标签,请向我们发送问题或PR。

安装

需要Python 3.6+。Python 2不受支持,也不会受支持。

pip install emrichen

如果您已从GitHub克隆了Emrichen(用于开发)

pip install -e .

支持的标签

标签 参数 示例 描述
!All 一个可迭代对象 !All [true, false] 如果可迭代的参数中的所有项都是真值,则返回 true。
!Any 一个可迭代对象 !Any [true, false] 如果可迭代的参数中的至少一项是真值,则返回 true。
!Base64 要编码的值 !Base64 foobar 将值(或其字符串表示形式)编码为 base64。
!Compose value:要应用标签的值
tags:要应用的标签名称列表,最新的先
!Base64,Var foo 用于内部实现标签组合。
通常不以明文形式使用。
请参阅下面的 标签组合
!Concat 列表的列表 !Concat [[1, 2], [3, 4]] 连接列表。
!Debug 任何东西,实际上 !Debug,Var foo 丰富其参数,将其输出到 stderr 并返回。用于检查大模板中某些表达式的值,甚至可能是一个没有完全渲染的表达式。
例如,在以下示例中:
!Defaults 一个变量定义的字典 请参阅 examples/defaults/ 定义变量的默认值。这些值将被其他任何变量来源覆盖。
注意: !Defaults 必须出现在模板文件中单独的文档中(即,通过 --- 分隔)。包含 !Defaults 的文档将被从输出中删除。
!Error 错误消息 !Error "必须定义 foo 或 bar,但不能同时定义两者" 如果在解决所有条件之后,模板中存在 !Error 标签,
它将导致模板渲染以错误发出指定的错误消息退出。
!Exists JSONPath 表达式 !Exists foo 如果 JSONPath 表达式返回一个或多个匹配项,则返回 true,否则返回 false
!Filter testover 请参阅 tests/test_cond.py 接受一个列表,并且只返回通过谓词的元素。
!Format 格式化字符串 !Format "{foo} {bar!d}" 使用 Python 格式字符串 进行字符串插值。
支持在变量查找中使用 JSONPath(例如,{people[0].first_name} 将正确执行)。
注意:当格式字符串以 { 开头时,您需要将其引用以避免被解释为 YAML 对象。
!Group 接受与 !Loop 相同的参数,除了 template 是可选的(默认为身份),另外还有以下内容
by:(必需)用于确定当前值键的表达式
result_as:(可选,字符串)在评估 by 时,丰富的 template 在此名称下可用。
待定 将列表转换为字典。键由 by 确定。具有相同键的项将被分组在列表中。
!If testthenelse 请参阅 tests/test_cond.py 根据条件返回两个值之一。
!Include 要包含的模板的路径 !Include ../foo.yml 在此位置渲染请求的模板。绝对路径和相对路径都有效。
!IncludeBase64 二进制文件的路径 !IncludeBase64 ../foo.pdf 加载给定的二进制文件,并以 Base64 编码的形式返回其内容。
!IncludeBinary 二进制文件的路径 !IncludeBinary ../foo.pdf 加载给定的二进制文件,并以字节的形式返回其内容。这对于散列来说实际上很有用。
!IncludeGlob 字符串(或字符串列表)的模板包含 glob 模式 !IncludeGlob bits/**.in.yml 展开 glob 模式,并将所有模板渲染到一个列表中。
包含多个文档的 YAML 文件将渲染所有这些模板到
相同的平面列表。
展开结果按字典序排序。
与Python的glob.glob()类似,使用双星号(**)进行递归。
!IncludeText UTF-8文本文件的路径 !IncludeText ../foo.toml 加载指定的UTF-8文本文件,并将内容作为字符串返回。
!Index 接受与 !Loop 相同的参数,除了 template 是可选的(默认为身份),另外还有以下内容
by:(必需)用于确定当前值键的表达式
result_as:(可选,字符串)在评估 by 时,丰富的 template 在此名称下可用。
duplicates:(可选,默认errorerrorwarn(ing)ignore重复值。
待定 将列表转换为字典。键由by确定。
!IsBoolean 要类型检查的数据。 !IsBoolean ... 如果增强的值是给定的类型,则返回True,否则返回False。
!IsDict 要类型检查的数据。 !IsDict ... 如果增强的值是给定的类型,则返回True,否则返回False。
!IsInteger 要类型检查的数据。 !IsInteger ... 如果增强的值是给定的类型,则返回True,否则返回False。
!IsList 要类型检查的数据。 !IsList ... 如果增强的值是给定的类型,则返回True,否则返回False。
!IsNone 要类型检查的数据。 !IsNone ... 如果增强的值是None(null)或Void,则返回True,否则返回False。
!IsNumber 要类型检查的数据。 !IsNumber ... 如果增强的值是给定的类型,则返回True,否则返回False。
!IsString 要类型检查的数据。 !IsString ... 如果增强的值是给定的类型,则返回True,否则返回False。
!Join items:(必需)要连接在一起的项目列表。
separator:(可选,默认空格)项目之间放置的分隔符。
或者
一个用空格作为分隔符连接在一起的项目列表。
!Join [foo, bar]
!Join { items: [foo, bar], separator: ', ' }
使用分隔符连接项目列表。结果始终是字符串。
!Lookup JSONPath 表达式 !Lookup people[0].first_name 执行JSONPath查找并返回第一个匹配项。如果没有匹配项,则引发错误。
!LookupAll JSONPath 表达式 !LookupAll people[*].first_name 执行JSONPath查找并返回所有匹配项作为列表。如果没有找到匹配项,则返回空列表[]
!Loop over:(必需)要迭代的的数据(一个字面量列表或字典,或!Var)
as:(可选,默认item)当前值赋予的变量名
index_as:(可选)赋予循环索引的变量名。如果over是列表,则这是一个从0开始的数字索引。如果over是字典,则这是字典键。
index_start:(可选,默认0)第一个索引,例如,基于1的索引。
previous_as:(可选)赋予前一个值的变量名。在循环的第一个迭代中,前一个值是null在0.2.0中添加
template:(必需)为循环的每次迭代处理的模板。
as_documents:(可选)是否将此循环的输出展开为单独的YAML文档以写入YAML。仅在模板的最顶层才有作用。
请参阅examples/loop/ 循环遍历列表或字典,并为每次迭代渲染一个模板。输出始终是列表。
!MD5 要哈希的数据 !MD5 'some data to hash' 使用MD5算法对给定数据进行哈希。如果数据不是二进制,则将其转换为UTF-8字节。
!Merge 字典列表 !Merge [{a: 5}, {b: 6}] 合并对象。对于重叠的键,最后一个键优先。
!Not 一个值 !Not !Var foo 逻辑上否定给定的值(在Python语义中)。
!Op aopb 请参阅 tests/test_cond.py 执行二元运算符。特别适用于与!If一起使用以实现大于等。
!SHA1 要哈希的数据 !SHA1 'some data to hash' 使用SHA1算法对给定数据进行哈希。如果数据不是二进制,则将其转换为UTF-8字节。
!SHA256 要哈希的数据 !SHA256 'some data to hash' 使用SHA256算法对给定数据进行哈希。如果数据不是二进制,则将其转换为UTF-8字节。
!URLEncode 要编码的字符串
或者
url:要组合查询参数的URL
query:要添加的查询字符串参数的对象或查询字符串参数的字符串
!URLEncode "foo+bar"
!URLEncode { url: "https://example.com/", query: { foo: bar } }
将字符串编码为安全地包含在URL中,或将查询字符串参数合并到URL中。
!Var 变量名 !Var image_name 替换为变量的值。
!Void 任何东西或什么也没有 foo: !Void 输出中删除解析为!Void的字典键、列表项或YAML文档。
!With vars:变量定义的字典。
template:带有定义变量的模板。
参见examples/with/ 将局部变量绑定到仅在内template中可见的范围内。对于为常用子表达式命名很有用。

JSON中的标签

JSON没有原生的标签构造。相反,使用一个对象,其单键是标签的名称(包括感叹号,例如 !Var)。例如

{
    "foo": {
        "!Var": "foo"
    }
}

JSON支持的局限性

  • !开头的对象键不受支持。
  • 渲染为JSON的模板只能包含单个文档。
    • JSON模板始终只有一个文档。
    • YAML模板只能包含一个非!Void、非!Defaults文档。
  • 由于!Defaults必须出现在自己的文档中,因此不支持在JSON模板中。请使用变量文件。

标签组合

由于YAML,您不能执行!Base64 !Var foo。我们提供了一个方便的解决方案:!Base64,Var foo

自定义标签

您可以在Python中实现自己的自定义标签。标签是继承自emrichen.tags.base.BaseTag类的类,并实现了enrich(self, context: emrichen.context.Context)方法。有关标签实现的示例,请参阅内置标签下的emrichen/tags/tests/custom_tags/中的示例。

将实现放在一个位于PYTHONPATH的Python模块中。通常,与模板相同的目录就足够了。

只要包含它们的模块被导入,所有BaseTag的子类都会自动注册。如果您正在使用CLI,请将-m your_tags添加到命令行,其中your_tags对应于your_tags.py。如果您以编程方式使用Emrichen,请确保在实例化模板之前导入您的自定义标签(import your_tags)。

以下是一个自定义标签示例,您可以尝试使用以下方法(假设您已从GitHub克隆了Emrichen并使用pip install -e .安装了它)。此示例在从PyPI安装Emrichen时不会安装(pip install emrichen)。

emrichen -m tests.custom_tags examples/custom_tags.yml

此示例定义了一个!KubeEnv自定义标签,它将键值映射字典转换为Kubernetes期望的格式的一组环境变量列表。

CLI

usage: emrichen [-h] [--template-format {yaml,json}] [--var-file VAR_FILE]
usage: emrichen [-h] [--template-format {yaml,json}] [--var-file VAR_FILE]
                [--define VAR=VALUE] [--output-file OUTPUT_FILE]
                [--output-format {yaml,json,pprint}] [--include-env]
                [template_file]

A YAML to YAML preprocessor.

positional arguments:
  template_file         The YAML template to process. If unspecified, the
                        template is read from stdin.

optional arguments:
  -h, --help            show this help message and exit
  --template-format {yaml,json}
                        Template format. If unspecified, attempted to be
                        autodetected from the input filename (but defaults to
                        YAML).
  --var-file VAR_FILE, -f VAR_FILE
                        A YAML file containing an object whose top-level keys
                        will be defined as variables. May be specified
                        multiple times.
  --define VAR=VALUE, -D VAR=VALUE
                        Defines a single variable. May be specified multiple
                        times.
  --output-file OUTPUT_FILE, -o OUTPUT_FILE
                        Output file. If unspecified, the template output is
                        written into stdout.
  --output-format {yaml,json,pprint}
                        Output format. If unspecified, attempted to be
                        autodetected from the output filename (but defaults to
                        YAML).
  --include-env, -e     Expose process environment variables to the template.

Variable precedence: -D > -e > -f > !Defaults

示例

cd examples/kubernetes
emrichen -f vars.yml -D tag=build-256 deployment.in.yml

Python API

待办事项

emrichen(template, *variable_sources, **override_variables)

Context(*variable_sources, **override_variables)

Template(template_source)

许可

The MIT License (MIT)

Copyright © 2018–2022 Santtu Pajukanta
Copyright © 2018–2022 Aarni Koskela

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

emrichen-0.4.0.tar.gz (28.7 kB 查看哈希值)

上传于 源代码

构建分发

emrichen-0.4.0-py3-none-any.whl (34.7 kB 查看哈希)

上传于 Python 3

由以下支持