Module: Serega::SeregaPlugins::Metadata

Defined in:
lib/serega/plugins/metadata/metadata.rb,
lib/serega/plugins/metadata/meta_attribute.rb,
lib/serega/plugins/metadata/validations/check_opts.rb,
lib/serega/plugins/metadata/validations/check_path.rb,
lib/serega/plugins/metadata/validations/check_block.rb,
lib/serega/plugins/metadata/validations/check_opt_hide_nil.rb,
lib/serega/plugins/metadata/validations/check_opt_hide_empty.rb

Overview

Plugin :metadata

Depends on: :root plugin, that must be loaded first

Adds ability to describe metadata that must be added to serialized response

Added class-level method :meta_attribute, to define metadata, it accepts:

  • *path [Array] - nested hash keys beginning from the root object.
  • **options [Hash] - defaults are hide_nil: false, hide_empty: false
  • &block [Proc] - describes value for current meta attribute

Examples:

class AppSerializer < Serega
  plugin :root
  plugin :metadata

  meta_attribute(:version) { '1.2.3' }
  meta_attribute(:ab_tests, :names) { %i[foo bar] }
  meta_attribute(:meta, :paging, hide_nil: true) do |records, ctx|
    next unless records.respond_to?(:total_count)

    { page: records.page, per_page: records.per_page, total_count: records.total_count }
  end
end

AppSerializer.to_h(nil) # => {:data=>nil, :version=>"1.2.3", :ab_tests=>{:names=>[:foo, :bar]}}

Defined Under Namespace

Modules: ClassMethods, ConfigInstanceMethods, InstanceMethods Classes: MetaAttribute, MetadataConfig

Class Method Summary collapse

Class Method Details

.after_load_plugin(serializer_class, **_opts) ⇒ void

This method returns an undefined value.

Adds config options and runs other callbacks after plugin was loaded

Parameters:

  • serializer_class (Class<Serega>)

    Current serializer class

  • _opts (Hash)

    loaded plugins opts



85
86
87
# File 'lib/serega/plugins/metadata/metadata.rb', line 85

def self.after_load_plugin(serializer_class, **_opts)
  serializer_class.config.opts[:metadata] = {attribute_keys: %i[path hide_nil hide_empty]}
end

.before_load_plugin(serializer_class, **_opts) ⇒ void

This method returns an undefined value.

Checks requirements and loads additional plugins

Parameters:

  • serializer_class (Class<Serega>)

    Current serializer class

  • _opts (Hash)

    loaded plugins opts



46
47
48
49
50
# File 'lib/serega/plugins/metadata/metadata.rb', line 46

def self.before_load_plugin(serializer_class, **_opts)
  unless serializer_class.plugin_used?(:root)
    raise SeregaError, "Please load :root plugin first so we can wrap serialization response into top-level hash to add metadata there"
  end
end

.load_plugin(serializer_class, **_opts) ⇒ void

This method returns an undefined value.

Applies plugin code to specific serializer

Parameters:

  • serializer_class (Class<Serega>)

    Current serializer class

  • _opts (Hash)

    Loaded plugins options



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/serega/plugins/metadata/metadata.rb', line 60

def self.load_plugin(serializer_class, **_opts)
  serializer_class.extend(ClassMethods)
  serializer_class.include(InstanceMethods)
  serializer_class::SeregaConfig.include(ConfigInstanceMethods)

  require_relative "./meta_attribute"
  require_relative "./validations/check_block"
  require_relative "./validations/check_opt_hide_nil"
  require_relative "./validations/check_opt_hide_empty"
  require_relative "./validations/check_opts"
  require_relative "./validations/check_path"

  meta_attribute_class = Class.new(MetaAttribute)
  meta_attribute_class.serializer_class = serializer_class
  serializer_class.const_set(:MetaAttribute, meta_attribute_class)
end

.plugin_nameSymbol

Returns Plugin name.

Returns:

  • (Symbol)

    Plugin name



35
36
37
# File 'lib/serega/plugins/metadata/metadata.rb', line 35

def self.plugin_name
  :metadata
end