openapi3_parser 0.6.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +23 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +18 -3
- data/.ruby-version +1 -1
- data/CHANGELOG.md +41 -0
- data/README.md +7 -4
- data/TODO.md +1 -1
- data/lib/openapi3_parser.rb +2 -3
- data/lib/openapi3_parser/array_sentence.rb +2 -1
- data/lib/openapi3_parser/document.rb +3 -2
- data/lib/openapi3_parser/error.rb +11 -1
- data/lib/openapi3_parser/node/array.rb +9 -1
- data/lib/openapi3_parser/node/context.rb +34 -4
- data/lib/openapi3_parser/node/map.rb +17 -1
- data/lib/openapi3_parser/node/object.rb +17 -0
- data/lib/openapi3_parser/node/operation.rb +8 -0
- data/lib/openapi3_parser/node/path_item.rb +8 -0
- data/lib/openapi3_parser/node/placeholder.rb +16 -12
- data/lib/openapi3_parser/node/schema.rb +50 -3
- data/lib/openapi3_parser/node_factory.rb +1 -1
- data/lib/openapi3_parser/node_factory/array.rb +34 -26
- data/lib/openapi3_parser/node_factory/context.rb +9 -2
- data/lib/openapi3_parser/node_factory/discriminator.rb +2 -0
- data/lib/openapi3_parser/node_factory/field.rb +2 -0
- data/lib/openapi3_parser/node_factory/fields/reference.rb +1 -0
- data/lib/openapi3_parser/node_factory/map.rb +12 -10
- data/lib/openapi3_parser/node_factory/media_type.rb +1 -0
- data/lib/openapi3_parser/node_factory/object.rb +4 -1
- data/lib/openapi3_parser/node_factory/object_factory/dsl.rb +7 -5
- data/lib/openapi3_parser/node_factory/object_factory/field_config.rb +9 -7
- data/lib/openapi3_parser/node_factory/object_factory/node_builder.rb +12 -13
- data/lib/openapi3_parser/node_factory/object_factory/validator.rb +25 -21
- data/lib/openapi3_parser/node_factory/openapi.rb +2 -0
- data/lib/openapi3_parser/node_factory/operation.rb +9 -0
- data/lib/openapi3_parser/node_factory/parameter.rb +2 -0
- data/lib/openapi3_parser/node_factory/parameter_like.rb +2 -1
- data/lib/openapi3_parser/node_factory/path_item.rb +27 -5
- data/lib/openapi3_parser/node_factory/paths.rb +1 -1
- data/lib/openapi3_parser/node_factory/reference.rb +9 -1
- data/lib/openapi3_parser/node_factory/request_body.rb +2 -4
- data/lib/openapi3_parser/node_factory/response.rb +1 -0
- data/lib/openapi3_parser/node_factory/responses.rb +1 -1
- data/lib/openapi3_parser/node_factory/schema.rb +5 -2
- data/lib/openapi3_parser/node_factory/server_variable.rb +1 -0
- data/lib/openapi3_parser/node_factory/type_checker.rb +6 -0
- data/lib/openapi3_parser/source.rb +2 -0
- data/lib/openapi3_parser/source/location.rb +6 -0
- data/lib/openapi3_parser/source/pointer.rb +9 -4
- data/lib/openapi3_parser/source_input.rb +9 -9
- data/lib/openapi3_parser/source_input/file.rb +3 -1
- data/lib/openapi3_parser/source_input/raw.rb +4 -1
- data/lib/openapi3_parser/source_input/resolve_next.rb +1 -0
- data/lib/openapi3_parser/source_input/string_parser.rb +3 -2
- data/lib/openapi3_parser/source_input/url.rb +3 -1
- data/lib/openapi3_parser/validation/error.rb +2 -0
- data/lib/openapi3_parser/validation/error_collection.rb +1 -1
- data/lib/openapi3_parser/validation/input_validator.rb +1 -1
- data/lib/openapi3_parser/validators/component_keys.rb +1 -1
- data/lib/openapi3_parser/validators/duplicate_parameters.rb +1 -0
- data/lib/openapi3_parser/validators/email.rb +3 -3
- data/lib/openapi3_parser/validators/media_type.rb +1 -1
- data/lib/openapi3_parser/validators/mutually_exclusive_fields.rb +8 -8
- data/lib/openapi3_parser/validators/reference.rb +2 -0
- data/lib/openapi3_parser/validators/required_fields.rb +2 -2
- data/lib/openapi3_parser/validators/unexpected_fields.rb +3 -2
- data/lib/openapi3_parser/validators/url.rb +2 -7
- data/lib/openapi3_parser/version.rb +1 -1
- data/openapi3_parser.gemspec +12 -8
- metadata +81 -25
- data/.travis.yml +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 81001258de6af8c21c8a7db87520d9433e3acb878483a56a616fdcd804e92848
|
4
|
+
data.tar.gz: 496f3a02ebcb386e949eab7ec6607f360a0b2e755be6bb4f1df3cd6b260a6e0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d789d4ffe423f8854f961e902ffa6ef56b86d7dbcf506292106afa8548b72f2fbe968d98358ea7c80771a3c2e974c302096d43968c0663bdad40dc5f60a676e2
|
7
|
+
data.tar.gz: aea92fa77fbb4808872093b9149f8eb933f70a38336a0e415fa1fc9d4c15e691b8307abb0d70c0e51eee8eca89887cbc1a16b21e70f2d1812ae0fd77b75fe2a3
|
@@ -0,0 +1,23 @@
|
|
1
|
+
on: [push, pull_request]
|
2
|
+
jobs:
|
3
|
+
test:
|
4
|
+
strategy:
|
5
|
+
matrix:
|
6
|
+
ruby: [2.5, 2.6, 2.7, 3.0]
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- uses: ruby/setup-ruby@v1
|
11
|
+
with:
|
12
|
+
bundler-cache: true
|
13
|
+
ruby-version: ${{ matrix.ruby }}
|
14
|
+
- name: Test Ruby ${{ matrix.ruby }}
|
15
|
+
run: bundle exec rake
|
16
|
+
if: matrix.ruby != '2.5'
|
17
|
+
- name: Test and publish coverage for Ruby ${{ matrix.ruby }}
|
18
|
+
uses: paambaati/codeclimate-action@v2.7.5
|
19
|
+
env:
|
20
|
+
CC_TEST_REPORTER_ID: 8bc2d8e54331569aeb442094c21cb64a58d6efa0670f65ff00d9ae887f63c0b4
|
21
|
+
with:
|
22
|
+
coverageCommand: bundle exec rake
|
23
|
+
if: matrix.ruby == '2.5'
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,15 +1,30 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rake
|
3
|
+
- rubocop-rspec
|
4
|
+
AllCops:
|
5
|
+
NewCops: enable
|
1
6
|
Style/StringLiterals:
|
2
7
|
EnforcedStyle: double_quotes
|
3
8
|
Metrics/MethodLength:
|
4
9
|
Max: 30
|
5
10
|
Metrics/AbcSize:
|
6
11
|
Max: 30
|
7
|
-
|
12
|
+
RSpec/ExampleLength:
|
13
|
+
Max: 30
|
14
|
+
Style/Documentation:
|
8
15
|
Enabled: false
|
9
16
|
Metrics/BlockLength:
|
10
17
|
Exclude:
|
11
18
|
- 'spec/**/*.rb'
|
12
|
-
|
19
|
+
- '*.gemspec'
|
20
|
+
RSpec/DescribeClass:
|
21
|
+
Exclude:
|
22
|
+
- 'spec/integration/**/*.rb'
|
23
|
+
# I'd rather have multiple expectations than lots of duplicate tests
|
24
|
+
RSpec/MultipleExpectations:
|
25
|
+
Enabled: false
|
26
|
+
# The default arbitrary number (5) is a little painful
|
27
|
+
RSpec/MultipleMemoizedHelpers:
|
13
28
|
Enabled: false
|
14
|
-
|
29
|
+
RSpec/MessageSpies:
|
15
30
|
Enabled: false
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.8
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
# 0.9.0
|
2
|
+
|
3
|
+
- Fix unexpected fields error when using Example nodes inside a Parameter -
|
4
|
+
https://github.com/kevindew/openapi3_parser/pull/19
|
5
|
+
- Drop support for Ruby 2.4
|
6
|
+
|
7
|
+
# 0.8.2
|
8
|
+
|
9
|
+
- Fix bug falling into recursive loop on Array/Map nodes -
|
10
|
+
https://github.com/kevindew/openapi3_parser/issues/13
|
11
|
+
|
12
|
+
# 0.8.1
|
13
|
+
|
14
|
+
- Fix incorrectly spelt method name on `Schema` s/disciminator/discriminator/g
|
15
|
+
|
16
|
+
# 0.8.0
|
17
|
+
|
18
|
+
- Resolve deprecation warnings for Ruby 2.7
|
19
|
+
- Resolve deprecation warnings for Psych
|
20
|
+
- Operation and Path Item objects use servers that have cascaded from parent
|
21
|
+
objects if they do not have their own servers defined.
|
22
|
+
- Add `#relative_node` and `#parent_node` methods to `Node::Context`.
|
23
|
+
- Default to a server of "/" when given an empty or null servers input for
|
24
|
+
OpenAPI node.
|
25
|
+
- Set referenced data as input and source location for a PathItem with only
|
26
|
+
a $ref value.
|
27
|
+
- Fix data being lost in PathItem reference merges.
|
28
|
+
|
29
|
+
# 0.7.0
|
30
|
+
|
31
|
+
- Add `#values` method to `Node::Object` and `Node#Map` to have a method that
|
32
|
+
pairs with `#keys`
|
33
|
+
- Add `Node::Schema#requires?` method to simplify checking whether a property
|
34
|
+
is required by a particular schema.
|
35
|
+
- Add `#==` methods to Node objects. This allows checking whether two nodes
|
36
|
+
are from the same source location even if they're referenced in different
|
37
|
+
places.
|
38
|
+
- Add `Node::Schema#name` method that looks up the name of a Schema based
|
39
|
+
on it's contextual position in a document. Allows accessing the `Pet` value
|
40
|
+
from `#/components/schemas/Pet`.
|
41
|
+
|
1
42
|
# 0.6.1
|
2
43
|
|
3
44
|
- Fix bug where Node::Object and Node::Map iterated arrays rather than hashes
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# OpenAPI 3 Parser
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/kevindew/openapi3_parser.svg?branch=
|
3
|
+
[![Build Status](https://travis-ci.org/kevindew/openapi3_parser.svg?branch=main)](https://travis-ci.org/kevindew/openapi3_parser)
|
4
4
|
|
5
5
|
This a Ruby based parser/validator for [OpenAPI 3][openapi-3]. It is used to
|
6
6
|
convert an OpenAPI file (can be a local file, a URL, a string or even a Ruby
|
@@ -33,10 +33,13 @@ being:
|
|
33
33
|
- Documentation for the API to navigate the OpenAPI nodes is available on
|
34
34
|
[rubydoc.info][docs].
|
35
35
|
|
36
|
+
I've wrote a blog post reflecting on the decisions involved in building this
|
37
|
+
parser in [How to write an OpenAPI 3 parser][blog].
|
36
38
|
|
37
39
|
[openapi-3]: https://github.com/OAI/OpenAPI-Specification
|
38
40
|
[openapi-3-spec]: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#specification
|
39
41
|
[docs]: http://www.rubydoc.info/github/kevindew/openapi3_parser/Openapi3Parser/Node/Openapi
|
42
|
+
[blog]: https://kevindew.me/post/188611423231/how-to-write-an-openapi-3-parser
|
40
43
|
|
41
44
|
## Usage
|
42
45
|
|
@@ -44,7 +47,7 @@ being:
|
|
44
47
|
|
45
48
|
```ruby
|
46
49
|
# by URL
|
47
|
-
Openapi3Parser.load_url("https://raw.githubusercontent.com/kevindew/openapi3_parser/
|
50
|
+
Openapi3Parser.load_url("https://raw.githubusercontent.com/kevindew/openapi3_parser/main/spec/support/examples/petstore-expanded.yaml")
|
48
51
|
|
49
52
|
# by path to file
|
50
53
|
Openapi3Parser.load_file("spec/support/examples/uber.yaml")
|
@@ -73,7 +76,7 @@ document.errors
|
|
73
76
|
### Traversing
|
74
77
|
|
75
78
|
```ruby
|
76
|
-
document = Openapi3Parser.load_url("https://raw.githubusercontent.com/kevindew/openapi3_parser/
|
79
|
+
document = Openapi3Parser.load_url("https://raw.githubusercontent.com/kevindew/openapi3_parser/main/spec/support/examples/petstore-expanded.yaml")
|
77
80
|
|
78
81
|
# by objects
|
79
82
|
|
@@ -118,7 +121,7 @@ You can install this gem into your bundler application by adding this line to
|
|
118
121
|
your Gemfile:
|
119
122
|
|
120
123
|
```
|
121
|
-
gem "openapi3_parser", "~> 0.
|
124
|
+
gem "openapi3_parser", "~> 0.8.0"
|
122
125
|
```
|
123
126
|
|
124
127
|
and then running `$ bundle install`
|
data/TODO.md
CHANGED
@@ -32,7 +32,7 @@ These are the steps defined to reach 1.0. Assistance is very welcome.
|
|
32
32
|
- [x] Ensure Array and Map nodes return empty ones by default rather than nil
|
33
33
|
- [ ] Make JSON pointer public access to be consistent accepting string, array
|
34
34
|
or (potentially) a pointer class
|
35
|
-
- [
|
35
|
+
- [x] Support creating a default Server object on servers property of OpenAPI
|
36
36
|
Node
|
37
37
|
- [ ] Support relative URLs being able to be relative the first server object
|
38
38
|
see: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#relative-references-in-urls
|
data/lib/openapi3_parser.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Dir.glob(File.join(__dir__, "openapi3_parser", "**", "*.rb")).
|
4
|
-
|
5
|
-
end
|
3
|
+
files = Dir.glob(File.join(__dir__, "openapi3_parser", "**", "*.rb")).sort
|
4
|
+
files.each { |file| require file }
|
6
5
|
|
7
6
|
module Openapi3Parser
|
8
7
|
# For a variety of inputs this will construct an OpenAPI document. For a
|
@@ -60,7 +60,7 @@ module Openapi3Parser
|
|
60
60
|
# @!method external_docs
|
61
61
|
# The value of the external_docs field on the OpenAPI document
|
62
62
|
# @see Node::Openapi#external_docs
|
63
|
-
# @return [Node::ExternalDocumentation]
|
63
|
+
# @return [Node::ExternalDocumentation, nil]
|
64
64
|
# @!method extension
|
65
65
|
# Look up an extension field provided for the root object of the document
|
66
66
|
# @see Node::Object#extension
|
@@ -138,7 +138,7 @@ module Openapi3Parser
|
|
138
138
|
look_up_pointer(pointer, relative_to, factory.resolved_input)
|
139
139
|
end
|
140
140
|
|
141
|
-
# Look up a node at a particular location in the OpenAPI
|
141
|
+
# Look up a node at a particular location in the OpenAPI document
|
142
142
|
#
|
143
143
|
# Examples:
|
144
144
|
#
|
@@ -174,6 +174,7 @@ module Openapi3Parser
|
|
174
174
|
|
175
175
|
def build
|
176
176
|
return if build_in_progress || built
|
177
|
+
|
177
178
|
@build_in_progress = true
|
178
179
|
context = NodeFactory::Context.root(root_source.data, root_source)
|
179
180
|
@factory = NodeFactory::Openapi.new(context)
|
@@ -7,32 +7,42 @@ module Openapi3Parser
|
|
7
7
|
# at runtime when we have tried to access that resource it is not available
|
8
8
|
# for whatever reason.
|
9
9
|
class InaccessibleInput < Error; end
|
10
|
+
|
10
11
|
# Raised in cases where we provided data that we expected to be parsable
|
11
12
|
# (such as a string of JSON data) but when we tried to parse it an error
|
12
13
|
# is raised
|
13
14
|
class UnparsableInput < Error; end
|
15
|
+
|
14
16
|
# Raised in cases where an object that is in an immutable state is modified
|
15
17
|
#
|
16
18
|
# Typically this would occur when a component that is frozen is modififed.
|
17
19
|
# Some components are mutable during the construction of a document and
|
18
20
|
# then frozen afterwards.
|
19
21
|
class ImmutableObject < Error; end
|
20
|
-
|
22
|
+
|
23
|
+
# Raised when a node is provided data as a type that is outside the allowed
|
24
|
+
# list
|
21
25
|
class InvalidType < Error; end
|
26
|
+
|
22
27
|
# Raised when we have to abort creating an object due to invalid data
|
23
28
|
class InvalidData < Error; end
|
29
|
+
|
24
30
|
# Used when there are fields that are missing from an object which prevents
|
25
31
|
# us from creating a node
|
26
32
|
class MissingFields < Error; end
|
33
|
+
|
27
34
|
# Used when there are extra fields that are not expected in the data for
|
28
35
|
# a node
|
29
36
|
class UnexpectedFields < Error; end
|
37
|
+
|
30
38
|
# Used when a method we expect to be able to call (through symbol or proc)
|
31
39
|
# is not callable
|
32
40
|
class NotCallable < Error; end
|
41
|
+
|
33
42
|
# Raised when we in a recursive data structure and can't perform an
|
34
43
|
# operation
|
35
44
|
class InRecursiveStructure < Error; end
|
45
|
+
|
36
46
|
# Used when we're trying to validate that a type is something that is not
|
37
47
|
# validatable, most likely a sign that we're in a bug
|
38
48
|
class UnvalidatableType < Error; end
|
@@ -14,7 +14,7 @@ module Openapi3Parser
|
|
14
14
|
extend Forwardable
|
15
15
|
include Enumerable
|
16
16
|
|
17
|
-
def_delegators :node_data, :empty
|
17
|
+
def_delegators :node_data, :empty?, :length, :size
|
18
18
|
attr_reader :node_data, :node_context
|
19
19
|
|
20
20
|
# @param [::Array] data data used to populate this node
|
@@ -35,6 +35,14 @@ module Openapi3Parser
|
|
35
35
|
Placeholder.each(node_data, &block)
|
36
36
|
end
|
37
37
|
|
38
|
+
# @param [Any] other
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
def ==(other)
|
42
|
+
other.instance_of?(self.class) &&
|
43
|
+
node_context.same_data_and_source?(other.node_context)
|
44
|
+
end
|
45
|
+
|
38
46
|
# Used to access a node relative to this node
|
39
47
|
# @param [Source::Pointer, ::Array, ::String] pointer_like
|
40
48
|
# @return anything
|
@@ -65,10 +65,19 @@ module Openapi3Parser
|
|
65
65
|
@source_location = source_location
|
66
66
|
end
|
67
67
|
|
68
|
+
# @param [Context] other
|
68
69
|
# @return [Boolean]
|
69
70
|
def ==(other)
|
71
|
+
document_location == other.document_location &&
|
72
|
+
same_data_and_source?(other)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Check that contexts are the same without concern for document location
|
76
|
+
#
|
77
|
+
# @param [Context] other
|
78
|
+
# @return [Boolean]
|
79
|
+
def same_data_and_source?(other)
|
70
80
|
input == other.input &&
|
71
|
-
document_location == other.document_location &&
|
72
81
|
source_location == other.source_location
|
73
82
|
end
|
74
83
|
|
@@ -98,9 +107,7 @@ module Openapi3Parser
|
|
98
107
|
def location_summary
|
99
108
|
summary = document_location.to_s
|
100
109
|
|
101
|
-
if document_location != source_location
|
102
|
-
summary += " (#{source_location})"
|
103
|
-
end
|
110
|
+
summary += " (#{source_location})" if document_location != source_location
|
104
111
|
|
105
112
|
summary
|
106
113
|
end
|
@@ -124,6 +131,29 @@ module Openapi3Parser
|
|
124
131
|
def node
|
125
132
|
document.node_at(document_location.pointer)
|
126
133
|
end
|
134
|
+
|
135
|
+
# Look up a node at a particular location in the OpenAPI docuemnt based
|
136
|
+
# on the relative position in the document of this context
|
137
|
+
#
|
138
|
+
# Examples:
|
139
|
+
#
|
140
|
+
# context.relative_node("#schemas")
|
141
|
+
# context.relative_node(%w[..])
|
142
|
+
#
|
143
|
+
# @param [Source::Pointer, String, Array] pointer
|
144
|
+
# @return anything
|
145
|
+
def relative_node(pointer)
|
146
|
+
document.node_at(pointer, document_location.pointer)
|
147
|
+
end
|
148
|
+
|
149
|
+
# Return the node that is the parent node for the node at this context
|
150
|
+
#
|
151
|
+
# @return [Node::Object, Node::Map, Node::Array, nil]
|
152
|
+
def parent_node
|
153
|
+
return if document_location.root?
|
154
|
+
|
155
|
+
relative_node("#..")
|
156
|
+
end
|
127
157
|
end
|
128
158
|
end
|
129
159
|
end
|
@@ -8,7 +8,7 @@ module Openapi3Parser
|
|
8
8
|
extend Forwardable
|
9
9
|
include Enumerable
|
10
10
|
|
11
|
-
def_delegators :node_data, :keys, :empty
|
11
|
+
def_delegators :node_data, :keys, :empty?, :length, :size
|
12
12
|
attr_reader :node_data, :node_context
|
13
13
|
|
14
14
|
def initialize(data, context)
|
@@ -48,6 +48,14 @@ module Openapi3Parser
|
|
48
48
|
self["x-#{value}"]
|
49
49
|
end
|
50
50
|
|
51
|
+
# @param [Any] other
|
52
|
+
#
|
53
|
+
# @return [Boolean]
|
54
|
+
def ==(other)
|
55
|
+
other.instance_of?(self.class) &&
|
56
|
+
node_context.same_data_and_source?(other.node_context)
|
57
|
+
end
|
58
|
+
|
51
59
|
# Iterates through the data of this node, used by Enumerable
|
52
60
|
#
|
53
61
|
# @return [Object]
|
@@ -55,6 +63,14 @@ module Openapi3Parser
|
|
55
63
|
Placeholder.each(node_data, &block)
|
56
64
|
end
|
57
65
|
|
66
|
+
# Provide an array of values for this object, a partner to the #keys
|
67
|
+
# method
|
68
|
+
#
|
69
|
+
# @return [Array]
|
70
|
+
def values
|
71
|
+
map(&:last)
|
72
|
+
end
|
73
|
+
|
58
74
|
# Used to access a node relative to this node
|
59
75
|
# @param [Source::Pointer, ::Array, ::String] pointer_like
|
60
76
|
# @return anything
|
@@ -48,6 +48,14 @@ module Openapi3Parser
|
|
48
48
|
self["x-#{value}"]
|
49
49
|
end
|
50
50
|
|
51
|
+
# @param [Any] other
|
52
|
+
#
|
53
|
+
# @return [Boolean]
|
54
|
+
def ==(other)
|
55
|
+
other.instance_of?(self.class) &&
|
56
|
+
node_context.same_data_and_source?(other.node_context)
|
57
|
+
end
|
58
|
+
|
51
59
|
# Iterates through the data of this node, used by Enumerable
|
52
60
|
#
|
53
61
|
# @return [Object]
|
@@ -55,11 +63,20 @@ module Openapi3Parser
|
|
55
63
|
Placeholder.each(node_data, &block)
|
56
64
|
end
|
57
65
|
|
66
|
+
# Provide an array of values for this object, a partner to the #keys
|
67
|
+
# method
|
68
|
+
#
|
69
|
+
# @return [Array]
|
70
|
+
def values
|
71
|
+
map(&:last)
|
72
|
+
end
|
73
|
+
|
58
74
|
# Used to render fields that can be in markdown syntax into HTML
|
59
75
|
# @param [String, nil] value
|
60
76
|
# @return [String, nil]
|
61
77
|
def render_markdown(value)
|
62
78
|
return if value.nil?
|
79
|
+
|
63
80
|
Markdown.to_html(value)
|
64
81
|
end
|
65
82
|
|
@@ -70,6 +70,14 @@ module Openapi3Parser
|
|
70
70
|
def servers
|
71
71
|
self["servers"]
|
72
72
|
end
|
73
|
+
|
74
|
+
# Whether this object uses it's own defined servers instead of falling
|
75
|
+
# back to the path items' ones.
|
76
|
+
#
|
77
|
+
# @return [Boolean]
|
78
|
+
def alternative_servers?
|
79
|
+
servers != node_context.parent_node.servers
|
80
|
+
end
|
73
81
|
end
|
74
82
|
end
|
75
83
|
end
|