Class: HaveAPI::Parameters::Param

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/params/param.rb

Constant Summary collapse

ATTRIBUTES =
i(label desc type db_name default fill clean)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, args = {}) ⇒ Param

Returns a new instance of Param.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/haveapi/params/param.rb', line 7

def initialize(name, args = {})
  # The hash values are deleted and it shouldn't affect the received hash
  myargs = args.clone

  @name = name
  @label = myargs.delete(:label) || name.to_s.capitalize
  @layout = :custom

  (ATTRIBUTES - i(label)).each do |attr|
    instance_variable_set("@#{attr}", myargs.delete(attr))
  end

  @type ||= String

  @validators = HaveAPI::ValidatorChain.new(myargs) unless myargs.empty?
  fail "unused arguments #{myargs}" unless myargs.empty?
end

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



5
6
7
# File 'lib/haveapi/params/param.rb', line 5

def default
  @default
end

#descObject (readonly)

Returns the value of attribute desc.



5
6
7
# File 'lib/haveapi/params/param.rb', line 5

def desc
  @desc
end

#labelObject (readonly)

Returns the value of attribute label.



5
6
7
# File 'lib/haveapi/params/param.rb', line 5

def label
  @label
end

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/haveapi/params/param.rb', line 5

def name
  @name
end

#typeObject (readonly)

Returns the value of attribute type.



5
6
7
# File 'lib/haveapi/params/param.rb', line 5

def type
  @type
end

Instance Method Details

#add_validator(k, v) ⇒ Object



52
53
54
55
# File 'lib/haveapi/params/param.rb', line 52

def add_validator(k, v)
  @validators ||= HaveAPI::ValidatorChain.new({})
  @validators.add_or_replace(k, v)
end

#clean(raw) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/haveapi/params/param.rb', line 68

def clean(raw)
  return instance_exec(raw, &@clean) if @clean
  
  val = if raw.nil?
    @default

  elsif @type.nil?
    nil

  elsif @type == Integer
    raw.to_i

  elsif @type == Boolean
    Boolean.to_b(raw)

  elsif @type == ::Datetime
    begin
      Time.iso8601(raw)

    rescue ArgumentError
      raise HaveAPI::ValidationError.new("not in ISO 8601 format '#{raw}'")
    end

  else
    raw
  end

  val
end

#db_nameObject



25
26
27
# File 'lib/haveapi/params/param.rb', line 25

def db_name
  @db_name || @name
end

#describe(context) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/haveapi/params/param.rb', line 41

def describe(context)
  {
      required: required?,
      label: @label,
      description: @desc,
      type: @type ? @type.to_s : String.to_s,
      validators: @validators ? @validators.describe : {},
      default: @default
  }
end

#fill?Boolean

Returns:



37
38
39
# File 'lib/haveapi/params/param.rb', line 37

def fill?
  @fill
end

#format_output(v) ⇒ Object



102
103
104
105
106
107
108
109
# File 'lib/haveapi/params/param.rb', line 102

def format_output(v)
  if @type == ::Datetime && v.is_a?(Time)
    v.iso8601

  else
    v
  end
end

#optional?Boolean

Returns:



33
34
35
# File 'lib/haveapi/params/param.rb', line 33

def optional?
  !@required
end

#patch(attrs) ⇒ Object



57
58
59
60
61
62
63
64
65
66
# File 'lib/haveapi/params/param.rb', line 57

def patch(attrs)
  attrs.each do |k, v|
    if ATTRIBUTES.include?(k)
      instance_variable_set("@#{k}", v)

    else
      add_validator(k, v)
    end
  end
end

#required?Boolean

Returns:



29
30
31
# File 'lib/haveapi/params/param.rb', line 29

def required?
  @validators ? @validators.required? : false
end

#validate(v, params) ⇒ Object



98
99
100
# File 'lib/haveapi/params/param.rb', line 98

def validate(v, params)
  @validators ? @validators.validate(v, params) : true
end