Skip to main content

Python 应用程序的配置库

项目描述

Everett 是适用于您的应用的 Python 配置库。

代码

https://github.com/willkg/everett

问题

https://github.com/willkg/everett/issues

执照

MPL v2

文档

https://everett.readthedocs.io/

目标

埃弗雷特的目标:

  1. 来自多个配置环境的灵活配置

  2. 通过配置轻松测试

  3. 为用户提供简单的自动化配置文档

由此,Everett 具有以下特点:

  • 可灵活满足您的配置环境需求,支持流程环境、env 文件、dicts、INI 文件、YAML 文件,以及编写您自己的配置环境

  • 为尝试配置您的软件的用户提供有用的错误消息

  • 具有用于记录配置的 Sphinx 扩展,包括 用于自动生成配置文档的autocomponentconfigautomoduleconfig指令

  • 便于测试配置值

  • 支持解析各种类型的值,如 bool、int、事物列表、类等,并允许您编写自己的解析器

  • 支持关键命名空间

  • 支持组件架构

  • 适用于您正在编写的任何东西——命令行工具、网站、系统守护进程等

Everett 的灵感来自python-decoupleconfigman

安装

跑:

$ pip install everett

一些配置环境需要额外的依赖:

# For INI support
$ pip install 'everett[ini]'

# for YAML support
$ pip install 'everett[yaml]'

快速开始

例子:

# myserver.py

"""
Minimal example showing how to use configuration for a web app.
"""

from everett.manager import ConfigManager

config = ConfigManager.basic_config(
    doc="Check https://example.com/configuration for documentation."
)

host = config("host", default="localhost")
port = config("port", default="8000", parser=int)
debug_mode = config(
    "debug",
    default="False",
    parser=bool,
    doc="Set to True for debugmode; False for regular mode",
)

print(f"host: {host}")
print(f"port: {port}")
print(f"debug_mode: {debug_mode}")

然后你可以运行它:

$ python myserver.py
host: localhost
port: 8000
debug_mode: False

您可以设置环境变量来影响配置:

$ PORT=7000 python myserver.py
host: localhost
port: 7000
debug_mode: False

它检查当前目录中的.env文件:

$ echo "HOST=127.0.0.1" > .env
$ python myserver.py
host: 127.0.0.1
port: 8000
debug_mode: False

如果配置错误,它会吐出有用的错误信息:

$ DEBUG=foo python myserver.py
<traceback>
everett.InvalidValueError: ValueError: 'foo' is not a valid bool value
DEBUG requires a value parseable by everett.manager.parse_bool
DEBUG docs: Set to True for debugmode; False for regular mode
Project docs: Check https://example.com/configuration for documentation.

您可以在测试中使用config_override测试您的代码,以测试各种配置值:

# testdebug.py

"""
Minimal example showing how to override configuration values when testing.
"""

import unittest

from everett.manager import ConfigManager, config_override


class App:
    def __init__(self):
        config = ConfigManager.basic_config()
        self.debug = config("debug", default="False", parser=bool)


class TestDebug(unittest.TestCase):
    def test_debug_on(self):
        with config_override(DEBUG="on"):
            app = App()
            self.assertTrue(app.debug)

    def test_debug_off(self):
        with config_override(DEBUG="off"):
            app = App()
            self.assertFalse(app.debug)


if __name__ == "__main__":
    unittest.main()

运行:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

这对于12-Factor应用程序来说非常好。

当您超出或需要它的不同变体时,您可以切换到创建满足您需求的ConfigManager实例。

为什么不是其他库?

我查看的大多数其他库都存在以下一个或多个问题:

  • 绑定到特定的 Web 应用程序框架

  • 不允许您指定配置源

  • 当用户配置错误时提供糟糕的错误消息

  • 有一个全局配置对象

  • 在编写测试时很难覆盖特定的配置

  • 没有自动生成配置文档的工具

历史

3.0.0(2022 年 1 月 13 日)

向后不兼容的更改:

  • 放弃了对 Python 3.6 的支持。(#176)

  • 放弃autocomponent Sphinx 指令以支持 autocomponentconfig

修复和功能:

  • 添加对 Python 3.10 的支持。(#173)

  • 重做命名空间,以便您可以在绑定组件(with_options( ) )后应用命名空间( with_namespace( ) )(#175)

  • 大修、简化和改进的文档。现在使用cog生成带有示例输出的文件。

  • 重写 Sphinx 扩展。

    这现在支持使用 everett:componenteverett:option指令手动记录配置。

    这添加了:everett:component::everett:option:角色,用于链接到文档中的特定配置。

    它还添加了自动生成文档的autocomponentconfigautomoduleconfig指令。

    使用这些指令时,会将项目添加到索引中,并且所有内容都是可链接的,从而更容易找到并与用户讨论特定的配置项目。(#172)

2.0.1(2021 年 8 月 23 日)

修复:

  • 修复关于 Everett sphinxext 中角色的 Sphinx 警告。(#165)

  • 修复get_runtime_config以使用插槽 (#166)

2.0.0(2021 年 7 月 27 日)

向后不兼容的更改:

  • 这从根本上减少了定义组件所需的样板文件。它还改善了事物之间的联系,因此更容易:

    • 确定单个组件所需的配置(考虑超类、覆盖等)

    • 在给定配置管理器的情况下确定组件树的运行时配置

    以前,组件需要继承RequiredConfigMixin 并提供“required_config”类属性。像这样的东西:

    from everett.component import RequiredConfigMixin, ConfigOptions
    
    class SomeClass(RequiredConfigMixin):
        required_config = ConfigOptions()
        required_config.add_option(
            "some_option",
            default="42",
        )

    已经精简,现在看起来像这样:

    from everett.manager import Option
    
    class SomeClass:
        class Config:
            some_option = Option(default="42")

    这要简单得多,并且底层实现代码也不那么复杂和复杂。

    如果您使用everett.component.RequiredConfigMixineverett.component.ConfigOptions,则需要更新您的类。

    如果您没有使用这些东西,那么您不必进行任何更改。

    请参阅有关组件的文档以了解它现在是如何工作的。

  • 更改了配置错误消息中引用配置变量的方式。以前,我尝试使用通用方式“namespace=something key=somethingelse”,但这很容易混淆,并且与项目文档不匹配。

    我将其更改为进程环境和 env 文件中使用的约定。例如,FOO_BAR

    如果您使用 INI 或 YAML 进行配置,则可以在构建ConfigManager时指定msg_builder 参数,并为您的用户构建错误消息。

修复:

  • 切换到src/存储库布局。

  • 在 CI 期间添加了类型注释和类型检查。(#155)

  • 在整个代码库中标准化 f 字符串。

  • 切换狮身人面像主题。

  • 更新文档、充实和简化示例、清理语言、重新设计 API 部分的结构(以前称为库或类似的一些无用的东西)等。

1.0.3(2020 年 10 月 28 日)

向后不兼容的更改:

  • 放弃了对 Python 3.4 的支持。(#96)

  • 放弃了对 Python 3.5 的支持。(#116)

修复:

  • 添加对 Python 3.7 的支持。(#68)

  • 添加对 Python 3.8 的支持。(#102)

  • 添加对 Python 3.9 的支持。(#117)

  • 用 Black 重新格式化代码,添加 Makefile,切换到 GitHub Actions。

  • 修复get_runtime_config()以推断命名空间。(#118)

  • 修复RemovedInSphinx50Warning。(#115)

  • 文档修复和说明。

1.0.2(2019 年 2 月 22 日)

修复:

  • 改进文档。

  • 修复嵌套BoundConfigs时的问题。现在它们可以正常工作。(#90)

  • 将“元”添加到选项中,让您在添加选项时声明有关选项的附加数据。

    例如,这使您可以执行诸如将选项标记为“秘密”之类的操作,这样您就可以在记录配置时知道要删除哪些选项(#88)

1.0.1(2019 年 1 月 8 日)

修复:

  • 修复文档问题。

  • 缺少everett.ext的包。谢谢你,dsblank!(#84)

1.0.0(2019 年 1 月 7 日)

向后不兼容的更改:

  • 放弃对 Python 2.7 的支持。Everett 不再支持 Python 2。 (#73)

  • 放弃了对 Python 3.3 的支持并增加了对 Python 3.7 的支持。谢谢你,pjz!(#68)

  • 将ConfigIniEnv移至不同的模块。现在你需要像这样导入它:

    from everett.ext.inifile import ConfigIniEnv

    (#79)

特征:

  • Everett 现在将配置发现记录在everett记录器的 logging.DEBUG级别。这有助于解决某些类型的问题。(#74)

  • Everett 现在有一个 YAML 配置环境。为了使用它,您需要安装它的要求:

    $ pip install everett[yaml]

    然后你可以像这样导入它:

    from everett.ext.yamlfile import ConfigYamlEnv

    (#72)

修复:

  • Everett 不再需要configobj——它现在是可选的。如果你使用 ConfigIniEnv,你可以安装它:

    $ pip install everett[ini]

    (#79)

  • 修复了 ConfigIniEnv 中的列表解析和文件发现,因此它们与文档匹配并且与其他环境更加一致。谢谢你,阿波罗13!(#71)

  • 为使用进程环境和当前工作目录中的.env文件的快速自以为是的设置添加了.basic_config() 。

  • 切换到服务器。

0.9(2017 年 4 月 7 日)

改变:

  • 重写 Sphinx 扩展。扩展现在位于everett.sphinxext 模块中,指令现在是.. autocomponent::。它生成更好的文档,现在它索引 Everett 组件和选项。

    这是向后不兼容的。您将需要更新您的 Sphinx 配置和文档。

  • 更改了HISTORY.rst结构。

  • 将everett.NO_VALUE的 repr 更改为"NO_VALUE"

  • InvalidValueErrorConfigurationMissingError现在具有 namespacekeyparser属性,允许您构建自己的消息。

固定的:

  • 修复文档中最终键向后的示例。谢谢你,pjz!

文档修复和更新。

0.8(2017 年 1 月 24 日)

添加:

  • :namespace::case:参数添加到 autoconfig 指令。这些使您的文档更容易满足您的项目需求。

  • 添加对 Python 3.6 的支持。

次要文档修复和更新。

0.7(2017 年 1 月 5 日)

添加:

  • 功能:您现在可以包含 ConfigManager对象和配置选项的文档提示和 URL。这将使您的用户更容易调试他们在使用您的软件时遇到的配置错误。

固定的:

  • 修复ListOf使其返回空列表而不是带有单个空字符串的列表。

文档修复和更新。

0.6(2016 年 11 月 28 日)

添加:

  • 添加RequiredConfigMixin.get_runtime_config(),它返回一个组件或组件树的运行时配置。这使您可以在启动时打印运行时配置、生成 INI 文件等。

  • 添加允许您使用对象进行配置的ConfigObjEnv 。这适用于 argparse 的命名空间等。

改变:

  • 更改:show-docstring:以获取一个可选值,该值是从中提取文档字符串内容的属性。这意味着您不必将编程文档与用户文档混为一谈——它们可以具有不同的属性。

  • 改进与配置相关的异常。在 Python 3 中,配置错误都源自ConfigurationError并具有有用的错误消息,可以清楚地说明配置值有什么问题。使用 Python 2,您可以根据使用的解析器抛出其他类型的异常,但配置错误消息应该仍然有用。

文档修复和更新。

0.5(2016 年 11 月 8 日)

添加:

  • :show-docstring:标志添加到autoconfig指令。

  • :hide-classname:标志添加到autoconfig指令。

改变:

  • 重写ConfigIniEnv以使用允许在 INI 文件中嵌套部分的 configobj。这也允许您指定多个 INI 文件并让后面的文件覆盖前面的文件。

固定的:

  • 修复autoconfig Sphinx 指令并添加测试——它被各种破坏了。

文档修复和更新。

0.4(2016 年 10 月 27 日)

添加:

  • raw_value参数添加到配置调用。这使得编写打印配置的代码变得更加容易。

固定的:

  • 修复listify(None)以返回[]

文档修复和更新。

0.3.1(2016 年 10 月 12 日)

固定的:

  • 用组件修复alternate_keys 。以前它适用于除组件之外的所有东西。现在它也适用于组件。

文档修复和更新。

0.3(2016 年 10 月 6 日)

添加:

  • 添加用于构建配置实例的ConfigManager.from_dict()简写。

  • .get_namespace()添加到ConfigManager和朋友,以获取给定配置实例的完整命名空间作为字符串列表。

  • alternate_keys添加到配置调用。这使您可以指定键列表,以便在主键未找到值时进行尝试。这有助于弃用您过去以向后兼容的方式使用的密钥。

  • 为键添加root:前缀,允许您查看当前命名空间之外的配置根目录以获取配置值。

改变:

  • 使ConfigDictEnv对键和命名空间不区分大小写。

文档修复和更新。

0.2(2016 年 8 月 16 日)

添加:

  • 添加ConfigEnvFileEnv以支持.env文件。谢谢你,保罗!

  • 添加“on”和“off”作为有效的布尔值。这使得配置功能更容易使用。谢谢你,保罗!

改变:

  • 更改ConfigIniEnv以采用单个路径或路径列表。谢谢你,保罗!

  • 使NO_VALUE为假。

固定的:

  • 修复__call__返回 None - 它应该返回NO_VALUE

大量文档更新:完成了关于制作自己的解析器的部分,添加了关于使用 dj-database-url 的部分,添加了关于 django-cache-url 的部分并扩展了现有示例。

0.1(2016 年 8 月 1 日)

初写。

项目详情


下载文件

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

源分布

everett-3.0.0.tar.gz (75.0 kB 查看哈希)

已上传 source

内置分布

everett-3.0.0-py2.py3-none-any.whl (35.2 kB 查看哈希

已上传 py2 py3