Skip to content

Instantly share code, notes, and snippets.

@Attumm
Created August 18, 2023 09:02
Show Gist options
  • Save Attumm/b64e16d7bb16523757e9051481d39388 to your computer and use it in GitHub Desktop.
Save Attumm/b64e16d7bb16523757e9051481d39388 to your computer and use it in GitHub Desktop.
import json
def new_dn(dn, key):
return dn + (key,)
def sm_looper(run_func, sm_model):
def loop_over(model, dn=()):
if "type" not in model:
return model
model = run_func(model, dn)
if model["type"] == "dict":
for key, sub_model in model["nested"].items():
model["nested"][key] = loop_over(sub_model, new_dn(dn, key))
elif model["type"] == "list":
if "items" in model:
for i, sub_model in enumerate(model["items"]):
model["items"][i] = loop_over(sub_model, new_dn(dn, "items"))
elif "item" in model:
model["item"] = loop_over(model["item"], new_dn(dn, "item"))
elif "nested" in model:
for key, sub_model in model["nested"].items():
model["nested"][key] = loop_over(sub_model, new_dn(dn, key))
return model
return loop_over(sm_model.copy())
def parse_key(key):
return key.lower().replace(" ", "_").replace("-", "_")
def rename_keys(model, dn):
if "nested" in model:
submodel = model["nested"]
keys = list(submodel.keys())
for key in keys:
submodel[parse_key(key)] = submodel.pop(key)
return model
def order_keys(model, dn):
top_keys = ["title", "type", "field_type", "description", "example", "source", "item"]
lower_keys = ["rbac", "items", "nested"]
ordered_model = {}
# top keys
for key in top_keys:
if key in model:
ordered_model[key] = model[key]
# Unknown keys
for key, value in model.items():
if key not in lower_keys and key not in ordered_model:
ordered_model[key] = value
# lower keys
for key in lower_keys:
if key in model:
ordered_model[key] = model[key]
return ordered_model
def remove_and_place_rbac(model, dn):
rbac = model.get("source", {}).pop("rbac", None)
if rbac is not None:
model["rbac"] = rbac
return model
if __name__ == "__main__":
filename = "sm_model.json"
sem_model = json.load(open(filename))
result = sm_looper(rename_keys, sem_model)
result1 = sm_looper(remove_and_place_rbac, result)
result2 = sm_looper(order_keys, result1)
print(json.dumps(result2, indent=4))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment