Class: GraphQL::Schema::Argument
- Inherits:
-
Object
- Object
- GraphQL::Schema::Argument
- Includes:
- Member::AcceptsDefinition, Member::CachedGraphQLDefinition, Member::HasAstNode, Member::HasPath
- Defined in:
- lib/graphql/schema/argument.rb
Constant Summary collapse
- NO_DEFAULT =
:__no_default__
Instance Attribute Summary collapse
-
#default_value ⇒ Object
readonly
The value used when the client doesn’t provide a value for this argument.
-
#description(text = nil) ⇒ String
Documentation for this argument.
-
#keyword ⇒ Symbol
readonly
This argument’s name in Ruby keyword arguments.
-
#loads ⇒ Class, ...
readonly
If this argument should load an application object, this is the type of object to load.
-
#name ⇒ String
(also: #graphql_name)
readonly
The GraphQL name for this argument, camelized unless
camelize: falseis provided. -
#owner ⇒ GraphQL::Schema::Field, Class
readonly
The field or input object this argument belongs to.
-
#prepare ⇒ Symbol
readonly
A method to call to transform this value before sending it to field resolution method.
Instance Method Summary collapse
-
#accessible?(context) ⇒ Boolean
-
#authorized?(obj, value, ctx) ⇒ Boolean
-
#authorized_as_type?(obj, value, ctx, as_type:) ⇒ Boolean
-
#default_value? ⇒ Boolean
True if this argument has a default value.
-
#deprecation_reason(text = nil) ⇒ String
(also: #deprecation_reason=)
Deprecation reason for this argument.
-
#from_resolver? ⇒ Boolean
True if a resolver defined this argument.
-
#initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, deprecation_reason: nil, &definition_block) ⇒ Argument
constructor
A new instance of Argument.
-
#prepare_value(obj, value, context: nil) ⇒ Object
private
Apply the #prepare configuration to
value, using methods fromobj. -
#statically_coercible? ⇒ Boolean
-
#to_graphql ⇒ Object
-
#type ⇒ Object
-
#type=(new_type) ⇒ Object
-
#visible?(context) ⇒ Boolean
Methods included from Member::HasAstNode
Methods included from Member::HasPath
Methods included from Member::CachedGraphQLDefinition
#graphql_definition, #initialize_copy, #type_class
Constructor Details
#initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, deprecation_reason: nil, &definition_block) ⇒ Argument
Returns a new instance of Argument.
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 |
# File 'lib/graphql/schema/argument.rb', line 49 def initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, deprecation_reason: nil, &definition_block) arg_name ||= name @name = -(camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s) @type_expr = type_expr || type @description = desc || description @null = !required @default_value = default_value @owner = owner @as = as @loads = loads @keyword = as || (arg_name.is_a?(Symbol) ? arg_name : Schema::Member::BuildType.underscore(@name).to_sym) @prepare = prepare @ast_node = ast_node @from_resolver = from_resolver @method_access = method_access self.deprecation_reason = deprecation_reason if definition_block if definition_block.arity == 1 instance_exec(self, &definition_block) else instance_eval(&definition_block) end end end |
Instance Attribute Details
#default_value ⇒ Object (readonly)
Returns the value used when the client doesn’t provide a value for this argument.
76 77 78 |
# File 'lib/graphql/schema/argument.rb', line 76 def default_value @default_value end |
#description(text = nil) ⇒ String
Returns Documentation for this argument.
86 87 88 89 90 91 92 |
# File 'lib/graphql/schema/argument.rb', line 86 def description(text = nil) if text @description = text else @description end end |
#keyword ⇒ Symbol (readonly)
Returns This argument’s name in Ruby keyword arguments.
27 28 29 |
# File 'lib/graphql/schema/argument.rb', line 27 def keyword @keyword end |
#loads ⇒ Class, ... (readonly)
Returns If this argument should load an application object, this is the type of object to load.
30 31 32 |
# File 'lib/graphql/schema/argument.rb', line 30 def loads @loads end |
#name ⇒ String (readonly) Also known as: graphql_name
Returns the GraphQL name for this argument, camelized unless camelize: false is provided.
17 18 19 |
# File 'lib/graphql/schema/argument.rb', line 17 def name @name end |
#owner ⇒ GraphQL::Schema::Field, Class (readonly)
Returns The field or input object this argument belongs to.
21 22 23 |
# File 'lib/graphql/schema/argument.rb', line 21 def owner @owner end |
#prepare ⇒ Symbol (readonly)
Returns A method to call to transform this value before sending it to field resolution method.
24 25 26 |
# File 'lib/graphql/schema/argument.rb', line 24 def prepare @prepare end |
Instance Method Details
#accessible?(context) ⇒ Boolean
110 111 112 |
# File 'lib/graphql/schema/argument.rb', line 110 def accessible?(context) true end |
#authorized?(obj, value, ctx) ⇒ Boolean
114 115 116 |
# File 'lib/graphql/schema/argument.rb', line 114 def (obj, value, ctx) (obj, value, ctx, as_type: type) end |
#authorized_as_type?(obj, value, ctx, as_type:) ⇒ Boolean
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/graphql/schema/argument.rb', line 118 def (obj, value, ctx, as_type:) if value.nil? return true end if as_type.kind.non_null? as_type = as_type.of_type end if as_type.kind.list? value.each do |v| if !(obj, v, ctx, as_type: as_type.of_type) return false end end elsif as_type.kind.input_object? as_type.arguments.each do |_name, input_obj_arg| input_obj_arg = input_obj_arg.type_class # TODO: this skips input objects whose values were alread replaced with application objects. # See: https://github.com/rmosolgo/graphql-ruby/issues/2633 if value.respond_to?(:key?) && value.key?(input_obj_arg.keyword) && !input_obj_arg.(obj, value[input_obj_arg.keyword], ctx) return false end end end # None of the early-return conditions were activated, # so this is authorized. true end |
#default_value? ⇒ Boolean
Returns True if this argument has a default value.
79 80 81 |
# File 'lib/graphql/schema/argument.rb', line 79 def default_value? @default_value != NO_DEFAULT end |
#deprecation_reason(text = nil) ⇒ String Also known as: deprecation_reason=
Returns Deprecation reason for this argument.
95 96 97 98 99 100 101 102 |
# File 'lib/graphql/schema/argument.rb', line 95 def deprecation_reason(text = nil) if text validate_deprecated_or_optional(null: @null, deprecation_reason: text) @deprecation_reason = text else @deprecation_reason end end |
#from_resolver? ⇒ Boolean
Returns true if a resolver defined this argument.
33 34 35 |
# File 'lib/graphql/schema/argument.rb', line 33 def from_resolver? @from_resolver end |
#prepare_value(obj, value, context: nil) ⇒ Object
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.
Apply the #prepare configuration to value, using methods from obj.
Used by the runtime.
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/graphql/schema/argument.rb', line 197 def prepare_value(obj, value, context: nil) if value.is_a?(GraphQL::Schema::InputObject) value = value.prepare end if @prepare.nil? value elsif @prepare.is_a?(String) || @prepare.is_a?(Symbol) if obj.nil? # The problem here is, we _used to_ prepare while building variables. # But now we don't have the runtime object there. # # This will have to be called later, when the runtime object _is_ available. value else obj.public_send(@prepare, value) end elsif @prepare.respond_to?(:call) @prepare.call(value, context || obj.context) else raise "Invalid prepare for #{@owner.name}.name: #{@prepare.inspect}" end end |
#statically_coercible? ⇒ Boolean
188 189 190 191 192 |
# File 'lib/graphql/schema/argument.rb', line 188 def statically_coercible? return @statically_coercible if defined?(@statically_coercible) @statically_coercible = !@prepare.is_a?(String) && !@prepare.is_a?(Symbol) end |
#to_graphql ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/graphql/schema/argument.rb', line 148 def to_graphql argument = GraphQL::Argument.new argument.name = @name argument.type = -> { type } argument.description = @description argument.[:type_class] = self argument.as = @as argument.ast_node = ast_node argument.method_access = @method_access if NO_DEFAULT != @default_value argument.default_value = @default_value end if @deprecation_reason argument.deprecation_reason = @deprecation_reason end argument end |
#type ⇒ Object
176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/graphql/schema/argument.rb', line 176 def type @type ||= begin parsed_type = begin Member::BuildType.parse_type(@type_expr, null: @null) rescue StandardError => err raise ArgumentError, "Couldn't build type for Argument #{@owner.name}.#{name}: #{err.class.name}: #{err.}", err.backtrace end # Use the setter method to get validations self.type = parsed_type end end |
#type=(new_type) ⇒ Object
166 167 168 169 170 171 172 173 174 |
# File 'lib/graphql/schema/argument.rb', line 166 def type=(new_type) validate_input_type(new_type) # This isn't true for LateBoundTypes, but we can assume those will # be updated via this codepath later in schema setup. if new_type.respond_to?(:non_null?) validate_deprecated_or_optional(null: !new_type.non_null?, deprecation_reason: deprecation_reason) end @type = new_type end |
#visible?(context) ⇒ Boolean
106 107 108 |
# File 'lib/graphql/schema/argument.rb', line 106 def visible?(context) true end |