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

Returns a new instance of Directive.



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

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

#ast_nodeObject

Returns the value of attribute ast_node.



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

def ast_node
  @ast_node
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.



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

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

Returns Is this directive supplied by default? (eg @skip).

Returns:

  • (Boolean)

    Is this directive supplied by default? (eg @skip)



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

def default_directive?
  @default_directive
end

#on_field?Boolean

Returns:

  • (Boolean)


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

def on_field?
  locations.include?(FIELD)
end

#on_fragment?Boolean

Returns:

  • (Boolean)


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

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

#on_operation?Boolean

Returns:

  • (Boolean)


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

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

#to_sObject



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

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