在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_PROFILEsandbox

请注意,两个配置文件的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"

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

推荐PyPI第三方库


热门话题
java Admob初始化失败,应用程序在启动时崩溃,即使没有错误   java如何在ibatis中使用存储过程?   java干净体系结构:在不同的环境中分离IO和核心。jar文件   Java streams compare属性在两个列表之间相等,并返回true或false   有没有一种压缩Java Try-Catch块的方法?   Android片段中的java Mapbox SDK   用于IzPack安装的JavaFX本机启动器:控制InnoSetup/WiX/RPMBuild行为   java接口是否可以将一个已经实例化的对象作为属性?   hashmap中的java线程问题   请求中的java字符编码。getRemoteUser()   java将OneTONE链接更改为另一个id为的实体   java当使用javaw启动应用程序时,不会执行关闭钩子。exe   Android java代码更改显示的微调器   java GZIP解压字符串和字节转换   运行springbatch后java LDAP运行状况检查失败