Skip to content

Commit 63e699d

Browse files
authored
Merge pull request rmosolgo#3986 from geshwho/mt/repeatable-directives
Allow multiples of repeatable directives
2 parents 2f13966 + ba3609a commit 63e699d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

lib/graphql/schema/member/has_directives.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ module HasDirectives
1111
# @return [void]
1212
def directive(dir_class, **options)
1313
@own_directives ||= []
14-
remove_directive(dir_class)
14+
remove_directive(dir_class) unless dir_class.repeatable?
1515
@own_directives << dir_class.new(self, **options)
1616
nil
1717
end

spec/graphql/schema/directive_spec.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,46 @@ class Thing < GraphQL::Schema::Object
8080
assert_equal "@secret.topSecret is required, but no value was given", err2.message
8181
end
8282

83+
describe 'repeatable directives' do
84+
module RepeatDirectiveTest
85+
class Secret < GraphQL::Schema::Directive
86+
argument :secret, String
87+
locations OBJECT, INTERFACE
88+
repeatable true
89+
end
90+
91+
class OtherSecret < GraphQL::Schema::Directive
92+
argument :secret, String
93+
locations OBJECT, INTERFACE
94+
repeatable false
95+
end
96+
97+
class Thing < GraphQL::Schema::Object
98+
directive(Secret, secret: "my secret")
99+
directive(Secret, secret: "my second secret")
100+
101+
directive(OtherSecret, secret: "other secret")
102+
directive(OtherSecret, secret: "second other secret")
103+
end
104+
end
105+
106+
it "allows repeatable directives twice" do
107+
directives = RepeatDirectiveTest::Thing.directives
108+
secret_directives = directives.select{ |x| x.is_a?(RepeatDirectiveTest::Secret) }
109+
110+
assert_equal 2, secret_directives.size
111+
assert_equal ["my secret", "my second secret"], secret_directives.map{ |d| d.arguments[:secret] }
112+
end
113+
114+
it "overwrites non-repeatable directives" do
115+
directives = RepeatDirectiveTest::Thing.directives
116+
other_directives = directives.select{ |x| x.is_a?(RepeatDirectiveTest::OtherSecret) }
117+
118+
assert_equal 1, other_directives.size
119+
assert_equal ["second other secret"], other_directives.map{ |d| d.arguments[:secret] }
120+
end
121+
end
122+
83123
module RuntimeDirectiveTest
84124
class CountFields < GraphQL::Schema::Directive
85125
locations(FIELD, FRAGMENT_SPREAD, INLINE_FRAGMENT)

0 commit comments

Comments
 (0)