openapi3_parser 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/.travis.yml +3 -5
  4. data/CHANGELOG.md +7 -0
  5. data/README.md +2 -2
  6. data/TODO.md +9 -2
  7. data/lib/openapi3_parser/context/pointer.rb +2 -0
  8. data/lib/openapi3_parser/document.rb +54 -18
  9. data/lib/openapi3_parser/markdown.rb +15 -0
  10. data/lib/openapi3_parser/{nodes → node}/array.rb +1 -1
  11. data/lib/openapi3_parser/{nodes → node}/callback.rb +2 -4
  12. data/lib/openapi3_parser/{nodes → node}/components.rb +2 -4
  13. data/lib/openapi3_parser/{nodes → node}/contact.rb +2 -4
  14. data/lib/openapi3_parser/{nodes → node}/discriminator.rb +2 -4
  15. data/lib/openapi3_parser/{nodes → node}/encoding.rb +2 -4
  16. data/lib/openapi3_parser/{nodes → node}/example.rb +7 -4
  17. data/lib/openapi3_parser/{nodes → node}/external_documentation.rb +7 -4
  18. data/lib/openapi3_parser/{nodes → node}/header.rb +4 -5
  19. data/lib/openapi3_parser/{nodes → node}/info.rb +9 -6
  20. data/lib/openapi3_parser/{nodes → node}/license.rb +2 -4
  21. data/lib/openapi3_parser/{nodes → node}/link.rb +7 -4
  22. data/lib/openapi3_parser/node/map.rb +1 -1
  23. data/lib/openapi3_parser/{nodes → node}/media_type.rb +2 -4
  24. data/lib/openapi3_parser/{nodes → node}/oauth_flow.rb +2 -4
  25. data/lib/openapi3_parser/{nodes → node}/oauth_flows.rb +2 -4
  26. data/lib/openapi3_parser/node/object.rb +11 -1
  27. data/lib/openapi3_parser/{nodes → node}/openapi.rb +6 -8
  28. data/lib/openapi3_parser/{nodes → node}/operation.rb +11 -8
  29. data/lib/openapi3_parser/{nodes → node}/parameter.rb +3 -4
  30. data/lib/openapi3_parser/node/parameter_like.rb +70 -0
  31. data/lib/openapi3_parser/{nodes → node}/path_item.rb +9 -6
  32. data/lib/openapi3_parser/{nodes → node}/paths.rb +2 -4
  33. data/lib/openapi3_parser/{nodes → node}/request_body.rb +7 -4
  34. data/lib/openapi3_parser/{nodes → node}/response.rb +7 -4
  35. data/lib/openapi3_parser/{nodes → node}/responses.rb +2 -4
  36. data/lib/openapi3_parser/{nodes → node}/schema.rb +12 -9
  37. data/lib/openapi3_parser/{nodes → node}/security_requirement.rb +2 -4
  38. data/lib/openapi3_parser/{nodes → node}/security_scheme.rb +7 -5
  39. data/lib/openapi3_parser/{nodes → node}/server.rb +7 -4
  40. data/lib/openapi3_parser/{nodes → node}/server_variable.rb +8 -5
  41. data/lib/openapi3_parser/{nodes → node}/tag.rb +7 -4
  42. data/lib/openapi3_parser/{nodes → node}/xml.rb +2 -4
  43. data/lib/openapi3_parser/node_factories/array.rb +10 -4
  44. data/lib/openapi3_parser/node_factories/callback.rb +2 -2
  45. data/lib/openapi3_parser/node_factories/components.rb +5 -3
  46. data/lib/openapi3_parser/node_factories/contact.rb +10 -4
  47. data/lib/openapi3_parser/node_factories/discriminator.rb +2 -2
  48. data/lib/openapi3_parser/node_factories/encoding.rb +7 -3
  49. data/lib/openapi3_parser/node_factories/example.rb +8 -3
  50. data/lib/openapi3_parser/node_factories/external_documentation.rb +7 -3
  51. data/lib/openapi3_parser/node_factories/header.rb +2 -2
  52. data/lib/openapi3_parser/node_factories/info.rb +6 -3
  53. data/lib/openapi3_parser/node_factories/license.rb +6 -3
  54. data/lib/openapi3_parser/node_factories/link.rb +4 -2
  55. data/lib/openapi3_parser/node_factories/map.rb +12 -4
  56. data/lib/openapi3_parser/node_factories/media_type.rb +36 -5
  57. data/lib/openapi3_parser/node_factories/oauth_flow.rb +2 -2
  58. data/lib/openapi3_parser/node_factories/oauth_flows.rb +2 -2
  59. data/lib/openapi3_parser/node_factories/openapi.rb +13 -3
  60. data/lib/openapi3_parser/node_factories/operation.rb +11 -3
  61. data/lib/openapi3_parser/node_factories/parameter.rb +28 -3
  62. data/lib/openapi3_parser/node_factories/parameter/parameter_like.rb +9 -5
  63. data/lib/openapi3_parser/node_factories/path_item.rb +26 -7
  64. data/lib/openapi3_parser/node_factories/paths.rb +51 -2
  65. data/lib/openapi3_parser/node_factories/reference.rb +4 -0
  66. data/lib/openapi3_parser/node_factories/request_body.rb +32 -3
  67. data/lib/openapi3_parser/node_factories/response.rb +24 -4
  68. data/lib/openapi3_parser/node_factories/responses.rb +28 -2
  69. data/lib/openapi3_parser/node_factories/schema.rb +17 -3
  70. data/lib/openapi3_parser/node_factories/security_requirement.rb +2 -2
  71. data/lib/openapi3_parser/node_factories/security_scheme.rb +2 -2
  72. data/lib/openapi3_parser/node_factories/server.rb +2 -2
  73. data/lib/openapi3_parser/node_factories/server_variable.rb +2 -2
  74. data/lib/openapi3_parser/node_factories/tag.rb +2 -2
  75. data/lib/openapi3_parser/node_factories/xml.rb +6 -3
  76. data/lib/openapi3_parser/node_factory.rb +10 -4
  77. data/lib/openapi3_parser/node_factory/fields/reference.rb +4 -0
  78. data/lib/openapi3_parser/node_factory/map.rb +10 -0
  79. data/lib/openapi3_parser/node_factory/object.rb +29 -0
  80. data/lib/openapi3_parser/node_factory/object/validator.rb +69 -6
  81. data/lib/openapi3_parser/source/reference.rb +2 -0
  82. data/lib/openapi3_parser/source/reference_resolver.rb +5 -1
  83. data/lib/openapi3_parser/validators/absolute_uri.rb +14 -0
  84. data/lib/openapi3_parser/validators/component_keys.rb +17 -0
  85. data/lib/openapi3_parser/validators/duplicate_parameters.rb +30 -0
  86. data/lib/openapi3_parser/validators/email.rb +23 -0
  87. data/lib/openapi3_parser/validators/media_type.rb +20 -0
  88. data/lib/openapi3_parser/validators/url.rb +18 -0
  89. data/lib/openapi3_parser/version.rb +1 -1
  90. data/openapi3_parser.gemspec +5 -2
  91. metadata +70 -36
  92. data/lib/openapi3_parser/nodes/map.rb +0 -17
  93. data/lib/openapi3_parser/nodes/parameter/parameter_like.rb +0 -67
@@ -35,6 +35,7 @@ module Openapi3Parser
35
35
  [
36
36
  missing_required_fields_error,
37
37
  unexpected_fields_error,
38
+ mututally_exclusive_fields_errors,
38
39
  invalid_field_errors
39
40
  ].flatten.compact
40
41
  end
@@ -77,13 +78,20 @@ module Openapi3Parser
77
78
  end
78
79
  end
79
80
 
81
+ def mututally_exclusive_fields_errors
82
+ MututallyExclusiveFieldErrors.call(factory, input)
83
+ end
84
+
80
85
  def field_errors(name, field_config)
86
+ return if input[name].nil?
81
87
  field = input[name]
82
- return if field.nil?
83
- return field.errors.to_a if field.respond_to?(:errors)
84
- type_error = build_type_error(name, field_config)
85
- return type_error if type_error
86
- build_validation_errors(name, field_config)
88
+
89
+ if field.respond_to?(:errors) && !field.errors.empty?
90
+ field.errors.to_a
91
+ else
92
+ build_type_error(name, field_config) ||
93
+ build_validation_errors(name, field_config)
94
+ end
87
95
  end
88
96
 
89
97
  def build_type_error(name, field_config)
@@ -101,12 +109,67 @@ module Openapi3Parser
101
109
  raw_input[name], factory
102
110
  ).map do |error|
103
111
  Validation::Error.new(
104
- "Invalid field: #{error}",
112
+ error,
105
113
  Context.next_field(context, name),
106
114
  factory.class
107
115
  )
108
116
  end
109
117
  end
118
+
119
+ class MututallyExclusiveFieldErrors
120
+ def self.call(*args)
121
+ new.call(*args)
122
+ end
123
+
124
+ def call(factory, input)
125
+ factory
126
+ .mutually_exclusive_fields
127
+ .each_with_object([]) do |mutually_exclusive, memo|
128
+ error = determine_error(mutually_exclusive, input, factory)
129
+ memo << error if error
130
+ end
131
+ end
132
+
133
+ private
134
+
135
+ def determine_error(mutually_exclusive, input, factory)
136
+ fields = mutually_exclusive.fields
137
+ number_non_nil = count_non_nil_fields(fields, input)
138
+
139
+ if number_non_nil.zero? && mutually_exclusive.required
140
+ required_error(fields, factory)
141
+ elsif number_non_nil > 1
142
+ exclusive_error(fields, factory)
143
+ end
144
+ end
145
+
146
+ def count_non_nil_fields(fields, input)
147
+ fields.count do |field|
148
+ data = input[field]
149
+ data.respond_to?(:nil_input?) ? !data.nil_input? : !data.nil?
150
+ end
151
+ end
152
+
153
+ def required_error(fields, factory)
154
+ Validation::Error.new(
155
+ "one of #{sentence_fields(fields)} is required",
156
+ factory.context,
157
+ factory.class
158
+ )
159
+ end
160
+
161
+ def exclusive_error(fields, factory)
162
+ Validation::Error.new(
163
+ "#{sentence_fields(fields)} are mutually exclusive fields",
164
+ factory.context,
165
+ factory.class
166
+ )
167
+ end
168
+
169
+ def sentence_fields(fields)
170
+ fields[0..-2].join(", ") + " and " + fields[-1]
171
+ end
172
+ end
110
173
  end
111
174
  end
112
175
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "cgi"
4
+
3
5
  require "openapi3_parser/source"
4
6
  require "openapi3_parser/validators/reference"
5
7
 
@@ -16,7 +16,7 @@ module Openapi3Parser
16
16
  @reference_factory ||= begin
17
17
  next_context = Context.reference_field(
18
18
  context,
19
- input: source.data_at_pointer(json_pointer),
19
+ input: data,
20
20
  source: source,
21
21
  pointer_segments: json_pointer
22
22
  )
@@ -24,6 +24,10 @@ module Openapi3Parser
24
24
  end
25
25
  end
26
26
 
27
+ def data
28
+ source.data_at_pointer(json_pointer)
29
+ end
30
+
27
31
  def valid?
28
32
  errors.empty?
29
33
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ class AbsoluteUri
6
+ def self.call(input)
7
+ uri = URI.parse(input)
8
+ %("#{input}" is not a absolute URI) unless uri.absolute?
9
+ rescue URI::InvalidURIError
10
+ %("#{input}" is not a valid URI)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ # This validates that the keys of an object match the format of those
6
+ # defined for a Components node.
7
+ # As defined: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#components-object
8
+ class ComponentKeys
9
+ REGEX = /\A[a-zA-Z0-9\.\-_]+\Z/
10
+
11
+ def self.call(input)
12
+ invalid = input.keys.reject { |key| REGEX.match(key) }
13
+ "Contains invalid keys: #{invalid.join(', ')}" unless invalid.empty?
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ class DuplicateParameters
6
+ def self.call(resolved_input)
7
+ new.call(resolved_input)
8
+ end
9
+
10
+ def call(resolved_input)
11
+ dupes = duplicate_names_by_in(resolved_input)
12
+ message(dupes) unless dupes.empty?
13
+ end
14
+
15
+ private
16
+
17
+ def duplicate_names_by_in(resolved_input)
18
+ resolved_input.reject { |item| item["name"].nil? || item["in"].nil? }
19
+ .group_by { |item| [item["name"], item["in"]] }
20
+ .delete_if { |_, group| group.size < 2 }
21
+ .keys
22
+ end
23
+
24
+ def message(dupes)
25
+ grouped = dupes.map { |d| "#{d.first} in #{d.last}" }.join(", ")
26
+ "Duplicate parameters: #{grouped}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ class Email
6
+ # Regex is sourced from HTML specification:
7
+ # https://html.spec.whatwg.org/#e-mail-state-(type=email)
8
+ REGEX = %r{
9
+ \A
10
+ [a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+
11
+ @
12
+ [a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
13
+ (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*
14
+ \Z
15
+ }x
16
+
17
+ def self.call(input)
18
+ message = %("#{input}" is not a valid email address)
19
+ message unless REGEX.match(input)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ class MediaType
6
+ REGEX = %r{
7
+ \A
8
+ (\w+|\*) # word or asterisk
9
+ / # separating slash
10
+ ([-+.\w]+|\*) # word (with +, - & .) or asterisk
11
+ \Z
12
+ }x
13
+
14
+ def self.call(input)
15
+ message = %("#{input}" is not a valid media type)
16
+ message unless REGEX.match(input)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openapi3Parser
4
+ module Validators
5
+ class Url
6
+ def self.call(input)
7
+ message = %("#{input}" is not a valid URL)
8
+ uri = URI.parse(input)
9
+
10
+ message if !uri.relative? &&
11
+ !uri.is_a?(URI::HTTP) &&
12
+ !uri.is_a?(URI::HTTPS)
13
+ rescue URI::InvalidURIError
14
+ message
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Openapi3Parser
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "openapi3_parser/version"
6
6
 
@@ -25,9 +25,12 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.required_ruby_version = ">= 2.3.0"
27
27
 
28
+ spec.add_dependency "commonmarker", "~> 0.17"
29
+
28
30
  spec.add_development_dependency "bundler", "~> 1.15"
31
+ spec.add_development_dependency "byebug", "~> 10.0"
29
32
  spec.add_development_dependency "rake", "~> 10.0"
30
33
  spec.add_development_dependency "rspec", "~> 3.6"
31
- spec.add_development_dependency "rubocop", "~> 0.51"
34
+ spec.add_development_dependency "rubocop", "~> 0.53.0"
32
35
  spec.add_development_dependency "webmock", "~> 3.1"
33
36
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openapi3_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Dew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-31 00:00:00.000000000 Z
11
+ date: 2018-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commonmarker
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.17'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.17'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: '1.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +86,14 @@ dependencies:
58
86
  requirements:
59
87
  - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: '0.51'
89
+ version: 0.53.0
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: '0.51'
96
+ version: 0.53.0
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: webmock
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -107,8 +135,40 @@ files:
107
135
  - lib/openapi3_parser/document.rb
108
136
  - lib/openapi3_parser/document/reference_register.rb
109
137
  - lib/openapi3_parser/error.rb
138
+ - lib/openapi3_parser/markdown.rb
139
+ - lib/openapi3_parser/node/array.rb
140
+ - lib/openapi3_parser/node/callback.rb
141
+ - lib/openapi3_parser/node/components.rb
142
+ - lib/openapi3_parser/node/contact.rb
143
+ - lib/openapi3_parser/node/discriminator.rb
144
+ - lib/openapi3_parser/node/encoding.rb
145
+ - lib/openapi3_parser/node/example.rb
146
+ - lib/openapi3_parser/node/external_documentation.rb
147
+ - lib/openapi3_parser/node/header.rb
148
+ - lib/openapi3_parser/node/info.rb
149
+ - lib/openapi3_parser/node/license.rb
150
+ - lib/openapi3_parser/node/link.rb
110
151
  - lib/openapi3_parser/node/map.rb
152
+ - lib/openapi3_parser/node/media_type.rb
153
+ - lib/openapi3_parser/node/oauth_flow.rb
154
+ - lib/openapi3_parser/node/oauth_flows.rb
111
155
  - lib/openapi3_parser/node/object.rb
156
+ - lib/openapi3_parser/node/openapi.rb
157
+ - lib/openapi3_parser/node/operation.rb
158
+ - lib/openapi3_parser/node/parameter.rb
159
+ - lib/openapi3_parser/node/parameter_like.rb
160
+ - lib/openapi3_parser/node/path_item.rb
161
+ - lib/openapi3_parser/node/paths.rb
162
+ - lib/openapi3_parser/node/request_body.rb
163
+ - lib/openapi3_parser/node/response.rb
164
+ - lib/openapi3_parser/node/responses.rb
165
+ - lib/openapi3_parser/node/schema.rb
166
+ - lib/openapi3_parser/node/security_requirement.rb
167
+ - lib/openapi3_parser/node/security_scheme.rb
168
+ - lib/openapi3_parser/node/server.rb
169
+ - lib/openapi3_parser/node/server_variable.rb
170
+ - lib/openapi3_parser/node/tag.rb
171
+ - lib/openapi3_parser/node/xml.rb
112
172
  - lib/openapi3_parser/node_factories/array.rb
113
173
  - lib/openapi3_parser/node_factories/callback.rb
114
174
  - lib/openapi3_parser/node_factories/components.rb
@@ -150,38 +210,6 @@ files:
150
210
  - lib/openapi3_parser/node_factory/object/node_builder.rb
151
211
  - lib/openapi3_parser/node_factory/object/validator.rb
152
212
  - lib/openapi3_parser/node_factory/optional_reference.rb
153
- - lib/openapi3_parser/nodes/array.rb
154
- - lib/openapi3_parser/nodes/callback.rb
155
- - lib/openapi3_parser/nodes/components.rb
156
- - lib/openapi3_parser/nodes/contact.rb
157
- - lib/openapi3_parser/nodes/discriminator.rb
158
- - lib/openapi3_parser/nodes/encoding.rb
159
- - lib/openapi3_parser/nodes/example.rb
160
- - lib/openapi3_parser/nodes/external_documentation.rb
161
- - lib/openapi3_parser/nodes/header.rb
162
- - lib/openapi3_parser/nodes/info.rb
163
- - lib/openapi3_parser/nodes/license.rb
164
- - lib/openapi3_parser/nodes/link.rb
165
- - lib/openapi3_parser/nodes/map.rb
166
- - lib/openapi3_parser/nodes/media_type.rb
167
- - lib/openapi3_parser/nodes/oauth_flow.rb
168
- - lib/openapi3_parser/nodes/oauth_flows.rb
169
- - lib/openapi3_parser/nodes/openapi.rb
170
- - lib/openapi3_parser/nodes/operation.rb
171
- - lib/openapi3_parser/nodes/parameter.rb
172
- - lib/openapi3_parser/nodes/parameter/parameter_like.rb
173
- - lib/openapi3_parser/nodes/path_item.rb
174
- - lib/openapi3_parser/nodes/paths.rb
175
- - lib/openapi3_parser/nodes/request_body.rb
176
- - lib/openapi3_parser/nodes/response.rb
177
- - lib/openapi3_parser/nodes/responses.rb
178
- - lib/openapi3_parser/nodes/schema.rb
179
- - lib/openapi3_parser/nodes/security_requirement.rb
180
- - lib/openapi3_parser/nodes/security_scheme.rb
181
- - lib/openapi3_parser/nodes/server.rb
182
- - lib/openapi3_parser/nodes/server_variable.rb
183
- - lib/openapi3_parser/nodes/tag.rb
184
- - lib/openapi3_parser/nodes/xml.rb
185
213
  - lib/openapi3_parser/source.rb
186
214
  - lib/openapi3_parser/source/reference.rb
187
215
  - lib/openapi3_parser/source/reference_resolver.rb
@@ -193,7 +221,13 @@ files:
193
221
  - lib/openapi3_parser/source_input/url.rb
194
222
  - lib/openapi3_parser/validation/error.rb
195
223
  - lib/openapi3_parser/validation/error_collection.rb
224
+ - lib/openapi3_parser/validators/absolute_uri.rb
225
+ - lib/openapi3_parser/validators/component_keys.rb
226
+ - lib/openapi3_parser/validators/duplicate_parameters.rb
227
+ - lib/openapi3_parser/validators/email.rb
228
+ - lib/openapi3_parser/validators/media_type.rb
196
229
  - lib/openapi3_parser/validators/reference.rb
230
+ - lib/openapi3_parser/validators/url.rb
197
231
  - lib/openapi3_parser/version.rb
198
232
  - openapi3_parser.gemspec
199
233
  homepage: https://github.com/kevindew/openapi_parser