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

Constant Summary

Constants included from Member::HasFields

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

Instance Attribute Summary

Attributes included from Member::HasAstNode

#ast_node

Attributes included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Attributes included from Member::BaseDSLMethods

#default_graphql_name, #graphql_name

Instance Method Summary collapse

Methods included from Member::HasInterfaces

#implements, #interface_type_memberships, #interfaces, #own_interface_type_memberships

Methods included from Member::HasDirectives

add_directive, #directive, #directives, get_directives, #inherited, #remove_directive, remove_directive

Methods included from Member::HasAstNode

#inherited

Methods included from Member::Scoped

#inherited, #reauthorize_scoped_objects, #scope_items

Methods included from Member::HasPath

#path

Methods included from Member::HasFields

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

Methods included from Member::TypeSystemHelpers

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

Methods included from Member::BaseDSLMethods

#authorized?, #default_relay, #description, #introspection, #introspection?, #mutation, #name

Instance Method Details

#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

[View source]

22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/graphql/schema/interface.rb', line 22

def definition_methods(&block)
  # 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 !defined?(@_definition_methods)
    defn_methods_module = Module.new
    @_definition_methods = defn_methods_module
    const_set(:DefinitionMethods, defn_methods_module)
    extend(self::DefinitionMethods)
  end
  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.

[View source]

49
50
51
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
# File 'lib/graphql/schema/interface.rb', line 49

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) && ancestor != child_class
        child_class.extend(ancestor::DefinitionMethods)
      end
    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_locations(0, 10).find do |location|
      location.base_label == "implements" &&
        location.path.end_with?("schema/member/has_interfaces.rb")
    end

    if !backtrace_line
      raise "Attach interfaces using `implements(#{self})`, not `include(#{self})`"
    end
  end

  super
end

#kindObject

[View source]

95
96
97
# File 'lib/graphql/schema/interface.rb', line 95

def kind
  GraphQL::TypeKinds::INTERFACE
end

#orphan_types(*types) ⇒ Object

[View source]

85
86
87
88
89
90
91
92
93
# File 'lib/graphql/schema/interface.rb', line 85

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

#type_membership_class(membership_class = nil) ⇒ Object

[View source]

40
41
42
43
44
45
46
# File 'lib/graphql/schema/interface.rb', line 40

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
[View source]

36
37
38
# File 'lib/graphql/schema/interface.rb', line 36

def visible?(context)
  true
end