def test_deep_load(): tree = Tree() @tree.root() class Config(): @tree.node() class oidc(): url = str @tree.node() class credentials(): client_id = str key = str source_data = {'oidc': {'url': 'teve', 'credentials': {'client_id': 'muha', 'key': 'da_key'}}} cfg = tree.load(source_data) assert cfg.oidc.url == 'teve' assert cfg.oidc.credentials.client_id == 'muha' assert cfg.oidc.credentials.key == 'da_key'
def test_schema_var_annotation_list(): StringList = List[str] tree = Tree() @tree.root() class Config(): param_simpe_1: StringList schema = tree.build_schema() data = {'param_simpe_1': ['teve']} assert schema(data) == data with raises(MultipleInvalid): schema({}) with raises(MultipleInvalid): schema({'param_simpe_1': 42}) with raises(MultipleInvalid): schema({'param_simpe_1': [42]})
def test_list_of_objects(): class ServerConfig(NodeBase): url = str def serialize(self): return self.__dict__ class credentials(NodeBase): client_id = str secret = str def serialize(self): return self.__dict__ tree = Tree() @tree.root() class Config(): servers = tree.list_node([ServerConfig]) source_data = {'servers':[{'url': 'http://teve.hu', 'credentials': {'client_id': 'id1', 'secret': '42'}}]} source_data2 = deepcopy(source_data) source_data2['servers'][0]['credentials']['client_id'] = 42 source_data3 = deepcopy(source_data) del source_data3['servers'][0]['credentials']['secret'] schema = tree.build_schema() assert len(schema.schema) == 1 assert schema(source_data) == source_data assert schema({'servers': []}) == {'servers': []} with raises(MultipleInvalid): assert schema(source_data2) with raises(MultipleInvalid): assert schema(source_data3)
def test_dict_node_dump(): class ServerConfig(NodeBase): host = str port = int def serialize(self): return self.__dict__ tree = Tree() @tree.root() class Config(): servers = tree.dict_node(str, ServerConfig) source_data = { 'servers': { 'server1': { 'host': 'teve', 'port': 42 }, 'server2': { 'host': 'muha', 'port': 422 } } } cfg = tree.load(source_data) cfg.servers['server1'].port = 5042 data = tree.dump(cfg) assert data['servers']['server1']['port'] == 5042
def test_list_node_load_two_types(): class ServerConfig(NodeBase): host = str port = int def serialize(self): return self.__dict__ tree = Tree() @tree.root() class Config(): servers = tree.list_node([ServerConfig, int]) source_data = {'servers':[{'host': 'teve', 'port': 42}, 21]} cfg = tree.load(source_data) assert cfg.servers[0].host == 'teve' assert cfg.servers[0].port == 42 assert cfg.servers[1] == 21
from configpp.tree import Tree tree = Tree() @tree.root() class Config(): param_simple_1 = 42 cfg = tree.load({}) print(cfg.param_simple_1)
import logging import logging.config from configpp.soil import Config from configpp.tree import Tree, Settings, DatabaseLeaf logger = logging.getLogger(__name__) tree = Tree(Settings( convert_underscores_to_hypens = True, convert_camel_case_to_hypens = True, )) @tree.root() class AppConfig: database: DatabaseLeaf redis: str logger: dict discord_token: str wows_token: str web_base_url: str def load() -> AppConfig: config_loader = Config('scrat.yaml') if not config_loader.load(): raise Exception("config not loaded") app_config: AppConfig = tree.load(config_loader.data)
def test_missing_root(): tree = Tree() with raises(ConfigTreeBuilderException): tree.build_schema()
from configpp.tree import Tree, Settings from configpp.soil import create_from_url tree = Tree(Settings(convert_underscores_to_hypens = True)) @tree.root() class Config(): port: int host = '0.0.0.0' mpv_socket_pattern: str logger: dict def load() -> Config: config_loader = create_from_url('configpp://mpv-http-router.yaml') if not config_loader.load(): return None return tree.load(config_loader.data)