Module: Alba

Defined in:
lib/alba.rb,
lib/alba/type.rb,
lib/alba/errors.rb,
lib/alba/layout.rb,
lib/alba/railtie.rb,
lib/alba/resource.rb,
lib/alba/constants.rb,
lib/alba/association.rb,
lib/alba/deprecation.rb,
lib/alba/typed_attribute.rb,
lib/alba/nested_attribute.rb,
lib/alba/default_inflector.rb,
lib/alba/conditional_attribute.rb

Overview

This file includes public constants to prevent circular dependencies.

Defined Under Namespace

Modules: DefaultInflector, Deprecation, Resource Classes: Association, ConditionalAttribute, Error, Layout, NestedAttribute, Railtie, Type, TypedAttribute, UnsupportedBackend, UnsupportedType

Constant Summary collapse

Serializer =
Resource
REMOVE_KEY =

A constant to remove key from serialized JSON

Object.new.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.backendObject

Returns the value of attribute backend.



14
15
16
# File 'lib/alba.rb', line 14

def backend
  @backend
end

.encoderObject

Returns the value of attribute encoder.



14
15
16
# File 'lib/alba.rb', line 14

def encoder
  @encoder
end

.inflectorObject

Getter for inflector, a module responsible for inflecting strings



17
18
19
# File 'lib/alba.rb', line 17

def inflector
  @inflector
end

Class Method Details

.collection?(object) ⇒ Boolean

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.

Detect if object is a collection or not. When object is a Struct, it’s Enumerable but not a collection

Returns:

  • (Boolean)


81
82
83
# File 'lib/alba.rb', line 81

def collection?(object)
  object.is_a?(Enumerable) && !object.is_a?(Struct)
end

.disable_inference!Object

Deprecated.

Use inflector= instead

Disable inference for key and resource name



100
101
102
103
104
# File 'lib/alba.rb', line 100

def disable_inference!
  Alba::Deprecation.warn('Alba.disable_inference! is deprecated. Use `Alba.inflector = nil` instead.')
  @inferring = false
  @inflector = nil
end

.enable_inference!(with:) ⇒ Object

Deprecated.

Use inflector= instead

Enable inference for key and resource name

Parameters:

  • with (Symbol, Class, Module)

    inflector When it’s a Symbol, it sets inflector with given name When it’s a Class or a Module, it sets given object to inflector



91
92
93
94
95
# File 'lib/alba.rb', line 91

def enable_inference!(with:)
  Alba::Deprecation.warn('Alba.enable_inference! is deprecated. Use `Alba.inflector=` instead.')
  @inflector = inflector_from(with)
  @inferring = true
end

.find_type(name) ⇒ Alba::Type

Find type by name

Returns:



197
198
199
200
201
# File 'lib/alba.rb', line 197

def find_type(name)
  @types.fetch(name) do
    raise(Alba::UnsupportedType, "Unknown type: #{name}")
  end
end

.hashify(object = nil, with: :inference, root_key: nil, &block) ⇒ String

Hashify the object with inline definitions

Parameters:

  • object (Object) (defaults to: nil)

    the object to be serialized

  • with (:inference, Proc, Class<Alba::Resource>) (defaults to: :inference)

    determines how to get resource class for each object

  • root_key (Symbol, nil, true) (defaults to: nil)
  • block (Block)

    resource block

Returns:

  • (String)

    serialized JSON string

Raises:

  • (ArgumentError)

    if block is absent or ‘with` argument’s type is wrong



68
69
70
71
72
73
74
75
# File 'lib/alba.rb', line 68

def hashify(object = nil, with: :inference, root_key: nil, &block)
  if collection?(object)
    hashify_collection(object, with, &block)
  else
    resource = resource_with(object, &block)
    resource.as_json(root_key: root_key)
  end
end

.infer_resource_class(name, nesting: nil) ⇒ Class<Alba::Resource>

Returns resource class.

Parameters:

  • name (String)

    a String Alba infers resource name with

  • nesting (String, nil) (defaults to: nil)

    namespace Alba tries to find resource class in

Returns:

Raises:



134
135
136
137
138
139
140
141
142
143
# File 'lib/alba.rb', line 134

def infer_resource_class(name, nesting: nil)
  raise Alba::Error, 'Inference is disabled so Alba cannot infer resource name. Set inflector before use.' unless Alba.inflector

  const_parent = nesting.nil? ? Object : Object.const_get(nesting)
  begin
    const_parent.const_get("#{inflector.classify(name)}Resource")
  rescue NameError # Retry for serializer
    const_parent.const_get("#{inflector.classify(name)}Serializer")
  end
end

.inferringBoolean

Deprecated.

Use inflector instead

Returns whether inference is enabled or not.

Returns:

  • (Boolean)

    whether inference is enabled or not



108
109
110
111
# File 'lib/alba.rb', line 108

def inferring
  Alba::Deprecation.warn('Alba.inferring is deprecated. Use `Alba.inflector` instead.')
  @inferring
end

.register_type(name, check: false, converter: nil, auto_convert: false) ⇒ void

This method returns an undefined value.

Register types, used for both builtin and custom types

See Also:



190
191
192
# File 'lib/alba.rb', line 190

def register_type(name, check: false, converter: nil, auto_convert: false)
  @types[name] = Type.new(name, check: check, converter: converter, auto_convert: auto_convert)
end

.regularize_key(key) ⇒ Symbol, ...

Regularize key to be either Symbol or String depending on @symbolize_keys Returns nil if key is nil

Parameters:

  • key (String, Symbol, nil)

Returns:

  • (Symbol, String, nil)


160
161
162
163
164
# File 'lib/alba.rb', line 160

def regularize_key(key)
  return if key.nil?

  @symbolize_keys ? key.to_sym : key.to_s
end

.reset!Object

Reset config variables Useful for test cleanup



205
206
207
208
209
210
211
212
# File 'lib/alba.rb', line 205

def reset!
  @encoder = default_encoder
  @symbolize_keys = false
  @_on_error = :raise
  @_on_nil = nil
  @types = {}
  register_default_types
end

.resource_class(&block) ⇒ Class<Alba::Resource>

Returns resource class.

Parameters:

  • block (Block)

    resource body

Returns:



124
125
126
127
128
129
# File 'lib/alba.rb', line 124

def resource_class(&block)
  klass = Class.new
  klass.include(Alba::Resource)
  klass.class_eval(&block) if block
  klass
end

.resource_with(object, &block) ⇒ Object

Get a resource object from arguments If block is given, it creates a resource class with the block Otherwise, it infers resource class from the object’s class name

@ param object [Object] the object whose class name is used for inferring resource class



219
220
221
222
223
# File 'lib/alba.rb', line 219

def resource_with(object, &block)
  klass = block ? resource_class(&block) : infer_resource_class(object.class.name)

  klass.new(object)
end

.serialize(object = nil, with: :inference, root_key: nil, &block) ⇒ String

Serialize the object with inline definitions

Parameters:

  • object (Object) (defaults to: nil)

    the object to be serialized

  • with (:inference, Proc, Class<Alba::Resource>) (defaults to: :inference)

    determines how to get resource class for each object

  • root_key (Symbol, nil, true) (defaults to: nil)
  • block (Block)

    resource block

Returns:

  • (String)

    serialized JSON string

Raises:

  • (ArgumentError)

    if block is absent or ‘with` argument’s type is wrong



50
51
52
53
54
55
56
57
58
# File 'lib/alba.rb', line 50

def serialize(object = nil, with: :inference, root_key: nil, &block)
  if collection?(object)
    h = hashify_collection(object, with, &block)
    Alba.encoder.call(h)
  else
    resource = resource_with(object, &block)
    resource.serialize(root_key: root_key)
  end
end

.stringify_keys!Object

Configure Alba to stringify (not symbolize) keys



151
152
153
# File 'lib/alba.rb', line 151

def stringify_keys!
  @symbolize_keys = false
end

.symbolize_keys!Object

Configure Alba to symbolize keys



146
147
148
# File 'lib/alba.rb', line 146

def symbolize_keys!
  @symbolize_keys = true
end

.transform_key(key, transform_type:) ⇒ String

Transform a key with given transform_type

Parameters:

  • key (String)

    a target key

  • transform_type (Symbol)

    a transform type, either one of ‘camel`, `lower_camel`, `dash` or `snake`

Returns:

  • (String)

Raises:



171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/alba.rb', line 171

def transform_key(key, transform_type:)
  raise Alba::Error, 'Inflector is nil. You must set inflector before transforming keys.' unless inflector

  key = key.to_s

  k = case transform_type
      when :camel then inflector.camelize(key)
      when :lower_camel then inflector.camelize_lower(key)
      when :dash then inflector.dasherize(key)
      when :snake then inflector.underscore(key)
      else raise Alba::Error, "Unknown transform type: #{transform_type}"
      end
  regularize_key(k)
end