Class: GraphQL::Directive

Inherits:
Object
  • Object
show all
Includes:
GraphQL::Define::InstanceDefinable
Defined in:
lib/graphql/directive.rb

Overview

Directives are server-defined hooks for modifying execution.

Two directives are included out-of-the-box:

  • @skip(if: ...) Skips the tagged field if the value of if is true
  • @include(if: ...) Includes the tagged field only if if is true

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,
]
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.',
}
SkipDirective =
GraphQL::Directive.define do
  name "skip"
  description "Directs the executor to skip this field or fragment when the `if` argument is true."
  locations([GraphQL::Directive::FIELD, GraphQL::Directive::FRAGMENT_SPREAD, GraphQL::Directive::INLINE_FRAGMENT])

  argument :if, !GraphQL::BOOLEAN_TYPE, 'Skipped when true.'
  default_directive true
end
IncludeDirective =
GraphQL::Directive.define do
  name "include"
  description "Directs the executor to include this field or fragment only when the `if` argument is true."
  locations([GraphQL::Directive::FIELD, GraphQL::Directive::FRAGMENT_SPREAD, GraphQL::Directive::INLINE_FRAGMENT])
  argument :if, !GraphQL::BOOLEAN_TYPE, 'Included when true.'
  default_directive true
end
DeprecatedDirective =
GraphQL::Directive.define do
  name "deprecated"
  description "Marks an element of a GraphQL schema as no longer supported."
  locations([GraphQL::Directive::FIELD_DEFINITION, GraphQL::Directive::ENUM_VALUE])

  reason_description = "Explains why this element was deprecated, usually also including a "\
    "suggestion for how to access supported similar data. Formatted "\
    "in [Markdown](https://daringfireball.net/projects/markdown/)."

  argument :reason, GraphQL::STRING_TYPE, reason_description, default_value: GraphQL::Directive::DEFAULT_DEPRECATION_REASON
  default_directive true
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from GraphQL::Define::InstanceDefinable

#define, #initialize_copy, #metadata, #redefine

Constructor Details

#initializeDirective



61
62
63
64
# File 'lib/graphql/directive.rb', line 61

def initialize
  @arguments = {}
  @default_directive = false
end

Instance Attribute Details

#argumentsObject

Returns the value of attribute arguments



13
14
15
# File 'lib/graphql/directive.rb', line 13

def arguments
  @arguments
end

#arguments_classObject

Returns the value of attribute arguments_class



13
14
15
# File 'lib/graphql/directive.rb', line 13

def arguments_class
  @arguments_class
end

#default_directive=(value) ⇒ Object (writeonly)

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.



15
16
17
# File 'lib/graphql/directive.rb', line 15

def default_directive=(value)
  @default_directive = value
end

#descriptionObject

Returns the value of attribute description



13
14
15
# File 'lib/graphql/directive.rb', line 13

def description
  @description
end

#locationsObject

Returns the value of attribute locations



13
14
15
# File 'lib/graphql/directive.rb', line 13

def locations
  @locations
end

#nameObject

Returns the value of attribute name



13
14
15
# File 'lib/graphql/directive.rb', line 13

def name
  @name
end

Instance Method Details

#default_directive?Boolean



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

def default_directive?
  @default_directive
end

#on_field?Boolean



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

def on_field?
  locations.include?(FIELD)
end

#on_fragment?Boolean



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

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

#on_operation?Boolean



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

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

#to_sObject



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

def to_s
  "<GraphQL::Directive #{name}>"
end