A validator that performs deep validation of a dictionary. All validators are optional, but at least one of *key_validator* or *value_validator* must be provided. Args: key_validator: Validator(s) to apply to dictionary keys. value_validator: Validator(s) to apply
(
key_validator=None, value_validator=None, mapping_validator=None
)
| 408 | |
| 409 | |
| 410 | def deep_mapping( |
| 411 | key_validator=None, value_validator=None, mapping_validator=None |
| 412 | ): |
| 413 | """ |
| 414 | A validator that performs deep validation of a dictionary. |
| 415 | |
| 416 | All validators are optional, but at least one of *key_validator* or |
| 417 | *value_validator* must be provided. |
| 418 | |
| 419 | Args: |
| 420 | key_validator: Validator(s) to apply to dictionary keys. |
| 421 | |
| 422 | value_validator: Validator(s) to apply to dictionary values. |
| 423 | |
| 424 | mapping_validator: |
| 425 | Validator(s) to apply to top-level mapping attribute. |
| 426 | |
| 427 | .. versionadded:: 19.1.0 |
| 428 | |
| 429 | .. versionchanged:: 25.4.0 |
| 430 | *key_validator* and *value_validator* are now optional, but at least one |
| 431 | of them must be provided. |
| 432 | |
| 433 | .. versionchanged:: 25.4.0 |
| 434 | *key_validator*, *value_validator*, and *mapping_validator* can now be a |
| 435 | list or tuple of validators. |
| 436 | |
| 437 | Raises: |
| 438 | TypeError: If any sub-validator fails on validation. |
| 439 | |
| 440 | ValueError: |
| 441 | If neither *key_validator* nor *value_validator* is provided on |
| 442 | instantiation. |
| 443 | """ |
| 444 | if key_validator is None and value_validator is None: |
| 445 | msg = ( |
| 446 | "At least one of key_validator or value_validator must be provided" |
| 447 | ) |
| 448 | raise ValueError(msg) |
| 449 | |
| 450 | if isinstance(key_validator, (list, tuple)): |
| 451 | key_validator = and_(*key_validator) |
| 452 | if isinstance(value_validator, (list, tuple)): |
| 453 | value_validator = and_(*value_validator) |
| 454 | if isinstance(mapping_validator, (list, tuple)): |
| 455 | mapping_validator = and_(*mapping_validator) |
| 456 | |
| 457 | return _DeepMapping(key_validator, value_validator, mapping_validator) |
| 458 | |
| 459 | |
| 460 | @attrs(repr=False, frozen=True, slots=True) |