in bsp_server/scip_sync_util/scip_utils.py [0:0]
def transform_bazel_query_results(qr: list[dict]) -> dict[str, dict[str, list[str]]]:
"""Transform the results of a bazel query into a dictionary of dependencies."""
res = {}
rules = set([])
for target in qr:
if target["type"] == "RULE":
rules.add(target["rule"]["name"])
for target in qr:
if target["type"] != "RULE":
continue
rule = target["rule"]
name = rule["name"]
base_path = rule["name"].split(":")[0][2:]
# add all rule inputs except external repository
# to deps
direct_deps = []
for dep in rule.get("ruleInput", []):
if dep.startswith("@"):
continue
if dep not in rules:
continue
direct_deps.append(dep)
target_type = rule["ruleClass"]
e_deps = []
deps = []
for attr in rule.get("attribute", []):
if "stringListValue" not in attr:
continue
if attr["name"] == "deps":
deps += [
dep
for dep in attr.get("stringListValue", [])
if not dep.startswith("@") and dep in rules
]
if attr["name"] == "data":
deps += [
data
for data in attr.get("stringListValue", [])
if not data.startswith("@") and data in rules
]
if attr["name"] == "exports":
e_deps = attr.get("stringListValue", [])
info = {
"base_path": base_path,
"deps": list(set(deps)),
"direct_deps": direct_deps,
"exports": e_deps,
"target_type": target_type,
}
res[name] = info
return res