feat(validation): check the contents of a raw option that holds a dict or list

This commit is contained in:
2026-10-05 18:12:41 +02:00
parent 75ea3f10e2
commit d0916e5d2b
3 changed files with 27 additions and 4 deletions
+4 -2
View File
@@ -79,9 +79,11 @@ class _Validator:
if "choices" in spec and value not in spec["choices"]: if "choices" in spec and value not in spec["choices"]:
shown = "" if spec.get("no_log") else f", got {value!r}" shown = "" if spec.get("no_log") else f", got {value!r}"
self.errors.append(f"{path}: must be one of {', '.join(map(str, spec['choices']))}{shown}") self.errors.append(f"{path}: must be one of {', '.join(map(str, spec['choices']))}{shown}")
if kind == "dict" and "options" in spec: # Keyed on the value, not the declared type, so a `raw` option ("false, or a dict of...") is
# still checked whenever it holds a dict or a list.
if "options" in spec and isinstance(value, Mapping):
self.check_options(spec["options"], value, path) self.check_options(spec["options"], value, path)
elif kind == "list" and "elements" in spec: elif "elements" in spec and isinstance(value, list):
element = {"type": spec["elements"]} element = {"type": spec["elements"]}
if "options" in spec: if "options" in spec:
element["options"] = spec["options"] element["options"] = spec["options"]
+5
View File
@@ -21,6 +21,11 @@ argument_specs:
secret: secret:
type: str type: str
no_log: true no_log: true
gate:
type: raw
options:
port:
type: int
disks: disks:
type: list type: list
elements: dict elements: dict
+18 -2
View File
@@ -39,7 +39,7 @@ inputs_fixtures:
value: value:
name: web01 name: web01
userz: {} userz: {}
expect: ["fixture.userz: unsupported key, fixture accepts count, disks, enabled, kind, name, secret, servers, users"] expect: ["fixture.userz: unsupported key, fixture accepts count, disks, enabled, gate, kind, name, secret, servers, users"]
- name: wrong-element-type - name: wrong-element-type
value: value:
@@ -84,5 +84,21 @@ inputs_fixtures:
enabled: "true" enabled: "true"
userz: {} userz: {}
expect: expect:
- "fixture.userz: unsupported key, fixture accepts count, disks, enabled, kind, name, secret, servers, users" - "fixture.userz: unsupported key, fixture accepts count, disks, enabled, gate, kind, name, secret, servers, users"
- "fixture.enabled: expected bool, got str" - "fixture.enabled: expected bool, got str"
- name: raw-gate-false
value:
name: web01
gate: false
expect: []
- name: raw-gate-dict-checked
value:
name: web01
gate:
port: http
portz: 1
expect:
- "fixture.gate.portz: unsupported key, fixture.gate accepts port"
- "fixture.gate.port: expected int, got str"