Python源码示例:jsonschema.FormatChecker()
示例1
def add(self, message):
if isinstance(message, singer.RecordMessage):
stream = self.ensure_stream(message.stream)
if stream.latest_schema:
validator_fn = extend_with_default(Draft4Validator)
validator = validator_fn(
stream.latest_schema, format_checker=FormatChecker())
validator.validate(copy.deepcopy(message.record))
else:
print('I saw a record for stream {} before the schema'.format(
message.stream))
exit(1)
stream.num_records += 1
elif isinstance(message, singer.SchemaMessage):
stream = self.ensure_stream(message.stream)
stream.num_schemas += 1
stream.latest_schema = message.schema
elif isinstance(message, singer.StateMessage):
self.latest_state = message.value
self.num_states += 1
示例2
def validate_host_mapping(host_mapping):
"""
Validate a provided host mapping.
:param dict host_mapping: The parsed JSON host mapping from the
environment variable ``FLOCKER_ACCEPTANCE_HOSTNAME_TO_PUBLIC_ADDRESS``.
:raises: jsonschema.ValidationError if the configuration is invalid.
"""
schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"additionalProperties": "true",
}
v = Draft4Validator(schema, format_checker=FormatChecker())
v.validate(host_mapping)
示例3
def validate(self, json_object):
results = ValidationResults()
if "$schemaRef" not in json_object:
results.add(ValidationSeverity.FATAL, JsonValidationException("No $schemaRef found, unable to validate."))
return results
schemaRef = json_object["$schemaRef"]
if schemaRef not in self.schemas.keys():
# We don't want to go out to the Internet and retrieve unknown schemas.
results.add(ValidationSeverity.FATAL, JsonValidationException("Schema " + schemaRef + " is unknown, unable to validate."))
return results
schema = self.schemas[schemaRef]
try:
jsValidate(json_object, schema, format_checker=FormatChecker())
except ValidationError as e:
results.add(ValidationSeverity.ERROR, e)
return results
示例4
def validate_json(value, schema):
v = Draft4Validator(schema, format_checker=FormatChecker())
errors = sorted(v.iter_errors(value), key=lambda e: e.path)
message_dict = {}
for e in errors:
if e.validator == 'anyOf':
fields = [
f.message.split(' ')[0].replace('\'', '') for f in e.context
]
for f in fields:
message_dict[f] = _("Please provide either {}").format(
_(" or ").join(fields))
elif e.validator == 'required':
field = e.message.split(' ')[0].replace('\'', '')
message_dict[field] = _("This field is required.")
else:
field = '.'.join([str(el) for el in e.path])
message_dict[field] = e.message
if message_dict:
raise JsonValidationError(message_dict)
示例5
def validate_json(json_obj):
with open(SCHEMA_PATH) as s:
json_schema = json.load(s)
# first validate schema file
v = jsonschema.Draft4Validator(json_schema)
# now validate json file
try:
jsonschema.validate(json_obj, json_schema, format_checker=jsonschema.FormatChecker())
logger.info('The file is valid. Validation passed.')
return True
except jsonschema.exceptions.ValidationError:
errors = [e for e in v.iter_errors((json_obj))]
logger.info(f"The file is not valid. Total errors: {len(errors)}")
for i, error in enumerate(errors, 1):
logger.error(f"{i} Validation error in {'.'.join(str(v) for v in error.path)}: {error.message}")
logger.info('Validation failed.')
return False
示例6
def validate_JSON(data,combined_schema):
for keys in combined_schema['properties']:
if "$ref" in (combined_schema['properties'])[keys]:
refUrl= ((combined_schema['properties'])[keys])['$ref']
references_file, section = refUrl.split('#')
if not os.path.isfile(references_file):
print "References file does not exists"
sys.exit()
schema_dir = os.path.dirname(os.path.realpath(references_file))
resolver = RefResolver("file://{}/".format(schema_dir), None)
try:
validate(data,combined_schema,format_checker=FormatChecker(), resolver=resolver)
print "JSON is valid with the schema"
return True
except exceptions.ValidationError as error:
print(error.message)
return False
#Merging schemas and putting key translations
示例7
def full_validate(
schema: RawSchema, raw_items: RawItems, keys: pd.Index
) -> Dict[str, set]:
"""This function uses jsonschema validator which returns all found error per item.
See `fast_validate()` for arguments descriptions.
"""
errors: DefaultDict = defaultdict(set)
validator = validators.validator_for(schema)(schema)
validator.format_checker = FormatChecker()
for i, raw_item in enumerate(tqdm(raw_items, desc="JSON Schema Validation")):
raw_item.pop("_type", None)
raw_item.pop("_key", None)
for e in validator.iter_errors(raw_item):
error = format_validation_message(
e.message, e.path, e.schema_path, e.validator
)
errors[error].add(keys[i])
return dict(errors)
示例8
def _validate_create_body(self, body):
schedule = body.get("schedule")
if schedule is None:
raise exception.InvalidInput(
"schedule is required")
schedule = self._validate_schedule(schedule)
schemas.validate_value(
body, schemas.SCHEDULE_API_BODY_SCHEMA,
format_checker=jsonschema.FormatChecker())
enabled = body.get("enabled", True)
exp = body.get("expiration_date", None)
if exp is not None:
exp = self._validate_expiration_date(exp)
shutdown = body.get("shutdown_instance", False)
return (schedule, enabled, exp, shutdown)
示例9
def _validate_update_body(self, update_body):
body = {}
schedule = update_body.get("schedule")
if schedule is not None:
schedule = self._validate_schedule(schedule)
body["schedule"] = schedule
enabled = update_body.get("enabled")
if enabled is not None:
body["enabled"] = enabled
shutdown = update_body.get("shutdown_instance")
if shutdown is not None:
body["shutdown_instance"] = shutdown
schemas.validate_value(
body, schemas.SCHEDULE_API_BODY_SCHEMA,
format_checker=jsonschema.FormatChecker())
exp = None
if "expiration_date" in update_body:
exp = self._validate_expiration_date(
update_body.get("expiration_date"))
body["expiration_date"] = exp
return body
示例10
def validate(self, data=None):
if not data:
data = self.config_dict
schema_dir = "/usr/share/contrailctl/schema/"
schema_path="{}/{}.json".format(schema_dir, self.component)
resolver = RefResolver("file://{}/".format(schema_dir), None)
try:
schema=open(schema_path,'r').read()
except IOError as error:
print("Schema file is missing - {}".format(schema_path))
return True
try:
validate(data, json.loads(schema), format_checker=FormatChecker(), resolver=resolver)
return True
except exceptions.ValidationError as error:
print(error.message)
return False
示例11
def require_schema(schema):
"""This decorator verifies that request JSON matches given JSONSchema.
http://json-schema.org
"""
validator = jsonschema.Draft4Validator(
schema,
format_checker=jsonschema.FormatChecker()
)
def outer_decorator(func):
@functools.wraps(func)
def inner_decorator(self, *args, **kwargs):
errors = validator.iter_errors(self.request_json)
errors = [err.message for err in errors]
if errors:
LOG.warning("Cannot validate request: %s", errors)
raise exceptions.InvalidJSONError(errors)
return func(self, *args, **kwargs)
return inner_decorator
return outer_decorator
示例12
def __init__(self, schema, is_body=True):
self.is_body = is_body
validators = {
'minimum': self._validate_minimum,
'maximum': self._validate_maximum
}
validator_cls = jsonschema.validators.extend(self.validator_org,
validators)
fc = jsonschema.FormatChecker()
self.validator = validator_cls(schema, format_checker=fc)
示例13
def is_valid_json(data, schema):
checker = FormatChecker()
# add the "interval" format
checker.checks("interval")(parse_iso8601_interval)
validator = Draft4Validator(schema, format_checker=checker)
errors = []
for error in validator.iter_errors(data):
errors.append(error.message)
return errors
示例14
def _assert_schema(self, schema, reality):
try:
validate(reality, schema, format_checker=FormatChecker())
except SchemaError as e:
raise RuntimeError(e)
except ValidationError as e:
raise AssertionError(e)
示例15
def validate_cluster_configuration(cluster_config):
"""
Validate a provided cluster configuration.
:param dict cluster_config: The cluster configuration.
:raises: jsonschema.ValidationError if the configuration is invalid.
"""
schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": ["control_node", "agent_nodes"],
"properties": {
"control_node": {
"type": "string",
},
"agent_nodes": {
"type": "array",
"items": {
"type": "object",
"required": ["public", "private"],
"properties": {
"public": {
"type": "string"
},
"private": {
"type": "string"
},
},
},
},
},
"additionalProperties": "true",
}
v = Draft4Validator(schema, format_checker=FormatChecker())
v.validate(cluster_config)
示例16
def validate(self, descriptor):
# Other profiles
if self.name != 'table-schema':
return jsonschema.validate(descriptor, self.jsonschema)
# Collect errors
errors = []
validator = _TableSchemaValidator(
self.jsonschema, format_checker=jsonschema.FormatChecker())
for error in validator.iter_errors(descriptor):
if isinstance(error, jsonschema.exceptions.ValidationError):
message = str(error.message)
if six.PY2:
message = message.replace('u\'', '\'')
descriptor_path = '/'.join(map(str, error.path))
profile_path = '/'.join(map(str, error.schema_path))
error = exceptions.ValidationError(
'Descriptor validation error: %s '
'at "%s" in descriptor and '
'at "%s" in profile'
% (message, descriptor_path, profile_path))
errors.append(error)
# Railse error
if errors:
message = 'There are %s validation errors (see exception.errors)' % len(errors)
raise exceptions.ValidationError(message, errors=errors)
return True
# Internal
示例17
def validate_json(instance, schema):
"""Validate a dictionary using the provided json schema."""
Validator(schema, format_checker=FormatChecker()).validate(instance)
示例18
def test_valid(filename, schema):
errors = 0
with open(filename) as f:
data = json.load(f)
for error in validator(schema, format_checker=FormatChecker()).iter_errors(data):
errors += 1
warnings.warn(json.dumps(error.instance, indent=2, separators=(',', ': ')))
warnings.warn('{} ({})\n'.format(error.message, '/'.join(error.absolute_schema_path)))
assert errors == 0, '{} is invalid. See warnings below.'.format(filename)
示例19
def handle_batch(self, messages, contains_activate_version, schema, key_names, bookmark_names=None, state_writer=None, state=None): # pylint: disable=no-self-use,unused-argument
'''Handles messages by validating them against schema.'''
LOGGER.info("ValidatingHandler handle_batch")
validator = Draft4Validator(schema, format_checker=FormatChecker())
for i, message in enumerate(messages):
if isinstance(message, singer.RecordMessage):
try:
validator.validate(message.record)
if key_names:
for k in key_names:
if k not in message.record:
raise TargetStitchException(
'Message {} is missing key property {}'.format(
i, k))
except Exception as e:
raise TargetStitchException(
'Record does not pass schema validation: {}'.format(e))
# pylint: disable=undefined-loop-variable
# NB: This seems incorrect as there's a chance message is not defined
LOGGER.info('%s (%s): Batch is valid',
messages[0].stream,
len(messages))
if state:
line = simplejson.dumps(state)
state_writer.write("{}\n".format(line))
state_writer.flush()
示例20
def validate_v0(json_to_validate, schema_filename):
schema_dir = os.path.join(os.path.dirname(__file__), 'schemas/v0')
resolver = jsonschema.RefResolver('file://' + schema_dir + '/', None)
with open(os.path.join(schema_dir, schema_filename)) as schema:
jsonschema.validate(
json_to_validate,
json.load(schema),
format_checker=jsonschema.FormatChecker(),
resolver=resolver
)
示例21
def validate_against_schema(j, js):
isValid = True
es = []
#-- lazy validation to catch as many as possible
myvalidator = jsonschema.Draft4Validator(js, format_checker=jsonschema.FormatChecker())
for err in sorted(myvalidator.iter_errors(j), key=str):
isValid = False
es.append(err.message)
return (isValid, es)
# try:
# jsonschema.Draft4Validator(js, format_checker=jsonschema.FormatChecker()).validate(j)
# except jsonschema.ValidationError as e:
# raise Exception(e.message)
# return False
# except jsonschema.SchemaError as e:
# raise Exception(e.message)
# return False
# try:
# jsonschema.validate(j, js, format_checker=jsonschema.FormatChecker())
# except jsonschema.ValidationError as e:
# raise Exception(e.message)
# return False
# except jsonschema.SchemaError as e:
# raise Exception(e.message)
# return False
示例22
def validate_schema(file_path, file_type):
"""Check if the specified config file has a valid schema
:param file_path: path to file to validate
:param file_type: what schema type should we validate against
"""
try:
schema = get_schema(file_type)
except Exception as e:
print(f"{SCHEMA_ERROR}: {file_type}, error: {e!r}")
return
if schema is None:
print(f"{SCHEMA_NOT_FOUND}: {file_path}")
return
validator = Draft4Validator(schema, format_checker=FormatChecker())
basename = os.path.basename(file_path)
config_file_object = get_config_file_dict(file_path)
try:
validator.validate(config_file_object)
if file_type == "kubernetes" and not validate_instance_names(
config_file_object, file_path
):
return
except ValidationError:
print(f"{SCHEMA_INVALID}: {file_path}")
errors = validator.iter_errors(config_file_object)
print(" Validation Message: %s" % exceptions.best_match(errors).message)
except Exception as e:
print(f"{SCHEMA_ERROR}: {file_type}, error: {e!r}")
return
else:
print(f"{SCHEMA_VALID}: {basename}")
return True
示例23
def validate(value, schema):
"""Collect all errors during validation"""
validator = Draft4WithDefaults(schema, format_checker=FormatChecker())
errs = sorted(validator.iter_errors(value), key=lambda e: e.path)
errs = ['%s: %s' % (list(e.schema_path), e.message) for e in errs]
if errs:
raise Error(errs, schema)
return value
示例24
def update_schema(self, schema, key_properties):
# In order to determine whether a value _is in_ properties _or not_ we need to flatten `$ref`s etc.
self.schema = json_schema.simplify(schema)
self.key_properties = deepcopy(key_properties)
# The validator can handle _many_ more things than our simplified schema, and is, in general handled by third party code
self.validator = Draft4Validator(schema, format_checker=FormatChecker())
properties = self.schema['properties']
if singer.RECEIVED_AT not in properties:
properties[singer.RECEIVED_AT] = {
'type': ['null', 'string'],
'format': 'date-time'
}
if singer.SEQUENCE not in properties:
properties[singer.SEQUENCE] = {
'type': ['null', 'integer']
}
if singer.TABLE_VERSION not in properties:
properties[singer.TABLE_VERSION] = {
'type': ['null', 'integer']
}
if singer.BATCHED_AT not in properties:
properties[singer.BATCHED_AT] = {
'type': ['null', 'string'],
'format': 'date-time'
}
if len(self.key_properties) == 0:
self.use_uuid_pk = True
self.key_properties = [singer.PK]
properties[singer.PK] = {
'type': ['string']
}
else:
self.use_uuid_pk = False
示例25
def validate_config_schema(self):
"""Config schema validation
Exception:
If schema validation fails
"""
schema = SchemaDefinition.get_schema(ordered=True)
try:
validate(
self.config, schema, format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as error:
if error.cause is None:
path = None
for index, element in enumerate(error.path):
if isinstance(element, int):
path += '[{}]'.format(element)
else:
if index == 0:
path = '{}'.format(element)
else:
path += '.{}'.format(element)
exc = 'Schema validation failed - {} - {}'.format(
path, str(error))
else:
exc = 'Schema validation failed - {} - {}'.format(
error.cause, str(error))
if 'Additional properties are not allowed' in str(error):
raise UserException(exc)
else:
raise UserCriticalException(exc)
示例26
def __init__(self, schema, relax_additional_properties=False):
validators = {
'minimum': self._validate_minimum,
'maximum': self._validate_maximum,
}
if relax_additional_properties:
validators[
'additionalProperties'] = _soft_validate_additional_properties
validator_cls = jsonschema.validators.extend(self.validator_org,
validators)
format_checker = FormatChecker()
self.validator = validator_cls(schema, format_checker=format_checker)
示例27
def __init__(
self,
validator_class,
schema_factory,
module,
resolver=None,
format_checker=None,
):
self.schema_factory = schema_factory
self.validator_class = validator_class
self.resolver = resolver
self.format_checker = format_checker or FormatChecker()
self.module = module
示例28
def __init__(
self, app=None, config=None, sanitizer=None, template=None,
template_file=None, decorators=None, validation_function=None,
validation_error_handler=None, parse=False, format_checker=None,
merge=False
):
self._configured = False
self.endpoints = []
self.definition_models = [] # not in app, so track here
self.sanitizer = sanitizer or BR_SANITIZER
self._init_config(config, merge)
self.template = template
self.template_file = template_file
self.decorators = decorators
self.format_checker = format_checker or jsonschema.FormatChecker()
def default_validation_function(data, schema):
return jsonschema.validate(
data, schema, format_checker=self.format_checker,
)
def default_error_handler(e, _, __):
return abort(400, e.message)
self.validation_function = validation_function\
or default_validation_function
self.validation_error_handler = validation_error_handler\
or default_error_handler
self.apispecs = {} # cached apispecs
self.parse = parse
if app:
self.init_app(app)
示例29
def __init__(self, schema):
validator_cls = jsonschema.validators.extend(self.validator_org,
validators={})
format_checker = FormatChecker()
self.validator = validator_cls(schema, format_checker=format_checker)
示例30
def test_format(instance, format_value):
with pytest.raises(ValidationError) as excinfo:
validate(instance, {"format": format_value}, format_checker=FormatChecker())
assert f"'{instance}' is not a '{format_value}'" in str(excinfo.value)