Skip to content

Commit ab131bd

Browse files
committed
Add a cop to catch _eval usage, update all block calls to use _exec instead
1 parent f82a43c commit ab131bd

13 files changed

+35
-15
lines changed

.rubocop.yml

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require:
22
- ./cop/development/none_without_block_cop
3+
- ./cop/development/no_eval_cop
34
- ./cop/development/no_focus_cop
45
- ./lib/graphql/rubocop/graphql/default_null_true
56
- ./lib/graphql/rubocop/graphql/default_required_true
@@ -51,6 +52,10 @@ Development/NoneWithoutBlockCop:
5152
- "lib/**/*"
5253
- "spec/**/*"
5354

55+
Development/NoEvalCop:
56+
Include:
57+
- "lib/**/*"
58+
5459
Development/NoFocusCop:
5560
Include:
5661
- "spec/**/*"

cop/development/no_eval_cop.rb

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
require 'rubocop'
3+
4+
module Cop
5+
module Development
6+
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."
8+
9+
def on_send(node)
10+
case node.method_name
11+
when :module_eval, :class_eval, :instance_eval
12+
message = MSG_TEMPLATE % { eval_method_name: node.method_name, exec_method_name: node.method_name.to_s.sub("eval", "exec").to_sym }
13+
add_offense node, message: message
14+
end
15+
end
16+
end
17+
end
18+
end

lib/graphql/schema/argument.rb

+2-5
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,8 @@ def initialize(arg_name = nil, type_expr = nil, desc = nil, required: true, type
8989
end
9090

9191
if definition_block
92-
if definition_block.arity == 1
93-
instance_exec(self, &definition_block)
94-
else
95-
instance_eval(&definition_block)
96-
end
92+
# `self` will still be self, it will also be the first argument to the block:
93+
instance_exec(self, &definition_block)
9794
end
9895
end
9996

lib/graphql/schema/directive.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def repeatable(new_value)
9999

100100
def inherited(subclass)
101101
super
102-
subclass.class_eval do
102+
subclass.class_exec do
103103
@default_graphql_name ||= nil
104104
end
105105
end

lib/graphql/schema/enum_value.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def initialize(graphql_name, desc = nil, owner:, ast_node: nil, directives: nil,
4747
end
4848

4949
if block_given?
50-
instance_eval(&block)
50+
instance_exec(self, &block)
5151
end
5252
end
5353

lib/graphql/schema/interface.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def definition_methods(&block)
2929
const_set(:DefinitionMethods, defn_methods_module)
3030
extend(self::DefinitionMethods)
3131
end
32-
self::DefinitionMethods.module_eval(&block)
32+
self::DefinitionMethods.module_exec(&block)
3333
end
3434

3535
# @see {Schema::Warden} hides interfaces without visible implementations

lib/graphql/schema/member/has_directives.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class Member
66
module HasDirectives
77
def self.extended(child_cls)
88
super
9-
child_cls.module_eval { self.own_directives = nil }
9+
child_cls.module_exec { self.own_directives = nil }
1010
end
1111

1212
def inherited(child_cls)

lib/graphql/schema/member/has_fields.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def self.extended(child_class)
183183

184184
def inherited(subclass)
185185
super
186-
subclass.class_eval do
186+
subclass.class_exec do
187187
@own_fields ||= nil
188188
@field_class ||= nil
189189
end

lib/graphql/schema/member/has_interfaces.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def self.extended(child_class)
133133

134134
def inherited(subclass)
135135
super
136-
subclass.class_eval do
136+
subclass.class_exec do
137137
@own_interface_type_memberships ||= nil
138138
end
139139
end

lib/graphql/schema/member/scoped.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def reauthorize_scoped_objects(new_value = nil)
3030

3131
def inherited(subclass)
3232
super
33-
subclass.class_eval do
33+
subclass.class_exec do
3434
@reauthorize_scoped_objects = nil
3535
end
3636
end

lib/graphql/schema/member/type_system_helpers.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def kind
4343
private
4444

4545
def inherited(subclass)
46-
subclass.class_eval do
46+
subclass.class_exec do
4747
@to_non_null_type ||= nil
4848
@to_list_type ||= nil
4949
end

lib/graphql/types/relay/connection_behaviors.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def self.included(child_class)
1313
child_class.node_nullable(true)
1414
child_class.edges_nullable(true)
1515
child_class.edge_nullable(true)
16-
child_class.module_eval {
16+
child_class.module_exec {
1717
self.edge_type = nil
1818
self.node_type = nil
1919
self.edge_class = nil

lib/graphql/types/relay/edge_behaviors.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def self.included(child_class)
88
child_class.description("An edge in a connection.")
99
child_class.field(:cursor, String, null: false, description: "A cursor for use in pagination.")
1010
child_class.extend(ClassMethods)
11-
child_class.class_eval { self.node_type = nil }
11+
child_class.class_exec { self.node_type = nil }
1212
child_class.node_nullable(true)
1313
end
1414

0 commit comments

Comments
 (0)