I'm trying to define dynamically the following exemplifying schema:
query_type = GraphQL::ObjectType.define do
name "Query"
field :foo, types.Int do
argument :id, types.ID, required: true
resolve ->(_,_,_) { 0 }
end
end
schema = GraphQL::Schema.define do
query(query_type)
end
p schema.execute('{ foo(id: 1) }')
But it fails with this exception:
40: from main.rb:134:in `<main>'
39: from [..]/graphql/define/instance_definable.rb:228:in `define'
38: from [..]/graphql/schema.rb:233:in `define'
37: from [..]/graphql/schema/validation.rb:19:in `validate'
36: from [..]/graphql/schema/validation.rb:19:in `reduce'
35: from [..]/graphql/schema/validation.rb:19:in `each'
34: from [..]/graphql/schema/validation.rb:19:in `block in validate'
33: from [..]/graphql/schema/validation.rb:134:in `block in <module:Rules>'
32: from [..]/graphql/schema.rb:272:in `types'
31: from [..]/graphql/schema.rb:1059:in `rebuild_artifacts'
30: from [..]/graphql/schema.rb:1059:in `new'
29: from [..]/graphql/schema/traversal.rb:43:in `initialize'
28: from [..]/graphql/schema/traversal.rb:124:in `visit'
27: from [..]/graphql/schema/traversal.rb:124:in `each'
26: from [..]/graphql/schema/traversal.rb:124:in `block in visit'
25: from [..]/graphql/schema/traversal.rb:138:in `visit'
24: from [..]/graphql/schema/traversal.rb:217:in `validate_type'
23: from [..]/graphql/schema/validation.rb:19:in `validate'
22: from [..]/graphql/schema/validation.rb:19:in `reduce'
21: from [..]/graphql/schema/validation.rb:19:in `each'
20: from [..]/graphql/schema/validation.rb:19:in `block in validate'
19: from [..]/graphql/schema/validation.rb:79:in `block in assert_named_items_are_valid'
18: from [..]/graphql/schema/validation.rb:79:in `each'
17: from [..]/graphql/schema/validation.rb:80:in `block (2 levels) in assert_named_items_are_valid'
16: from [..]/graphql/schema/validation.rb:19:in `validate'
15: from [..]/graphql/schema/validation.rb:19:in `reduce'
14: from [..]/graphql/schema/validation.rb:19:in `each'
13: from [..]/graphql/schema/validation.rb:19:in `block in validate'
12: from [..]/graphql/schema/validation.rb:30:in `block in assert_property'
11: from [..]/graphql/schema/validation.rb:30:in `public_send'
10: from [..]/graphql/define/instance_definable.rb:206:in `block (3 levels) in stash_dependent_methods'
9: from [..]/graphql/define/instance_definable.rb:161:in `ensure_defined'
8: from [..]/graphql/define/instance_definable.rb:161:in `instance_eval'
7: from main.rb:130:in `block (2 levels) in <main>'
6: from [..]/graphql/define/defined_object_proxy.rb:38:in `method_missing'
5: from [..]/graphql/define/assign_argument.rb:8:in `call'
4: from [..]/graphql/define/instance_definable.rb:206:in `block (3 levels) in stash_dependent_methods'
3: from [..]/graphql/define/instance_definable.rb:156:in `ensure_defined'
2: from [..]/graphql/define/instance_definable.rb:156:in `each'
1: from [..]/graphql/define/instance_definable.rb:157:in `block in ensure_defined'
[..]/graphql/define/instance_definable.rb:157:in `public_send': GraphQL::Argument can't define 'required' (GraphQL::Define::NoDefinitionError)
The required option seems to be not supported, so how can I define a mandatory argument dynamically?
Environment:
The old .define-based api overloads ruby's ! operator to express non-nullability, eg
argument :id, !types.ID
Personally I recommend using classes instead, for example:
query_type = Class.new(GraphQL::Schema::Object) do
field :foo, Integer, null: true do
argument :id, ID, required: true
end
def foo; 0; end
end
hope that helps!
Most helpful comment
The old
.define-based api overloads ruby's!operator to express non-nullability, egPersonally I recommend using classes instead, for example:
hope that helps!