Skip to content

Commit 1687b4b

Browse files
committed
Disable development NoEvalCop for load-time eval calls
1 parent fb34a43 commit 1687b4b

5 files changed

Lines changed: 23 additions & 14 deletions

File tree

cop/development/no_eval_cop.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
module Cop
55
module Development
66
class NoEvalCop < RuboCop::Cop::Base
7-
MSG_TEMPLATE = "Don't use `%{eval_method_name}` which accept strings and may result in unexpected code being generated. Use `%{exec_method_name}` instead, and pass a block."
7+
MSG_TEMPLATE = "Don't use `%{eval_method_name}` which accepts strings and may result evaluating unexpected code. Use `%{exec_method_name}` instead, and pass a block."
88

99
def on_send(node)
1010
case node.method_name

lib/graphql/language/nodes.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ def merge!(new_options)
133133
end
134134

135135
class << self
136+
# rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
137+
136138
# Add a default `#visit_method` and `#children_method_name` using the class name
137139
def inherited(child_class)
138140
super
@@ -274,6 +276,8 @@ def initialize_node #{arguments.join(", ")}
274276
#{assignments.join("\n")}
275277
end
276278
RUBY
279+
280+
# rubocop:enable Development/NoEvalCop
277281
end
278282
end
279283
end

lib/graphql/language/visitor.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def visit
7373
@document
7474
end
7575
end
76+
# rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
7677

7778
# Call the user-defined handler for `node`.
7879
def visit_node(node, parent)

lib/graphql/schema/build_from_definition.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -426,17 +426,18 @@ def build_fields(owner, field_definitions, type_resolver, default_resolve:)
426426

427427
# Don't do this for interfaces
428428
if default_resolve
429-
owner.class_eval <<-RUBY, __FILE__, __LINE__
430-
# frozen_string_literal: true
431-
def #{resolve_method_name}(**args)
432-
field_instance = self.class.get_field("#{field_definition.name}")
433-
context.schema.definition_default_resolve.call(self.class, field_instance, object, args, context)
434-
end
435-
RUBY
429+
define_field_resolve_method(owner, resolve_method_name, field_definition.name)
436430
end
437431
end
438432
end
439433

434+
def define_field_resolve_method(owner, method_name, field_name)
435+
owner.define_method(method_name) { |**args|
436+
field_instance = self.class.get_field(field_name)
437+
context.schema.definition_default_resolve.call(self.class, field_instance, object, args, context)
438+
}
439+
end
440+
440441
def build_resolve_type(lookup_hash, directives, missing_type_handler)
441442
resolve_type_proc = nil
442443
resolve_type_proc = ->(ast_node) {

lib/graphql/schema/input_object.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,8 @@ class << self
123123
def argument(*args, **kwargs, &block)
124124
argument_defn = super(*args, **kwargs, &block)
125125
# Add a method access
126-
method_name = argument_defn.keyword
127-
class_eval <<-RUBY, __FILE__, __LINE__
128-
def #{method_name}
129-
self[#{method_name.inspect}]
130-
end
131-
RUBY
126+
define_accessor_method(argument_defn.keyword)
127+
argument_defn
132128
end
133129

134130
def to_graphql
@@ -236,6 +232,13 @@ def coerce_result(value, ctx)
236232

237233
result
238234
end
235+
236+
private
237+
238+
def define_accessor_method(method_name)
239+
define_method(method_name) { self[method_name] }
240+
alias_method(method_name, method_name)
241+
end
239242
end
240243

241244
private

0 commit comments

Comments
 (0)