Skip to content

Commit

Permalink
Merge pull request #41 from fkroeber/parse_layout_fix
Browse files Browse the repository at this point in the history
fix: autocomplete friendly layout parsing 🔧
  • Loading branch information
luukvdmeer authored Mar 5, 2024
2 parents 5e797c7 + 2f2a783 commit 31bc70f
Showing 1 changed file with 48 additions and 40 deletions.
88 changes: 48 additions & 40 deletions semantique/datacube.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,26 +232,30 @@ def layout(self, value):
self._layout = {} if value is None else self._parse_layout(value)

def _parse_layout(self, obj):
# Makes the metadata objects of the data layers autocomplete friendly.
def _parse(obj, ref):
is_layer = False
while not is_layer:
if all([x in obj for x in ["type", "values"]]):
obj["reference"] = copy.deepcopy(ref)
if isinstance(obj["values"], list):
obj["labels"] = {x["label"]:x["id"] for x in obj["values"]}
obj["descriptions"] = {x["description"]:x["id"] for x in obj["values"]}
del ref[-1]
is_layer = True
else:
ref.append(k)
for k, v in obj.items():
_parse(v, ref)
for k, v in obj.items():
ref = [k]
for k, v in v.items():
ref.append(k)
_parse(v, ref)
# Function to recursively parse and metadata objects to make them autocomplete friendly
def _parse(current_obj, ref_path):
if "type" in current_obj and "values" in current_obj:
current_obj["reference"] = copy.deepcopy(ref_path)
if isinstance(current_obj["values"], list):
current_obj["labels"] = {
item["label"]: item["id"] for item in current_obj["values"]
}
current_obj["descriptions"] = {
item["description"]: item["id"]
for item in current_obj["values"]
}
return

# If not a "layer", traverse deeper into the object.
for key, value in current_obj.items():
if isinstance(value, dict):
new_ref_path = ref_path + [key]
_parse(value, new_ref_path)

# Start parsing from the root object.
for key, value in obj.items():
if isinstance(value, dict):
_parse(value, [key])
return obj

def retrieve(self, *reference, extent):
Expand Down Expand Up @@ -517,26 +521,30 @@ def layout(self, value):
self._layout = {} if value is None else self._parse_layout(value)

def _parse_layout(self, obj):
# Makes the metadata objects of the data layers autocomplete friendly.
def _parse(obj, ref):
is_layer = False
while not is_layer:
if all([x in obj for x in ["type", "values"]]):
obj["reference"] = copy.deepcopy(ref)
if isinstance(obj["values"], list):
obj["labels"] = {x["label"]:x["id"] for x in obj["values"]}
obj["descriptions"] = {x["description"]:x["id"] for x in obj["values"]}
del ref[-1]
is_layer = True
else:
ref.append(k)
for k, v in obj.items():
_parse(v, ref)
for k, v in obj.items():
ref = [k]
for k, v in v.items():
ref.append(k)
_parse(v, ref)
# Function to recursively parse and metadata objects to make them autocomplete friendly
def _parse(current_obj, ref_path):
if "type" in current_obj and "values" in current_obj:
current_obj["reference"] = copy.deepcopy(ref_path)
if isinstance(current_obj["values"], list):
current_obj["labels"] = {
item["label"]: item["id"] for item in current_obj["values"]
}
current_obj["descriptions"] = {
item["description"]: item["id"]
for item in current_obj["values"]
}
return

# If not a "layer", traverse deeper into the object.
for key, value in current_obj.items():
if isinstance(value, dict):
new_ref_path = ref_path + [key]
_parse(value, new_ref_path)

# Start parsing from the root object.
for key, value in obj.items():
if isinstance(value, dict):
_parse(value, [key])
return obj

def retrieve(self, *reference, extent):
Expand Down

0 comments on commit 31bc70f

Please sign in to comment.