Class: Paramoid::Object

Inherits:
Object
  • Object
show all
Defined in:
lib/paramoid/object.rb

Overview

rubocop:disable Metrics/ClassLength

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, alias_name, nested: nil, nesting_type: nil, transformer: nil, default: nil, required: false) ⇒ Object

Returns a new instance of Object.

Parameters:

  • name (Symbol)
  • alias_name (Symbol)
  • nested (Object, NilClass) (defaults to: nil)
  • default (Object) (defaults to: nil)
  • transformer (Lambda, NilClass) (defaults to: nil)
  • required (TrueClass, FalseClass) (defaults to: false)


23
24
25
26
27
28
29
30
31
# File 'lib/paramoid/object.rb', line 23

def initialize(name, alias_name, nested: nil, nesting_type: nil, transformer: nil, default: nil, required: false)
  @name = name
  @alias = alias_name
  @nested = nested
  @default = default
  @transformer = transformer
  @required = required
  @nesting_type = nesting_type
end

Instance Attribute Details

#alias_nameSymbol (readonly)

Returns the parameter alias.

Returns:

  • (Symbol)

    the parameter alias



7
8
9
# File 'lib/paramoid/object.rb', line 7

def alias_name
  @alias_name
end

#defaultObject (readonly)

Returns the parameter default value.

Returns:

  • (Object)

    the parameter default value



11
12
13
# File 'lib/paramoid/object.rb', line 11

def default
  @default
end

#nameSymbol (readonly)

Returns the parameter name.

Returns:

  • (Symbol)

    the parameter name



5
6
7
# File 'lib/paramoid/object.rb', line 5

def name
  @name
end

#nestedObject (readonly)

Returns the parameter nested.

Returns:

  • (Object)

    the parameter nested



9
10
11
# File 'lib/paramoid/object.rb', line 9

def nested
  @nested
end

#requiredTrueClass, FalseClass (readonly)

Returns required.

Returns:

  • (TrueClass, FalseClass)

    required



15
16
17
# File 'lib/paramoid/object.rb', line 15

def required
  @required
end

#transformerLambda, NilClass (readonly)

Returns the transformer.

Returns:

  • (Lambda, NilClass)

    the transformer



13
14
15
# File 'lib/paramoid/object.rb', line 13

def transformer
  @transformer
end

Instance Method Details

#<<(value) ⇒ Object



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

def <<(value)
  @nested << value
end

#apply_defaults!(params) ⇒ Hash

Returns the params with the default values.

Parameters:

  • params (Hash)

Returns:

  • (Hash)

    the params with the default values



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/paramoid/object.rb', line 95

def apply_defaults!(params)
  return apply_nested_defaults!(params) if nested?

  return params unless @default

  return params if @nesting_type == :list && !params

  params ||= {}
  apply_scalar_defaults!(params)

  params
end

#apply_nested_defaults!(params) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/paramoid/object.rb', line 117

def apply_nested_defaults!(params)
  return params unless params

  params ||= @nesting_type == :list ? [] : {}

  return apply_nested_param_default_when_available!(params, output_key) unless params.is_a?(Array)

  params.map! do |param|
    apply_nested_param_default_when_available!(param, output_key)
  end
  params
end

#apply_nested_param_default_when_available!(param, key) ⇒ Object



130
131
132
133
134
135
136
# File 'lib/paramoid/object.rb', line 130

def apply_nested_param_default_when_available!(param, key)
  return param unless param[key]

  result = @nested.apply_defaults!(param[key])
  param[key] = result if result
  param
end

#apply_scalar_defaults!(params) ⇒ Object



108
109
110
111
112
113
114
115
# File 'lib/paramoid/object.rb', line 108

def apply_scalar_defaults!(params)
  if params.is_a?(Array)
    params.map! { |param| apply_scalar_defaults!(param) }
  else
    params[output_key] ||= @default
  end
  params
end

#ensure_required_nested_params!(params, current_path) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/paramoid/object.rb', line 85

def ensure_required_nested_params!(params, current_path)
  return params if current_path.size > 1 && params.nil?

  @nested.ensure_required_params!(params ? params[output_key] : nil, path: current_path)

  params
end

#ensure_required_params!(params, path: []) ⇒ Object

Parameters:

  • params (Hash)
  • path (Array<Symbol>) (defaults to: [])

Raises:

  • (ActionController::ParameterMissing)

    if one of the required params is missing



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/paramoid/object.rb', line 68

def ensure_required_params!(params, path: [])
  if params.is_a?(Array)
    params.flatten.each do |param|
      ensure_required_params!(param, path: path)
    end
    return params
  end

  current_path = [*path, @name]

  _raise_on_missing_parameter!(params, output_key, current_path) if @required

  return params unless nested?

  ensure_required_nested_params!(params, current_path)
end

#nested?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'lib/paramoid/object.rb', line 155

def nested?
  !@nested.nil?
end

#output_keyObject



147
148
149
# File 'lib/paramoid/object.rb', line 147

def output_key
  @output_key ||= (@alias || @name).to_s
end

#to_defaultsObject



138
139
140
141
142
143
144
145
# File 'lib/paramoid/object.rb', line 138

def to_defaults
  if nested?
    nested_defaults = @nested.to_defaults
    (nested_defaults.present? ? { output_key => nested_defaults } : {}).with_indifferent_access
  else
    (@default ? { output_key => @default } : {}).with_indifferent_access
  end
end

#to_paramsObject



48
49
50
51
52
53
54
# File 'lib/paramoid/object.rb', line 48

def to_params
  if nested?
    { @name.to_sym => @nested.to_params }
  else
    @name
  end
end

#to_required_paramsHash

Returns the required params.

Returns:

  • (Hash)

    the required params



57
58
59
60
61
62
63
# File 'lib/paramoid/object.rb', line 57

def to_required_params
  if nested?
    @nested.to_required_params
  else
    @required ? [@name] : []
  end
end

#transform_params!(params) ⇒ Object

Parameters:

  • params (Array, Hash)


34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/paramoid/object.rb', line 34

def transform_params!(params)
  if params.is_a?(Array)
    params.each { |param| transform_params!(param) }
    return
  end

  return unless params.key?(@name)

  params[@name] = @transformer.call(params[@name]) if @transformer.respond_to?(:call)

  @nested.transform_params!(params[@name]) if nested?
  params[@alias] = params.delete(@name) unless @alias == @name
end