schemavalidator.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # -*- coding: utf-8 -*-
  2. import ispformat.schema as _schema
  3. from jsonschema import Draft4Validator, RefResolver, draft4_format_checker
  4. from jsonschema.exceptions import RefResolutionError, SchemaError, ValidationError
  5. import json
  6. import os.path
  7. from urlparse import urlsplit
  8. class MyRefResolver(RefResolver):
  9. def resolve_remote(self, uri):
  10. # Prevent remote resolving
  11. raise RefResolutionError("LOL NOPE")
  12. def validate_isp(jdict):
  13. """
  14. Validate a json-object against the isp json-schema
  15. """
  16. if not 'version' in jdict:
  17. raise ValidationError(u'version is a required property')
  18. try:
  19. schema=_schema.versions.get(jdict['version'])
  20. except (AttributeError, TypeError):
  21. raise ValidationError(u'version %r unsupported'%jdict['version'])
  22. v=Draft4Validator(
  23. schema,
  24. resolver=MyRefResolver.from_schema(schema, store=_schema.deps_for_version(jdict['version'])),
  25. format_checker=draft4_format_checker,
  26. )
  27. for err in v.iter_errors(jdict):
  28. yield err
  29. def is_valid_url(u):
  30. try:
  31. pu=urlsplit(u)
  32. except:
  33. return False
  34. if pu.scheme not in ('', 'http', 'https'):
  35. return False
  36. if not pu.netloc:
  37. return False
  38. return True
  39. if 'website' in jdict and not is_valid_url(jdict['website']):
  40. yield ValidationError(u'%r must be an absolute HTTP URL'%u'website',
  41. instance=jdict[u'website'], schema=schema[u'properties'][u'website'],
  42. path=[u'website'], schema_path=[u'properties', u'website', u'description'],
  43. validator=u'validate_url', validator_value=jdict['website'])
  44. if 'logoURL' in jdict and not is_valid_url(jdict['logoURL']):
  45. yield ValidationError(u'%r must be an absolute HTTP URL'%u'logoURL',
  46. instance=jdict[u'logoURL'], schema=schema[u'properties'][u'logoURL'],
  47. path=[u'logoURL'], schema_path=[u'properties', u'logoURL', u'description'],
  48. validator=u'validate_url', validator_value=jdict['logoURL'])
  49. sch=schema[u'properties'][u'otherWebsites'][u'patternProperties'][u'^.+$']
  50. for name, url in jdict.get('otherWebsites', {}).iteritems():
  51. if is_valid_url(url):
  52. continue
  53. yield ValidationError(u'%r must be an absolute HTTP URL'%name,
  54. instance=url, schema=sch, path=[u'otherWebsite', name],
  55. schema_path=[u'properties', u'otherWebsites', u'patternProperties', u'^.+$', 'description'],
  56. validator=u'validate_url', validator_value=url)