Skip to content

Commit 6514e93

Browse files
Xuwznlncursoragent
andcommitted
fix registry init enforce defaults
Normalize missing init_param_enforce to an empty object so registry schema contracts do not prevent devices from loading. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent b005dc3 commit 6514e93

3 files changed

Lines changed: 13 additions & 29 deletions

File tree

unilabos/app/package_cli.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,10 @@ def build_resources_from_registry(
371371
for device_id, entry in entries.items():
372372
cls = entry.get("class") if isinstance(entry.get("class"), dict) else {}
373373
init_schema = entry.get("init_param_schema") if isinstance(entry.get("init_param_schema"), dict) else None
374-
init_enforce = entry.get("init_param_enforce")
375-
validate_init_param_enforce(
374+
init_enforce = validate_init_param_enforce(
376375
device_id,
377376
init_schema,
378-
init_enforce,
377+
entry.get("init_param_enforce"),
379378
error_factory=PackageCLIError,
380379
)
381380
category = entry.get("category") or entry.get("tags") or []
@@ -405,8 +404,7 @@ def build_resources_from_registry(
405404
}
406405
if init_schema is not None:
407406
resource["init_param_schema"] = init_schema
408-
if "init_param_enforce" in entry:
409-
resource["init_param_enforce"] = init_enforce
407+
resource["init_param_enforce"] = init_enforce
410408
resources.append(resource)
411409
return resources
412410

unilabos/registry/init_enforce.py

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,45 +33,31 @@ def validate_init_param_enforce(
3333
init_schema: Optional[Dict[str, Any]],
3434
init_enforce: Any,
3535
error_factory: Callable[[str], Exception] = ValueError,
36-
) -> None:
36+
) -> Dict[str, Any]:
3737
"""Validate the JSON enforced config paired with ``init_param_schema``.
3838
3939
``init_param_enforce`` is a plain JSON config object. It must not reintroduce
4040
the old ``class.init`` object factory DSL; drivers should construct rich
4141
objects from JSON-friendly type strings and params inside ``__init__``.
42-
"""
43-
if not isinstance(init_schema, dict):
44-
return
4542
46-
config_schema = init_schema.get("config")
47-
if not isinstance(config_schema, dict):
48-
return
49-
50-
required = config_schema.get("required")
51-
required_fields = [str(field) for field in required] if isinstance(required, list) else []
52-
properties = config_schema.get("properties")
53-
has_config_contract = bool(required_fields) or (
54-
isinstance(properties, dict) and bool(properties)
55-
)
56-
if not has_config_contract:
57-
return
43+
Missing or empty YAML values are normalized to an empty object because the
44+
schema describes runtime config, while ``init_param_enforce`` only declares
45+
registry-owned overrides.
46+
"""
47+
if init_enforce is None:
48+
return {}
5849

5950
if not isinstance(init_enforce, dict):
6051
raise error_factory(
61-
f"{device_id}: init_param_schema.config 已声明参数,必须提供对象形式的 init_param_enforce"
62-
)
63-
64-
missing = [field for field in required_fields if field not in init_enforce]
65-
if missing:
66-
raise error_factory(
67-
f"{device_id}: init_param_enforce 缺少 required 字段: {', '.join(missing)}"
52+
f"{device_id}: init_param_enforce 必须是对象形式"
6853
)
6954

7055
_reject_legacy_init_enforce(
7156
init_enforce,
7257
f"{device_id}.init_param_enforce",
7358
error_factory,
7459
)
60+
return copy.deepcopy(init_enforce)
7561

7662

7763
def _reject_legacy_init_enforce(

unilabos/registry/registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1900,7 +1900,7 @@ def _load_single_device_file(
19001900
continue
19011901

19021902
# --- 正常 YAML 处理 ---
1903-
validate_init_param_enforce(
1903+
device_config["init_param_enforce"] = validate_init_param_enforce(
19041904
device_id,
19051905
device_config.get("init_param_schema"),
19061906
device_config.get("init_param_enforce"),

0 commit comments

Comments
 (0)