Python 应用程序的配置库
项目描述
Everett 是适用于您的应用的 Python 配置库。
- 代码:
- 问题:
- 执照:
MPL v2
- 文档:
目标
埃弗雷特的目标:
来自多个配置环境的灵活配置
通过配置轻松测试
为用户提供简单的自动化配置文档
由此,Everett 具有以下特点:
可灵活满足您的配置环境需求,支持流程环境、env 文件、dicts、INI 文件、YAML 文件,以及编写您自己的配置环境
为尝试配置您的软件的用户提供有用的错误消息
具有用于记录配置的 Sphinx 扩展,包括 用于自动生成配置文档的autocomponentconfig和automoduleconfig指令
便于测试配置值
支持解析各种类型的值,如 bool、int、事物列表、类等,并允许您编写自己的解析器
支持关键命名空间
支持组件架构
适用于您正在编写的任何东西——命令行工具、网站、系统守护进程等
Everett 的灵感来自python-decouple和configman。
安装
跑:
$ 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:component和everett:option指令手动记录配置。
这添加了:everett:component:和:everett:option:角色,用于链接到文档中的特定配置。
它还添加了自动生成文档的autocomponentconfig和automoduleconfig指令。
使用这些指令时,会将项目添加到索引中,并且所有内容都是可链接的,从而更容易找到并与用户讨论特定的配置项目。(#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.RequiredConfigMixin或 everett.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"。
InvalidValueError和ConfigurationMissingError现在具有 namespace、key和parser属性,允许您构建自己的消息。
固定的:
修复文档中最终键向后的示例。谢谢你,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 日)
初写。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。