Module: GraphQL::Schema::Member::HasFields Private
- Included in:
- Interface::DefinitionMethods, GraphQL::Schema::Mutation, Object
- Defined in:
- lib/graphql/schema/member/has_fields.rb
Overview
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Shared code for Object and Interface
Class Method Summary collapse
-
.add_default_resolve_module(child_class) ⇒ Object
private
Create a module which will have instance methods for implementing fields.
-
.extended(child_class) ⇒ Object
private
When this module is added to a class, add a place for that class’s default behaviors.
Instance Method Summary collapse
-
#add_field(field_defn) ⇒ void
private
Register this field with the class, overriding a previous one if needed.
-
#field(*args, **kwargs, &block) ⇒ void
private
Add a field to this object or interface with the given definition.
-
#field_class(new_field_class = nil) ⇒ Class
private
The class to initialize when adding fields to this kind of schema member.
-
#fields ⇒ Hash<String => GraphQL::Schema::Field>
private
Fields on this object, keyed by name, including inherited fields.
-
#get_field(field_name) ⇒ Object
private
-
#global_id_field(field_name) ⇒ Object
private
-
#included(child_class) ⇒ Object
private
When this is included into interfaces, add a place for default field behaviors.
-
#inherited(child_class) ⇒ Object
private
When a subclass of objects are created, add a place for that subclass’s default field behaviors.
-
#own_fields ⇒ Array<GraphQL::Schema::Field>
private
Fields defined on this class specifically, not parent classes.
Class Method Details
.add_default_resolve_module(child_class) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Create a module which will have instance methods for implementing fields.
These will be super
methods for fields in interfaces, objects and mutations.
Use an instance variable on the class instead of a constant
so that module namespaces won’t be an issue. (If we used constants,
child_class::DefaultResolve
might find a constant from an included module.)
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/graphql/schema/member/has_fields.rb', line 20 def add_default_resolve_module(child_class) if child_class.instance_variable_get(:@_default_resolve) # This can happen when an object implements an interface, # since that interface has the `included` hook above. return end default_resolve_module = Module.new child_class.instance_variable_set(:@_default_resolve, default_resolve_module) child_class.include(default_resolve_module) end |
.extended(child_class) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
When this module is added to a class, add a place for that class’s default behaviors
10 11 12 13 |
# File 'lib/graphql/schema/member/has_fields.rb', line 10 def self.extended(child_class) add_default_resolve_module(child_class) super end |
Instance Method Details
#add_field(field_defn) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Register this field with the class, overriding a previous one if needed. Also, add a parent method for resolving this field.
82 83 84 85 86 87 88 89 |
# File 'lib/graphql/schema/member/has_fields.rb', line 82 def add_field(field_defn) own_fields[field_defn.name] = field_defn if !method_defined?(field_defn.method_sym) # Only add the super method if there isn't one already. add_super_method(field_defn.name.inspect, field_defn.method_sym) end nil end |
#field(*args, **kwargs, &block) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Add a field to this object or interface with the given definition
51 52 53 54 55 |
# File 'lib/graphql/schema/member/has_fields.rb', line 51 def field(*args, **kwargs, &block) field_defn = field_class.(*args, owner: self, **kwargs, &block) add_field(field_defn) nil end |
#field_class(new_field_class = nil) ⇒ Class
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The class to initialize when adding fields to this kind of schema member.
92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/graphql/schema/member/has_fields.rb', line 92 def field_class(new_field_class = nil) if new_field_class @field_class = new_field_class elsif @field_class @field_class elsif self.is_a?(Class) superclass.respond_to?(:field_class) ? superclass.field_class : GraphQL::Schema::Field else ancestor = ancestors[1..-1].find { |a| a.respond_to?(:field_class) && a.field_class } ancestor ? ancestor.field_class : GraphQL::Schema::Field end end |
#fields ⇒ Hash<String => GraphQL::Schema::Field>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Fields on this object, keyed by name, including inherited fields.
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/graphql/schema/member/has_fields.rb', line 58 def fields # Local overrides take precedence over inherited fields all_fields = {} ancestors.reverse_each do |ancestor| if ancestor.respond_to?(:own_fields) all_fields.merge!(ancestor.own_fields) end end all_fields end |
#get_field(field_name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
69 70 71 72 73 74 75 76 |
# File 'lib/graphql/schema/member/has_fields.rb', line 69 def get_field(field_name) for ancestor in ancestors if ancestor.respond_to?(:own_fields) && f = ancestor.own_fields[field_name] return f end end nil end |
#global_id_field(field_name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
105 106 107 |
# File 'lib/graphql/schema/member/has_fields.rb', line 105 def global_id_field(field_name) field field_name, "ID", null: false, resolve: GraphQL::Relay::GlobalIdResolve.new(type: self) end |
#included(child_class) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
When this is included into interfaces, add a place for default field behaviors
35 36 37 38 39 |
# File 'lib/graphql/schema/member/has_fields.rb', line 35 def included(child_class) HasFields.add_default_resolve_module(child_class) # Also, prepare a place for default field implementations super end |
#inherited(child_class) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
When a subclass of objects are created, add a place for that subclass’s default field behaviors
43 44 45 46 |
# File 'lib/graphql/schema/member/has_fields.rb', line 43 def inherited(child_class) HasFields.add_default_resolve_module(child_class) super end |
#own_fields ⇒ Array<GraphQL::Schema::Field>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Fields defined on this class specifically, not parent classes.
110 111 112 |
# File 'lib/graphql/schema/member/has_fields.rb', line 110 def own_fields @own_fields ||= {} end |