class SimpleJsonapi::Node::Base

Represents a node in the JSONAPI document. See {file:README.md} for more details.

{include:file:doc/node_hierarchy.md} @abstract @!attribute [r] root_node

@return [Node::Base]

@!attribute [r] serializer_inferrer

@return [SerializerInferrer]

@!attribute [r] serializer

@return [Serializer,ErrorSerializer]

@!attribute [r] fields_spec

@return [Parameters::FieldsSpec]

@!attribute [r] include_spec

@return [Parameters::IncludeSpec]

@!attribute [r] sort_spec

@return [Parameters::SortSpec]

@!attribute [r] extras

@return [Hash{Symbol => Object}]

Attributes

extras[R]
fields_spec[R]
include_spec[R]
root_node[R]
serializer[R]
serializer_inferrer[R]
sort_spec[R]

Public Class Methods

new( root_node:, serializer_inferrer: nil, serializer: nil, fields: nil, include: nil, sort_related: nil, extras: {}, **_options ) click to toggle source

@param root_node [Node::Base] @param serializer_inferrer [SerializerInferrer] @param serializer [Serializer,ErrorSerializer] @param fields [Parameters::FieldsSpec] @param include [Parameters::IncludeSpec] @param sort_related [Parameters::SortSpec] @param extras [Hash{Symbol => Object}]

# File lib/simple_jsonapi/node/base.rb, line 31
def initialize(
  root_node:,
  serializer_inferrer: nil,
  serializer: nil,
  fields: nil,
  include: nil,
  sort_related: nil,
  extras: {},
  **_options
)
  @root_node = root_node
  @serializer_inferrer = SimpleJsonapi::SerializerInferrer.wrap(serializer_inferrer)
  @serializer = serializer
  @fields_spec = SimpleJsonapi::Parameters::FieldsSpec.wrap(fields)
  @include_spec = SimpleJsonapi::Parameters::IncludeSpec.wrap(include)
  @sort_spec = SimpleJsonapi::Parameters::SortSpec.wrap(sort_related)
  @extras = extras
end

Public Instance Methods

as_jsonapi() click to toggle source

@abstract @return [Hash{Symbol => Hash}]

# File lib/simple_jsonapi/node/base.rb, line 52
def as_jsonapi
  raise NotImplementedError, "Implement #{__method__} in each subclass."
end

Private Instance Methods

build_child_node(node_class, **options) click to toggle source
# File lib/simple_jsonapi/node/base.rb, line 58
def build_child_node(node_class, **options)
  defaults = {
    root_node: root_node,
    serializer_inferrer: serializer_inferrer,
    serializer: serializer,
    fields: fields_spec,
    include: include_spec,
    sort_related: sort_spec,
    extras: extras,
  }

  node_class.new(defaults.merge(options))
end
evaluate(callable, object, **data) click to toggle source
# File lib/simple_jsonapi/node/base.rb, line 72
def evaluate(callable, object, **data)
  serializer.with(data.merge(extras)) do
    serializer.instance_exec(object, &callable)
  end
end
render?(definition, object) click to toggle source
# File lib/simple_jsonapi/node/base.rb, line 78
def render?(definition, object)
  if_proc = definition.if_predicate
  unless_proc = definition.unless_predicate

  if if_proc && !evaluate(if_proc, object)
    false
  elsif unless_proc && evaluate(unless_proc, object)
    false
  else
    true
  end
end