openapi3_parser 0.4.0 → 0.5.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 +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +8 -0
- data/README.md +1 -1
- data/TODO.md +4 -4
- data/lib/openapi3_parser/array_sentence.rb +12 -0
- data/lib/openapi3_parser/cautious_dig.rb +39 -0
- data/lib/openapi3_parser/context.rb +53 -1
- data/lib/openapi3_parser/context/location.rb +1 -0
- data/lib/openapi3_parser/context/pointer.rb +67 -5
- data/lib/openapi3_parser/document.rb +45 -4
- data/lib/openapi3_parser/error.rb +9 -0
- data/lib/openapi3_parser/node/array.rb +14 -4
- data/lib/openapi3_parser/node/map.rb +45 -3
- data/lib/openapi3_parser/node/object.rb +25 -5
- data/lib/openapi3_parser/node_factory.rb +0 -150
- data/lib/openapi3_parser/node_factory/array.rb +198 -0
- data/lib/openapi3_parser/node_factory/callback.rb +24 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/components.rb +24 -25
- data/lib/openapi3_parser/{node_factories → node_factory}/contact.rb +5 -6
- data/lib/openapi3_parser/{node_factories → node_factory}/discriminator.rb +6 -7
- data/lib/openapi3_parser/{node_factories → node_factory}/encoding.rb +6 -8
- data/lib/openapi3_parser/{node_factories → node_factory}/example.rb +4 -5
- data/lib/openapi3_parser/{node_factories → node_factory}/external_documentation.rb +4 -5
- data/lib/openapi3_parser/node_factory/field.rb +129 -0
- data/lib/openapi3_parser/node_factory/fields/reference.rb +54 -18
- data/lib/openapi3_parser/{node_factories → node_factory}/header.rb +4 -5
- data/lib/openapi3_parser/{node_factories → node_factory}/info.rb +6 -7
- data/lib/openapi3_parser/{node_factories → node_factory}/license.rb +4 -5
- data/lib/openapi3_parser/{node_factories → node_factory}/link.rb +6 -8
- data/lib/openapi3_parser/node_factory/map.rb +206 -21
- data/lib/openapi3_parser/{node_factories → node_factory}/media_type.rb +17 -16
- data/lib/openapi3_parser/{node_factories → node_factory}/oauth_flow.rb +2 -4
- data/lib/openapi3_parser/{node_factories → node_factory}/oauth_flows.rb +4 -6
- data/lib/openapi3_parser/node_factory/object.rb +66 -63
- data/lib/openapi3_parser/node_factory/object_factory/dsl.rb +50 -0
- data/lib/openapi3_parser/node_factory/object_factory/field_config.rb +88 -0
- data/lib/openapi3_parser/node_factory/object_factory/node_builder.rb +96 -0
- data/lib/openapi3_parser/node_factory/object_factory/validator.rb +172 -0
- data/lib/openapi3_parser/node_factory/openapi.rb +65 -0
- data/lib/openapi3_parser/node_factory/operation.rb +87 -0
- data/lib/openapi3_parser/node_factory/optional_reference.rb +7 -3
- data/lib/openapi3_parser/{node_factories → node_factory}/parameter.rb +16 -22
- data/lib/openapi3_parser/node_factory/parameter_like.rb +42 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/path_item.rb +27 -29
- data/lib/openapi3_parser/{node_factories → node_factory}/paths.rb +21 -27
- data/lib/openapi3_parser/node_factory/recursive_pointer.rb +17 -0
- data/lib/openapi3_parser/node_factory/reference.rb +48 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/request_body.rb +15 -19
- data/lib/openapi3_parser/{node_factories → node_factory}/response.rb +18 -21
- data/lib/openapi3_parser/node_factory/responses.rb +51 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/schema.rb +33 -33
- data/lib/openapi3_parser/node_factory/security_requirement.rb +21 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/security_scheme.rb +4 -6
- data/lib/openapi3_parser/{node_factories → node_factory}/server.rb +6 -8
- data/lib/openapi3_parser/{node_factories → node_factory}/server_variable.rb +10 -12
- data/lib/openapi3_parser/{node_factories → node_factory}/tag.rb +4 -6
- data/lib/openapi3_parser/node_factory/type_checker.rb +103 -0
- data/lib/openapi3_parser/{node_factories → node_factory}/xml.rb +4 -5
- data/lib/openapi3_parser/source/reference_resolver.rb +3 -3
- data/lib/openapi3_parser/validation/error.rb +9 -0
- data/lib/openapi3_parser/validation/input_validator.rb +18 -0
- data/lib/openapi3_parser/validation/validatable.rb +44 -0
- data/lib/openapi3_parser/validators/mutually_exclusive_fields.rb +121 -0
- data/lib/openapi3_parser/validators/required_fields.rb +37 -0
- data/lib/openapi3_parser/validators/unexpected_fields.rb +52 -0
- data/lib/openapi3_parser/version.rb +1 -1
- metadata +48 -38
- data/lib/openapi3_parser/node_factories/array.rb +0 -114
- data/lib/openapi3_parser/node_factories/callback.rb +0 -27
- data/lib/openapi3_parser/node_factories/map.rb +0 -120
- data/lib/openapi3_parser/node_factories/openapi.rb +0 -62
- data/lib/openapi3_parser/node_factories/operation.rb +0 -84
- data/lib/openapi3_parser/node_factories/parameter/parameter_like.rb +0 -41
- data/lib/openapi3_parser/node_factories/reference.rb +0 -35
- data/lib/openapi3_parser/node_factories/responses.rb +0 -60
- data/lib/openapi3_parser/node_factories/security_requirement.rb +0 -26
- data/lib/openapi3_parser/node_factory/field_config.rb +0 -88
- data/lib/openapi3_parser/node_factory/object/node_builder.rb +0 -97
- data/lib/openapi3_parser/node_factory/object/validator.rb +0 -176
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openapi3_parser/node/openapi"
|
4
|
+
require "openapi3_parser/node_factory/object"
|
5
|
+
require "openapi3_parser/node_factory/info"
|
6
|
+
require "openapi3_parser/node_factory/array"
|
7
|
+
require "openapi3_parser/node_factory/server"
|
8
|
+
require "openapi3_parser/node_factory/paths"
|
9
|
+
require "openapi3_parser/node_factory/components"
|
10
|
+
require "openapi3_parser/node_factory/security_requirement"
|
11
|
+
require "openapi3_parser/node_factory/tag"
|
12
|
+
require "openapi3_parser/node_factory/external_documentation"
|
13
|
+
|
14
|
+
module Openapi3Parser
|
15
|
+
module NodeFactory
|
16
|
+
class Openapi < NodeFactory::Object
|
17
|
+
allow_extensions
|
18
|
+
|
19
|
+
field "openapi", input_type: String, required: true
|
20
|
+
field "info", factory: NodeFactory::Info, required: true
|
21
|
+
field "servers", factory: :servers_factory
|
22
|
+
field "paths", factory: NodeFactory::Paths, required: true
|
23
|
+
field "components", factory: NodeFactory::Components
|
24
|
+
field "security", factory: :security_factory
|
25
|
+
field "tags", factory: :tags_factory
|
26
|
+
field "externalDocs", factory: NodeFactory::ExternalDocumentation
|
27
|
+
|
28
|
+
def can_use_default?
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def build_object(data, context)
|
35
|
+
Node::Openapi.new(data, context)
|
36
|
+
end
|
37
|
+
|
38
|
+
def servers_factory(context)
|
39
|
+
NodeFactory::Array.new(context,
|
40
|
+
value_factory: NodeFactory::Server)
|
41
|
+
end
|
42
|
+
|
43
|
+
def security_factory(context)
|
44
|
+
NodeFactory::Array.new(context,
|
45
|
+
value_factory: NodeFactory::SecurityRequirement)
|
46
|
+
end
|
47
|
+
|
48
|
+
def tags_factory(context)
|
49
|
+
validate_unique_tags = lambda do |validatable|
|
50
|
+
names = validatable.factory.context.input.map { |i| i["name"] }
|
51
|
+
return if names.uniq.count == names.count
|
52
|
+
|
53
|
+
dupes = names.find_all { |name| names.count(name) > 1 }
|
54
|
+
validatable.add_error(
|
55
|
+
"Duplicate tag names: #{dupes.uniq.join(', ')}"
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
NodeFactory::Array.new(context,
|
60
|
+
value_factory: NodeFactory::Tag,
|
61
|
+
validate: validate_unique_tags)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openapi3_parser/node/operation"
|
4
|
+
require "openapi3_parser/node_factory/map"
|
5
|
+
require "openapi3_parser/node_factory/object"
|
6
|
+
require "openapi3_parser/node_factory/optional_reference"
|
7
|
+
require "openapi3_parser/node_factory/array"
|
8
|
+
require "openapi3_parser/node_factory/external_documentation"
|
9
|
+
require "openapi3_parser/node_factory/parameter"
|
10
|
+
require "openapi3_parser/node_factory/request_body"
|
11
|
+
require "openapi3_parser/node_factory/responses"
|
12
|
+
require "openapi3_parser/node_factory/callback"
|
13
|
+
require "openapi3_parser/node_factory/server"
|
14
|
+
require "openapi3_parser/node_factory/security_requirement"
|
15
|
+
require "openapi3_parser/validators/duplicate_parameters"
|
16
|
+
|
17
|
+
module Openapi3Parser
|
18
|
+
module NodeFactory
|
19
|
+
class Operation < NodeFactory::Object
|
20
|
+
allow_extensions
|
21
|
+
field "tags", factory: :tags_factory
|
22
|
+
field "summary", input_type: String
|
23
|
+
field "description", input_type: String
|
24
|
+
field "externalDocs", factory: NodeFactory::ExternalDocumentation
|
25
|
+
field "operationId", input_type: String
|
26
|
+
field "parameters", factory: :parameters_factory
|
27
|
+
field "requestBody", factory: :request_body_factory
|
28
|
+
field "responses", factory: NodeFactory::Responses,
|
29
|
+
required: true
|
30
|
+
field "callbacks", factory: :callbacks_factory
|
31
|
+
field "deprecated", input_type: :boolean, default: false
|
32
|
+
field "security", factory: :security_factory
|
33
|
+
field "servers", factory: :servers_factory
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def build_object(data, context)
|
38
|
+
Node::Operation.new(data, context)
|
39
|
+
end
|
40
|
+
|
41
|
+
def tags_factory(context)
|
42
|
+
NodeFactory::Array.new(context, value_input_type: String)
|
43
|
+
end
|
44
|
+
|
45
|
+
def parameters_factory(context)
|
46
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::Parameter)
|
47
|
+
|
48
|
+
validate_parameters = lambda do |validatable|
|
49
|
+
validatable.add_error(
|
50
|
+
Validators::DuplicateParameters.call(
|
51
|
+
validatable.factory.resolved_input
|
52
|
+
)
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
NodeFactory::Array.new(context,
|
57
|
+
value_factory: factory,
|
58
|
+
validate: validate_parameters)
|
59
|
+
end
|
60
|
+
|
61
|
+
def request_body_factory(context)
|
62
|
+
factory = NodeFactory::RequestBody
|
63
|
+
NodeFactory::OptionalReference.new(factory).call(context)
|
64
|
+
end
|
65
|
+
|
66
|
+
def callbacks_factory(context)
|
67
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::Callback)
|
68
|
+
NodeFactory::Map.new(context, value_factory: factory)
|
69
|
+
end
|
70
|
+
|
71
|
+
def responses_factory(context)
|
72
|
+
factory = NodeFactory::RequestBody
|
73
|
+
NodeFactory::OptionalReference.new(factory).call(context)
|
74
|
+
end
|
75
|
+
|
76
|
+
def security_factory(context)
|
77
|
+
NodeFactory::Array.new(context,
|
78
|
+
value_factory: NodeFactory::SecurityRequirement)
|
79
|
+
end
|
80
|
+
|
81
|
+
def servers_factory(context)
|
82
|
+
NodeFactory::Array.new(context,
|
83
|
+
value_factory: NodeFactory::Server)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "openapi3_parser/
|
3
|
+
require "openapi3_parser/node_factory/reference"
|
4
4
|
|
5
5
|
module Openapi3Parser
|
6
6
|
module NodeFactory
|
@@ -11,8 +11,12 @@ module Openapi3Parser
|
|
11
11
|
|
12
12
|
def call(context)
|
13
13
|
reference = context.input.is_a?(Hash) && context.input["$ref"]
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
if reference
|
16
|
+
NodeFactory::Reference.new(context, self)
|
17
|
+
else
|
18
|
+
factory.new(context)
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
private
|
@@ -2,15 +2,14 @@
|
|
2
2
|
|
3
3
|
require "openapi3_parser/context"
|
4
4
|
require "openapi3_parser/node/parameter"
|
5
|
-
require "openapi3_parser/
|
5
|
+
require "openapi3_parser/node_factory/parameter_like"
|
6
6
|
require "openapi3_parser/node_factory/object"
|
7
7
|
require "openapi3_parser/validation/error"
|
8
8
|
|
9
9
|
module Openapi3Parser
|
10
|
-
module
|
11
|
-
class Parameter
|
12
|
-
include
|
13
|
-
include Parameter::ParameterLike
|
10
|
+
module NodeFactory
|
11
|
+
class Parameter < NodeFactory::Object
|
12
|
+
include ParameterLike
|
14
13
|
|
15
14
|
allow_extensions
|
16
15
|
|
@@ -34,24 +33,19 @@ module Openapi3Parser
|
|
34
33
|
|
35
34
|
mutually_exclusive "example", "examples"
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
Node::Parameter.new(data, context)
|
41
|
-
end
|
42
|
-
|
43
|
-
def validate(input, context)
|
44
|
-
errors = []
|
45
|
-
|
46
|
-
if input["in"] == "path" && !input["required"]
|
47
|
-
errors << Validation::Error.new(
|
36
|
+
validate do |validatable|
|
37
|
+
if validatable.input["in"] == "path" && !validatable.input["required"]
|
38
|
+
validatable.add_error(
|
48
39
|
"Must be included and true for a path parameter",
|
49
|
-
Context.next_field(context, "required")
|
50
|
-
self.class
|
40
|
+
Context.next_field(validatable.context, "required")
|
51
41
|
)
|
52
42
|
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
53
46
|
|
54
|
-
|
47
|
+
def build_object(data, context)
|
48
|
+
Node::Parameter.new(data, context)
|
55
49
|
end
|
56
50
|
|
57
51
|
def default_style
|
@@ -59,9 +53,9 @@ module Openapi3Parser
|
|
59
53
|
"form"
|
60
54
|
end
|
61
55
|
|
62
|
-
def validate_in(
|
63
|
-
|
64
|
-
"in can only be header, query, cookie, or path"
|
56
|
+
def validate_in(validatable)
|
57
|
+
return if %w[header query cookie path].include?(validatable.input)
|
58
|
+
validatable.add_error("in can only be header, query, cookie, or path")
|
65
59
|
end
|
66
60
|
end
|
67
61
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Openapi3Parser
|
4
|
+
module NodeFactory
|
5
|
+
module ParameterLike
|
6
|
+
def default_explode
|
7
|
+
context.input["style"] == "form"
|
8
|
+
end
|
9
|
+
|
10
|
+
def schema_factory(context)
|
11
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::Schema)
|
12
|
+
factory.call(context)
|
13
|
+
end
|
14
|
+
|
15
|
+
def examples_factory(context)
|
16
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::Schema)
|
17
|
+
NodeFactory::Map.new(context,
|
18
|
+
default: nil,
|
19
|
+
value_factory: factory)
|
20
|
+
end
|
21
|
+
|
22
|
+
def content_factory(context)
|
23
|
+
NodeFactory::Map.new(context,
|
24
|
+
default: nil,
|
25
|
+
value_factory: NodeFactory::MediaType,
|
26
|
+
validate: method(:validate_content))
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate_content(validatable)
|
30
|
+
return if validatable.input.size == 1
|
31
|
+
validatable.add_error("Must only have one item")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# These are in the footer as a cyclic dependency can stop this module loading
|
38
|
+
require "openapi3_parser/node_factory/optional_reference"
|
39
|
+
require "openapi3_parser/node_factory/map"
|
40
|
+
require "openapi3_parser/node_factory/schema"
|
41
|
+
require "openapi3_parser/node_factory/example"
|
42
|
+
require "openapi3_parser/node_factory/media_type"
|
@@ -3,19 +3,17 @@
|
|
3
3
|
require "openapi3_parser/node/path_item"
|
4
4
|
require "openapi3_parser/node_factory/fields/reference"
|
5
5
|
require "openapi3_parser/node_factory/object"
|
6
|
-
require "openapi3_parser/node_factory/
|
6
|
+
require "openapi3_parser/node_factory/object_factory/node_builder"
|
7
7
|
require "openapi3_parser/node_factory/optional_reference"
|
8
|
-
require "openapi3_parser/
|
9
|
-
require "openapi3_parser/
|
10
|
-
require "openapi3_parser/
|
11
|
-
require "openapi3_parser/
|
8
|
+
require "openapi3_parser/node_factory/array"
|
9
|
+
require "openapi3_parser/node_factory/server"
|
10
|
+
require "openapi3_parser/node_factory/operation"
|
11
|
+
require "openapi3_parser/node_factory/parameter"
|
12
12
|
require "openapi3_parser/validators/duplicate_parameters"
|
13
13
|
|
14
14
|
module Openapi3Parser
|
15
|
-
module
|
16
|
-
class PathItem
|
17
|
-
include NodeFactory::Object
|
18
|
-
|
15
|
+
module NodeFactory
|
16
|
+
class PathItem < NodeFactory::Object
|
19
17
|
allow_extensions
|
20
18
|
field "$ref", input_type: String, factory: :ref_factory
|
21
19
|
field "summary", input_type: String
|
@@ -31,10 +29,6 @@ module Openapi3Parser
|
|
31
29
|
field "servers", factory: :servers_factory
|
32
30
|
field "parameters", factory: :parameters_factory
|
33
31
|
|
34
|
-
def node_data
|
35
|
-
NodeBuilder.new(processed_input, self).data
|
36
|
-
end
|
37
|
-
|
38
32
|
private
|
39
33
|
|
40
34
|
def build_object(data, context)
|
@@ -45,44 +39,48 @@ module Openapi3Parser
|
|
45
39
|
end
|
46
40
|
|
47
41
|
def ref_factory(context)
|
48
|
-
Fields::Reference.new(context, self.class)
|
42
|
+
NodeFactory::Fields::Reference.new(context, self.class)
|
49
43
|
end
|
50
44
|
|
51
45
|
def operation_factory(context)
|
52
|
-
|
46
|
+
NodeFactory::Operation.new(context)
|
53
47
|
end
|
54
48
|
|
55
49
|
def servers_factory(context)
|
56
|
-
|
50
|
+
NodeFactory::Array.new(
|
57
51
|
context,
|
58
|
-
value_factory:
|
52
|
+
value_factory: NodeFactory::Server
|
59
53
|
)
|
60
54
|
end
|
61
55
|
|
62
56
|
def build_resolved_input
|
63
|
-
ref =
|
64
|
-
|
65
|
-
return
|
57
|
+
ref = data["$ref"]
|
58
|
+
data_without_ref = super.tap { |d| d.delete("$ref") }
|
59
|
+
return data_without_ref unless ref
|
66
60
|
|
67
|
-
merge_data(ref.
|
61
|
+
merge_data(ref.resolved_input || {}, data_without_ref)
|
68
62
|
end
|
69
63
|
|
70
64
|
def merge_data(base, priority)
|
71
|
-
base.merge(priority) do |_,
|
65
|
+
base.merge(priority) do |_, old, new|
|
72
66
|
new.nil? ? old : new
|
73
67
|
end
|
74
68
|
end
|
75
69
|
|
76
70
|
def parameters_factory(context)
|
77
|
-
factory = NodeFactory::OptionalReference.new(
|
78
|
-
|
79
|
-
|
80
|
-
|
71
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::Parameter)
|
72
|
+
|
73
|
+
validate_parameters = lambda do |validatable|
|
74
|
+
validatable.add_error(
|
75
|
+
Validators::DuplicateParameters.call(
|
76
|
+
validatable.factory.resolved_input
|
77
|
+
)
|
78
|
+
)
|
81
79
|
end
|
82
80
|
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
NodeFactory::Array.new(context,
|
82
|
+
value_factory: factory,
|
83
|
+
validate: validate_parameters)
|
86
84
|
end
|
87
85
|
end
|
88
86
|
end
|
@@ -2,13 +2,12 @@
|
|
2
2
|
|
3
3
|
require "openapi3_parser/node_factory/map"
|
4
4
|
require "openapi3_parser/node_factory/optional_reference"
|
5
|
-
require "openapi3_parser/
|
5
|
+
require "openapi3_parser/node_factory/path_item"
|
6
6
|
require "openapi3_parser/node/paths"
|
7
7
|
|
8
8
|
module Openapi3Parser
|
9
|
-
module
|
10
|
-
class Paths
|
11
|
-
include NodeFactory::Map
|
9
|
+
module NodeFactory
|
10
|
+
class Paths < NodeFactory::Map
|
12
11
|
PATH_REGEX = %r{
|
13
12
|
\A
|
14
13
|
# required prefix slash
|
@@ -24,46 +23,41 @@ module Openapi3Parser
|
|
24
23
|
\Z
|
25
24
|
}x
|
26
25
|
|
27
|
-
|
26
|
+
def initialize(context)
|
27
|
+
factory = NodeFactory::OptionalReference.new(NodeFactory::PathItem)
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
memo[key] = child_factory(next_context)
|
34
|
-
end
|
29
|
+
super(context,
|
30
|
+
allow_extensions: true,
|
31
|
+
value_factory: factory,
|
32
|
+
validate: :validate)
|
35
33
|
end
|
36
34
|
|
37
|
-
|
38
|
-
NodeFactory::OptionalReference.new(NodeFactories::PathItem)
|
39
|
-
.call(child_context)
|
40
|
-
end
|
35
|
+
private
|
41
36
|
|
42
|
-
def
|
37
|
+
def build_node(data)
|
43
38
|
Node::Paths.new(data, context)
|
44
39
|
end
|
45
40
|
|
46
|
-
def validate(
|
47
|
-
paths = input.keys.reject
|
48
|
-
|
41
|
+
def validate(validatable)
|
42
|
+
paths = validatable.input.keys.reject do |key|
|
43
|
+
NodeFactory::EXTENSION_REGEX =~ key
|
44
|
+
end
|
45
|
+
validate_paths(validatable, paths)
|
49
46
|
end
|
50
47
|
|
51
|
-
def validate_paths(paths)
|
48
|
+
def validate_paths(validatable, paths)
|
52
49
|
invalid_paths = paths.reject { |p| PATH_REGEX.match(p) }
|
53
|
-
errors = []
|
54
50
|
unless invalid_paths.empty?
|
55
51
|
joined = invalid_paths.map { |p| "'#{p}'" }.join(", ")
|
56
|
-
|
52
|
+
validatable.add_error("There are invalid paths: #{joined}")
|
57
53
|
end
|
58
54
|
|
59
55
|
conflicts = conflicting_paths(paths)
|
60
56
|
|
61
|
-
|
62
|
-
joined = conflicts.map { |p| "'#{p}'" }.join(", ")
|
63
|
-
errors << %(There are paths that conflict: #{joined})
|
64
|
-
end
|
57
|
+
return if conflicts.empty?
|
65
58
|
|
66
|
-
|
59
|
+
joined = conflicts.map { |p| "'#{p}'" }.join(", ")
|
60
|
+
validatable.add_error("There are paths that conflict: #{joined}")
|
67
61
|
end
|
68
62
|
|
69
63
|
def conflicting_paths(paths)
|