Module: Graphiti

Defined in:
lib/graphiti/debugger.rb,
lib/graphiti.rb,
lib/graphiti/cli.rb,
lib/graphiti/audit.rb,
lib/graphiti/query.rb,
lib/graphiti/rails.rb,
lib/graphiti/scope.rb,
lib/graphiti/types.rb,
lib/graphiti/errors.rb,
lib/graphiti/runner.rb,
lib/graphiti/schema.rb,
lib/graphiti/context.rb,
lib/graphiti/version.rb,
lib/graphiti/renderer.rb,
lib/graphiti/resource.rb,
lib/graphiti/sideload.rb,
lib/graphiti/stats/dsl.rb,
lib/graphiti/util/hash.rb,
lib/graphiti/util/link.rb,
lib/graphiti/serializer.rb,
lib/graphiti/util/class.rb,
lib/graphiti/schema_diff.rb,
lib/graphiti/audit/report.rb,
lib/graphiti/context_hash.rb,
lib/graphiti/resource/dsl.rb,
lib/graphiti/schema/check.rb,
lib/graphiti/scoping/base.rb,
lib/graphiti/scoping/sort.rb,
lib/graphiti/spec_helpers.rb,
lib/graphiti/adapters/null.rb,
lib/graphiti/configuration.rb,
lib/graphiti/hash_renderer.rb,
lib/graphiti/rails/context.rb,
lib/graphiti/rails/railtie.rb,
lib/graphiti/stats/payload.rb,
lib/graphiti/util/sideload.rb,
lib/graphiti/resource/links.rb,
lib/graphiti/resource_proxy.rb,
lib/graphiti/scoping/filter.rb,
lib/graphiti/rails/debugging.rb,
lib/graphiti/resource/remote.rb,
lib/graphiti/filter_operators.rb,
lib/graphiti/rails/controller.rb,
lib/graphiti/rails/responders.rb,
lib/graphiti/scoping/paginate.rb,
lib/graphiti/util/cache_debug.rb,
lib/graphiti/util/uri_decoder.rb,
lib/graphiti/adapters/abstract.rb,
lib/graphiti/request_validator.rb,
lib/graphiti/spec_helpers/node.rb,
lib/graphiti/util/field_params.rb,
lib/graphiti/extensions/temp_id.rb,
lib/graphiti/rails/rake_helpers.rb,
lib/graphiti/rails/test_helpers.rb,
lib/graphiti/resource/interface.rb,
lib/graphiti/scoping/filterable.rb,
lib/graphiti/spec_helpers/rspec.rb,
lib/graphiti/spec_helpers/rspec.rb,
lib/graphiti/util/public_id_map.rb,
lib/graphiti/util/remote_params.rb,
lib/graphiti/util/simple_errors.rb,
lib/graphiti/spec_helpers/errors.rb,
lib/graphiti/util/include_params.rb,
lib/graphiti/util/internal_param.rb,
lib/graphiti/delegates/pagination.rb,
lib/graphiti/resource/persistence.rb,
lib/graphiti/resource/sideloading.rb,
lib/graphiti/spec_helpers/helpers.rb,
lib/graphiti/util/attribute_check.rb,
lib/graphiti/util/public_id_block.rb,
lib/graphiti/adapters/graphiti_api.rb,
lib/graphiti/resource/polymorphism.rb,
lib/graphiti/spec_helpers/matchers.rb,
lib/graphiti/adapters/active_record.rb,
lib/graphiti/resource/configuration.rb,
lib/graphiti/resource/documentation.rb,
lib/graphiti/scoping/default_filter.rb,
lib/graphiti/util/public_id_sources.rb,
lib/graphiti/util/remote_serializer.rb,
lib/graphiti/jsonapi_serializable_ext.rb,
lib/graphiti/rails/exception_handlers.rb,
lib/graphiti/scoping/extra_attributes.rb,
lib/graphiti/spec_helpers/errors_proxy.rb,
lib/graphiti/util/relationship_payload.rb,
lib/generators/graphiti/generator_mixin.rb,
lib/graphiti/extensions/extra_attribute.rb,
lib/graphiti/util/serializer_attributes.rb,
lib/generators/graphiti/locale_generator.rb,
lib/generators/graphiti/install_generator.rb,
lib/graphiti/error_serializers/validation.rb,
lib/graphiti/extensions/boolean_attribute.rb,
lib/graphiti/request_validators/validator.rb,
lib/generators/graphiti/api_test_generator.rb,
lib/generators/graphiti/resource_generator.rb,
lib/graphiti/util/serializer_relationships.rb,
lib/graphiti/scoping/filter_group_validator.rb,
lib/graphiti/util/transaction_hooks_recorder.rb,
lib/graphiti/adapters/persistence/associations.rb,
lib/graphiti/error_serializers/invalid_request.rb,
lib/generators/graphiti/resource_test_generator.rb,
lib/graphiti/error_serializers/conflict_request.rb,
lib/graphiti/error_serializers/translated_title.rb,
lib/graphiti/request_validators/update_validator.rb

Overview

For "Rails STI" behavior CreditCard.all # => [, , etc]

Defined Under Namespace

Modules: Adapters, Context, Delegates, ErrorSerializers, Errors, Extensions, GeneratorMixin, JsonapiSerializableExt, Links, Rails, RequestValidators, Scoping, SerializableHash, SerializableTempId, SpecHelpers, Stats, Util Classes: ApiTestGenerator, Audit, CLI, Configuration, ContextHash, Debugger, Deserializer, FilterOperators, HashRenderer, InstallGenerator, LocaleGenerator, Query, Renderer, RequestValidator, Resource, ResourceGenerator, ResourceProxy, ResourceTestGenerator, Runner, Schema, SchemaDiff, Scope, Serializer, Sideload, Types

Constant Summary collapse

DEPRECATOR =
ActiveSupport::Deprecation.new("3.0", "Graphiti")
Responders =

Deprecated. Was core's own responders mixin, superseded by the one that came in with graphiti-rails. Remove in 3.0.

ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
  "Graphiti::Responders",
  "Graphiti::Rails::Responders",
  DEPRECATOR
)
Railtie =

Deprecated. Core's railtie merged into graphiti-rails'. Remove in 3.0.

ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
  "Graphiti::Railtie",
  "Graphiti::Rails::Railtie",
  DEPRECATOR
)
VERSION =
"2.1.1"

Class Method Summary collapse

Class Method Details

.broadcast(name, payload) ⇒ Object



119
120
121
122
123
124
125
126
# File 'lib/graphiti.rb', line 119

def self.broadcast(name, payload)
  # AS::N prefers domain naming format with more specific towards end
  name = "#{name}.graphiti"

  ActiveSupport::Notifications.instrument(name, payload) do
    yield payload if block_given?
  end
end

.cache ⇒ Object



177
178
179
# File 'lib/graphiti.rb', line 177

def self.cache
  @cache
end

.cache=(val) ⇒ Object



173
174
175
# File 'lib/graphiti.rb', line 173

def self.cache=(val)
  @cache = val
end

.config ⇒ Object



77
78
79
# File 'lib/graphiti.rb', line 77

def self.config
  @config ||= Configuration.new
end

.configure {|config| ... } ⇒ Object

Examples:

Graphiti.configure do |c|
  c.raise_on_missing_sideload = false
end

Yields:

See Also:



87
88
89
# File 'lib/graphiti.rb', line 87

def self.configure
  yield config
end

.context ⇒ 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.



53
54
55
# File 'lib/graphiti.rb', line 53

def self.context
  Fiber[:context] ||= ContextHash.new
end

.context=(val) ⇒ 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.



58
59
60
61
62
# File 'lib/graphiti.rb', line 58

def self.context=(val)
  Fiber[:context] = ContextHash.new.tap do |hash|
    val.each { |key, value| hash[key] = value }
  end
end

.guarded_relationships ⇒ Object

Every guarded relationship, e.g. ["EmployeeResource.positions"]



108
109
110
111
112
113
114
115
116
117
# File 'lib/graphiti.rb', line 108

def self.guarded_relationships
  ::Rails.application.eager_load! if defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application

  resources.flat_map { |resource_class|
    resource_class.config[:sideloads]
      .select { |_name, sideload| sideload.guarded? }
      .keys
      .map { |relationship_name| "#{resource_class.name || "(anonymous resource)"}.#{relationship_name}" }
  }.uniq.sort
end

.log(msg, color = :white, bold = false) ⇒ Object



144
145
146
147
148
149
150
151
152
# File 'lib/graphiti.rb', line 144

def self.log(msg, color = :white, bold = false)
  colored = if ::ActiveSupport.version >= Gem::Version.new("7.1")
    ActiveSupport::LogSubscriber.new.send(:color, msg, color, bold: bold)
  else
    ActiveSupport::LogSubscriber.new.send(:color, msg, color, bold)
  end

  logger.debug(colored)
end

.logger ⇒ Object



128
129
130
# File 'lib/graphiti.rb', line 128

def self.logger
  @logger ||= stdout_logger
end

.logger=(val) ⇒ Object



140
141
142
# File 'lib/graphiti.rb', line 140

def self.logger=(val)
  @logger = val
end

.public_id_sources ⇒ Object



95
96
97
# File 'lib/graphiti.rb', line 95

def self.public_id_sources
  @public_id_sources ||= Util::PublicIdSources.new
end

.public_ids_declared=(value) ⇒ Object



103
104
105
# File 'lib/graphiti.rb', line 103

def self.public_ids_declared=(value)
  @public_ids_declared = value
end

.public_ids_declared? ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/graphiti.rb', line 99

def self.public_ids_declared?
  !!@public_ids_declared
end

.resources ⇒ Object



91
92
93
# File 'lib/graphiti.rb', line 91

def self.resources
  @resources ||= []
end

.setup! ⇒ Object

When we add a sideload, we need to do configuration, such as adding the relationship to the Resource's serializer. However, the sideload's Resource class may not be loaded yet.

This is not a problem when Rails autoloading, but is a problem when eager loading, or not using Rails.

So, load every Resource class then call Graphiti.setup!



162
163
164
165
166
167
# File 'lib/graphiti.rb', line 162

def self.setup!
  resources.each do |r|
    r.apply_sideloads_to_serializer
  end
  @setup = true
end

.setup? ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
# File 'lib/graphiti.rb', line 169

def self.setup?
  !!@setup
end

.stdout_logger ⇒ Object



132
133
134
135
136
137
138
# File 'lib/graphiti.rb', line 132

def self.stdout_logger
  logger = Logger.new($stdout)
  logger.formatter = proc do |severity, datetime, progname, msg|
    "#{msg}\n"
  end
  logger
end

.with_context(obj, action = nil) ⇒ 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.



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/graphiti.rb', line 65

def self.with_context(obj, action = nil)
  prior = context
  self.context = {object: obj, action: action}
  yield
ensure
  self.context = prior

  resources.each do |resource_class|
    resource_class.sideloads.values.each(&:clear_resources)
  end
end