Ejemplo n.º 1
0
 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))
Ejemplo n.º 2
0
 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]]
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 def dump(self, payload, delim='>'):
     """ Dumps data onto the KV Storage """
     raise KvError(errno.ENOSYS, "%s:dump() not implemented",
                   type(self).__name__)
Ejemplo n.º 5
0
 def load(self, delim='>'):
     """ Loads and returns data from KV storage """
     raise KvError(errno.ENOSYS, "%s:load() not implemented",
                   type(self).__name__)