可扩展的配置文件格式
项目描述
Yay是一种非严格的懒加载配置语言。它将类似YAML的数据声明与懒Python表达式相结合。我们真心希望您喜欢这个,如果它有用,请告诉我们。
它适用于python 2.6+、3.2+和pypy 1.9。
Yay是一个非常新的软件,尽管我们已经测试了很多次,但它肯定充满了错误。请订阅yaybu-dev邮件列表,您可以在http://lists.yaybu.com找到它。
所有文档可以在http://yay.readthedocs.org/en/latest/找到,其中包括语言介绍和语法解释。
如果您对这个项目感兴趣,您可能会想查看Yaybu,它使用Yay来驱动完整的系统部署和管理系统。您可以在http://yaybu.com找到Yaybu。
yay的变更日志
3.1.1 (2013-11-06)
目前还没有变化。
3.1.0 (2013-11-06)
现在支持python 3.2和python 3.3(除了2.6,2.7和pypy)。
许多对YAML多行块模式的修复
大量测试覆盖率改进
移除对扩展切片的不必要支持
命令行输出更加美观
3.0.1 (2013-09-04)
目前还没有变化。
3.0 (2013-09-04)
这是在ply解析框架之上进行全面重写的。
0.0.62 (2012-09-27)
尝试先导入,因为它可能会产生命中并节省检查互联网上的事情。
0.0.61 (2012-09-15)
早期版本添加了验证以阻止您用映射替换列表或反之亦然。然而,实现没有考虑到您可能会扩展来自查找的映射。
0.0.60 (2012-09-15)
修复了过滤器节点。在展开时,它之前没有意识到其父节点,这阻止了其子节点在全局命名空间中查找值。
0.0.59 (2012-09-01)
修复了设置GPG_TTY。
0.0.58 (2012-08-15)
捕获GPG失败并抛出异常。不幸的是,由于没有通过状态文件与GPG通信,我们无法获得关于出错原因的更多信息。
以批处理模式运行。这阻止了GPG忽略stdout/stderr重定向,但意味着您现在必须使用GPG代理,因为它不能再提示输入密钥。
GPG_TTY被设置 - 这意味着gpg-agent现在可以提示输入了。
修复了在嵌套字典中使用时Config.add的问题。
0.0.57 (2012-08-02)
向根配置对象添加了新的懒加载查找方法。如果您正在构建一个字典键的懒加载迭代器,这很有用。
def example_iterator(self, expression): try: for item in expression.expand(): resolved = item.resolve() create_obj_from_settings(resolved) except CreateObjectError: # You can get line and column from the item object! except yay.errors.Error: # Ideal place to wrap Yay errors in your apps exceptions example_iterator(config.lookup("somekey"))
您可以看到,API允许您将任何混乱的“找不到键”异常推迟到迭代器需要访问键时 - 而迭代器已经有适当的异常处理。
添加了向后兼容性的额外测试用例
0.0.56 (2012-07-31)
代码路径现在用跟踪上下文装饰。这个__context__元数据给出了当yay失去控制时yay在做什么的感觉。
0.0.55 (2012-07-25)
修复了PackageIndex,使其在缺少包时不警告() - 我们自己捕捉这个!
0.0.54 (2012-07-22)
克隆的节点应该可用行号和文件信息,这将导致更有用的错误输出。
将处理序列节点上的索引错误
将序列作为映射节点处理将触发适当的Yay错误。
0.0.53 (2012-07-21)
允许使用yay的Python代码为openers设置默认配置
0.0.52 (2012-07-21)
修复了现有用户的package://回归。
0.0.51 (2012-07-19)
引入了用于扩展搜索路径的懒加载评估机制
.search: - package://some.egg/ - http://raw.github.com/isotoma/yay/
随后的.import语句将使用修改后的搜索路径。
如果指定的包(作为(include)的一部分或作为(search)的一部分)不在sys.path上,则尝试安装它。
可以使用.config将配置传递给opener后端。例如,您可能希望让.package://opener使用您内部的包仓库
.config: openers: packages: index: https://my-python-mirror/simple/ username: joe password: penguin55
您可以使用变量替换和定义密码在GPG加密的yay文件中或在使用Yay的应用程序中推送变量。
Yay openers支持在URL中的基本认证。如果与.include一起使用,建议使用密钥来隐藏密码。
# Define ${password} in a GPG armored file .include: home://.credentials.yay.gpg .search: - https://username:${password}@svn.yourcompany.org/svn/cookbook/trunk
如果需要,.include和.search可以是一个单个标量值而不是列表。
0.0.50 (2012-07-10)
允许表达式返回空字典
result: ${site.vhosts else {}}
0.0.49 (2012-06-27)
添加了一个字符串替换函数,允许人们执行类似的操作
something: jolly good show slug: ${replace(something, " ", "-")}
之后,slug 的值将是 jolly-good-show。
0.0.48 (2012-04-07)
在 foreach 迭代过程中支持操作符
result.foreach v in somevalues if v in somelist: ${v}.
0.0.47 (2012-04-06)
允许表达式中包含字面字符串和浮点数
result: ${site.description else "No description"} result2: ${3.212121}
允许表达式返回空列表
result: ${site.vhosts else []}
允许对未定义键的相等性检查适当通过或失败,而不会引发 NoMatching 异常
data: part1: a: 1 part2: c: 2 res1.foreach p in data if data[p].a = 2: ${p} res2.foreach p in data if data[p].c != 1: ${p}
res1 将为空,因为 part1 和 part2 都没有值为 2 的 a 字段,而 res2 将包含 part1 和 part2,因为它们都没有值为 1 的 c 字段。
添加一个 undefined,当解析时将引发 NoMatch 异常。这允许根据键是否存在于映射中来进行过滤。
- 数据
- part1
a: 1
- part2
c: 2
res.foreach p in data if data[p].c = undefined: ${p}
res 将包含 part1,因为 part1 没有c字段。
0.0.46 (2012-04-04)
修复 else 表达式在 .include 内部的问题
0.0.45 (2012-03-22)
现在可以向 Openers 的 open 方法传递 etag。如果 etag 匹配显示请求 URI 未更改,则将引发 NotModified 异常。这可以用于实现缓存策略并减少 yay 通过网络连接传输的数据量
>>> from yay.openers import Openers >>> fp = Openers().open("/tmp/somefile, etag="1234535462356456fa") NotModified: File '/tmp/somefile' not modified
所有 openers 现在都将具有 etag 属性。如果无法提供合适的 etag,则该属性可以是 None。否则,它应该是某种散列,确保文件的状态,以便后续请求只需询问“它自从这个状态以来是否有变化”。要获取 etag
>>> from yay.openers import Openers >>> fp = Openers().open("/tmp/somefile") >>> print fp.etag 1234535462356456fa
0.0.44 (2012-03-17)
修复 .select 在解析的值是复杂表达式时的错误。
在意外混淆列表和映射类型时进行更好的验证。
0.0.43 (2012-02-12)
修复在 searchpath 上没有方案的路径的处理。
0.0.42 (2012-01-01)
更改 Django boxing 的工作方式,以便不需要 .bind 就可以工作。这允许将原始 Django 模型通过 0.0.41 的 .add API 推入 yay。
0.0.41 (2011-12-21)
只要 yay 知道如何装箱,就可以将 Python 对象注入到 Yay 配置对象中。如果您有一个这样的 Yay 文件
hello: abc result: ${hello}
以及以下 python 代码
from yay.config import Config c = Config() c.load_uri(example_file) c.add(dict(hello="xyx"))
那么以下断言是真实的
c.get() == dict(hello="xyz", result="xyz")
0.0.40 (2011-12-13)
修复调用其他文件中定义的宏的问题。
0.0.39 (2011-11-30)
修复字符串构建器,以便包含机密的配置可以序列化。
0.0.38 (2011-11-22)
这是一个错误修复版本,用于改进现有功能,特别是外置数据装箱。
将更多代码从直接使用 Boxed 移至 BoxingFactory.box
将任何字典对象包装在 Mapping 对象中,以便它们可以与其他来自 Yay 的映射合并。
0.0.37 (2011-11-20)
棕色纸袋版本发布,以删除多余的打印。
0.0.36 (2011-11-20)
现在有一个 home:// URL 处理程序。对我来说这意味着
import yay yay.load_uri("home://foo/bar.yay")
等同于
import yay yay.load_uri("/home/john/foo/bar.yay")
改进搜索路径处理,以更好地处理 URI。
根据 YEP2 添加对表达式中的 else 关键字的支持
foo: bar: ${foo.baz else 52}
这对于在您的配方中提供合理的默认值非常有用。
循环块现在是自动扁平化的。这意味着由 .foreach 转换为 1 维列表的构造将生成列表的列表。例如
somelist: - - - a - b - c - d someotherlist.foreach var in somelist: ${var}
someotherlist 列表现在将包含
somelist: - a - b - c - d
使用 chain 修饰符可以获得先前的行为
somelist.foreach var in somelist chain: ${var}
添加简单的宏语言。这是一个高度实验性的功能,并且经常调整语法。您可以使用 .define 语句定义可重用的配置块。以下是在 Yaybu 中创建可重用虚拟环境步骤的示例
.define Virtualenv: - Directory: name: ${venv.location} owner: ${venv.owner} - Execute: name: create-virtualenv-${venv.location} command: virtualenv --no-site-packages ${venv.location} creates: ${venv.location}/bin/pip - Execute: name: install-requirements-${venv.location} command: ${venv.location}/bin/pip install -r ${venv.requirements}
宏可以作为表达式的一部分内联调用。例如
resources.append: .foreach venv in virtualenvs: ${Virtualenv!}
同样,您可以这样做
.define Virtualenv: - Directory: name: ${location} owner: ${owner} # SNIP resources.append: Virtualenv!: location: /tmp/example owner: dave requirements: /tmp/requirements.txt
0.0.35 (2011-11-12)
本次发布对ProtectedString进行了重构,使其在Yay之外更有用。现在您应该导入yay.String,而不是导入yay.protectedstring.ProtectedString
现在可以将字符串传递给构造函数,它们将被自动包装。之前您需要传递StringPart给构造函数。现在这是一个内部实现细节。
现在有一个extend()函数。它接受包含原始字符串和其他String对象的列表。
s = String("echo") y = String("supersekritpassword", secret=True) s.extend(["a", "b", y, "d"])
现在有一个as_list()函数。它返回您添加到字符串中的所有部分。如果您正在构建一个要传递给子进程的命令行,这很有用。
s.String(["someprogram", "--pasword"]) s.add_secret("password") # Log the obfuscated version but execute with the real password log.info(s.protected) p = subprocess.Popen(s.as_list(secret=False), cwd="/")
现在在Yay中有一个secret调用,可以在不使用GPG的情况下执行秘密Yay。这主要用于测试目的,但如果您有尚未受到严格保护的字符串,但又不想它们出现在日志中,它可能很有用。要使用它,您可以这样做:
resources.append: - Checkout: name: /checkouts/mycode repository: http://github.com/whatever scm_password.secret: mypassword
此示例来自Yaybu,可以防止Yaybu记录您的SVN密码。
0.0.34 (2011-11-10)
Compose现在重用Opener()而不是为每个加载的流创建一个新的Opener()。
0.0.33 (2011-11-10)
您现在可以将searchpath传递给Config对象。
0.0.32 (2011-11-10)
工作package://导入
0.0.31 (2011-11-10)
更好的绝对路径处理
0.0.30 (2011-11-10)
现在,由Openers() API返回的任何流对象都有一个len属性。
内部Openers() API现在可以从Python路径上的任何包中加载。
fp = Openers().open("package://some.egg/hello.txt")
0.0.29 (2011-11-10)
内部Openers() API现在支持搜索路径
fp = Openers(searchpath=['file:///home/john', 'http://google.com']).open("foo.txt")
Openers() API现在支持https://
0.0.28 (2011-11-07)
完全删除所有Mapping默认crud
0.0.27 (2011-11-03)
修复${django.SomeModel}以正确解析
0.0.26 (2011-11-03)
添加对Django DataStore的支持
允许从Python公开对象,包括简单的函数调用
0.0.25 (2011-10-28)
修复.append中的回归
0.0.24 (2011-10-22)
现在可以对映射进行foreach操作
添加.foreach x in y if x.z = a
添加‘.with expression as foo:’
添加chain和nochain模式到foreach。chain是默认模式。
主要重构,上下文变量不再需要解决图
现在将“semi_resolve”API更正为“expand”
0.0.23 (2011-07-26)
$$转义$ - 所以${foo}被视为字符串,而不是变量查找
0.0.22 (2011-07-19)
删除多余的调试消息
修复.forEach中的.import
0.0.21 (2011-07-19)
新.add指令,可以在文件中的任何位置使用变量
0.0.20 (2011-06-29)
将ProtectedString更改为从basestring继承
0.0.19 (2011-06-29)
受保护的yay文件的概念,其中包含任何最终包含秘密的字符串都将被隐藏
处理受保护字符串和非受保护字符串连接的ProtectedString
GPG用于解密.yay.gpg文件,它们产生的任何变量都是受保护的
0.0.18 (2011-06-10)
棕色纸袋用于移除散乱的调试脚手架
0.0.17 (2011-06-10)
修复对None的追加
修复列表访问,其中列表已部分解析
0.0.16 (2011-06-10)
添加范围测试,修复range()作为${}扩展
添加sum()(但没有语法糖)
允许对过滤器执行索引操作
修复迭代Flatten()节点
修复迭代ForEach()节点
添加对丢失的空文档的测试
0.0.15 (2011-05-18)
如果字段访问无效,则引发错误
添加用于显示有用的消息的LanguageError
如果我们引发一个不是从yay.errors.Error派生的错误,则现在是错误
0.0.14 (2011-05-12)
不要在空(例如{})上中断
0.0.13 (2011-03-06)
修复Append节点
0.0.12 (2011-03-03)
导出该方法 ;)
0.0.11 (2011-03-03)
除非需要,否则不要使用unicode
添加dump()方法
0.0.10 (2011-02-22)
在方括号表达式[bracketed_expression]中不要删除空白字符
0.0.9 (2011-02-22)
在模板字符串[templated_string]中不要删除空白字符
0.0.8 (2011-02-18)
将“foreach bar as foo”替换为“foreach foo in bar”
0.0.7 (2011-02-16)
以0开头的数字被视为8进制。
0.0.6 (2011-02-13)
尽可能避免使用Unicode映射键 - 它们会在Py2.x中破坏kwargs
0.0.5 (2011-02-09)
添加对嵌套foreach的支持
至少目前,支持类似Ruby风格的.flatten
0.0.4 (2011-02-04)
在YAML中,{foo}可以解释为映射。目前,我们将使用${foo}来避免这种情况
实现了对Python的函数调用 - 现在有range()函数
现在有foo.select键,因此可以使用switch语句
0.0.3 (2011-01-24)
鸡蛋包装修复
0.0.2 (2011-01-24)
更多关于表达式评估和表达式解析的unittests
取消对OrderedDict的依赖
0.0.1
这仍然是预发布版,不保证API或语言稳定性
现在在表达式树中完成变量解析,而没有单独的解析阶段
使用pyparsing解析{foo[bar][@.baz > 5]}类型的语法
0.0.0
这是一个预alpha版本,用于实验我们可以做什么和不能做什么。
新的PyYAML加载子类,用于获取无丑陋!!omap标记的有序映射
解析YAML节点内的{}标记
懒惰地评估.copy、.append和.remove指令
项目详情
yay-3.1.1.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8576e10a9e358dce4be02be20c9d15ba35c68ea0cfdd7e41f9384e32813b5341 |
|
MD5 | a63889e355402d6b9eda855e7d8ab667 |
|
BLAKE2b-256 | b24ada98a8614143876a2fb8cdfa82ab29cf9da5430a7c4301b8a1d6ae304a6f |