From 1ab78d43b07ae3c0192314cb754be452fa84816b Mon Sep 17 00:00:00 2001 From: Michael Zeltser Date: Sun, 12 Jul 2020 17:29:19 +0300 Subject: [PATCH] Add capability to get nested items using dot --- warlock/model.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/warlock/model.py b/warlock/model.py index 54bcbd7..91a94e5 100644 --- a/warlock/model.py +++ b/warlock/model.py @@ -23,6 +23,26 @@ from . import exceptions +def dot_factory(attr): + if isinstance(attr, dict): + return DotDict(attr) + elif isinstance(attr, list): + return DotList(attr) + return attr + + +class DotList(list): + def __getitem__(self, i: int): + item = list.__getitem__(self, i) + return dot_factory(item) + + +class DotDict(dict): + def __getattr__(self, key): + attr = self.__getitem__(key) + return dot_factory(attr) + + class Model(dict): def __init__(self, *args, **kwargs): # we overload setattr so set this manually @@ -64,7 +84,8 @@ def __delitem__(self, key): def __getattr__(self, key): try: - return self.__getitem__(key) + attr = self.__getitem__(key) + return dot_factory(attr) except KeyError: raise AttributeError(key)