def test_isnamedtupleinstance(): """Assert that isnamedtupleinstance works as expected""" Db = namedtuple("Db", ["host", "port"]) assert isnamedtupleinstance(Db(host="localhost", port=3306)) assert not isnamedtupleinstance(dict(host="localhost", port=3306.0)) assert not isnamedtupleinstance(("localhost", "3306")) class Foo(tuple): def _fields(self): return ["a", "b"] assert not isnamedtupleinstance(Foo())
def parse_conf_data(data, tomlfy=False, box_settings=None): # fix for https://github.com/rochacbruno/dynaconf/issues/595 if isnamedtupleinstance(data): return data # not enforced to not break backwards compatibility with custom loaders box_settings = box_settings or {} if isinstance(data, (tuple, list)): # recursively parse each sequence item return [ parse_conf_data(item, tomlfy=tomlfy, box_settings=box_settings) for item in data ] if isinstance(data, (dict, DynaBox)): # recursively parse inner dict items _parsed = {} for k, v in data.items(): _parsed[k] = parse_conf_data(v, tomlfy=tomlfy, box_settings=box_settings) return _parsed if (isinstance(data, str) and data.startswith(("+", "-")) and data[1:].isdigit()): return data # return parsed string value return _parse_conf_data(data, tomlfy=tomlfy, box_settings=box_settings)