跳转到主要内容

可扩展的配置文件格式

项目描述

https://travis-ci.org/yaybu/yay.png https://coveralls.io/repos/yaybu/yay/badge.png?branch=master https://pypip.in/v/yay/badge.png

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指令

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的应用程序。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分布

yay-3.1.1.zip (101.1 kB 查看哈希值)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面