Class: JSONSchemer::Schema::Base

Inherits:
Object
  • Object
show all
Includes:
Format
Defined in:
lib/json_schemer/schema/base.rb

Direct Known Subclasses

Draft4, Draft6, Draft7

Defined Under Namespace

Classes: Instance

Constant Summary collapse

ID_KEYWORD =
'$id'
DEFAULT_REF_RESOLVER =
proc { |uri| raise UnknownRef, uri.to_s }
NET_HTTP_REF_RESOLVER =
proc { |uri| JSON.parse(Net::HTTP.get(uri)) }
RUBY_REGEXP_RESOLVER =
proc { |pattern| Regexp.new(pattern) }
ECMA_REGEXP_RESOLVER =
proc { |pattern| Regexp.new(EcmaRegexp.ruby_equivalent(pattern)) }
BOOLEANS =
Set[true, false].freeze
INSERT_DEFAULT_PROPERTY =
proc do |data, property, property_schema, _parent|
  if !data.key?(property) && property_schema.is_a?(Hash) && property_schema.key?('default')
    data[property] = property_schema.fetch('default').clone
  end
end
JSON_POINTER_TOKEN_ESCAPE_CHARS =
{ '~' => '~0', '/' => '~1' }
JSON_POINTER_TOKEN_ESCAPE_REGEX =
Regexp.union(JSON_POINTER_TOKEN_ESCAPE_CHARS.keys)

Constants included from Format

Format::DATE_TIME_OFFSET_REGEX, Format::EMAIL_REGEX, Format::HOUR_24_REGEX, Format::INVALID_QUERY_REGEX, Format::IP_REGEX, Format::JSON_POINTER_REGEX, Format::JSON_POINTER_REGEX_STRING, Format::LEAP_SECOND_REGEX, Format::RELATIVE_JSON_POINTER_REGEX

Constants included from Format::URITemplate

Format::URITemplate::EXPLODE, Format::URITemplate::EXPRESSION, Format::URITemplate::LITERALS, Format::URITemplate::MAX_LENGTH, Format::URITemplate::MODIFIER_LEVEL4, Format::URITemplate::OPERATOR, Format::URITemplate::PCT_ENCODED, Format::URITemplate::PREFIX, Format::URITemplate::URI_TEMPLATE, Format::URITemplate::URI_TEMPLATE_REGEX, Format::URITemplate::VARCHAR, Format::URITemplate::VARIABLE_LIST, Format::URITemplate::VARNAME, Format::URITemplate::VARSPEC

Constants included from Format::Hostname

Format::Hostname::ARABIC_EXTENDED_DIGITS_REGEX, Format::Hostname::ARABIC_INDIC_DIGITS_REGEX, Format::Hostname::CONTEXT_REGEX, Format::Hostname::EXCEPTIONS_DISALLOWED, Format::Hostname::EXCEPTIONS_PVALID, Format::Hostname::GREEK_LOWER_NUMERAL_SIGN, Format::Hostname::HEBREW_PUNCTUATION, Format::Hostname::HOSTNAME_REGEX, Format::Hostname::JOINING_TYPE_D_CHARACTER_CLASS, Format::Hostname::JOINING_TYPE_L_CHARACTER_CLASS, Format::Hostname::JOINING_TYPE_R_CHARACTER_CLASS, Format::Hostname::JOINING_TYPE_T_CHARACTER_CLASS, Format::Hostname::KATAKANA_MIDDLE_DOT_CONTEXT_REGEX, Format::Hostname::KATAKANA_MIDDLE_DOT_REGEX, Format::Hostname::LABEL_CHARACTER_CLASS, Format::Hostname::LABEL_REGEX_STRING, Format::Hostname::LEADING_CHARACTER_CLASS, Format::Hostname::LETTER_DIGITS, Format::Hostname::MARKS, Format::Hostname::MIDDLE_DOT, Format::Hostname::VIRAMA_CHARACTER_CLASS, Format::Hostname::ZERO_WIDTH_NON_JOINER_JOINING_TYPE, Format::Hostname::ZERO_WIDTH_VIRAMA

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Format

#iri_escape, #parse_uri_scheme, #valid_date_time?, #valid_email?, #valid_ip?, #valid_json?, #valid_json_pointer?, #valid_regex?, #valid_relative_json_pointer?, #valid_spec_format?, #valid_uri?, #valid_uri_reference?

Methods included from Format::URITemplate

#valid_uri_template?

Methods included from Format::Hostname

#valid_hostname?

Constructor Details

#initialize(schema, base_uri: nil, format: true, insert_property_defaults: false, before_property_validation: nil, after_property_validation: nil, formats: nil, keywords: nil, ref_resolver: DEFAULT_REF_RESOLVER, regexp_resolver: 'ruby') ⇒ Base

Returns a new instance of Base.

Raises:



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/json_schemer/schema/base.rb', line 51

def initialize(
  schema,
  base_uri: nil,
  format: true,
  insert_property_defaults: false,
  before_property_validation: nil,
  after_property_validation: nil,
  formats: nil,
  keywords: nil,
  ref_resolver: DEFAULT_REF_RESOLVER,
  regexp_resolver: 'ruby'
)
  raise InvalidSymbolKey, 'schemas must use string keys' if schema.is_a?(Hash) && !schema.empty? && !schema.first.first.is_a?(String)
  @root = schema
  @base_uri = base_uri
  @format = format
  @before_property_validation = [*before_property_validation]
  @before_property_validation.unshift(INSERT_DEFAULT_PROPERTY) if insert_property_defaults
  @after_property_validation = [*after_property_validation]
  @formats = formats
  @keywords = keywords
  @ref_resolver = ref_resolver == 'net/http' ? CachedResolver.new(&NET_HTTP_REF_RESOLVER) : ref_resolver
  @regexp_resolver = case regexp_resolver
  when 'ecma'
    CachedResolver.new(&ECMA_REGEXP_RESOLVER)
  when 'ruby'
    CachedResolver.new(&RUBY_REGEXP_RESOLVER)
  else
    regexp_resolver
  end
end

Class Method Details

.draft_nameObject



38
39
40
# File 'lib/json_schemer/schema/base.rb', line 38

def draft_name
  name.split('::').last.downcase
end

.meta_schemaObject



42
43
44
# File 'lib/json_schemer/schema/base.rb', line 42

def meta_schema
  @meta_schema ||= JSON.parse(Pathname.new(__dir__).join("#{draft_name}.json").read).freeze
end

.meta_schemerObject



46
47
48
# File 'lib/json_schemer/schema/base.rb', line 46

def meta_schemer
  @meta_schemer ||= JSONSchemer.schema(meta_schema)
end

Instance Method Details

#valid?(data) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/json_schemer/schema/base.rb', line 83

def valid?(data)
  valid_instance?(Instance.new(data, '', root, '', @base_uri, @before_property_validation, @after_property_validation))
end

#valid_schema?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/json_schemer/schema/base.rb', line 91

def valid_schema?
  self.class.meta_schemer.valid?(root)
end

#validate(data) ⇒ Object



87
88
89
# File 'lib/json_schemer/schema/base.rb', line 87

def validate(data)
  validate_instance(Instance.new(data, '', root, '', @base_uri, @before_property_validation, @after_property_validation))
end

#validate_schemaObject



95
96
97
# File 'lib/json_schemer/schema/base.rb', line 95

def validate_schema
  self.class.meta_schemer.validate(root)
end