Read an attribute list at a dotted path, e.g. ``actuator_common.attrs``. Returns [] if missing.
(schema: Dict[str, Any], path: str)
| 228 | |
| 229 | |
| 230 | def schema_attrs(schema: Dict[str, Any], path: str) -> List[str]: |
| 231 | """Read an attribute list at a dotted path, e.g. |
| 232 | ``actuator_common.attrs``. Returns [] if missing.""" |
| 233 | cur: Any = schema |
| 234 | for piece in path.split("."): |
| 235 | if isinstance(cur, dict) and piece in cur: |
| 236 | cur = cur[piece] |
| 237 | else: |
| 238 | return [] |
| 239 | if isinstance(cur, list): |
| 240 | if cur and isinstance(cur[0], str): |
| 241 | return list(cur) |
| 242 | attrs: List[str] = [] |
| 243 | for entry in cur: |
| 244 | if isinstance(entry, dict): |
| 245 | if "attrs" in entry and isinstance(entry["attrs"], list): |
| 246 | attrs.extend([str(x) for x in entry["attrs"]]) |
| 247 | else: |
| 248 | for v in entry.values(): |
| 249 | if isinstance(v, list): |
| 250 | attrs.extend([str(x) for x in v]) |
| 251 | seen = set() |
| 252 | out = [] |
| 253 | for a in attrs: |
| 254 | if a not in seen: |
| 255 | seen.add(a) |
| 256 | out.append(a) |
| 257 | return out |
| 258 | if isinstance(cur, dict): |
| 259 | attrs2: List[str] = [] |
| 260 | for v in cur.values(): |
| 261 | if isinstance(v, list): |
| 262 | attrs2.extend([str(x) for x in v if isinstance(x, str)]) |
| 263 | return attrs2 |
| 264 | return [] |
| 265 | |
| 266 | |
| 267 | def schema_subtype_attrs(schema: Dict[str, Any], category: str, |
no test coverage detected