Source code for dynaconf.utils.parse_conf

import os
import json
import toml

from six import string_types
from dynaconf.utils.boxing import DynaBox


true_values = (
    't', 'true', 'enabled', '1', 'on', 'yes', 'True'
)
false_values = (
    'f', 'false', 'disabled', '0', 'off', 'no', 'False', ''
)

converters = {
    '@int': int,
    '@float': float,
    '@bool': (
        lambda value: True if str(value).lower() in true_values else False
    ),
    '@json': json.loads,
    # Special markers to be used as placeholders e.g: in prefilled forms
    # will always return None when evaluated
    '@note': lambda value: None,
    '@comment': lambda value: None,
    '@null': lambda value: None,
    '@none': lambda value: None,
}


[docs]def parse_with_toml(data): """Uses TOML syntax to parse data""" try: return toml.loads('key={}'.format(data), DynaBox).key except toml.TomlDecodeError: return data
def _parse_conf_data(data, tomlfy=False): """ @int @bool @float @json (for lists and dicts) strings does not need converters export DYNACONF_DEFAULT_THEME='material' export DYNACONF_DEBUG='@bool True' export DYNACONF_DEBUG_TOOLBAR_ENABLED='@bool False' export DYNACONF_PAGINATION_PER_PAGE='@int 20' export DYNACONF_MONGODB_SETTINGS='@json {"DB": "quokka_db"}' export DYNACONF_ALLOWED_EXTENSIONS='@json ["jpg", "png"]' """ cast_toggler = os.environ.get('AUTO_CAST_FOR_DYNACONF', 'true').lower() castenabled = cast_toggler not in false_values if castenabled and data and isinstance( data, string_types ) and data.startswith(tuple(converters.keys())): parts = data.partition(' ') converter_key = parts[0] value = parts[-1] return converters.get(converter_key)(value) return parse_with_toml(data) if tomlfy else data
[docs]def parse_conf_data(data, tomlfy=False): if isinstance(data, (tuple, list)): # recursively parse each sequence item return [parse_conf_data(item, tomlfy=tomlfy) for item in data] elif isinstance(data, (dict, DynaBox)): # recursively parse inner dict items _parsed = {} for k, v in data.items(): _parsed[k] = parse_conf_data(v, tomlfy=tomlfy) return _parsed else: # return parsed string value return _parse_conf_data(data, tomlfy=tomlfy)
[docs]def unparse_conf_data(value): if isinstance(value, bool): return "@bool %s" % value elif isinstance(value, int): return "@int %s" % value elif isinstance(value, float): return "@float %s" % value elif isinstance(value, (list, dict)): return "@json %s" % json.dumps(value) elif value is None: return "@none " else: return value