在python 3.6+中轻松加载基于环境变量的概要文件
wr-profiles的Python项目详细描述
简介
wr profiles允许声明由环境变量支持的配置文件(一组键值对) 并通过点符号访问配置文件内容,在IDE中自动完成工作。 您还可以声明多个独立的环境,并通过只更改一个环境在配置文件之间切换 变量(就像您通常在使用多个aws帐户时所做的那样,如果您有这样的背景)。 wr配置文件的设计考虑了可测试性。
wr- in the package name stands for Wheel Reinvented. Just like all other packages whose name starts with wr-, the meaning of this library (as in meaning of life) lies in its existence and evolution and not in any external application of it.
支持的python版本
- python 3.6
- 巨蟒3.7
示例
声明配置文件:
fromwr_profilesimportenvvar_profile_cls@envvar_profile_clsclassWarehouseProfile:host:str="localhost"username:strpassword:strwarehouse_profile=WarehouseProfile()
设置环境:
exportWAREHOUSE_STAGING_PARENT_PROFILE="production"exportWAREHOUSE_STAGING_PASSWORD="staging-password"exportWAREHOUSE_PRODUCTION_USERNAME="production-username"exportWAREHOUSE_PRODUCTION_PASSWORD="production-password"
选择活动环境:
exportWAREHOUSE_PROFILE=staging
使用配置文件:
fromprofilesimportwarehouse_profileassertwarehouse_profile.host=="localhost"assertwarehouse_profile.username=="production-username"assertwarehouse_profile.password=="staging-password"
安装
pip install wr-profiles
如果决定使用此库,请确保将版本号固定在需求文件中。
我们正在对语义版本控制模式进行解释。示例:
- v2.x.a -> v2.x.b-错误修复或非中断更改,可安全升级。
- v2.x.* -> v3.y.*-可能会破坏更改,添加了功能,可能需要对用户代码进行最小的更改
- v2.* -> v3.*-完成转换
更改日志
4.2.0版
- 添加了profile_delegate功能。
v4.1.0
- 添加了EnvvarProfile.create_env,它创建了一个Environment,可以应用 作为上下文管理器。
用户指南
概念
剖面图
profile表示单个服务的一组可配置的properties。 由环境变量支持。
在您的应用程序中,可以有多个不相关的配置文件,每个都提供接口 其他服务的属性。
与同一服务关联的配置文件实例共享同一基类,并由 profile_root在该基类中指定。是所有相关的 已形成环境变量名。
无关服务的配置文件不共享任何信息。 在下面的讨论中,不同的实例或类型的配置文件都与同一个服务相关, 例如,相同的profile_root。
仓库简介(示例)
在下面的讨论中,我们将以数据仓库访问的概要文件为例。 类WarehouseProfile声明配置文件及其提供的属性。 对象warehouse_profile是用户必须通过其查找服务的单个实例 活动配置。
fromwr_profilesimportenvvar_profile_cls@envvar_profile_clsclassWarehouseProfile:host:str="localhost"username:strpassword:strwarehouse_profile=WarehouseProfile()
配置文件名
配置文件的单个实例由其名称(profile_nameproperty)标识。
活动配置文件
active profile是应该使用的服务的配置文件 根据环境变量。
默认情况下,可以通过设置特殊的环境变量来切换活动配置文件 <PROFILE_ROOT>_PROFILE。对于WarehouseProfile,应该是WAREHOUSE_PROFILE。
通过设置类的profile_activating_envvar,可以自定义此变量的名称。
如果未设置此变量,则活动配置文件为an empty string,环境变量为 咨询方式如下:
<PROFILE_ROOT>_<PROPERTY_NAME>
例如,WAREHOUSE_HOST。
如果设置了<PROFILE_ROOT>_PROFILE,则活动配置文件将以以下形式查询环境变量:
<PROFILE_ROOT>_<PROFILE_NAME>_<PROPERTY_NAME>
例如,如果WAREHOUSE_PROFILE设置为staging,则将查找host属性 在WAREHOUSE_STAGING_HOST下。
父配置文件
可以指示任何特定配置文件(例如,staging配置文件的WarehouseProfile) 通过设置:
<PROFILE_ROOT>_<PROFILE_NAME>_PARENT_PROFILE
例如,WAREHOUSE_STAGING_PARENT_PROFILE如果设置为production,则意味着 if环境变量^{tt2未设置1}$,属性值加载程序将 改为查阅WAREHOUSE_PRODUCTION_HOST。只有当变量不存在时, 将使用属性的默认值。
限制:默认配置文件(profile_name="")不能用作父配置文件。 如果指定空字符串为<PROFILE_ROOT>_<PROFILE_NAME>_PARENT_PROFILE,则 配置文件将没有任何父配置文件。这和没有值集是一样的。
实时配置文件与冻结配置文件
配置文件总是查询环境变量(os.environ),而 frozen配置文件仅在实例化期间和显式加载时执行此操作 使用load()方法。
常见场景
获取当前活动配置文件
当前活动的配置文件始终可以通过配置文件类的实例使用,该实例是 无参数实例化:
warehouse_profile=WarehouseProfile()
通常,您只需要profile类的一个实例指向活动的profile。
获取混凝土剖面
要使用不一定要激活的具体配置文件,请使用load 工厂方法:
staging=WarehouseProfile.load("staging")
默认情况下,此配置文件将被冻结,这意味着它在实例化期间只加载一次。 如果希望它始终参考环境变量,请传递profile_is_live=True:
staging=WarehouseProfile.load("staging",profile_is_live=True)
自定义配置文件激活环境变量
假设您有自己的WarehouseProfile,并且希望在测试中使用它。在测试中,它应该有不同的默认值。
@envvar_profile_clsclassWarehouseTestProfile(WarehouseProfile):# If you don't set this, it would be "WAREHOUSE_PROFILE" which would conflict# with your non-test profile.profile_activating_envvar="WAREHOUSE_TEST_PROFILE"host:str="test-host"username:str="test-user"
在您的应用程序中,您将有两个实例:
profile=WarehouseProfile()test_profile=WarehouseTestProfile()
现在可以在有意义的时候在测试中重用非测试配置文件。例如,如果您设置了环境 形式为WAREHOUSE_SANDBOX_*的变量,那么这个“沙盒”配置文件可以通过设置 WAREHOUSE_TEST_PROFILE到sandbox。
请注意,两个配置文件的profile_root是相同的。
激活配置文件
若要激活配置文件,请对冻结的配置文件实例调用activate方法,而不使用任何参数, 或者,activate(profile_name)在当前配置文件实例上:
staging.activate()# or:warehouse_profile.activate("staging")
获取所有值
warehouse_profile.to_dict()
设置环境变量
注意,您设置的环境变量通常只应用于当前进程及其子进程 因此,这将有有限的用途-只有在启动子流程或执行此操作时才有意义 在代码的早期,在环境变量被代码的其他部分加载之前。
os.environ.update(warehouse_profile.to_envvars())
检查属性是否具有非默认值
warehouse_profile.has_prop_value("username")# orwarehouse_profile.has_prop_value(WarehouseProfile.username)
检查属性
fromwr_profilesimportEnvvarProfilePropertyassertisinstance(WarehouseProfile.username,EnvvarProfileProperty)assertWarehouseProfile.username.name=="username"assertWarehouseProfile.username.default=="default-username"
环境对象
从版本4.1开始,您可以创建Environment的实例,然后可以将其应用于os.environ 或者pytest的monkeypatchfixture。Environment是一个需要 设置或取消设置以应用指定的环境。这些值是由环境决定的 创建时间。
test_env=warehouse_profile.create_env(username='test',password=None)withtest_env.applied():assertwarehouse_profile.username=='test'assertos.environ['WAREHOUSE_USERNAME']=='test'assertwarehouse_profile.passwordisNoneassert'WAREHOUSE_PASSWORD'notinos.environ
委派到配置文件的配置对象
环境变量不一定是配置的唯一来源。 在一个非常重要的应用程序中,您可能不会从应用程序代码中查询profile对象 直接的。相反,您将拥有一个config对象,它将查询不同的源,包括 环境变量配置文件。 在profile类中定义的属性很可能 是config对象公开的那些内容的子集。如果你不想重复,你可以 config类扩展profile类,并让config类将所有属性委托给profile 类,但在配置类中实现的类除外。
profile=WarehouseProfile()classWarehouseConfig(WarehouseProfile):@propertydefprofile_delegate(self):returnprofile@propertydefusername(self):returnprofile.usernameor"anonymous"