openapi_validator 0.4.1 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/lib/openapi_validator/documentation_validator.rb +0 -1
- data/lib/openapi_validator/extended_schema.rb +6 -6
- data/lib/openapi_validator/file_loader.rb +0 -1
- data/lib/openapi_validator/path_validator.rb +5 -5
- data/lib/openapi_validator/request.rb +0 -1
- data/lib/openapi_validator/request_validator.rb +6 -6
- data/lib/openapi_validator/response_validator.rb +7 -7
- data/lib/openapi_validator/response_validators/image_validator.rb +4 -4
- data/lib/openapi_validator/schema/json_validator.rb +0 -1
- data/lib/openapi_validator/schema/required_attribute.rb +4 -4
- data/lib/openapi_validator/validator.rb +3 -3
- data/lib/openapi_validator/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 421695ee7a834a974d8564fbd30da8f3bc21ade39aeca6bb67dd81bf5394d5c9
|
4
|
+
data.tar.gz: ee0caa0e6210f8c7f3a11eac1d744c906a886b8868c402da52082804dcd3a848
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea58fb690c20e18076d9bacea5d563cdbf6ab7951c1e7a7ddc9967efe0f5251a3409e3aaf38d4077b870eef01fa7b2693a6b34fc776aba0cf3904f1f8d942adc
|
7
|
+
data.tar.gz: 2b14e4bac49769407d1e0b9d0bb8a82428c17e182b52755e74b6479da0a54a641f1434ad52d54f68fb88e8ae433bc22dfc979634ce7f9b6aaab9c169fce539a6
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
[![Build Status](https://travis-ci.org/medsolutions/openapi_validator.svg?branch=master)][travis]
|
8
8
|
[![Code Climate](https://codeclimate.com/github/medsolutions/openapi_validator/badges/gpa.svg)][codeclimate]
|
9
9
|
[![Test Coverage](https://codeclimate.com/github/medsolutions/openapi_validator/badges/coverage.svg)][codeclimate]
|
10
|
+
[![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
|
10
11
|
|
11
12
|
Validator used for [openapi_rspec](https://github.com/medsolutions/openapi_rspec)
|
12
13
|
|
@@ -43,3 +44,5 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/medsol
|
|
43
44
|
## License
|
44
45
|
|
45
46
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
47
|
+
|
48
|
+
This project includes the [OpenAPI 3.0 Schema](https://github.com/googleapis/gnostic/blob/master/OpenAPIv3/openapi-3.0.json) as `data/openapi-3.0.json`. Copyright 2017, Google Inc. Released under the Apache 2.0 license.
|
@@ -7,13 +7,13 @@ module OpenapiValidator
|
|
7
7
|
class ExtendedSchema < JSON::Schema::Draft4
|
8
8
|
def initialize
|
9
9
|
super
|
10
|
-
@attributes[
|
11
|
-
@attributes[
|
12
|
-
@uri = URI.parse(
|
13
|
-
@names = [
|
10
|
+
@attributes["type"] = TypeAttribute
|
11
|
+
@attributes["required"] = RequiredAttribute
|
12
|
+
@uri = URI.parse("http://example.com/extended_schema")
|
13
|
+
@names = ["http://example.com/extended_schema"]
|
14
14
|
end
|
15
15
|
|
16
|
-
JsonValidator.register_validator(
|
17
|
-
JsonValidator.register_default_validator(
|
16
|
+
JsonValidator.register_validator(new)
|
17
|
+
JsonValidator.register_default_validator(new)
|
18
18
|
end
|
19
19
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
|
3
3
|
module OpenapiValidator
|
4
4
|
class PathValidator
|
@@ -14,8 +14,8 @@ module OpenapiValidator
|
|
14
14
|
[path_key, method, @schema_code]
|
15
15
|
end
|
16
16
|
|
17
|
-
def fragment
|
18
|
-
build_fragment.tap do |array|
|
17
|
+
def fragment(media_type: nil)
|
18
|
+
build_fragment(media_type: media_type).tap do |array|
|
19
19
|
array.define_singleton_method(:split) do |_|
|
20
20
|
self
|
21
21
|
end
|
@@ -93,7 +93,7 @@ module OpenapiValidator
|
|
93
93
|
raise(Error, "OpenAPI documentation does not have a documented path for #{path_key}")
|
94
94
|
end
|
95
95
|
|
96
|
-
def build_fragment
|
96
|
+
def build_fragment(media_type: nil)
|
97
97
|
fragment =
|
98
98
|
if @fragment_path
|
99
99
|
@fragment_path.split("/")
|
@@ -101,7 +101,7 @@ module OpenapiValidator
|
|
101
101
|
["#", "paths", path_key, method, "responses", @schema_code]
|
102
102
|
end
|
103
103
|
|
104
|
-
fragment += ["content", media_type, "schema"] unless @empty_schema
|
104
|
+
fragment += ["content", media_type || self.media_type, "schema"] unless @empty_schema
|
105
105
|
|
106
106
|
fragment
|
107
107
|
end
|
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "openapi_validator/path_validator"
|
2
|
+
require "openapi_validator/response_validator"
|
3
|
+
require "openapi_validator/schema/json_validator"
|
4
4
|
|
5
5
|
module OpenapiValidator
|
6
6
|
class RequestValidator
|
7
|
-
|
8
7
|
attr_reader :errors, :api_doc, :path_validator
|
9
8
|
|
10
9
|
def valid?
|
@@ -20,7 +19,7 @@ module OpenapiValidator
|
|
20
19
|
self
|
21
20
|
end
|
22
21
|
|
23
|
-
def validate_response(body:, code:)
|
22
|
+
def validate_response(body:, code:, media_type: request.media_type)
|
24
23
|
if request.code != code.to_s
|
25
24
|
@errors << "Path #{request.path} did not respond with expected status code. Expected #{request.code} got #{code}"
|
26
25
|
end
|
@@ -29,7 +28,8 @@ module OpenapiValidator
|
|
29
28
|
@errors << "Path #{request.path} should return empty response." unless body.empty?
|
30
29
|
else
|
31
30
|
@errors += OpenapiValidator::ResponseValidator.call(
|
32
|
-
request: request, schema: validator.api_doc, data: body,
|
31
|
+
request: request, schema: validator.api_doc, data: body, media_type: media_type,
|
32
|
+
fragment: path_validator.fragment(media_type: media_type), response: true
|
33
33
|
).errors
|
34
34
|
end
|
35
35
|
|
@@ -3,7 +3,6 @@ require "openapi_validator/response_validators/image_validator"
|
|
3
3
|
|
4
4
|
module OpenapiValidator
|
5
5
|
class ResponseValidator
|
6
|
-
|
7
6
|
attr_reader :errors
|
8
7
|
|
9
8
|
def valid?
|
@@ -21,27 +20,28 @@ module OpenapiValidator
|
|
21
20
|
|
22
21
|
private
|
23
22
|
|
24
|
-
attr_reader :request, :schema, :data, :fragment, :response
|
23
|
+
attr_reader :request, :schema, :data, :fragment, :response, :media_type
|
25
24
|
|
26
|
-
def initialize(request:, schema:, data:, fragment:, response:)
|
25
|
+
def initialize(request:, schema:, data:, fragment:, response:, media_type:)
|
27
26
|
@request = request
|
28
27
|
@schema = schema
|
29
28
|
@data = data
|
29
|
+
@media_type = media_type
|
30
30
|
@fragment = fragment
|
31
31
|
@response = response
|
32
32
|
@errors = []
|
33
33
|
end
|
34
34
|
|
35
35
|
def validate_response
|
36
|
-
@errors += validator.new(schema: schema, data: data, fragment: fragment, media_type:
|
36
|
+
@errors += validator.new(schema: schema, data: data, fragment: fragment, media_type: media_type, response: response).validate
|
37
37
|
end
|
38
38
|
|
39
39
|
def validator
|
40
|
-
case
|
41
|
-
when 'application/json'
|
42
|
-
OpenapiValidator::ResponseValidator::JsonValidator
|
40
|
+
case media_type
|
43
41
|
when %r{^image/[^/]*$}
|
44
42
|
OpenapiValidator::ResponseValidator::ImageValidator
|
43
|
+
else
|
44
|
+
OpenapiValidator::ResponseValidator::JsonValidator
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -23,17 +23,17 @@ module OpenapiValidator
|
|
23
23
|
attr_reader :schema, :data, :fragment, :media_type, :response, :property_name
|
24
24
|
|
25
25
|
def validate_media_type
|
26
|
-
type, sub_type = media_type.split(
|
26
|
+
type, sub_type = media_type.split("/")
|
27
27
|
content = MimeMagic.by_magic(data)
|
28
28
|
|
29
|
-
if content&.mediatype != type && (content&.subtype == sub_type || sub_type ==
|
29
|
+
if content&.mediatype != type && (content&.subtype == sub_type || sub_type == "*")
|
30
30
|
@errors << "Content-type of property '#{property_name}' did not match the following content-type: #{media_type}"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
def validate_schema
|
35
|
-
unless JSON::Schema::Attribute.data_valid_for_type?(data,
|
36
|
-
|
35
|
+
unless JSON::Schema::Attribute.data_valid_for_type?(data, "string")
|
36
|
+
@errors << "The property '#{property_name}' did not match the following type: #{type}"
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -6,17 +6,17 @@ module OpenapiValidator
|
|
6
6
|
return unless data.is_a?(Hash)
|
7
7
|
|
8
8
|
schema = current_schema.schema
|
9
|
-
defined_properties = schema[
|
9
|
+
defined_properties = schema["properties"]
|
10
10
|
|
11
|
-
schema[
|
12
|
-
next if data.
|
11
|
+
schema["required"].each do |property, _property_schema|
|
12
|
+
next if data.key?(property.to_s)
|
13
13
|
prop_defaults = options[:insert_defaults] &&
|
14
14
|
defined_properties &&
|
15
15
|
defined_properties[property] &&
|
16
16
|
!defined_properties[property]["default"].nil? &&
|
17
17
|
!defined_properties[property]["readonly"]
|
18
18
|
|
19
|
-
skip_error = processor.options[:response] && defined_properties
|
19
|
+
skip_error = processor.options[:response] && defined_properties.dig(property, "writeOnly")
|
20
20
|
|
21
21
|
if !prop_defaults && !skip_error
|
22
22
|
message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
|
@@ -6,7 +6,6 @@ require "openapi_validator/request_validator"
|
|
6
6
|
|
7
7
|
module OpenapiValidator
|
8
8
|
class Validator
|
9
|
-
|
10
9
|
attr_reader :api_base_path, :unvalidated_requests, :api_doc
|
11
10
|
|
12
11
|
# @return [DocumentationValidator] validation result
|
@@ -41,11 +40,12 @@ module OpenapiValidator
|
|
41
40
|
def build_unvalidated_requests
|
42
41
|
http_methods = %w[get put post delete options head patch trace]
|
43
42
|
requests = []
|
44
|
-
|
43
|
+
|
44
|
+
api_doc["paths"]&.each do |path, methods|
|
45
45
|
methods.each do |method, values|
|
46
46
|
next unless http_methods.include?(method)
|
47
47
|
|
48
|
-
values["responses"]
|
48
|
+
values["responses"]&.each_key do |code|
|
49
49
|
requests << [path, method, code]
|
50
50
|
end
|
51
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openapi_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Svyatoslav Kryukov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json-schema
|