Class: Openapi3Parser::Source

Inherits:
Object
  • Object
show all
Defined in:
lib/openapi3_parser/source.rb,
lib/openapi3_parser/source/reference.rb,
lib/openapi3_parser/source/reference_resolver.rb

Overview

Represents a source of data used to produce the OpenAPI document. Documents which do not have any references to external files will only have a single source

Defined Under Namespace

Classes: Reference, ReferenceResolver

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_input, document, reference_register, parent = nil) ⇒ Source

Returns a new instance of Source.

Parameters:



28
29
30
31
32
33
# File 'lib/openapi3_parser/source.rb', line 28

def initialize(source_input, document, reference_register, parent = nil)
  @source_input = source_input
  @document = document
  @reference_register = reference_register
  @parent = parent
end

Instance Attribute Details

#documentDocument (readonly)

The document that this source is associated with

Returns:

  • (Document)

    the current value of document



21
22
23
# File 'lib/openapi3_parser/source.rb', line 21

def document
  @document
end

#parentSource? (readonly)

Set to a Source if this source was created due to a reference within a different Source

Returns:

  • (Source, nil)

    the current value of parent



21
22
23
# File 'lib/openapi3_parser/source.rb', line 21

def parent
  @parent
end

#reference_registerDocument::ReferenceRegister (readonly)

An object to track references for a document

Returns:



21
22
23
# File 'lib/openapi3_parser/source.rb', line 21

def reference_register
  @reference_register
end

#source_inputSourceInput (readonly)

The source input which provides the data

Returns:



21
22
23
# File 'lib/openapi3_parser/source.rb', line 21

def source_input
  @source_input
end

Instance Method Details

#==(other) ⇒ Object



111
112
113
# File 'lib/openapi3_parser/source.rb', line 111

def ==(other)
  source_input == other.source_input && document == other.document
end

#available?Boolean

Returns:

  • (Boolean)

See Also:



41
42
43
# File 'lib/openapi3_parser/source.rb', line 41

def available?
  source_input.available?
end

#dataObject

The data from the source



36
37
38
# File 'lib/openapi3_parser/source.rb', line 36

def data
  @data ||= normalize_data(source_input.contents)
end

#data_at_pointer(json_pointer) ⇒ Object

Access the data in a source at a particular pointer

Parameters:

  • json_pointer (Array)

    An array of segments of a JSON pointer

Returns:

  • (Object)


95
96
97
98
# File 'lib/openapi3_parser/source.rb', line 95

def data_at_pointer(json_pointer)
  return data if json_pointer.empty?
  data.dig(*json_pointer) if data.respond_to?(:dig)
end

#has_pointer?(json_pointer) ⇒ Boolean

Whether the source has data at the particular pointer

Returns:

  • (Boolean)


101
102
103
# File 'lib/openapi3_parser/source.rb', line 101

def has_pointer?(json_pointer) # rubocop:disable Naming/PredicateName
  !data_at_pointer(json_pointer).nil?
end

#inspectObject

return [String]



116
117
118
# File 'lib/openapi3_parser/source.rb', line 116

def inspect
  %{#{self.class.name}(input: #{source_input})}
end

#register_reference(given_reference, factory, context) ⇒ ReferenceResolver

Used to register a reference with the underlying document and return a reference resolver to access the object referenced

Parameters:

  • given_reference (String)

    The reference as text

  • factory (NodeFactory)

    Factory class for the expected eventual resource

  • context (Context)

    The context of the object calling this reference

Returns:



59
60
61
62
63
64
65
66
67
# File 'lib/openapi3_parser/source.rb', line 59

def register_reference(given_reference, factory, context)
  reference = Reference.new(given_reference)
  ReferenceResolver.new(
    reference, factory, context
  ).tap do |resolver|
    next if resolver.in_root_source?
    reference_register.register(resolver.reference_factory)
  end
end

#relative_to_rootString

Returns:

  • (String)


106
107
108
109
# File 'lib/openapi3_parser/source.rb', line 106

def relative_to_root
  return "" if root?
  source_input.relative_to(document.root_source.source_input)
end

#resolve_source(reference) ⇒ Source

Access/create the source object for a reference

Parameters:

Returns:



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/openapi3_parser/source.rb', line 73

def resolve_source(reference)
  if reference.only_fragment?
    # I found the spec wasn't fully clear on expected behaviour if a source
    # references a fragment that doesn't exist in it's current document
    # and just the root source. I'm assuming to be consistent with URI a
    # fragment only reference only references current JSON document. This
    # could be incorrect though.
    self
  else
    next_source_input = source_input.resolve_next(reference)
    source = document.source_for_source_input(next_source_input)
    source || self.class.new(next_source_input,
                             document,
                             reference_register,
                             self)
  end
end

#root?Boolean

Whether this is the root source of a document

Returns:

  • (Boolean)


46
47
48
# File 'lib/openapi3_parser/source.rb', line 46

def root?
  document.root_source == self
end