_legacy_validators.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from jsonschema import _utils
  2. from jsonschema.compat import iteritems
  3. from jsonschema.exceptions import ValidationError
  4. def dependencies_draft3(validator, dependencies, instance, schema):
  5. if not validator.is_type(instance, "object"):
  6. return
  7. for property, dependency in iteritems(dependencies):
  8. if property not in instance:
  9. continue
  10. if validator.is_type(dependency, "object"):
  11. for error in validator.descend(
  12. instance, dependency, schema_path=property,
  13. ):
  14. yield error
  15. elif validator.is_type(dependency, "string"):
  16. if dependency not in instance:
  17. yield ValidationError(
  18. "%r is a dependency of %r" % (dependency, property)
  19. )
  20. else:
  21. for each in dependency:
  22. if each not in instance:
  23. message = "%r is a dependency of %r"
  24. yield ValidationError(message % (each, property))
  25. def disallow_draft3(validator, disallow, instance, schema):
  26. for disallowed in _utils.ensure_list(disallow):
  27. if validator.is_valid(instance, {"type": [disallowed]}):
  28. yield ValidationError(
  29. "%r is disallowed for %r" % (disallowed, instance)
  30. )
  31. def extends_draft3(validator, extends, instance, schema):
  32. if validator.is_type(extends, "object"):
  33. for error in validator.descend(instance, extends):
  34. yield error
  35. return
  36. for index, subschema in enumerate(extends):
  37. for error in validator.descend(instance, subschema, schema_path=index):
  38. yield error
  39. def items_draft3_draft4(validator, items, instance, schema):
  40. if not validator.is_type(instance, "array"):
  41. return
  42. if validator.is_type(items, "object"):
  43. for index, item in enumerate(instance):
  44. for error in validator.descend(item, items, path=index):
  45. yield error
  46. else:
  47. for (index, item), subschema in zip(enumerate(instance), items):
  48. for error in validator.descend(
  49. item, subschema, path=index, schema_path=index,
  50. ):
  51. yield error
  52. def minimum_draft3_draft4(validator, minimum, instance, schema):
  53. if not validator.is_type(instance, "number"):
  54. return
  55. if schema.get("exclusiveMinimum", False):
  56. failed = instance <= minimum
  57. cmp = "less than or equal to"
  58. else:
  59. failed = instance < minimum
  60. cmp = "less than"
  61. if failed:
  62. yield ValidationError(
  63. "%r is %s the minimum of %r" % (instance, cmp, minimum)
  64. )
  65. def maximum_draft3_draft4(validator, maximum, instance, schema):
  66. if not validator.is_type(instance, "number"):
  67. return
  68. if schema.get("exclusiveMaximum", False):
  69. failed = instance >= maximum
  70. cmp = "greater than or equal to"
  71. else:
  72. failed = instance > maximum
  73. cmp = "greater than"
  74. if failed:
  75. yield ValidationError(
  76. "%r is %s the maximum of %r" % (instance, cmp, maximum)
  77. )
  78. def properties_draft3(validator, properties, instance, schema):
  79. if not validator.is_type(instance, "object"):
  80. return
  81. for property, subschema in iteritems(properties):
  82. if property in instance:
  83. for error in validator.descend(
  84. instance[property],
  85. subschema,
  86. path=property,
  87. schema_path=property,
  88. ):
  89. yield error
  90. elif subschema.get("required", False):
  91. error = ValidationError("%r is a required property" % property)
  92. error._set(
  93. validator="required",
  94. validator_value=subschema["required"],
  95. instance=instance,
  96. schema=schema,
  97. )
  98. error.path.appendleft(property)
  99. error.schema_path.extend([property, "required"])
  100. yield error
  101. def type_draft3(validator, types, instance, schema):
  102. types = _utils.ensure_list(types)
  103. all_errors = []
  104. for index, type in enumerate(types):
  105. if validator.is_type(type, "object"):
  106. errors = list(validator.descend(instance, type, schema_path=index))
  107. if not errors:
  108. return
  109. all_errors.extend(errors)
  110. else:
  111. if validator.is_type(instance, type):
  112. return
  113. else:
  114. yield ValidationError(
  115. _utils.types_msg(instance, types), context=all_errors,
  116. )