openapi3_parser 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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