Skip to main content

轻松建模和转换您关心的环境变量。

项目描述

e2e.env

基于类的环境变量建模及其类型转换。

特别适用于大量使用环境变量的测试自动化,甚至适用于可以从这些映射中受益的应用程序。

要求

为了便于实施,需要 Python 3.6 才能使用 PEP-526变量注释。

概述

环境变量访问很常见,通常通过基于模块的方法完成。

SERVICE_HOST = os.getenv('COMPANY_APP_HOST')
SERVICE_PORT = int(os.getenv('COMPANY_APP_PORT'))

这工作得很好,但有时他们需要刷新......

# Whoops, forgot the int conversion!
SERVICE_PORT = os.getenv('COMPANY_APP_PORT')

...这不是很DRY

此外,您有时可能需要跟踪环境中的名称值,

# This is getting verbose quickly
ENVNAME_SERVICE_HOST = 'COMPANY_APP_HOST'
SERVICE_HOST = os.getenv(ENVNAME_SERVICE_HOST)
ENVNAME_SERVICE_PORT = 'COMPANY_APP_PORT'
SERVICE_PORT = int(os.getenv(ENVNAME_SERVICE_PORT))

一口气,我们可以映射环境变量以及它们到本机类型的转换,并获取值或名称:

class ServiceVars(e2e.env.EnvMapper):
    host: str = 'COMPANY_APP_HOST'
    port: int = 'COMPANY_APP_PORT'

# Get the port via instance
print(ServiceVars().port)   # 8080
type(ServiceVars().port)    # <class 'int'>

# Get the name of the port environment variable via class
print(ServiceVars.port)     # COMPANY_APP_PORT
type(ServiceVars.port)      # <class 'str'>

使用您自己的“转换器”

所做的只是读取类型注释并EnvMapper通过将环境值传递给它来构造返回值。

也就是说,在建模时,

    mapped_name: annotated_type = 'ENV_VAR_NAME'

...通过EnvMapper实例访问时,变为...

    annotated_type(os.getenv('ENV_VAR_NAME'))

例如,在上面的示例中,我们有port: int = 'COMPANY_APP_PORT'. 这基本上被改组为int(os.getenv('COMPANY_APP_PORT')). 因此,任何可以在其构造函数中使用单个str并返回适当类型的可调用对象都将起作用。

生产用途

代码非常简单,并且将遵守这些合同:

  • 不存在的变量将导致 a e2e.env.exceptions.NoSuchVariableError被引发。*
  • AttributeError正如合理预期的那样,访问未映射的环境变量将引发。
  • 访问没有注释的映射将引发TypeError带有映射名称和模型类的 a。

* 开放讨论。回来None可以工作。传递None给类型转换器通常不会产生跨类型的一致行为,因此不能确定为特殊情况(例如str(None)give "None"int(None) raises a TypeError)。有关详细信息,请参阅 问题 #1

未来的工作

  • 支持raise_on_dne或类似更改未找到环境变量时发生的情况。如果您想查看此功能,请 为问题 #1添加大拇指 。
    class ServiceVars(e2e.env.EnvMapper, raise_on_dne=False): ...
    
    class ServiceVars(e2e.env.EnvMapper, dne=lambda: None): ...
    
  • 出于组织目的,支持将映射组合成一个更大的映射。如果您想查看此功能,请为问题 #2添加大拇指 。

下载文件

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

源分布

e2e.env-0.1.0.tar.gz (4.4 kB 查看哈希

已上传 source

内置分布

e2e.env-0.1.0-py3-none-any.whl (4.5 kB 查看哈希

已上传 py3