Temple 是一个用于创建和管理应用程序模板的工具,它使用 YAML(YAML Ain't Markup Language)文件来定义模板的结构和内容。这些模板可以用于生成项目的骨架代码、配置文件、文档等。
该工具位于string模块内,使用如下代码导入:
from string import Template
下面是一个简单的 YAML Temple 示例:
name: MyProject
description: A sample project template
variables:
- name: project_name
prompt: Enter the project name
default: MyProject
files:
- path: src/main.py
template: templates/main.py.j2
- path: README.md
content: |
# {{ project_name }}
This is a sample project generated by Temple.
- path: config.yaml
content: |
project_name: {{ project_name }}
version: 1.0
在这个示例中,我们定义了一个名为 "MyProject" 的项目模板,它包含了以下内容:
name 和 description 字段用于描述模板的名称和描述信息。
variables 字段定义了模板中可以接受的变量列表。每个变量都有一个 name 字段用于指定变量的名称,prompt 字段用于指定用户输入变量时的提示信息,default 字段用于指定变量的默认值(可选)。
files 字段定义了模板中的文件列表。每个文件都有一个 path 字段用于指定文件的路径,template 字段用于指定文件的模板路径(可选),content 字段用于指定文件的内容。
在使用 Temple 生成项目时,它会提示用户输入变量的值,并根据模板生成对应的文件。模板文件中可以使用 Jinja2 模板语法来动态地生成文件内容,例如 {{ project_name }} 将会被替换为用户输入的项目名称。
Temple 提供了命令行工具和 Python API 来使用模板生成项目。你可以使用命令行工具运行 temple create 命令并指定模板的 YAML 文件,或者使用 Python API 调用相应的函数来生成项目。
下面给出一个使用Template修改yaml中的变量的示例:
source.yaml文件内容如下:
- test:
name: login case1
request:
url: http://www.xxx.com/login/
method: POST
headers:
Content-Type: application/json
User-Agent: python-requests/2.18.4
json:
username: $user
password: $psw
validate:
- eq: [$.msg, login success!]
- eq: [$.code, 0]
示例code:
import yaml
from string import Template
class YamlTest:
def __init__(self, yaml_file) -> None:
self.yaml_file = yaml_file;
def read_yaml(self):
with open(self.yaml_file, 'r', encoding='utf-8') as f:
value = f.read()
temp = Template(value)
print("temp={}".format(temp))
res = temp.safe_substitute({'user': 'lili', 'password': '123456'})
yaml_data = yaml.safe_load(res)
print('res={}'.format(res)) #打印匹配后数据
print("yaml_data={}".format(yaml_data))
if __name__ == "__main__":
YamlTest("./data/source.yaml").read_yaml()
safe_substitute:可以让不想匹配的变量当正常的字符串使用
运行结果:
通过运行结果看到,safe_substitute要匹配{'user': 'lili', 'password': '123456'},但是原文件中只有username: $user , password: $psw, 所以‘user’被匹配到,并且用‘lili’进行了替换;因为原文件中只有‘pwd’没有'password',所以没有被替换。