Module: Serega::SeregaPlugins::Root

Defined in:
lib/serega/plugins/root/root.rb

Overview

Plugin :root

Allows to add root key to your serialized data

Accepts options:

- :root - specifies root for all responses
- :root_one - specifies root for single object serialization only
- :root_many - specifies root for multiple objects serialization only

Adds additional config options:

- config.root.one
- config.root.many
- config.root.one=
- config.root_many=

Default root is ‘:data`.

Root also can be changed per serialization.

Also root can be removed for all responses by providing ‘root: nil`. In this case no root will be added to response, but you still can to add it per serialization

Examples:

Define plugin

class UserSerializer < Serega
  plugin :root # default root is :data
end

class UserSerializer < Serega
  plugin :root, root: :users
end

class UserSerializer < Serega
  plugin :root, root_one: :user, root_many: :people
end

class UserSerializer < Serega
  plugin :root, root: nil # no root by default
end

Change root per serialization:

class UserSerializer < Serega
  plugin :root
end

UserSerializer.to_h(nil)              # => {:data=>nil}
UserSerializer.to_h(nil, root: :user) # => {:user=>nil}
UserSerializer.to_h(nil, root: nil)   # => nil

Defined Under Namespace

Modules: ClassMethods, ConfigInstanceMethods, InstanceMethods Classes: RootConfig

Constant Summary collapse

ROOT_DEFAULT =

Returns Default response root key.

Returns:

  • (Symbol)

    Default response root key

:data

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



105
106
107
108
109
110
111
112
113
114
# File 'lib/serega/plugins/root/root.rb', line 105

def self.after_load_plugin(serializer_class, **opts)
  config = serializer_class.config
  default = opts.fetch(:root, ROOT_DEFAULT)
  one = opts.fetch(:root_one, default)
  many = opts.fetch(:root_many, default)
  config.opts[:root] = {}
  config.root = {one: one, many: many}

  config.serialize_keys << :root
end

.before_load_plugin(serializer_class, **opts) ⇒ void

This method returns an undefined value.

Checks requirements to load plugin

Parameters:

  • serializer_class (Class<Serega>)

    Current serializer class

  • opts (Hash)

    plugin options



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/serega/plugins/root/root.rb', line 70

def self.before_load_plugin(serializer_class, **opts)
  allowed_keys = %i[root root_one root_many]
  opts.each_key do |key|
    next if allowed_keys.include?(key)

    raise SeregaError,
      "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
      "  - :root [String, Symbol, nil] Specifies common root keyword used when serializing one or multiple objects\n" \
      "  - :root_one [String, Symbol, nil] Specifies root keyword used when serializing one object\n" \
      "  - :root_many [String, Symbol, nil] Specifies root keyword used when serializing multiple objects" \
  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



91
92
93
94
95
# File 'lib/serega/plugins/root/root.rb', line 91

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

.plugin_nameSymbol

Returns Plugin name.

Returns:

  • (Symbol)

    Plugin name



59
60
61
# File 'lib/serega/plugins/root/root.rb', line 59

def self.plugin_name
  :root
end