Source code for dclab.definitions.meta_logic

import numbers

from . import feat_logic, meta_const, meta_parse


[docs] def config_key_exists(section, key): """Return `True` if the configuration key exists""" valid = False if section == "user": if isinstance(key, str) and key.strip(): # sanity check valid = True elif meta_const.config_funcs.get(section, {}).get(key, False): valid = True elif section == "online_filter": if (key.count(",") and (key.endswith("soft limit") or key.endswith("polygon points"))): # "online_filter:area_um,deform soft limit" # "online_filter:area_um,deform polygon points" f1, f2 = key.split(" ", 1)[0].split(",") valid = (feat_logic.scalar_feature_exists(f1) and feat_logic.scalar_feature_exists(f2)) else: feat = key.split(" ", 1)[0] valid = feat_logic.scalar_feature_exists(feat) return valid
[docs] def get_config_value_descr(section, key): """Return the description of a config value Returns `key` if not defined anywhere """ descr = key if section == "user": pass elif meta_const.config_descr.get(section, {}).get(key, False): descr = meta_const.config_descr[section][key] elif section == "online_filter": if (key.count(",") and (key.endswith("soft limit") or key.endswith("polygon points"))): # "online_filter:area_um,deform soft limit" # "online_filter:area_um,deform polygon points" f1, f2 = key.split(" ", 1)[0].split(",") # do not include units l1 = feat_logic.get_feature_label(f1, with_unit=False) l2 = feat_logic.get_feature_label(f2, with_unit=False) if key.endswith("soft limit"): descr = f"Soft limit, polygon ({l1}, {l2})" elif key.endswith("polygon points"): descr = f"Polygon ({l1}, {l2})" else: feat = key.split(" ", 1)[0] if feat_logic.scalar_feature_exists(feat): if key.endswith("soft limit"): # "online_filter:area_um soft limit" label = feat_logic.get_feature_label(feat, with_unit=False) descr = f"Soft limit, {label}" elif key.endswith("min"): # "online_filter:area_um min" descr = f"Min. {feat_logic.get_feature_label(feat)}" elif key.endswith("max"): # "online_filter:area_um max" descr = f"Max. {feat_logic.get_feature_label(feat)}" return descr
[docs] def get_config_value_func(section, key): """Return configuration type converter function""" func = None if section == "user": pass elif meta_const.config_funcs.get(section, {}).get(key, False): func = meta_const.config_funcs[section][key] elif section == "online_filter": # Note that for "min" and "max" values we do nothing (None) if key.endswith("soft limit"): # "online_filter:area_um,deform soft limit" func = meta_parse.fbool elif key.endswith("polygon points"): # "online_filter:area_um,deform polygon points" func = meta_parse.f2dfloatarray if func is None: return lambda x: x else: return func
[docs] def get_config_value_type(section, key): """Return the expected type of a config value Returns `None` if no type is defined """ typ = None if section == "user": pass elif meta_const.config_types.get(section, {}).get(key, False): typ = meta_const.config_types[section][key] elif section == "online_filter": if key.endswith("soft limit"): # "online_filter:area_um,deform soft limit" typ = meta_parse.func_types[meta_parse.fbool] elif key.endswith("polygon points"): typ = meta_parse.func_types[meta_parse.f2dfloatarray] elif key.endswith("min") or key.endswith("max"): # most-general type is a number typ = numbers.Number return typ