Class: HaveAPI::Parameters::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/parameters/resource.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, name: nil, label: nil, desc: nil, choices: nil, value_id: :id, value_label: :label, required: nil, db_name: nil, fetch: nil, nullable: nil) ⇒ Resource

Returns a new instance of Resource.



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

def initialize(resource, name: nil, label: nil, desc: nil,
               choices: nil, value_id: :id, value_label: :label, required: nil,
               db_name: nil, fetch: nil, nullable: nil)
  @resource = resource
  @resource_path = build_resource_path(resource)
  @name = name || resource.resource_name.underscore.to_sym
  @label = label || (name && name.to_s.capitalize) || resource.resource_name
  @desc = desc
  @choices = choices || @resource::Index
  @value_id = value_id
  @value_label = value_label
  @required = required
  @nullable = nullable
  @db_name = db_name
  @extra = {
      fetch:
  }
end

Instance Attribute Details

#choicesObject (readonly)

Returns the value of attribute choices.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def choices
  @choices
end

#descObject (readonly)

Returns the value of attribute desc.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def desc
  @desc
end

#labelObject (readonly)

Returns the value of attribute label.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def label
  @label
end

#nameObject (readonly)

Returns the value of attribute name.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def name
  @name
end

#resourceObject (readonly)

Returns the value of attribute resource.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def resource
  @resource
end

#typeObject (readonly)

Returns the value of attribute type.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def type
  @type
end

#value_idObject (readonly)

Returns the value of attribute value_id.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def value_id
  @value_id
end

#value_labelObject (readonly)

Returns the value of attribute value_label.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def value_label
  @value_label
end

#value_paramsObject (readonly)

Returns the value of attribute value_params.



3
4
5
# File 'lib/haveapi/parameters/resource.rb', line 3

def value_params
  @value_params
end

Instance Method Details

#clean(raw) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/haveapi/parameters/resource.rb', line 100

def clean(raw)
  if raw.nil?
    return nil if nullable?

    raise HaveAPI::ValidationError, 'cannot be null'
  end

  if raw.is_a?(String)
    stripped = raw.strip
    return nil if stripped.empty? && nullable?
  end

  extra = @extra.merge(optional: optional?, nullable: nullable?)

  ::HaveAPI::ModelAdapter.for(
    show_action.input.layout, @resource.model
  ).input_clean(@resource.model, raw, extra)
end

#db_nameObject



25
26
27
# File 'lib/haveapi/parameters/resource.rb', line 25

def db_name
  @db_name || @name
end

#describe(context) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/haveapi/parameters/resource.rb', line 49

def describe(context)
  val_path = context.path_for(
    @resource::Show,
    context.endpoint && context.action_prepare && context.layout == :object && context.call_path_params(context.action, context.action_prepare)
  )
  val_method = @resource::Index.http_method.to_s.upcase

  choices_path = context.path_for(
    @choices,
    context.endpoint && context.layout == :object && context.call_path_params(context.action, context.action_prepare)
  )
  choices_method = @choices.http_method.to_s.upcase

  {
    required: required?,
    nullable: nullable?,
    label: @label,
    description: @desc,
    type: 'Resource',
    resource: @resource_path,
    value_id: @value_id,
    value_label: @value_label,
    value: context.action_prepare && {
      path: val_path,
      method: val_method,
      help: "#{val_path}?method=#{val_method}"
    },
    choices: {
      path: choices_path,
      method: choices_method,
      help: "#{choices_path}?method=#{choices_method}"
    }
  }
end

#format_output(v) ⇒ Object



123
124
125
# File 'lib/haveapi/parameters/resource.rb', line 123

def format_output(v)
  v
end

#nullable?Boolean

Returns:



37
38
39
# File 'lib/haveapi/parameters/resource.rb', line 37

def nullable?
  @nullable == true && optional?
end

#optional?Boolean

Returns:



33
34
35
# File 'lib/haveapi/parameters/resource.rb', line 33

def optional?
  !@required
end

#patch(attrs) ⇒ Object



96
97
98
# File 'lib/haveapi/parameters/resource.rb', line 96

def patch(attrs)
  attrs.each { |k, v| instance_variable_set("@#{k}", v) }
end

#required?Boolean

Returns:



29
30
31
# File 'lib/haveapi/parameters/resource.rb', line 29

def required?
  @required
end

#show_actionObject



41
42
43
# File 'lib/haveapi/parameters/resource.rb', line 41

def show_action
  @resource::Show
end

#show_indexObject



45
46
47
# File 'lib/haveapi/parameters/resource.rb', line 45

def show_index
  @resource::Index
end

#validate(v, params) ⇒ Object



119
120
121
# File 'lib/haveapi/parameters/resource.rb', line 119

def validate(v, params)
  true
end

#validate_build_outputObject



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/haveapi/parameters/resource.rb', line 84

def validate_build_output
  i[value_id value_label].each do |name|
    v = instance_variable_get("@#{name}")

    [show_action, show_index].each do |klass|
      next unless klass.instance_variable_get('@output')[v].nil?

      raise "association to '#{@resource}': value_label '#{v}' is not an output parameter of '#{klass}'"
    end
  end
end