def _shallow_get_keys(self, keys: list, data, pkey: str = None, key_index: bool = True) -> None: if isinstance(data, list): if key_index == True: for i in range(len(data)): keys.append("%s[%d]" % (pkey, i)) else: keys.append(pkey) elif isinstance(data, dict): for key in data.keys(): nkey = key if pkey is None else "%s%s%s" % (pkey, self._delim, key) if not isinstance(data[key], (dict, list)): keys.append(nkey) else: self._shallow_get_keys(keys, data[key], nkey, key_index) else: raise KvError(errno.ENOSYS, "Cant handle type %s", type(data))
def get(self, key): k = key.split(self._delim, 1) if len(k) <= 1: raise KvError(errno.EINVAL, "Missing section in key %s", \ key) return self._data[k[0]][k[1]]
def _get(self, key: str, data: dict) -> str: """ Core logic for get """ # Indexed keys Validations can be put here for all methods key_split = key.split(self._delim, 1) # leaf node if len(key_split) == 1: [leaf_key] = key_split leaf_key_index = self._key_index_split(leaf_key) if len(leaf_key_index[0].strip()) == 0: raise KvError(errno.EINVAL, "Empyt key %s", leaf_key) if len(leaf_key_index) > 1: if not leaf_key_index[1].isnumeric(): raise KvError(errno.EINVAL, \ "Invalid key index for the key %s", leaf_key) if leaf_key_index[2]: raise KvError(errno.EINVAL, "Invalid key %s", leaf_key) leaf_key, leaf_index = leaf_key_index[0], int( leaf_key_index[1]) if leaf_key not in data.keys() or \ leaf_index > len(data[leaf_key])-1 or \ leaf_key not in data.keys() or \ not isinstance(data[leaf_key], list): return None return data[leaf_key][leaf_index] if isinstance(data, dict): if leaf_key not in data.keys(): return None return data[leaf_key] elif len(key_split) > 1: p_key, c_key = key_split # Check if parent key has index, if so split key and index key_index = self._key_index_split(p_key) # Raise error if key is an empty str if len(key_index[0].strip()) == 0: raise KvError(errno.EINVAL, "Empyt key %s", p_key) if len(key_index) > 1: if not key_index[1].isnumeric(): raise KvError(errno.EINVAL, \ "Invalid key index for the key %s", p_key) if key_index[2]: raise KvError(errno.EINVAL, "Invalid key %s", p_key) p_key, p_index = key_index[0], int(key_index[1]) if isinstance(data[p_key], list): if p_index > (len(data[p_key]) - 1): return None if isinstance(data[p_key][p_index], dict): return self._get(c_key, data[p_key][p_index]) else: # Index for a dict! return None else: if p_key not in data.keys(): return None if isinstance(data[p_key], dict): return self._get(c_key, data[p_key]) else: return None
def dump(self, payload, delim='>'): """ Dumps data onto the KV Storage """ raise KvError(errno.ENOSYS, "%s:dump() not implemented", type(self).__name__)
def load(self, delim='>'): """ Loads and returns data from KV storage """ raise KvError(errno.ENOSYS, "%s:load() not implemented", type(self).__name__)