skooma 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +22 -0
- data/LICENSE.txt +21 -0
- data/README.md +125 -0
- data/data/oas-3.1/dialect/base.json +25 -0
- data/data/oas-3.1/meta/base.json +96 -0
- data/data/oas-3.1/schema/2022-10-07.json +1441 -0
- data/data/oas-3.1/schema-base/2022-10-07.json +23 -0
- data/lib/skooma/body_parsers.rb +31 -0
- data/lib/skooma/dialects/oas_3_1.rb +41 -0
- data/lib/skooma/inflector.rb +19 -0
- data/lib/skooma/instance.rb +112 -0
- data/lib/skooma/keywords/oas_3_1/dialect/discriminator.rb +13 -0
- data/lib/skooma/keywords/oas_3_1/dialect/example.rb +13 -0
- data/lib/skooma/keywords/oas_3_1/dialect/external_docs.rb +13 -0
- data/lib/skooma/keywords/oas_3_1/dialect/xml.rb +13 -0
- data/lib/skooma/keywords/oas_3_1/schema.rb +32 -0
- data/lib/skooma/keywords/oas_3_1.rb +22 -0
- data/lib/skooma/objects/base/keywords/deprecated.rb +13 -0
- data/lib/skooma/objects/base/keywords/description.rb +13 -0
- data/lib/skooma/objects/base/keywords/security.rb +13 -0
- data/lib/skooma/objects/base/keywords/servers.rb +13 -0
- data/lib/skooma/objects/base/keywords/summary.rb +13 -0
- data/lib/skooma/objects/base/keywords/tags.rb +13 -0
- data/lib/skooma/objects/base.rb +33 -0
- data/lib/skooma/objects/callback.rb +12 -0
- data/lib/skooma/objects/components.rb +30 -0
- data/lib/skooma/objects/header/keywords/content.rb +50 -0
- data/lib/skooma/objects/header/keywords/example.rb +13 -0
- data/lib/skooma/objects/header/keywords/examples.rb +13 -0
- data/lib/skooma/objects/header/keywords/explode.rb +13 -0
- data/lib/skooma/objects/header/keywords/required.rb +19 -0
- data/lib/skooma/objects/header/keywords/schema.rb +19 -0
- data/lib/skooma/objects/header/keywords/style.rb +13 -0
- data/lib/skooma/objects/header.rb +23 -0
- data/lib/skooma/objects/media_type.rb +14 -0
- data/lib/skooma/objects/openapi/keywords/components.rb +23 -0
- data/lib/skooma/objects/openapi/keywords/info.rb +13 -0
- data/lib/skooma/objects/openapi/keywords/json_schema_dialect.rb +21 -0
- data/lib/skooma/objects/openapi/keywords/openapi.rb +24 -0
- data/lib/skooma/objects/openapi/keywords/paths.rb +62 -0
- data/lib/skooma/objects/openapi/keywords/security.rb +13 -0
- data/lib/skooma/objects/openapi/keywords/webhooks.rb +15 -0
- data/lib/skooma/objects/openapi.rb +39 -0
- data/lib/skooma/objects/operation/keywords/callbacks.rb +13 -0
- data/lib/skooma/objects/operation/keywords/operation_id.rb +13 -0
- data/lib/skooma/objects/operation/keywords/parameters.rb +53 -0
- data/lib/skooma/objects/operation/keywords/request_body.rb +21 -0
- data/lib/skooma/objects/operation/keywords/responses.rb +48 -0
- data/lib/skooma/objects/operation.rb +31 -0
- data/lib/skooma/objects/parameter/keywords/allow_empty_value.rb +13 -0
- data/lib/skooma/objects/parameter/keywords/allow_reserved.rb +13 -0
- data/lib/skooma/objects/parameter/keywords/content.rb +21 -0
- data/lib/skooma/objects/parameter/keywords/in.rb +13 -0
- data/lib/skooma/objects/parameter/keywords/name.rb +13 -0
- data/lib/skooma/objects/parameter/keywords/required.rb +19 -0
- data/lib/skooma/objects/parameter/keywords/schema.rb +21 -0
- data/lib/skooma/objects/parameter/keywords/value_parser.rb +80 -0
- data/lib/skooma/objects/parameter.rb +27 -0
- data/lib/skooma/objects/path_item/keywords/base_operation.rb +25 -0
- data/lib/skooma/objects/path_item/keywords/delete.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/get.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/head.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/options.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/parameters.rb +19 -0
- data/lib/skooma/objects/path_item/keywords/patch.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/post.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/put.rb +16 -0
- data/lib/skooma/objects/path_item/keywords/trace.rb +16 -0
- data/lib/skooma/objects/path_item.rb +28 -0
- data/lib/skooma/objects/ref_base.rb +33 -0
- data/lib/skooma/objects/request_body/keywords/required.rb +19 -0
- data/lib/skooma/objects/request_body.rb +17 -0
- data/lib/skooma/objects/response/keywords/content.rb +51 -0
- data/lib/skooma/objects/response/keywords/headers.rb +37 -0
- data/lib/skooma/objects/response/keywords/links.rb +13 -0
- data/lib/skooma/objects/response.rb +18 -0
- data/lib/skooma/output_format.rb +35 -0
- data/lib/skooma/rspec.rb +166 -0
- data/lib/skooma/validators/double.rb +13 -0
- data/lib/skooma/validators/float.rb +13 -0
- data/lib/skooma/validators/int_32.rb +15 -0
- data/lib/skooma/validators/int_64.rb +15 -0
- data/lib/skooma/version.rb +5 -0
- data/lib/skooma.rb +26 -0
- metadata +161 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$id": "https://spec.openapis.org/oas/3.1/schema-base/2022-10-07",
|
|
3
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
|
+
|
|
5
|
+
"description": "The description of OpenAPI v3.1.x documents using the OpenAPI JSON Schema dialect, as defined by https://spec.openapis.org/oas/v3.1.0",
|
|
6
|
+
|
|
7
|
+
"$ref": "https://spec.openapis.org/oas/3.1/schema/2022-10-07",
|
|
8
|
+
"properties": {
|
|
9
|
+
"jsonSchemaDialect": { "$ref": "#/$defs/dialect" }
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
"$defs": {
|
|
13
|
+
"dialect": { "const": "https://spec.openapis.org/oas/3.1/dialect/base" },
|
|
14
|
+
|
|
15
|
+
"schema": {
|
|
16
|
+
"$dynamicAnchor": "meta",
|
|
17
|
+
"$ref": "https://spec.openapis.org/oas/3.1/dialect/base",
|
|
18
|
+
"properties": {
|
|
19
|
+
"$schema": { "$ref": "#/$defs/dialect" }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module BodyParsers
|
|
5
|
+
class << self
|
|
6
|
+
DEFAULT_PARSER = ->(body) { body }
|
|
7
|
+
|
|
8
|
+
def [](media_type)
|
|
9
|
+
parsers[media_type.to_s.strip.downcase] || DEFAULT_PARSER
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_accessor :parsers
|
|
13
|
+
|
|
14
|
+
def register(*media_types, parser)
|
|
15
|
+
media_types.each do |media_type|
|
|
16
|
+
parsers[media_type.to_s.strip.downcase] = parser
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
self.parsers = {}
|
|
21
|
+
|
|
22
|
+
module JSONParser
|
|
23
|
+
def self.call(body)
|
|
24
|
+
JSON.parse(body)
|
|
25
|
+
rescue JSON::ParserError
|
|
26
|
+
body
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
register "application/json", JSONParser
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Dialects
|
|
5
|
+
module OAS31
|
|
6
|
+
class << self
|
|
7
|
+
def call(registry, **options)
|
|
8
|
+
registry.add_source(
|
|
9
|
+
"https://spec.openapis.org/oas/3.1/",
|
|
10
|
+
JSONSkooma::Sources::Local.new(File.join(DATA_DIR, "oas-3.1").to_s, suffix: ".json")
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
registry.add_vocabulary(
|
|
14
|
+
"https://spec.openapis.org/oas/3.1/vocab/base",
|
|
15
|
+
Skooma::Keywords::OAS31::Dialect::Discriminator,
|
|
16
|
+
Skooma::Keywords::OAS31::Dialect::Xml,
|
|
17
|
+
Skooma::Keywords::OAS31::Dialect::ExternalDocs,
|
|
18
|
+
Skooma::Keywords::OAS31::Dialect::Example
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
registry.add_metaschema(
|
|
22
|
+
"https://spec.openapis.org/oas/3.1/dialect/base",
|
|
23
|
+
"https://json-schema.org/draft/2020-12/vocab/core",
|
|
24
|
+
"https://json-schema.org/draft/2020-12/vocab/applicator",
|
|
25
|
+
"https://json-schema.org/draft/2020-12/vocab/unevaluated",
|
|
26
|
+
"https://json-schema.org/draft/2020-12/vocab/validation",
|
|
27
|
+
"https://json-schema.org/draft/2020-12/vocab/format-annotation",
|
|
28
|
+
"https://json-schema.org/draft/2020-12/vocab/meta-data",
|
|
29
|
+
"https://json-schema.org/draft/2020-12/vocab/content",
|
|
30
|
+
"https://spec.openapis.org/oas/3.1/vocab/base"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
registry.add_format("int32", Skooma::Validators::Int32)
|
|
34
|
+
registry.add_format("int64", Skooma::Validators::Int64)
|
|
35
|
+
registry.add_format("float", Skooma::Validators::Float)
|
|
36
|
+
registry.add_format("double", Skooma::Validators::Double)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
class Inflector < Zeitwerk::Inflector
|
|
5
|
+
STATIC_MAPPING = {
|
|
6
|
+
"oas_3_1" => "OAS31",
|
|
7
|
+
"openapi" => "OpenAPI",
|
|
8
|
+
"rspec" => "RSpec"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
def camelize(basename, _abspath)
|
|
12
|
+
if basename.include?("json_")
|
|
13
|
+
super.gsub("Json", "JSON")
|
|
14
|
+
else
|
|
15
|
+
STATIC_MAPPING[basename] || super
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
class Instance < JSONSkooma::JSONNode
|
|
5
|
+
module Coercible
|
|
6
|
+
def coerce(json)
|
|
7
|
+
value = self&.value
|
|
8
|
+
return self if value.nil?
|
|
9
|
+
|
|
10
|
+
case json["type"]
|
|
11
|
+
when "integer"
|
|
12
|
+
begin
|
|
13
|
+
Integer(value, 10)
|
|
14
|
+
rescue ArgumentError
|
|
15
|
+
value
|
|
16
|
+
end
|
|
17
|
+
when "number"
|
|
18
|
+
begin
|
|
19
|
+
Float(value)
|
|
20
|
+
rescue ArgumentError
|
|
21
|
+
value
|
|
22
|
+
end
|
|
23
|
+
when "boolean"
|
|
24
|
+
return true if value == "true"
|
|
25
|
+
|
|
26
|
+
(value == "false") ? false : value
|
|
27
|
+
when "object"
|
|
28
|
+
value
|
|
29
|
+
# convert_object(value, schema)
|
|
30
|
+
when "array"
|
|
31
|
+
# convert_array(value, schema)
|
|
32
|
+
value
|
|
33
|
+
else
|
|
34
|
+
value
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class Attribute < JSONSkooma::JSONNode
|
|
40
|
+
include Coercible
|
|
41
|
+
|
|
42
|
+
def initialize(value, **item_params)
|
|
43
|
+
super(value, **item_params.merge(item_class: Attribute))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Headers < JSONSkooma::JSONNode
|
|
48
|
+
def [](key)
|
|
49
|
+
super(key.to_s.downcase)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def map_object_value(value)
|
|
55
|
+
value.map { |k, v| [k.to_s.downcase, Attribute.new(v, key: k.to_s, parent: self, **@item_params)] }.to_h
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class Response < Attribute
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def parse_value(value)
|
|
63
|
+
data = {}
|
|
64
|
+
data["status"] = JSONSkooma::JSONNode.new(value.fetch("status"), key: "status", parent: self)
|
|
65
|
+
data["headers"] = Headers.new(value.fetch("headers", {}), key: "headers", parent: self)
|
|
66
|
+
body_value = parse_body(value["body"], data["headers"]&.[]("Content-Type"))
|
|
67
|
+
data["body"] = Attribute.new(body_value, key: "body", parent: self)
|
|
68
|
+
["object", data]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def parse_body(body, content_type)
|
|
72
|
+
return nil unless body
|
|
73
|
+
|
|
74
|
+
parser = BodyParsers[content_type&.split(";")&.first]
|
|
75
|
+
parser ? parser.call(body) : body
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class Request < JSONSkooma::JSONNode
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def parse_value(value)
|
|
83
|
+
data = {}
|
|
84
|
+
data["query"] = Attribute.new(value.fetch("query", ""), key: "query", parent: self)
|
|
85
|
+
data["headers"] = Headers.new(value.fetch("headers", {}), key: "headers", parent: self)
|
|
86
|
+
body_value = parse_body(value["body"], data["headers"]&.[]("Content-Type"))
|
|
87
|
+
data["body"] = Attribute.new(body_value, key: "body", parent: self)
|
|
88
|
+
["object", data]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def parse_body(body, content_type)
|
|
92
|
+
return nil unless body
|
|
93
|
+
|
|
94
|
+
parser = BodyParsers[content_type&.split(";")&.first]
|
|
95
|
+
parser ? parser.call(body) : body
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def parse_value(value)
|
|
102
|
+
data = {
|
|
103
|
+
"method" => JSONSkooma::JSONNode.new(value["method"], key: "method", parent: self),
|
|
104
|
+
"path" => JSONSkooma::JSONNode.new(value["path"], key: "path", parent: self)
|
|
105
|
+
}
|
|
106
|
+
data["request"] = Request.new(value["request"], key: "request", parent: self) if value["request"]
|
|
107
|
+
data["response"] = Response.new(value["response"], key: "response", parent: self) if value["response"]
|
|
108
|
+
|
|
109
|
+
["object", data]
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Keywords
|
|
5
|
+
module OAS31
|
|
6
|
+
class Schema < JSONSkooma::Keywords::Base
|
|
7
|
+
self.key = "schema"
|
|
8
|
+
|
|
9
|
+
def evaluate(instance, result)
|
|
10
|
+
json.evaluate(instance.coerce(json), result)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def each_schema
|
|
14
|
+
yield json
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def wrap_value(value)
|
|
20
|
+
JSONSkooma::JSONSchema.new(
|
|
21
|
+
value,
|
|
22
|
+
key: key,
|
|
23
|
+
parent: parent_schema,
|
|
24
|
+
registry: parent_schema.registry,
|
|
25
|
+
cache_id: parent_schema.cache_id,
|
|
26
|
+
metaschema_uri: parent_schema.json_schema_dialect_uri
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Keywords
|
|
5
|
+
module OAS31
|
|
6
|
+
module SchemaValue
|
|
7
|
+
def wrap_value(value)
|
|
8
|
+
return super unless value.is_a?(Hash) || value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
|
9
|
+
|
|
10
|
+
Objects::OpenAPI.new(value, registry: parent_schema.registry, parent: parent_schema, key: key)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def each_schema
|
|
14
|
+
return super unless json.is_a?(Objects::OpenAPI)
|
|
15
|
+
|
|
16
|
+
yield json
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
JSONSkooma::Keywords::ValueSchemas.register_value_schema(:openapi_schema, SchemaValue)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
class Base < JSONSkooma::JSONSchema
|
|
6
|
+
DEFAULT_OPTIONS = {
|
|
7
|
+
registry: REGISTRY_NAME
|
|
8
|
+
}.freeze
|
|
9
|
+
|
|
10
|
+
def initialize(value, **options)
|
|
11
|
+
super(value, **DEFAULT_OPTIONS.merge(options))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def bootstrap(value)
|
|
15
|
+
# nothing to do
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def kw_classes
|
|
19
|
+
[]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def json_schema_dialect_uri
|
|
23
|
+
root.json_schema_dialect_uri
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def kw_class(k)
|
|
29
|
+
kw_classes.find { |kw| kw.key == k } || JSONSkooma::Keywords::Unknown[k]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
# https://spec.openapis.org/oas/v3.1.0#callback-object
|
|
6
|
+
# A map of possible out-of band callbacks related to the parent operation.
|
|
7
|
+
class Callback < RefBase
|
|
8
|
+
def kw_classes
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
# Holds a set of reusable objects for different aspects of the OAS.
|
|
6
|
+
# https://spec.openapis.org/oas/v3.1.0#components-object
|
|
7
|
+
class Components < JSONSkooma::JSONNode
|
|
8
|
+
CLASSES_MAP = {
|
|
9
|
+
"schemas" => JSONSkooma::JSONSchema,
|
|
10
|
+
"responses" => Response,
|
|
11
|
+
"parameters" => Parameter,
|
|
12
|
+
# "examples" => Example,
|
|
13
|
+
"requestBodies" => RequestBody,
|
|
14
|
+
"headers" => Header,
|
|
15
|
+
"securitySchemes" => JSONSkooma::JSONNode,
|
|
16
|
+
"links" => JSONSkooma::JSONNode,
|
|
17
|
+
# "callbacks" => Callback,
|
|
18
|
+
"pathItems" => PathItem
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
def map_object_value(value)
|
|
22
|
+
value.map do |k, v|
|
|
23
|
+
key = k.to_s
|
|
24
|
+
value = JSONSkooma::JSONNode.new(v, key: key, parent: self, item_class: CLASSES_MAP.fetch(key), **@item_params, metaschema_uri: parent.json_schema_dialect_uri)
|
|
25
|
+
[key, value]
|
|
26
|
+
end.to_h
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
class Header
|
|
6
|
+
module Keywords
|
|
7
|
+
class Content < JSONSkooma::Keywords::Base
|
|
8
|
+
self.key = "content"
|
|
9
|
+
self.value_schema = :object_of_schemas
|
|
10
|
+
self.schema_value_class = Objects::MediaType
|
|
11
|
+
|
|
12
|
+
def evaluate(instance, result)
|
|
13
|
+
return if instance&.value.nil?
|
|
14
|
+
|
|
15
|
+
media_type = result.root.instance["response"]["headers"]["Content-Type"]&.split(";")&.first&.strip&.downcase
|
|
16
|
+
media_type_object, matched_media_type = find_media_type(media_type)
|
|
17
|
+
|
|
18
|
+
return result.discard unless media_type_object
|
|
19
|
+
|
|
20
|
+
result.annotate(matched_media_type)
|
|
21
|
+
result.call(instance, matched_media_type) do |media_type_result|
|
|
22
|
+
media_type_object.evaluate(instance, media_type_result)
|
|
23
|
+
result.failure("Invalid content") unless media_type_result.passed?
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# The key is a media type or media type range and the value describes it.
|
|
30
|
+
# For requests that match multiple keys, only the most specific key is applicable.
|
|
31
|
+
# e.g. text/plain overrides text/*
|
|
32
|
+
def find_media_type(media_type)
|
|
33
|
+
matched_media_type =
|
|
34
|
+
if json.key?(media_type)
|
|
35
|
+
media_type
|
|
36
|
+
elsif media_type &&
|
|
37
|
+
(key = "#{media_type.split("/").first}/*") &&
|
|
38
|
+
json.key?(key)
|
|
39
|
+
key
|
|
40
|
+
elsif json.key?("*/*")
|
|
41
|
+
"*/*"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
[json[matched_media_type], matched_media_type]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
class Header
|
|
6
|
+
module Keywords
|
|
7
|
+
class Required < JSONSkooma::Keywords::Base
|
|
8
|
+
self.key = "required"
|
|
9
|
+
|
|
10
|
+
def evaluate(instance, result)
|
|
11
|
+
if json.value && instance.value.nil?
|
|
12
|
+
result.failure("Header is required")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
class Header
|
|
6
|
+
module Keywords
|
|
7
|
+
class Schema < Skooma::Keywords::OAS31::Schema
|
|
8
|
+
self.key = "schema"
|
|
9
|
+
|
|
10
|
+
def evaluate(instance, result)
|
|
11
|
+
return if instance.value.nil?
|
|
12
|
+
|
|
13
|
+
super
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Skooma
|
|
4
|
+
module Objects
|
|
5
|
+
# https://spec.openapis.org/oas/v3.1.0#header-object
|
|
6
|
+
# The Header Object follows the structure of the Parameter Object.
|
|
7
|
+
class Header < RefBase
|
|
8
|
+
def kw_classes
|
|
9
|
+
[
|
|
10
|
+
Base::Keywords::Description,
|
|
11
|
+
Base::Keywords::Deprecated,
|
|
12
|
+
Keywords::Style,
|
|
13
|
+
Keywords::Explode,
|
|
14
|
+
Keywords::Required,
|
|
15
|
+
Keywords::Schema,
|
|
16
|
+
Keywords::Example,
|
|
17
|
+
Keywords::Examples,
|
|
18
|
+
Keywords::Content
|
|
19
|
+
]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|