module GraphQL::Schema::Interface::DefinitionMethods
def accessible?(context)
def accessible?(context) context.schema.possible_types(self, context).each do |type| if context.schema.accessible?(type, context) return true end end false end
def definition_methods(&block)
- Added as class methods to this interface
Methods defined in this block will be:
def definition_methods(&block) self::DefinitionMethods.module_eval(&block) end
def included(child_class)
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
def kind
def kind GraphQL::TypeKinds::INTERFACE end
def orphan_types(*types)
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
def type_membership_class(membership_class = nil)
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
def visible?(context)
- See: {Schema::Warden} - hides interfaces without visible implementations
def visible?(context) true end