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


51
52
53
54
# File 'lib/json-schema/schema/reader.rb', line 51

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)


85
86
87
88
89
90
91
# File 'lib/json-schema/schema/reader.rb', line 85

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)


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

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



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/json-schema/schema/reader.rb', line 61

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