Module: GraphQL::Schema::Interface::DefinitionMethods

Constant Summary

Constants included from Member::HasDirectives

Member::HasDirectives::NO_DIRECTIVES

Constants included from Member::HasFields

Member::HasFields::CONFLICT_FIELD_NAMES, Member::HasFields::GRAPHQL_RUBY_KEYWORDS, Member::HasFields::RUBY_KEYWORDS

Instance Method Summary collapse

Methods included from Member::HasInterfaces

#implements, #interface_type_memberships, #interfaces, #own_interface_type_memberships

Methods included from Member::HasDirectives

#directive, #directives, #remove_directive

Methods included from Member::HasAstNode

#ast_node

Methods included from Member::Scoped

#scope_items

Methods included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Methods included from Member::HasPath

#path

Methods included from Member::HasFields

#add_field, #all_field_definitions, #field, #field_class, #fields, #get_field, #global_id_field, #own_fields

Methods included from Member::TypeSystemHelpers

#list?, #non_null?, #to_list_type, #to_non_null_type, #to_type_signature

Methods included from Member::BaseDSLMethods

#authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name

Methods included from Relay::TypeExtensions

#connection_type, #define_connection, #define_edge, #edge_type

Methods included from Member::CachedGraphQLDefinition

#deprecated_to_graphql, #graphql_definition, #initialize_copy, #type_class

Instance Method Details

#accessible?(context) ⇒ Boolean

The interface is accessible if any of its possible types are accessible

Returns:


34
35
36
37
38
39
40
41
# File 'lib/graphql/schema/interface.rb', line 34

def accessible?(context)
  context.schema.possible_types(self, context).each do |type|
    if context.schema.accessible?(type, context)
      return true
    end
  end
  false
end

#definition_methods(&block) ⇒ Object

Methods defined in this block will be:

  • Added as class methods to this interface
  • Added as class methods to all child interfaces

24
25
26
# File 'lib/graphql/schema/interface.rb', line 24

def definition_methods(&block)
  self::DefinitionMethods.module_eval(&block)
end

#included(child_class) ⇒ Object

Here's the tricky part. Make sure behavior keeps making its way down the inheritance chain.


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/graphql/schema/interface.rb', line 52

def included(child_class)
  if !child_class.is_a?(Class)
    # In this case, it's been included into another interface.
    # This is how interface inheritance is implemented

    # We need this before we can call `own_interfaces`
    child_class.extend(Schema::Interface::DefinitionMethods)

    child_class.type_membership_class(self.type_membership_class)
    child_class.ancestors.reverse_each do |ancestor|
      if ancestor.const_defined?(:DefinitionMethods)
        child_class.extend(ancestor::DefinitionMethods)
      end
    end

    # Use an instance variable to tell whether it's been included previously or not;
    # You can't use constant detection because constants are brought into scope
    # by `include`, which has already happened at this point.
    if !child_class.instance_variable_defined?(:@_definition_methods)
      defn_methods_module = Module.new
      child_class.instance_variable_set(:@_definition_methods, defn_methods_module)
      child_class.const_set(:DefinitionMethods, defn_methods_module)
      child_class.extend(child_class::DefinitionMethods)
    end
    child_class.introspection(introspection)
    child_class.description(description)
    # If interfaces are mixed into each other, only define this class once
    if !child_class.const_defined?(:UnresolvedTypeError, false)
      add_unresolved_type_error(child_class)
    end
  elsif child_class < GraphQL::Schema::Object
    # This is being included into an object type, make sure it's using `implements(...)`
    backtrace_line = caller(0, 10).find { |line| line.include?("schema/member/has_interfaces.rb") && line.include?("in `implements'")}
    if !backtrace_line
      raise "Attach interfaces using `implements(#{self})`, not `include(#{self})`"
    end
  end

  super
end

#kindObject


123
124
125
# File 'lib/graphql/schema/interface.rb', line 123

def kind
  GraphQL::TypeKinds::INTERFACE
end

#orphan_types(*types) ⇒ Object


93
94
95
96
97
98
99
100
101
# File 'lib/graphql/schema/interface.rb', line 93

def orphan_types(*types)
  if types.any?
    @orphan_types = types
  else
    all_orphan_types = @orphan_types || []
    all_orphan_types += super if defined?(super)
    all_orphan_types.uniq
  end
end

#to_graphqlObject


105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/graphql/schema/interface.rb', line 105

def to_graphql
  type_defn = GraphQL::InterfaceType.new
  type_defn.name = graphql_name
  type_defn.description = description
  type_defn.orphan_types = orphan_types
  type_defn.type_membership_class = self.type_membership_class
  type_defn.ast_node = ast_node
  fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
    field_defn = field_inst.graphql_definition(silence_deprecation_warning: true)
    type_defn.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
  end
  type_defn.[:type_class] = self
  if respond_to?(:resolve_type)
    type_defn.resolve_type = method(:resolve_type)
  end
  type_defn
end

#type_membership_class(membership_class = nil) ⇒ Object


43
44
45
46
47
48
49
# File 'lib/graphql/schema/interface.rb', line 43

def type_membership_class(membership_class = nil)
  if membership_class
    @type_membership_class = membership_class
  else
    @type_membership_class || find_inherited_value(:type_membership_class, GraphQL::Schema::TypeMembership)
  end
end

#visible?(context) ⇒ Boolean

Returns:

See Also:

  • hides interfaces without visible implementations

29
30
31
# File 'lib/graphql/schema/interface.rb', line 29

def visible?(context)
  true
end