Class: GraphQL::Schema::Directive

Inherits:
Member
  • Object
show all
Extended by:
Member::HasArguments, Member::HasArguments::HasDirectiveArguments, Member::HasValidators
Defined in:
lib/graphql/schema/directive.rb,
lib/graphql/schema/directive/skip.rb,
lib/graphql/schema/directive/one_of.rb,
lib/graphql/schema/directive/feature.rb,
lib/graphql/schema/directive/flagged.rb,
lib/graphql/schema/directive/include.rb,
lib/graphql/schema/directive/transform.rb,
lib/graphql/schema/directive/deprecated.rb,
lib/graphql/schema/directive/specified_by.rb

Overview

Subclasses of this can influence how Execution::Interpreter runs queries.

  • Directive.include?: if it returns false, the field or fragment will be skipped altogether, as if it were absent
  • Directive.resolve: Wraps field resolution (so it should call yield to continue)

Direct Known Subclasses

Deprecated, Feature, Flagged, Include, OneOf, Skip, SpecifiedBy, Transform

Defined Under Namespace

Classes: Deprecated, Feature, Flagged, Include, InvalidArgumentError, OneOf, Skip, SpecifiedBy, Transform

Constant Summary collapse

LOCATIONS =
[
  QUERY =                  :QUERY,
  MUTATION =               :MUTATION,
  SUBSCRIPTION =           :SUBSCRIPTION,
  FIELD =                  :FIELD,
  FRAGMENT_DEFINITION =    :FRAGMENT_DEFINITION,
  FRAGMENT_SPREAD =        :FRAGMENT_SPREAD,
  INLINE_FRAGMENT =        :INLINE_FRAGMENT,
  SCHEMA =                 :SCHEMA,
  SCALAR =                 :SCALAR,
  OBJECT =                 :OBJECT,
  FIELD_DEFINITION =       :FIELD_DEFINITION,
  ARGUMENT_DEFINITION =    :ARGUMENT_DEFINITION,
  INTERFACE =              :INTERFACE,
  UNION =                  :UNION,
  ENUM =                   :ENUM,
  ENUM_VALUE =             :ENUM_VALUE,
  INPUT_OBJECT =           :INPUT_OBJECT,
  INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
  VARIABLE_DEFINITION =    :VARIABLE_DEFINITION,
]
DEFAULT_DEPRECATION_REASON =
'No longer supported'
LOCATION_DESCRIPTIONS =
{
  QUERY:                    'Location adjacent to a query operation.',
  MUTATION:                 'Location adjacent to a mutation operation.',
  SUBSCRIPTION:             'Location adjacent to a subscription operation.',
  FIELD:                    'Location adjacent to a field.',
  FRAGMENT_DEFINITION:      'Location adjacent to a fragment definition.',
  FRAGMENT_SPREAD:          'Location adjacent to a fragment spread.',
  INLINE_FRAGMENT:          'Location adjacent to an inline fragment.',
  SCHEMA:                   'Location adjacent to a schema definition.',
  SCALAR:                   'Location adjacent to a scalar definition.',
  OBJECT:                   'Location adjacent to an object type definition.',
  FIELD_DEFINITION:         'Location adjacent to a field definition.',
  ARGUMENT_DEFINITION:      'Location adjacent to an argument definition.',
  INTERFACE:                'Location adjacent to an interface definition.',
  UNION:                    'Location adjacent to a union definition.',
  ENUM:                     'Location adjacent to an enum definition.',
  ENUM_VALUE:               'Location adjacent to an enum value definition.',
  INPUT_OBJECT:             'Location adjacent to an input object type definition.',
  INPUT_FIELD_DEFINITION:   'Location adjacent to an input object field definition.',
  VARIABLE_DEFINITION:      'Location adjacent to a variable definition.',
}

Constants included from Member::HasArguments

Member::HasArguments::NO_ARGUMENTS

Constants included from EmptyObjects

EmptyObjects::EMPTY_ARRAY, EmptyObjects::EMPTY_HASH

Constants included from Member::GraphQLTypeNames

Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int

Instance Attribute Summary collapse

Attributes included from Member::BaseDSLMethods

#default_graphql_name

Attributes included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Attributes included from Member::HasAstNode

#ast_node

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Member::HasArguments

add_argument, all_argument_definitions, any_arguments?, argument, argument_class, arguments_statically_coercible?, coerce_arguments, get_argument, own_arguments, remove_argument, validate_directive_argument

Methods included from Member::HasArguments::HasDirectiveArguments

validate_directive_argument

Methods included from Member::HasValidators

validates, validators

Methods included from Member::BaseDSLMethods

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

Methods included from Member::BaseDSLMethods::ConfigurationExtension

#inherited

Methods included from Member::TypeSystemHelpers

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

Methods included from Member::Scoped

#inherited, #reauthorize_scoped_objects, #scope_items

Methods included from Member::HasPath

#path

Methods included from Member::HasAstNode

#inherited

Methods included from Member::HasDirectives

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

Constructor Details

#initialize(owner, **arguments) ⇒ Directive

Returns a new instance of Directive.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/graphql/schema/directive.rb', line 122

def initialize(owner, **arguments)
  @owner = owner
  assert_valid_owner
  # It's be nice if we had the real context here, but we don't. What we _would_ get is:
  # - error handling
  # - lazy resolution
  # Probably, those won't be needed here, since these are configuration arguments,
  # not runtime arguments.
  context = Query::NullContext.instance
  self.class.all_argument_definitions.each do |arg_defn|
    value = arguments[arg_defn.keyword]
    result = arg_defn.type.validate_input(value, context)
    if !result.valid?
      raise InvalidArgumentError, "@#{graphql_name}.#{arg_defn.graphql_name} on #{owner.path} is invalid (#{value.inspect}): #{result.problems.first["explanation"]}"
    end
  end
  self.class.validate!(arguments, context)
  @arguments = self.class.coerce_arguments(nil, arguments, context)
  if @arguments.is_a?(GraphQL::ExecutionError)
    raise @arguments
  end
end

Instance Attribute Details

#argumentsGraphQL::Interpreter::Arguments (readonly)

Returns:

  • (GraphQL::Interpreter::Arguments)


117
118
119
# File 'lib/graphql/schema/directive.rb', line 117

def arguments
  @arguments
end

#ownerGraphQL::Schema::Field, ... (readonly)



114
115
116
# File 'lib/graphql/schema/directive.rb', line 114

def owner
  @owner
end

Class Method Details

.default_directive(new_default_directive = nil) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'lib/graphql/schema/directive.rb', line 45

def default_directive(new_default_directive = nil)
  if new_default_directive != nil
    @default_directive = new_default_directive
  elsif @default_directive.nil?
    @default_directive = (superclass.respond_to?(:default_directive) ? superclass.default_directive : false)
  else
    !!@default_directive
  end
end

.default_directive?Boolean

Returns:



55
56
57
# File 'lib/graphql/schema/directive.rb', line 55

def default_directive?
  default_directive
end

.default_graphql_nameObject

Return a name based on the class name, but downcase the first letter.



24
25
26
27
28
29
30
# File 'lib/graphql/schema/directive.rb', line 24

def default_graphql_name
  @default_graphql_name ||= begin
    camelized_name = super.dup
    camelized_name[0] = camelized_name[0].downcase
    -camelized_name
  end
end

.include?(_object, arguments, context) ⇒ Boolean

If false, this part of the query won’t be evaluated

Returns:



60
61
62
# File 'lib/graphql/schema/directive.rb', line 60

def include?(_object, arguments, context)
  static_include?(arguments, context)
end

.locations(*new_locations) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/graphql/schema/directive.rb', line 32

def locations(*new_locations)
  if !new_locations.empty?
    new_locations.each do |new_loc|
      if !LOCATIONS.include?(new_loc.to_sym)
        raise ArgumentError, "#{self} (#{self.graphql_name}) has an invalid directive location: `locations #{new_loc}` "
      end
    end
    @locations = new_locations
  else
    @locations ||= (superclass.respond_to?(:locations) ? superclass.locations : [])
  end
end

.on_field?Boolean

Returns:



83
84
85
# File 'lib/graphql/schema/directive.rb', line 83

def on_field?
  locations.include?(FIELD)
end

.on_fragment?Boolean

Returns:



87
88
89
# File 'lib/graphql/schema/directive.rb', line 87

def on_fragment?
  locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
end

.on_operation?Boolean

Returns:



91
92
93
# File 'lib/graphql/schema/directive.rb', line 91

def on_operation?
  locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
end

.pathObject



18
19
20
# File 'lib/graphql/schema/directive.rb', line 18

def path
  "@#{super}"
end

.repeatable(new_value) ⇒ Object



99
100
101
# File 'lib/graphql/schema/directive.rb', line 99

def repeatable(new_value)
  @repeatable = new_value
end

.repeatable?Boolean

Returns:



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

def repeatable?
  !!@repeatable
end

.resolve(object, arguments, context) ⇒ Object

Continuing is passed as a block; yield to continue



70
71
72
# File 'lib/graphql/schema/directive.rb', line 70

def resolve(object, arguments, context)
  yield
end

.resolve_each(object, arguments, context) ⇒ Object

Continuing is passed as a block, yield to continue.



75
76
77
# File 'lib/graphql/schema/directive.rb', line 75

def resolve_each(object, arguments, context)
  yield
end

.static_include?(_arguments, _context) ⇒ Boolean

Determines whether Execution::Lookahead considers the field to be selected

Returns:



65
66
67
# File 'lib/graphql/schema/directive.rb', line 65

def static_include?(_arguments, _context)
  true
end

.validate!(arguments, context) ⇒ Object



79
80
81
# File 'lib/graphql/schema/directive.rb', line 79

def validate!(arguments, context)
  Schema::Validator.validate!(validators, self, context, arguments)
end

Instance Method Details

#graphql_nameObject



145
146
147
# File 'lib/graphql/schema/directive.rb', line 145

def graphql_name
  self.class.graphql_name
end