在一个地方管理多个配置源

etcaetera的Python项目详细描述


一、二、二、三、三、四、四、四、四、四、四、四、四、四、四、四、四、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六、六。图片::https://badge.fury.io/py/etcaetera.png
:目标:http://badge.fury.io/py/etcaetera

…图片:https://travis-ci.org/oleiade/etcaetera.png?branch=master
:目标:https://travis ci.org/oleiade/etcaetera

…图片::https://pypip.in/d/etcaetera/badge.png
:目标:https://crate.io/packages/etcaetera?版本=最新版本



什么?
=


etcaetera是从多个源加载应用程序配置的最简单的方法。

设置是按照正确的顺序从适配器加载的,所有配置都存储在**配置**对象中。


===


管理大型应用程序配置源可能是个麻烦。


不可能!

etcaetera为您提供了一种简单而统一的方法,可以在一个地方处理所有复杂的问题。




代码块::bash

$pip安装etcaetera


代码块::bash

$git clone git@github.com:oleiade/etcaetera
$cd etcaetera
$python setup.py install



==


dive
----

代码块::python

>;>import os
>;>from etcaetera.config import config
>;>from etcaetera.adapter import defaults,module,overrides,env,file

/>
并创建一组适配器
>;>;>;>;module_adapter=module(os)
>;>overrides=overrides({"我的优先设置":"我的强制值"})

r/>>;>;config.load()

/>"first_json_setting":"在json settings中找到的第一个json设置值",

}


config object
----


config object是整个应用程序设置的中心位置。它将按照您注册适配器的顺序加载适配器
,并使用适配器的数据更新自身。此外,您可以将子配置
对象附加到它,以保持一个干净的配置层次结构。

请注意,**默认值**适配器将始终首先加载,而**覆盖值**将始终最后加载。

代码块::python

>;>from etcaetera.config import config
>;>from etcaetera.adapter import defaults,env

当适配器在配置中注册时,不会立即对其进行评估。(默认值({"abc":"123"}))
>;>assert"abc"不在配置中
>;>config.register(env("user","pwd")
>;>assert"user"不在配置中
>;>assert"pwd"不在配置中

在account
>;>config.adapters
adapterset(<;默认值0x1238f2a>;,<;env 0xe3a12bd>;)

图load()
>;>print(config)
{
"abc":"123",
"user":"your user",
"pwd":"/current/working/directory"
}

下面是一个示例,说明如何在其上添加"aws"子图
>;>;aws_config=config();创建配置对象
>;>;aws_env=env("aws_access_key_id","aws_secret_access_key")
>;>;aws_config.register(aws_env);在其上注册env适配器
>>>gt;配置添加配置aws subconfig('aws,aws_config)
>>>配置aws
{
"aws_access_key_id":"128u09ijod019jhd182o1290d81",
"aws_secret_access_key":"qoijdn0182hern1d09uj12podij1029udaiwjjbiu09u0oimjkhki"


还能够自动格式化从适配器传入的密钥。例如,如果希望所有键都小写
nv_adapter=env(*{"user":"super_duper_user"})
>;>/>适配器是与配置源的接口。它们从自定义源类型加载设置,
,并将其作为规范化的dict公开给*config*对象。


etcaetera现在提供以下适配器:
**defaults*:设置一些默认设置
**overrides*:覆盖配置设置值
**env*:从系统环境中提取配置值
**file*:从文件中提取配置值。接受的格式是:json、yaml、python模块文件(有关详细信息,请参阅*文件适配器*部分)
**模块*:从python模块提取配置值。像在django中一样,在不久的将来,只有大写的变量将被匹配

,etcaetera可能会提供以下适配器:
**argv*argparse格式支持:将从argparser解析器属性加载设置
**file*ini格式支持:将从ini文件加载设置

您应该知道的很酷的功能:
*您可以为适配器提供一个*格式化程序*,以便自动修改导入的密钥。示例``env("user",etcaetera.formatters.lowercased)``将在调用`.load()``时将`$user``环境变量导入为``user`'。

默认适配器
~~~~~~~~~~~~~~~~~~~~~


默认适配器为配置对象提供默认值。
调用"config.load"方法时,将始终首先对其求值。
您可以将默认值提供给*config*作为*默认*对象
还是作为D前南法庭。

…代码块::python

>;>from etcaetera.config import config
>;>from etcaetera.adapter import defaults

/>
>;>;config=config(默认值)
>;>;config.load()

>;>;打印(配置)
{
"abc":"123"
}


覆盖适配器
~~~~~~~~~~~~~~~~~

lues.
调用"config.load"方法时,它总是最后一个被求值。

…代码块::python

>;>from etcaetera.config import config
>;>from etcaetera.adapter import overrides

luated last.
如果要强制某些配置值,请使用它。
>;>overrides_adapter=overrides({"user":"overrided value"})
>;>config=config({
"user":"default value",
"first_setting":"first setting value"
})

>;>>配置寄存器(覆盖适配器)
>;>config.load()

>;>print(配置)
{
"用户":"覆盖值",
"第一设置":"第一设置值"
}

env适配器加载来自系统环境的配置变量值。
您是否可以为它提供要从环境中获取的键的列表。或者您可以向它传递一个*环境变量名到适配器目标名*``**映射``dict.
此外,由于适配器支持通过``.``分隔符的嵌套键,您可以将任何环境变量映射到嵌套适配器目标。

代码块::python

>;>from etcaetera.adapter import env

{
"user":"user extracted from environment",
"path":"path extracted from environment",
"pwd":"pwd extracted from environment"
}

/>或者将其作为env var names传递给适配器var
names dict
>;>;os.environment["source"]、os.environ["other_source"]
("我的第一个值"、"我的第二个值")
>;>;env=env({"source":"dest","other_source":"test"})
>;>;env.load()
>;>;打印env.data
{
"dest":"my first value",
"test":"my"第二个值"
}

文件适配器将从文件加载配置设置。
支持的格式有json、yaml和python模块文件。存储在指向文件中的每个键值对
都将加载到它注册到的*config*对象中。

```````````````````````````````````

python模块文件的格式应与django设置文件的格式相同。只加载大写变量
。可以使用任何python数据结构。

*下面是一个示例*

*给定以下设置。py file*

…代码块::bash

$cat/my/settings.py
第一个设置=123
第二个设置="这是第二个值"
第三个设置={"easy as":"do re mi"}
忽略的值="这将被忽略"

*文件适配器输出将如下*:

……代码块::python

>;>from etcaetera.adapter import file

>;>file=file('/my/settings.py')
>;>file.load()

>;{
"first_设置:123,
"第二个设置":"这是第二个值",
"第三个设置":{"easy as":"do re mi"}
}

代码块::bash

$cat/my/json/file.json
{
"第一个设置":"第一个json文件提取设置","第二个设置":"第二个json文件提取设置"
}


*文件适配器输出如下*:

……代码块::python

>;>from etcaetera.adapter import file



>;>print(file.data)
{
"第一个设置":"第一个json文件提取设置",
"第二个设置":"第二个json文件提取设置"
}


module adapter
~宏模块。它模拟django
设置模块加载行为,以便匹配模块的每个大写局部变量。

**给定一个mymodule。设置模块查看此内容**:

。代码块::python

my_first_setting=123
my_second_setting="abc"

**加载的模块数据将如下所示**:

…代码块::python

>;>import mymodule
>;>>>>gt;打印(模块.数据)
{
我的第一个设置=123
我的第二个设置=abc
}



contribution
==


请阅读"contribution<;https://github.com/oleiade/etcaetera/blob/development/contribution.rst>;``说明

如果你很懒,这里有一个总结:

1。找到虫子了吗?要添加功能吗?检查有无未解决的问题,或打开一个新的问题开始讨论。
2.打开存储库,开始进行更改。
3.编写一些测试,显示您已修复当前的错误,或者您的功能按预期工作。
4.系好安全带,向*develop*分公司发送拉动请求。



license
==
mit license(mit)


copyright(c)2014 théo crevon

entation文件("软件"),不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再授权和/或出售软件副本的权利,以及允许向其提供软件的人员这样做的权利。受限于以下条件:

对适销性、适用性和非侵权性的保证。在任何情况下,作者或
版权所有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,因
与软件或软件的使用或其他交易有关,或因
与软件或软件的使用或其他交易有关而引起的。
=======


etcaetera是[conf](https://github.com/jingweno/conf)自由创作的(也可以被视为其端口)。
首先感谢它的作者。感谢@botify支持创建这个开源库。
:alt:bitdeli badge
:目标:https://bitdeli.com/free








history
----

0.1.0(2014-01-11)
+++++++++++++

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
获取java。安全InvalidKeyException:密钥长度必须为128、192或256位   java在javafx应用程序中打开PDF   java通过socket发送图像而不会损坏图像   java可编辑JComboBox限制长度   同步表达式内的java方法引用   java检查日期是否在范围内   java I在回收器视图布局中使用Glide获得不同大小的图像   java log4j日志系统。我们需要一个完整的系统。错误并发到控制台   使用异常处理java REST API的应用程序和业务故障场景的设计模式   多线程如何使用多线程在java中处理数据块?   使用类型变量泛型的java调用方法   java将字节[]转换为字符串   /oauth/token端点的java自定义配置   java如何在自定义BaseAdapter中使用自定义字体   java如何使GridLayout的一些列在SWT中增长?   java如何引用要添加到二进制树的方法?   java中用于使字符串不可变的技术?   java将多个XML标记重命名为不同的名称   java Quartz调度程序在上次触发后禁用自动触发器删除