Skip to content

Commit 8bf1e32

Browse files
committed
Code cleanup
1 parent 2f59322 commit 8bf1e32

File tree

6 files changed

+36
-33
lines changed

6 files changed

+36
-33
lines changed

lib/graphql/static_validation/base_visitor.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,33 @@ def path
2424
@path.dup
2525
end
2626

27+
# Build a class to visit the AST and perform validation,
28+
# or use a pre-built class if rules is `ALL_RULES` or empty.
29+
# @param rules [Array<Module, Class>]
30+
# @return [Class] A class for validating `rules` during visitation
31+
def self.including_rules(rules)
32+
if rules.none?
33+
NoValidateVisitor
34+
elsif rules == ALL_RULES
35+
DefaultVisitor
36+
else
37+
visitor_class = Class.new(self) do
38+
include(GraphQL::StaticValidation::DefinitionDependencies)
39+
end
40+
41+
rules.reverse_each do |r|
42+
# If it's a class, it gets attached later.
43+
if !r.is_a?(Class)
44+
visitor_class.include(r)
45+
end
46+
end
47+
48+
visitor_class.include(GraphQL::InternalRepresentation::Rewrite)
49+
visitor_class.include(ContextMethods)
50+
visitor_class
51+
end
52+
end
53+
2754
module ContextMethods
2855
def on_operation_definition(node, parent)
2956
object_type = @schema.root_type_for_operation(node.operation_type)

lib/graphql/static_validation/default_visitor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class DefaultVisitor < BaseVisitor
99
end
1010

1111
include(GraphQL::InternalRepresentation::Rewrite)
12-
prepend(ContextMethods)
12+
include(ContextMethods)
1313
end
1414
end
1515
end

lib/graphql/static_validation/no_validate_visitor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module StaticValidation
44
class NoValidateVisitor < StaticValidation::BaseVisitor
55
include(GraphQL::InternalRepresentation::Rewrite)
66
include(GraphQL::StaticValidation::DefinitionDependencies)
7-
prepend(ContextMethods)
7+
include(ContextMethods)
88
end
99
end
1010
end

lib/graphql/static_validation/rules/arguments_are_defined.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def on_argument(node, parent)
2424
raise "Unexpected argument parent: #{parent.class} (##{parent})"
2525
end
2626

27-
if parent_defn && (argument_defn = context.warden.arguments(parent_defn).find { |arg| arg.name == node.name })
27+
if parent_defn && context.warden.arguments(parent_defn).any? { |arg| arg.name == node.name }
2828
super
2929
elsif parent_defn
3030
kind_of_node = node_type(parent)

lib/graphql/static_validation/rules/variables_are_used_and_defined.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ def on_fragment_definition(node, parent)
5353
@variable_context_stack.pop
5454
end
5555

56-
5756
# For FragmentSpreads:
5857
# - find the context on the stack
5958
# - mark the context as containing this spread

lib/graphql/static_validation/validator.rb

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,38 +24,15 @@ def initialize(schema:, rules: GraphQL::StaticValidation::ALL_RULES)
2424
def validate(query, validate: true)
2525
query.trace("validate", { validate: validate, query: query }) do
2626

27-
visitor_class = if validate == false
28-
# This visitor tracks context info, but doesn't apply any rules
29-
StaticValidation::NoValidateVisitor
30-
elsif @rules == ALL_RULES
31-
# This visitor applies the default rules
32-
StaticValidation::DefaultVisitor
33-
else
34-
# Create a visitor on the fly
35-
custom_class = Class.new(StaticValidation::BaseVisitor) do
36-
include DefinitionDependencies
37-
end
38-
39-
@rules.reverse_each do |r|
40-
if !r.is_a?(Class)
41-
custom_class.include(r)
42-
end
43-
end
44-
custom_class.include(GraphQL::InternalRepresentation::Rewrite)
45-
custom_class.prepend(StaticValidation::BaseVisitor::ContextMethods)
46-
custom_class
47-
end
27+
rules_to_use = validate ? @rules : []
28+
visitor_class = BaseVisitor.including_rules(rules_to_use)
4829

4930
context = GraphQL::StaticValidation::ValidationContext.new(query, visitor_class)
50-
visitor = context.visitor
5131

52-
# If the caller opted out of validation, don't attach these
53-
if validate
54-
# Attach legacy-style rules
55-
@rules.each do |rule_class_or_module|
56-
if rule_class_or_module.method_defined?(:validate)
57-
rule_class_or_module.new.validate(context)
58-
end
32+
# Attach legacy-style rules
33+
rules_to_use.each do |rule_class_or_module|
34+
if rule_class_or_module.method_defined?(:validate)
35+
rule_class_or_module.new.validate(context)
5936
end
6037
end
6138

0 commit comments

Comments
 (0)