feat(validation): check the contents of a raw option that holds a dict or list
This commit is contained in:
@@ -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"]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user