Class: Openapi3Parser::Source

Inherits:
Object
  • Object
show all
Defined in:
lib/openapi3_parser/source.rb,
lib/openapi3_parser/source/pointer.rb,
lib/openapi3_parser/source/location.rb,
lib/openapi3_parser/source/reference.rb,
lib/openapi3_parser/source/resolved_reference.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: Location, Pointer, Reference, ResolvedReference

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Source.

Parameters:



24
25
26
27
28
29
# File 'lib/openapi3_parser/source.rb', line 24

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

Instance Attribute Details

#documentDocument (readonly)

The document that this source is associated with

Returns:

  • (Document)

    the current value of document



17
18
19
# File 'lib/openapi3_parser/source.rb', line 17

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



17
18
19
# File 'lib/openapi3_parser/source.rb', line 17

def parent
  @parent
end

#reference_registryDocument::ReferenceRegistry (readonly)

An object that tracks factories for all references

Returns:



17
18
19
# File 'lib/openapi3_parser/source.rb', line 17

def reference_registry
  @reference_registry
end

#source_inputSourceInput (readonly)

The source input which provides the data

Returns:



17
18
19
# File 'lib/openapi3_parser/source.rb', line 17

def source_input
  @source_input
end

Instance Method Details

#==(other) ⇒ Object



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

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

#available?Boolean

Returns:

  • (Boolean)

See Also:



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

def available?
  source_input.available?
end

#dataObject

The data from the source



32
33
34
# File 'lib/openapi3_parser/source.rb', line 32

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)


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

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]



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

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

#relative_to_rootString

Returns:

  • (String)


106
107
108
109
110
# 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_reference(given_reference, unbuilt_factory, context, recursive: false) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/openapi3_parser/source.rb', line 46

def resolve_reference(given_reference,
                      unbuilt_factory,
                      context,
                      recursive: false)
  reference = Reference.new(given_reference)
  resolved_source = resolve_source(reference)
  source_location = Source::Location.new(resolved_source,
                                         reference.json_pointer)

  unless recursive
    reference_registry.register(unbuilt_factory,
                                source_location,
                                context)
  end

  ResolvedReference.new(
    source_location:,
    object_type: unbuilt_factory.object_type,
    reference_registry:
  )
end

#resolve_source(reference) ⇒ Source

Access/create the source object for a reference

Parameters:

Returns:



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

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 references the 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_registry,
                             self)
  end
end

#root?Boolean

Whether this is the root source of a document

Returns:

  • (Boolean)


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

def root?
  document.root_source == self
end