Class: JSON::Schema::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/json-schema/schema/reader.rb

Overview

When an unregistered schema is encountered, the Reader is used to fetch its contents and register it with the Validator.

This default reader will read schemas from the filesystem or from a URI.

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Reader

The behavior of the schema reader can be controlled by providing callbacks to determine whether to permit reading referenced schemas. The options accept_uri and accept_file should be procs which accept a URI or Pathname object, and return a boolean value indicating whether to read the referenced schema.

URIs using the file scheme will be normalized into Pathname objects and passed to the accept_file callback.

Examples:

Reject all unregistered schemas

JSON::Validator.schema_reader = JSON::Schema::Reader.new(
  :accept_uri => false,
  :accept_file => false
)

Only permit URIs from certain hosts

JSON::Validator.schema_reader = JSON::Schema::Reader.new(
  :accept_file => false,
  :accept_uri => proc { |uri| ['mycompany.com', 'json-schema.org'].include?(uri.host) }
)

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • accept_uri (Boolean, #call) — default: true
  • accept_file (Boolean, #call) — default: true


75
76
77
78
# File 'lib/json-schema/schema/reader.rb', line 75

def initialize(options = {})
  @accept_uri = options.fetch(:accept_uri, true)
  @accept_file = options.fetch(:accept_file, true)
end

Instance Method Details

#accept_file?(pathname) ⇒ Boolean

Parameters:

  • pathname (Pathname)

Returns:

  • (Boolean)


111
112
113
114
115
116
117
# File 'lib/json-schema/schema/reader.rb', line 111

def accept_file?(pathname)
  if @accept_file.respond_to?(:call)
    @accept_file.call(pathname)
  else
    @accept_file
  end
end

#accept_uri?(uri) ⇒ Boolean

Parameters:

  • uri (Addressable::URI)

Returns:

  • (Boolean)


101
102
103
104
105
106
107
# File 'lib/json-schema/schema/reader.rb', line 101

def accept_uri?(uri)
  if @accept_uri.respond_to?(:call)
    @accept_uri.call(uri)
  else
    @accept_uri
  end
end

#read(location) ⇒ JSON::Schema

Parameters:

  • location (#to_s)

    The location from which to read the schema

Returns:

Raises:

  • (JSON::Schema::ReadRefused)

    if accept_uri or accept_file indicated the schema could not be read

  • (JSON::Schema::ParseError)

    if the schema was not a valid JSON object

  • (JSON::Schema::ReadFailed)

    if reading the location was acceptable but the attempt to retrieve it failed



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/json-schema/schema/reader.rb', line 87

def read(location)
  uri  = JSON::Util::URI.parse(location.to_s)
  body = if uri.scheme.nil? || uri.scheme == 'file'
           uri = JSON::Util::URI.file_uri(uri)
           read_file(Pathname.new(uri.path).expand_path)
         else
           read_uri(uri)
         end

  JSON::Schema.new(JSON::Validator.parse(body), uri)
end