Skip to content

Commit c0efcd7

Browse files
committed
Make Schema.warden_class pluggable
1 parent ec0563e commit c0efcd7

File tree

8 files changed

+58
-16
lines changed

8 files changed

+58
-16
lines changed

lib/graphql/language/document_from_schema_definition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def initialize(
3030
end
3131

3232
schema_context = schema.context_class.new(query: nil, object: nil, schema: schema, values: context)
33-
@warden = GraphQL::Schema::Warden.new(
33+
@warden = @schema.warden_class.new(
3434
filter,
3535
schema: @schema,
3636
context: schema_context,

lib/graphql/query.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ def find_operation(operations, operation_name)
375375

376376
def prepare_ast
377377
@prepared_ast = true
378-
@warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
378+
@warden ||= @schema.warden_class.new(@filter, schema: @schema, context: @context)
379379
parse_error = nil
380380
@document ||= begin
381381
if query_string

lib/graphql/query/null_context.rb

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@ module GraphQL
33
class Query
44
# This object can be `ctx` in places where there is no query
55
class NullContext
6-
class NullWarden < GraphQL::Schema::Warden
7-
def visible_field?(field, ctx); true; end
8-
def visible_argument?(arg, ctx); true; end
9-
def visible_type?(type, ctx); true; end
10-
def visible_enum_value?(ev, ctx); true; end
11-
def visible_type_membership?(tm, ctx); true; end
12-
end
13-
146
class NullQuery
157
end
168

@@ -23,11 +15,7 @@ def initialize
2315
@query = NullQuery.new
2416
@dataloader = GraphQL::Dataloader::NullDataloader.new
2517
@schema = NullSchema
26-
@warden = NullWarden.new(
27-
GraphQL::Filter.new(silence_deprecation_warning: true),
28-
context: self,
29-
schema: @schema,
30-
)
18+
@warden = Schema::Warden::NullWarden.new(nil, context: self, schema: @schema)
3119
end
3220

3321
def [](key); end

lib/graphql/schema.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,18 @@ def root_types
418418
@root_types
419419
end
420420

421+
def warden_class
422+
if defined?(@warden_class)
423+
@warden_class
424+
elsif superclass.respond_to?(:warden_class)
425+
superclass.warden_class
426+
else
427+
GraphQL::Schema::Warden
428+
end
429+
end
430+
431+
attr_writer :warden_class
432+
421433
# @param type [Module] The type definition whose possible types you want to see
422434
# @return [Hash<String, Module>] All possible types, if no `type` is given.
423435
# @return [Array<Module>] Possible types for `type`, if it's given.

lib/graphql/schema/warden.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,33 @@ def arguments(owner, ctx); owner.arguments(ctx); end
8787
end
8888
end
8989

90+
class NullWarden
91+
def initialize(_filter, context:, schema:)
92+
@schema = schema
93+
# TODO consider per-query caches even though there's no filtering
94+
end
95+
96+
def visible_field?(field_defn, _ctx = nil, owner = nil); true; end
97+
def visible_argument?(arg_defn, _ctx = nil); true; end
98+
def visible_type?(type_defn, _ctx = nil); true; end
99+
def visible_enum_value?(enum_value, _ctx = nil); true; end
100+
def visible_type_membership?(type_membership, _ctx = nil); true; end
101+
def interface_type_memberships(obj_type, _ctx = nil); obj_type.interface_type_memberships; end
102+
def get_type(type_name); @schema.get_type(type_name); end
103+
def arguments(argument_owner, ctx = nil); argument_owner.arguments(ctx).values; end
104+
def enum_values(enum_defn); enum_defn.enum_values; end
105+
def get_argument(parent_type, argument_name); parent_type.get_argument(argument_name); end
106+
def types; @schema.types; end
107+
def root_type_for_operation(op_name); @schema.root_type_for_operation(op_name); end
108+
def directives; @schema.directives.values; end
109+
def fields(type_defn); type_defn.fields; end
110+
def get_field(parent_type, field_name); @schema.get_field(parent_type, field_name); end
111+
def reachable_type?(type_name); true; end
112+
def reachable_types; @schema.types.values; end
113+
def possible_types(type_defn); @schema.possible_types(type_defn); end
114+
def interfaces(obj_type); obj_type.interfaces; end
115+
end
116+
90117
# @param filter [<#call(member)>] Objects are hidden when `.call(member, ctx)` returns true
91118
# @param context [GraphQL::Query::Context]
92119
# @param schema [GraphQL::Schema]

spec/graphql/execution/interpreter_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ class Schema < GraphQL::Schema
261261
mutation(Mutation)
262262
lazy_resolve(Box, :value)
263263

264+
self.warden_class = GraphQL::Schema::Warden::NullWarden
265+
264266
def self.object_from_id(id, ctx)
265267
OpenStruct.new(id: id)
266268
end

spec/graphql/schema/warden_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,4 +948,15 @@ class Query < GraphQL::Schema::Object
948948
end
949949
end
950950
end
951+
952+
describe "NullWarden" do
953+
it "implements all Warden methods" do
954+
warden_methods = GraphQL::Schema::Warden.instance_methods - Object.methods
955+
warden_methods.each do |method_name|
956+
warden_params = GraphQL::Schema::Warden.instance_method(method_name).parameters
957+
assert GraphQL::Schema::Warden::NullWarden.method_defined?(method_name), "Null warden also responds to #{method_name} (#{warden_params})"
958+
assert_equal warden_params, GraphQL::Schema::Warden::NullWarden.instance_method(method_name).parameters,"#{method_name} has the same parameters"
959+
end
960+
end
961+
end
951962
end

spec/spec_helper.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ def prepare_ast
6060
def setup_finalizer
6161
if !@finalizer_defined
6262
@finalizer_defined = true
63-
ObjectSpace.define_finalizer(self, CheckShape.new(warden))
63+
if warden.is_a?(GraphQL::Schema::Warden)
64+
ObjectSpace.define_finalizer(self, CheckShape.new(warden))
65+
end
6466
end
6567
end
6668
end

0 commit comments

Comments
 (0)