Skip to content

Commit 75129f2

Browse files
committed
Allow repeated repeatable directives
1 parent 7cb6b3e commit 75129f2

File tree

7 files changed

+24
-5
lines changed

7 files changed

+24
-5
lines changed

lib/graphql/static_validation/base_visitor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def on_field(node, parent)
110110
end
111111

112112
def on_directive(node, parent)
113-
directive_defn = @schema.directives[node.name]
113+
directive_defn = @context.schema_directives[node.name]
114114
@directive_definitions.push(directive_defn)
115115
super
116116
@directive_definitions.pop

lib/graphql/static_validation/rules/arguments_are_defined.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def parent_definition(parent)
5959
end
6060
end
6161
when GraphQL::Language::Nodes::Directive
62-
context.schema.directives[parent.name]
62+
context.schema_directives[parent.name]
6363
when GraphQL::Language::Nodes::Field
6464
context.field_definition
6565
else

lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module DirectivesAreInValidLocations
55
include GraphQL::Language
66

77
def on_directive(node, parent)
8-
validate_location(node, parent, context.schema.directives)
8+
validate_location(node, parent, context.schema_directives)
99
super
1010
end
1111

lib/graphql/static_validation/rules/required_arguments_are_present.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def on_field(node, _parent)
88
end
99

1010
def on_directive(node, _parent)
11-
directive_defn = context.schema.directives[node.name]
11+
directive_defn = context.schema_directives[node.name]
1212
assert_required_args(node, directive_defn)
1313
super
1414
end

lib/graphql/static_validation/rules/unique_directives_per_location.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def validate_directive_location(node)
4040
nodes: [used_directives[directive_name], ast_directive],
4141
directive: directive_name,
4242
))
43-
else
43+
elsif !((dir_defn = context.schema_directives[directive_name]) && dir_defn.repeatable?)
4444
used_directives[directive_name] = ast_directive
4545
end
4646
end

lib/graphql/static_validation/validation_context.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def validate_literal(ast_value, type)
4444
def too_many_errors?
4545
@errors.length >= @max_errors
4646
end
47+
48+
def schema_directives
49+
@schema_directives ||= schema.directives
50+
end
4751
end
4852
end
4953
end

spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
1616
directive @A on FIELD
1717
directive @B on FIELD
18+
directive @C repeatable on FIELD
1819
") }
1920

2021
describe "query with no directives" do
@@ -31,6 +32,20 @@
3132
end
3233
end
3334

35+
describe "query with repeatable directives" do
36+
let(:query_string) {"
37+
{
38+
type {
39+
field @C @C @C
40+
}
41+
}
42+
"}
43+
44+
it "passes rule" do
45+
assert_equal [], errors
46+
end
47+
end
48+
3449
describe "query with unique directives in different locations" do
3550
let(:query_string) {"
3651
{

0 commit comments

Comments
 (0)