Skip to main content

用于存储服务配置和机密的包

项目描述

服务配置器

覆盖状态

Service Configurator 是一个 python 库,用于管理服务的设置和机密。

安装

使用包管理器 pip 安装服务配置器。

pip install service-configurator

用法

创建设置类

所有设置类都应派生自 BaseSettings 或其子类。

from configurator import BaseSettings, Integer, String


class MySettings(BaseSettings):
    user_id = Integer()
    password = String()


config = MySettings()

config.user_id = 10
config.password = '123'

print(f'User: {config.user_id} logged with password: {config.password}')

设置类可以有其他设置对象作为成员。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var1 = Integer()


class MySettings2(BaseSettings):
    my_settings = MySettings()
    var2 = Integer()

也可以从另一个设置类继承。子类将父类的设置视为自己的。

from configurator import BaseSettings, Integer


class ParentSettings(BaseSettings):
    var1 = Integer()


class MySettings(ParentSettings):
    var2 = Integer()

等于

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var1 = Integer()
    var2 = Integer()

可用的设置字段

所有实现的设置字段如下所示。

from configurator import BaseSettings, Integer, PositiveInteger, String, Email, Boolean, Float, Url


class MySettings(BaseSettings):
    var1 = Integer()
    var2 = PositiveInteger()
    var3 = String()
    var4 = Email()
    var5 = Boolean()
    var6 = Float()
    var7 = Url()

请记住在创建设置字段时始终包含括号 ()。

可选字段和默认值

设置字段可以使用必需参数标记为可选。除了可以设置默认值外,如果未修改字段,则返回默认值。当未提供这些参数时,字段是必需的,并且它的默认值是特定于字段类型的。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer(required=False, default=50)

导入设置

您可以使用以下方式导入设置:

  • python 字典对象
  • json文件
  • yaml 文件
from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer()


config = MySettings()

config.from_dict({'var': 12})
config.from_json('file.json')
config.from_yaml('file.yaml')

从 python dict 对象导入时,如果您不想提供所有必需的值,可以使用 partial_update 参数,这在单元测试时可能很有用。默认情况下,如果缺少必需的值,则会引发异常。json 和 yaml 导入无法访问此选项。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var1 = Integer()
    var2 = Integer()


配置 = 我的设置()

配置from_dict ({ 'var1' :  12 },  partial_update = True )

导出设置

与导入类似,您几乎没有导出选项:

  • python 字典对象
  • json文件
  • yaml 文件
from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer()


config = MySettings()
config.var = 10

config.to_dict()  # {'var': 10}
config.to_json('file.json')
config.to_yaml('file.yaml')

Yaml 文件是存储配置的推荐选项。

生成模板文件

模板/骨架配置文件可以通过创建设置类的新实例并使用导出方法来简单地生成。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer()


config = MySettings()

config.to_json('file.json.skel')
config.to_yaml('file.yaml.skel')

设置和获取单个字段

如果您想获取或设置单个属性,您可以作为普通类成员访问。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer()


config = MySettings()

config.var = 4
print(config.var)  # prints 4

私人设置字段

如果您将非字段成员添加到您的配置类,它不会被导出或导入。但是,您仍然可以将其用作普通类成员。

from configurator import BaseSettings, Integer


class MySettings(BaseSettings):
    var = Integer(default=5)
    multiplier = 2

    def multiply(self):
        return self.var * self.multiplier


config = MySettings()
print(config.multiply())  # prints 10
config.to_dict()  # {'var': 5}

处理异常

当出现问题时,配置器会抛出以下异常:

  • ValidationError - 提供的值未通过字段的验证检查
  • SettingsError - 通用设置错误,请阅读错误消息以获取更多信息
from configurator import BaseSettings, PositiveInteger, ValidationError, SettingsError


class MySettings(BaseSettings):
    var = PositiveInteger()


config = MySettings()

try:
    config.var = -1
except ValidationError as ex:
    # ValidationError -1 can't be assigned to PositiveInteger
    print(f'Validation error: {ex}')

try:
    config.from_dict({})
except SettingsError as ex:
    # SettingsError missing required field 'var'
    print(f'Settings error: {ex}')

异常不应该默默地过去。

实用程序类

对于常用的设置集,实用程序类被实施以避免在多个服务中不必要的代码重复。

所有当前实现的实用程序类如下所示。检查文档以了解班级命运。

from configurator import BaseSettings
from configurator.utils import OracleConnectorSettings, BoxSettings


class MySettings(BaseSettings):
    oracle_db = OracleConnectorSettings()
    box = BoxSettings()

完整示例

from configurator import BaseSettings, String, Email
from configurator.utils import OracleConnectorSettings


class MySettings(BaseSettings):
    api_key = String()
    report_email = Email(required=False)
    oracle_db = OracleConnectorSettings()


config = MySettings()
config.from_yaml('config.yml')

config.yaml

api_key: '123qwerty'
oracle_db:
  host: 'http://localhost'
  password: 'pass123'
  port: 1521
  sid: 'db2'
  user: 'admin'
report_email: 'report@example.com'

贡献

创建新的设置字段

  • 所有字段类都位于fields.py文件中。
  • 每个字段都应该继承自Field类或其子类。
  • 所有字段都应该实现defaulttypevalidate,除非它在父类中实现并且不需要更改

示例字段类:

# implemented in fields.py

class String(Field):
    """
    Class for string type fields.
    """
    type_ = str
    default = ''


class Email(String):
    """
    Class for email fields.
    """

    def validate(self, value: str) -> str:
        """Validates email using simple regex."""
        value = super().validate(value)
        regex = re.compile(r'^\S+@\S+\.\S+$')
        if regex.fullmatch(value) is None:
            raise ValidationError('Provided string is not a valid email.')
        return value

创建新的实用程序设置

许多服务中使用的通用参数集不应被复制粘贴。相反,应该在utils.py. 将实用程序类创建为普通设置类。

# implemented in utils.py

class OracleConnectorSettings(BaseSettings):
    """Setting required for connection to oracle database."""
    host = Url()
    port = Integer()
    user = String()
    password = String()
    sid = String()

    def get_connection_url(self):
        """Get connection url for sql alchemy"""
        return f"oracle://{self.user}:{self.password}@{self.host}:{self.port}/{self.sid}"

需要考虑的其他事项

  • 每个类和函数都应该记录在案。除此之外,运行 pydoc3 以在修改后生成 html 文档。
    pdoc --html -o docs configurator
    
  • 这个包的测试覆盖率是 100% 尽量不要降低它。
  • __all__如果__init__.py需要更新

下载文件

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

源分布

service-configurator-1.0.0.tar.gz (7.5 kB 查看哈希

已上传 source

内置分布

service_configurator-1.0.0-py3-none-any.whl (8.5 kB 查看哈希

已上传 py3