Skip to content

Commit ed9e968

Browse files
committed
Add default visitor for ALL_RULES
1 parent 77e22e0 commit ed9e968

File tree

5 files changed

+37
-8
lines changed

5 files changed

+37
-8
lines changed

lib/graphql/static_validation.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
require "graphql/static_validation/validator"
55
require "graphql/static_validation/validation_context"
66
require "graphql/static_validation/literal_validator"
7-
require "graphql/static_validation/visitor"
7+
require "graphql/static_validation/base_visitor"
8+
require "graphql/static_validation/no_validate_visitor"
89

910
rules_glob = File.expand_path("../static_validation/rules/*.rb", __FILE__)
1011
Dir.glob(rules_glob).each do |file|
1112
require(file)
1213
end
1314

1415
require "graphql/static_validation/all_rules"
16+
require "graphql/static_validation/default_visitor"

lib/graphql/static_validation/visitor.rb renamed to lib/graphql/static_validation/base_visitor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22
module GraphQL
33
module StaticValidation
4-
class Visitor < GraphQL::Language::Visitor
4+
class BaseVisitor < GraphQL::Language::Visitor
55
def initialize(document, context)
66
@path = []
77
@object_types = []
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
module GraphQL
3+
module StaticValidation
4+
class DefaultVisitor < BaseVisitor
5+
StaticValidation::ALL_RULES.reverse_each do |r|
6+
include(r)
7+
end
8+
9+
prepend(ContextMethods)
10+
end
11+
end
12+
end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# frozen_string_literal: true
2+
module GraphQL
3+
module StaticValidation
4+
class NoValidateVisitor < StaticValidation::BaseVisitor
5+
prepend(StaticValidation::BaseVisitor::ContextMethods)
6+
end
7+
end
8+
end

lib/graphql/static_validation/validator.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,24 @@ 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-
# TODO make a default class to use when all rules are chosen
28-
visitor_class = Class.new(StaticValidation::Visitor)
29-
if validate
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)
3036
@rules.reverse_each do |r|
3137
if !r.is_a?(Class)
32-
visitor_class.include(r)
38+
custom_class.include(r)
3339
end
3440
end
41+
custom_class.prepend(StaticValidation::BaseVisitor::ContextMethods)
42+
custom_class
3543
end
3644

37-
visitor_class.prepend(StaticValidation::Visitor::ContextMethods)
38-
3945
context = GraphQL::StaticValidation::ValidationContext.new(query, visitor_class)
4046
rewrite = GraphQL::InternalRepresentation::Rewrite.new
4147

@@ -44,6 +50,7 @@ def validate(query, validate: true)
4450

4551
# If the caller opted out of validation, don't attach these
4652
if validate
53+
# Attach legacy-style rules
4754
@rules.each do |rule_class_or_module|
4855
if rule_class_or_module.method_defined?(:validate)
4956
rule_class_or_module.new.validate(context)

0 commit comments

Comments
 (0)