Class: GraphQL::Schema::Visibility
- Inherits:
-
Object
- Object
- GraphQL::Schema::Visibility
- Defined in:
- lib/graphql/schema/visibility.rb,
lib/graphql/schema/visibility/visit.rb,
lib/graphql/schema/visibility/profile.rb,
lib/graphql/schema/visibility/migration.rb
Overview
Use this plugin to make some parts of your schema hidden from some viewers.
Defined Under Namespace
Classes: Migration, Profile, Visit
Instance Attribute Summary collapse
-
#cached_profiles ⇒ Object
readonly
Returns the value of attribute cached_profiles.
-
#top_level ⇒ Object
readonly
Returns the value of attribute top_level.
-
#types ⇒ Object
Returns the value of attribute types.
-
#unfiltered_interface_type_memberships ⇒ Object
readonly
private
Class Method Summary collapse
Instance Method Summary collapse
-
#all_directives ⇒ Object
-
#all_interface_type_memberships ⇒ Object
-
#all_references ⇒ Object
-
#dup_for(other_schema) ⇒ Visibility
private
Make another Visibility for
schema
based on this one. -
#freeze ⇒ Object
-
#get_type(type_name) ⇒ Object
-
#initialize(schema, dynamic:, preload:, profiles:, migration_errors:) ⇒ Visibility
constructor
A new instance of Visibility.
-
#introspection_system_configured(introspection_system) ⇒ Object
private
-
#migration_errors? ⇒ Boolean
-
#mutation_configured(mutation_type) ⇒ Object
private
-
#orphan_types_configured(orphan_types) ⇒ Object
private
-
#preload ⇒ Object
-
#preload? ⇒ Boolean
-
#profile_for(context) ⇒ Object
-
#query_configured(query_type) ⇒ Object
private
-
#subscription_configured(subscription_type) ⇒ Object
private
-
#top_level_profile(refresh: false) ⇒ Object
Constructor Details
#initialize(schema, dynamic:, preload:, profiles:, migration_errors:) ⇒ Visibility
Returns a new instance of Visibility.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/graphql/schema/visibility.rb', line 23 def initialize(schema, dynamic:, preload:, profiles:, migration_errors:) @schema = schema schema.use_visibility_profile = true schema.visibility_profile_class = if migration_errors Visibility::Migration else Visibility::Profile end @preload = preload @profiles = profiles @cached_profiles = {} @dynamic = dynamic @migration_errors = migration_errors # Top-level type caches: @visit = nil @interface_type_memberships = nil @directives = nil @types = nil @all_references = nil @loaded_all = false if preload self.preload end end |
Instance Attribute Details
#cached_profiles ⇒ Object (readonly)
Returns the value of attribute cached_profiles.
159 160 161 |
# File 'lib/graphql/schema/visibility.rb', line 159 def cached_profiles @cached_profiles end |
#top_level ⇒ Object (readonly)
Returns the value of attribute top_level.
185 186 187 |
# File 'lib/graphql/schema/visibility.rb', line 185 def top_level @top_level end |
#types ⇒ Object
Returns the value of attribute types.
76 77 78 |
# File 'lib/graphql/schema/visibility.rb', line 76 def types @types end |
#unfiltered_interface_type_memberships ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
188 189 190 |
# File 'lib/graphql/schema/visibility.rb', line 188 def unfiltered_interface_type_memberships @unfiltered_interface_type_memberships end |
Class Method Details
.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (Rails.env) ? Rails.env.production? : nil), migration_errors: false) ⇒ Object
15 16 17 18 19 20 21 |
# File 'lib/graphql/schema/visibility.rb', line 15 def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails.env) ? Rails.env.production? : nil), migration_errors: false) profiles&.each { |name, ctx| ctx[:visibility_profile] = name ctx.freeze } schema.visibility = self.new(schema, dynamic: dynamic, preload: preload, profiles: profiles, migration_errors: migration_errors) end |
Instance Method Details
#all_directives ⇒ Object
56 57 58 59 |
# File 'lib/graphql/schema/visibility.rb', line 56 def all_directives load_all @directives end |
#all_interface_type_memberships ⇒ Object
61 62 63 64 |
# File 'lib/graphql/schema/visibility.rb', line 61 def all_interface_type_memberships load_all @interface_type_memberships end |
#all_references ⇒ Object
66 67 68 69 |
# File 'lib/graphql/schema/visibility.rb', line 66 def all_references load_all @all_references end |
#dup_for(other_schema) ⇒ Visibility
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Make another Visibility for schema
based on this one
145 146 147 148 149 150 151 152 153 |
# File 'lib/graphql/schema/visibility.rb', line 145 def dup_for(other_schema) self.class.new( other_schema, dynamic: @dynamic, preload: @preload, profiles: @profiles, migration_errors: @migration_errors ) end |
#freeze ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/graphql/schema/visibility.rb', line 48 def freeze load_all @visit = true @interface_type_memberships.default_proc = nil @all_references.default_proc = nil super end |
#get_type(type_name) ⇒ Object
71 72 73 74 |
# File 'lib/graphql/schema/visibility.rb', line 71 def get_type(type_name) load_all @types[type_name] end |
#introspection_system_configured(introspection_system) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
132 133 134 135 136 137 138 139 140 |
# File 'lib/graphql/schema/visibility.rb', line 132 def introspection_system_configured(introspection_system) if @preload introspection_types = [ *@schema.introspection_system.types.values, *@schema.introspection_system.entry_points.map { |ep| ep.type.unwrap }, ] ensure_all_loaded(introspection_types) end end |
#migration_errors? ⇒ Boolean
155 156 157 |
# File 'lib/graphql/schema/visibility.rb', line 155 def migration_errors? @migration_errors end |
#mutation_configured(mutation_type) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
111 112 113 114 115 |
# File 'lib/graphql/schema/visibility.rb', line 111 def mutation_configured(mutation_type) if @preload ensure_all_loaded([mutation_type]) end end |
#orphan_types_configured(orphan_types) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
125 126 127 128 129 |
# File 'lib/graphql/schema/visibility.rb', line 125 def orphan_types_configured(orphan_types) if @preload ensure_all_loaded(orphan_types) end end |
#preload ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/graphql/schema/visibility.rb', line 82 def preload # Traverse the schema now (and in the *_configured hooks below) # To make sure things are loaded during boot @preloaded_types = Set.new types_to_visit = [ @schema.query, @schema.mutation, @schema.subscription, *@schema.introspection_system.types.values, *@schema.introspection_system.entry_points.map { |ep| ep.type.unwrap }, *@schema.orphan_types, ] # Root types may have been nil: types_to_visit.compact! ensure_all_loaded(types_to_visit) @profiles.each do |profile_name, example_ctx| prof = profile_for(example_ctx) prof.preload end end |
#preload? ⇒ Boolean
78 79 80 |
# File 'lib/graphql/schema/visibility.rb', line 78 def preload? @preload end |
#profile_for(context) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/graphql/schema/visibility.rb', line 161 def profile_for(context) if !@profiles.empty? visibility_profile = context[:visibility_profile] if @profiles.include?(visibility_profile) profile_ctx = @profiles[visibility_profile] @cached_profiles[visibility_profile] ||= @schema.visibility_profile_class.new(name: visibility_profile, context: profile_ctx, schema: @schema, visibility: self) elsif @dynamic if context.is_a?(Query::NullContext) top_level_profile else @schema.visibility_profile_class.new(context: context, schema: @schema, visibility: self) end elsif !context.key?(:visibility_profile) raise ArgumentError, "#{@schema} expects a visibility profile, but `visibility_profile:` wasn't passed. Provide a `visibility_profile:` value or add `dynamic: true` to your visibility configuration." else raise ArgumentError, "`#{visibility_profile.inspect}` isn't allowed for `visibility_profile:` (must be one of #{@profiles.keys.map(&:inspect).join(", ")}). Or, add `#{visibility_profile.inspect}` to the list of profiles in the schema definition." end elsif context.is_a?(Query::NullContext) top_level_profile else @schema.visibility_profile_class.new(context: context, schema: @schema, visibility: self) end end |
#query_configured(query_type) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
104 105 106 107 108 |
# File 'lib/graphql/schema/visibility.rb', line 104 def query_configured(query_type) if @preload ensure_all_loaded([query_type]) end end |
#subscription_configured(subscription_type) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
118 119 120 121 122 |
# File 'lib/graphql/schema/visibility.rb', line 118 def subscription_configured(subscription_type) if @preload ensure_all_loaded([subscription_type]) end end |
#top_level_profile(refresh: false) ⇒ Object
190 191 192 193 194 195 |
# File 'lib/graphql/schema/visibility.rb', line 190 def top_level_profile(refresh: false) if refresh @top_level_profile = nil end @top_level_profile ||= @schema.visibility_profile_class.new(context: Query::NullContext.instance, schema: @schema, visibility: self) end |