Module: Alba::Resource::ClassMethods

Included in:
Alba::Resource
Defined in:
lib/alba/resource.rb

Overview

Class methods

Instance Method Summary collapse

Instance Method Details

#association(name, condition = nil, resource: nil, key: nil, params: {}, **options, &block) ⇒ void Also known as: one, many, has_one, has_many

This method returns an undefined value.

Set association

Parameters:

  • name (String, Symbol)

    name of the association, used as key when ‘key` param doesn’t exist

  • condition (Proc, nil) (defaults to: nil)

    a Proc to modify the association

  • resource (Class<Alba::Resource>, String, Proc, nil) (defaults to: nil)

    representing resource for this association

  • key (String, Symbol, nil) (defaults to: nil)

    used as key when given

  • params (Hash) (defaults to: {})

    params override for the association

  • options (Hash<Symbol, Proc>)
  • block (Block)

Options Hash (**options):

  • if (Proc)

    a condition to decide if this association should be serialized

See Also:



380
381
382
383
384
385
386
# File 'lib/alba/resource.rb', line 380

def association(name, condition = nil, resource: nil, key: nil, params: {}, **options, &block)
  transformation = @_key_transformation_cascade ? @_transform_type : :none
  assoc = Association.new(
    name: name, condition: condition, resource: resource, params: params, nesting: nesting, key_transformation: transformation, helper: @_helper, &block
  )
  @_attributes[key&.to_sym || name.to_sym] = options[:if] ? ConditionalAttribute.new(body: assoc, condition: options[:if]) : assoc
end

#attribute(name, **options, &block) ⇒ void

This method returns an undefined value.

Set an attribute with the given block

Parameters:

  • name (String, Symbol)

    key name

  • options (Hash<Symbol, Proc>)
  • block (Block)

    the block called during serialization

Options Hash (**options):

  • if (Proc)

    a condition to decide if this attribute should be serialized

Raises:

  • (ArgumentError)

    if block is absent



362
363
364
365
366
# File 'lib/alba/resource.rb', line 362

def attribute(name, **options, &block)
  raise ArgumentError, 'No block given in attribute method' unless block

  @_attributes[name.to_sym] = options[:if] ? ConditionalAttribute.new(body: block, condition: options[:if]) : block
end

#attributes(*attrs, if: nil, **attrs_with_types) ⇒ void

This method returns an undefined value.

Set multiple attributes at once

Parameters:

  • attrs (Array<String, Symbol>)
  • if (Proc) (defaults to: nil)

    condition to decide if it should serialize these attributes

  • attrs_with_types (Hash<[Symbol, String], [Array<Symbol, Proc>, Symbol]>)

    attributes with name in its key and type and optional type converter in its value



328
329
330
331
332
# File 'lib/alba/resource.rb', line 328

def attributes(*attrs, if: nil, **attrs_with_types)
  if_value = binding.local_variable_get(:if)
  assign_attributes(attrs, if_value)
  assign_attributes_with_types(attrs_with_types, if_value)
end

#collection_key(key) ⇒ Object

Sets key for collection serialization

Parameters:

  • key (String, Symbol)


498
499
500
# File 'lib/alba/resource.rb', line 498

def collection_key(key)
  @_collection_key = key.to_sym
end

#helper(mod = @_helper || Module.new, &block) ⇒ Object

Define helper methods

Parameters:

  • mod (Module) (defaults to: @_helper || Module.new)

    a module to extend



535
536
537
538
539
# File 'lib/alba/resource.rb', line 535

def helper(mod = @_helper || Module.new, &block)
  mod.module_eval(&block) if block
  extend mod
  @_helper = mod
end

#layout(file: nil, inline: nil) ⇒ Object

Set layout

Parameters:

  • file (String) (defaults to: nil)

    name of the layout file

  • inline (Proc) (defaults to: nil)

    a proc returning JSON string or a Hash representing JSON



452
453
454
# File 'lib/alba/resource.rb', line 452

def layout(file: nil, inline: nil)
  @_layout = Layout.new(file: file, inline: inline)
end

#meta(key = :meta, &block) ⇒ Object

Set metadata



444
445
446
# File 'lib/alba/resource.rb', line 444

def meta(key = :meta, &block)
  @_meta = [key, block]
end

#method_added(method_name) ⇒ Object

This ‘method_added` is used for defining “resource methods”



308
309
310
311
# File 'lib/alba/resource.rb', line 308

def method_added(method_name)
  _resource_methods << method_name.to_sym unless method_name.to_sym == :_setup
  super
end

#nested_attribute(name, **options, &block) ⇒ void Also known as: nested

This method returns an undefined value.

Set a nested attribute with the given block

Parameters:

  • name (String, Symbol)

    key name

  • options (Hash<Symbol, Proc>)
  • block (Block)

    the block called during serialization

Options Hash (**options):

  • if (Proc)

    a condition to decide if this attribute should be serialized

Raises:

  • (ArgumentError)

    if block is absent



409
410
411
412
413
414
415
# File 'lib/alba/resource.rb', line 409

def nested_attribute(name, **options, &block)
  raise ArgumentError, 'No block given in attribute method' unless block

  key_transformation = @_key_transformation_cascade ? @_transform_type : :none
  attribute = NestedAttribute.new(key_transformation: key_transformation, &block)
  @_attributes[name.to_sym] = options[:if] ? ConditionalAttribute.new(body: attribute, condition: options[:if]) : attribute
end

#on_error(handler = nil, &block) ⇒ Object

Set error handler If this is set it’s used as a error handler overriding global one

Parameters:

  • handler (Symbol) (defaults to: nil)

    ‘:raise`, `:ignore` or `:nullify`

  • block (Block)

Raises:

  • (ArgumentError)


507
508
509
510
511
512
# File 'lib/alba/resource.rb', line 507

def on_error(handler = nil, &block)
  raise ArgumentError, 'You cannot specify error handler with both Symbol and block' if handler && block
  raise ArgumentError, 'You must specify error handler with either Symbol or block' unless handler || block

  @_on_error = block || validated_error_handler(handler)
end

#on_nil(&block) ⇒ Object

Set nil handler

Parameters:

  • block (Block)


528
529
530
# File 'lib/alba/resource.rb', line 528

def on_nil(&block)
  @_on_nil = block
end

#prefer_object_method!Object

DSL for alias, purely for readability



547
548
549
# File 'lib/alba/resource.rb', line 547

def prefer_object_method!
  alias_method :fetch_attribute_from_object_and_resource, :_fetch_attribute_from_object_first
end

#prefer_resource_method!Object

DSL for alias, purely for readability



542
543
544
# File 'lib/alba/resource.rb', line 542

def prefer_resource_method!
  alias_method :fetch_attribute_from_object_and_resource, :_fetch_attribute_from_resource_first
end

#root_key(key, key_for_collection = nil) ⇒ Object

Set root key

Parameters:

  • key (String, Symbol)
  • key_for_collection (String, Symbol) (defaults to: nil)

Raises:

  • (NoMethodError)

    when key doesn’t respond to ‘to_sym` method



423
424
425
426
# File 'lib/alba/resource.rb', line 423

def root_key(key, key_for_collection = nil)
  @_key = key.to_sym
  @_key_for_collection = key_for_collection&.to_sym
end

#root_key!Object

Set root key to true



438
439
440
441
# File 'lib/alba/resource.rb', line 438

def root_key!
  @_key = true
  @_key_for_collection = true
end

#root_key_for_collection(key) ⇒ Object

Set root key for collection

Parameters:

  • key (String, Symbol)

Raises:

  • (NoMethodError)

    when key doesn’t respond to ‘to_sym` method



432
433
434
435
# File 'lib/alba/resource.rb', line 432

def root_key_for_collection(key)
  @_key = true
  @_key_for_collection = key.to_sym
end

#transform_keys(type, root: true, cascade: true) ⇒ Object

Transform keys as specified type

Parameters:

  • type (String, Symbol)

    one of ‘snake`, `:camel`, `:lower_camel`, `:dash` and `none`

  • root (Boolean) (defaults to: true)

    decides if root key also should be transformed

  • cascade (Boolean) (defaults to: true)

    decides if key transformation cascades into inline association Default is true but can be set false for old (v1) behavior

Raises:



463
464
465
466
467
468
469
470
471
472
473
# File 'lib/alba/resource.rb', line 463

def transform_keys(type, root: true, cascade: true)
  type = type.to_sym
  unless %i[none snake camel lower_camel dash].include?(type)
    # This should be `ArgumentError` but for backward compatibility it raises `Alba::Error`
    raise ::Alba::Error, "Unknown transform type: #{type}. Supported type are :camel, :lower_camel and :dash."
  end

  @_transform_type = type
  @_transforming_root_key = root
  @_key_transformation_cascade = cascade
end

#transform_keys!(type) ⇒ Object

Transform keys as specified type AFTER the class is defined Note that this is an experimental API and may be removed/changed

See Also:



479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/alba/resource.rb', line 479

def transform_keys!(type)
  dup.class_eval do
    transform_keys(type, root: @_transforming_root_key, cascade: @_key_transformation_cascade)

    if @_key_transformation_cascade
      # We need to update key transformation of associations and nested attributes
      @_attributes.each_value do |attr|
        next unless attr.is_a?(Association) || attr.is_a?(NestedAttribute)

        attr.key_transformation = type
      end
    end
    self # Return the new class
  end
end