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_const.rb,
lib/serega/plugins/metadata/validations/check_opt_value.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 of Symbols] - nested hash keys.

  • **options [Hash]

  • :const - describes metadata value (if it is constant)

  • :value - describes metadata value as any #callable instance

  • :hide_nil - does not show metadata key if value is nil, false by default

  • :hide_empty, does not show metadata key if value is nil or empty, false by default

  • &block [Proc] - describes value for current meta attribute

Examples:

class AppSerializer < Serega
  plugin :root
  plugin :metadata

  meta_attribute(:version, const: '1.2.3')
  meta_attribute(:ab_tests, :names, value: ABTests.new.method(:names))
  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=> ... }}

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)

    Plugin options



94
95
96
# File 'lib/serega/plugins/metadata/metadata.rb', line 94

def self.after_load_plugin(serializer_class, **_opts)
  serializer_class.config.opts[:metadata] = {attribute_keys: %i[const hide_nil hide_empty value]}
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)

    Plugin options



53
54
55
56
57
# File 'lib/serega/plugins/metadata/metadata.rb', line 53

def self.before_load_plugin(serializer_class, **_opts)
  unless serializer_class.plugin_used?(:root)
    raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :root plugin. Please load the :root plugin first"
  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)

    Plugin options



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/serega/plugins/metadata/metadata.rb', line 67

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_const"
  require_relative "validations/check_opt_hide_nil"
  require_relative "validations/check_opt_hide_empty"
  require_relative "validations/check_opt_value"
  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



42
43
44
# File 'lib/serega/plugins/metadata/metadata.rb', line 42

def self.plugin_name
  :metadata
end