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

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

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)

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

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)

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

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 should not be readed

  • (JSON::ParserError)

    if the schema was not a valid JSON object


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

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

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