Class: Apipie::ParamDescription

Inherits:
Object
  • Object
show all
Defined in:
lib/apipie/param_description.rb

Overview

method parameter description

name - method name (show) desc - description required - boolean if required validator - Validator::BaseValidator subclass

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method_description, name, validator, desc_or_options = nil, options = {}, &block) ⇒ ParamDescription

Returns a new instance of ParamDescription.

Raises:

  • (ArgumentError)


42
43
44
45
46
47
48
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/apipie/param_description.rb', line 42

def initialize(method_description, name, validator, desc_or_options = nil, options = {}, &block)

  if desc_or_options.is_a?(Hash)
    options = options.merge(desc_or_options)
  elsif desc_or_options.is_a?(String)
    options[:desc] = desc_or_options
  elsif !desc_or_options.nil?
    raise ArgumentError.new("param description: expected description or options as 3rd parameter")
  end

  options.symbolize_keys!

  # we save options to know what was passed in DSL
  @options = options
  if @options[:param_group]
    @from_concern = @options[:param_group][:from_concern]
  end

  @method_description = method_description
  @name = concern_subst(name)
  @as = options[:as] || @name
  @desc = preformat_text(@options[:desc])

  @parent = @options[:parent]
  @metadata = @options[:meta]

  @required = is_required?

  @response_only = (@options[:only_in] == :response)
  @request_only = (@options[:only_in] == :request)
  raise ArgumentError.new("'#{@options[:only_in]}' is not a valid value for :only_in") if (!@response_only && !@request_only) && @options[:only_in].present?

  @show = if @options.has_key? :show
    @options[:show]
  else
    true
  end

  @allow_nil = @options[:allow_nil] || false
  @allow_blank = @options[:allow_blank] || false

  action_awareness

  if validator
    if (validator != Hash) && (validator.is_a? Hash) && (validator[:array_of])
      @is_array = true
      rest_of_options = validator
      validator = validator[:array_of]
      options.merge!(rest_of_options.select{|k,v| k != :array_of })
      raise "an ':array_of =>' validator is allowed exclusively on response-only fields" unless @response_only
    end
    @validator = Validator::BaseValidator.find(self, validator, @options, block)
    raise "Validator for #{validator} not found." unless @validator
  end

  @validations = Array(options[:validations]).map {|v| concern_subst(Apipie.markup_to_html(v)) }

  @additional_properties = @options[:additional_properties]
end

Instance Attribute Details

#additional_propertiesObject (readonly)

Returns the value of attribute additional_properties.



12
13
14
# File 'lib/apipie/param_description.rb', line 12

def additional_properties
  @additional_properties
end

#allow_blankObject (readonly)

Returns the value of attribute allow_blank.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def allow_blank
  @allow_blank
end

#allow_nilObject (readonly)

Returns the value of attribute allow_nil.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def allow_nil
  @allow_nil
end

#asObject (readonly)

Returns the value of attribute as.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def as
  @as
end

#descObject (readonly)

Returns the value of attribute desc.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def desc
  @desc
end

#is_arrayObject (readonly) Also known as: is_array?

Returns the value of attribute is_array.



12
13
14
# File 'lib/apipie/param_description.rb', line 12

def is_array
  @is_array
end

#metadataObject (readonly)

Returns the value of attribute metadata.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def 
  @metadata
end

#method_descriptionObject (readonly)

Returns the value of attribute method_description.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def method_description
  @method_description
end

#nameObject (readonly)

Returns the value of attribute name.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def options
  @options
end

#parentObject

Returns the value of attribute parent.



13
14
15
# File 'lib/apipie/param_description.rb', line 13

def parent
  @parent
end

#request_onlyObject (readonly) Also known as: request_only?

Returns the value of attribute request_only.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def request_only
  @request_only
end

#requiredObject

Returns the value of attribute required.



13
14
15
# File 'lib/apipie/param_description.rb', line 13

def required
  @required
end

#response_onlyObject (readonly) Also known as: response_only?

Returns the value of attribute response_only.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def response_only
  @response_only
end

#showObject (readonly)

Returns the value of attribute show.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def show
  @show
end

#validationsObject (readonly)

Returns the value of attribute validations.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def validations
  @validations
end

#validatorObject (readonly)

Returns the value of attribute validator.



11
12
13
# File 'lib/apipie/param_description.rb', line 11

def validator
  @validator
end

Class Method Details

.from_dsl_data(method_description, args) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/apipie/param_description.rb', line 19

def self.from_dsl_data(method_description, args)
  param_name, validator, desc_or_options, options, block = args
  Apipie::ParamDescription.new(method_description,
                               param_name,
                               validator,
                               desc_or_options,
                               options,
                               &block)
end

.unify(params) ⇒ Object

merge param descriptions. Allows defining hash params on more places (e.g. in param_groups). For example:

def_param_group :user do
  param :user, Hash do
    param :name, String
  end
end

param_group :user
param :user, Hash do
  param :password, String
end


193
194
195
196
197
198
# File 'lib/apipie/param_description.rb', line 193

def self.unify(params)
  ordering = params.map(&:name)
  params.group_by(&:name).map do |name, param_descs|
    param_descs.reduce(&:merge_with)
  end.sort_by { |param| ordering.index(param.name) }
end

Instance Method Details

#==(other) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/apipie/param_description.rb', line 33

def ==(other)
  return false unless self.class == other.class
  if method_description == other.method_description && @options == other.options
    true
  else
    false
  end
end

#action_aware?Boolean

action awareness is being inherited from ancestors (in terms of nested params)

Returns:

  • (Boolean)


202
203
204
205
206
207
208
209
210
# File 'lib/apipie/param_description.rb', line 202

def action_aware?
  if @options.has_key?(:action_aware)
    return @options[:action_aware]
  elsif @parent
    @parent.action_aware?
  else
    false
  end
end

#action_awarenessObject

makes modification that are based on the action that the param is defined for. Typical for required and allow_nil variations in crate/update actions.



226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/apipie/param_description.rb', line 226

def action_awareness
  if action_aware?
    if !@options.has_key?(:allow_nil)
      if @required
        @allow_nil = false
      else
        @allow_nil = true
      end
    end
    if as_action != "create"
      @required = false
    end
  end
end

#as_actionObject



212
213
214
215
216
217
218
219
220
221
# File 'lib/apipie/param_description.rb', line 212

def as_action
  if @options[:param_group] && @options[:param_group][:options] &&
      @options[:param_group][:options][:as]
    @options[:param_group][:options][:as].to_s
  elsif @parent
    @parent.as_action
  else
    @method_description.method
  end
end

#concern_subst(string) ⇒ Object



241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/apipie/param_description.rb', line 241

def concern_subst(string)
  return string if string.nil? or !from_concern?

  original = string
  string = ":#{original}" if original.is_a? Symbol

  replaced = method_description.resource.controller._apipie_perform_concern_subst(string)

  return original if replaced == string
  return replaced.to_sym if original.is_a? Symbol
  return replaced
end

#from_concern?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/apipie/param_description.rb', line 102

def from_concern?
  method_description.from_concern? || @from_concern
end

#full_nameObject



136
137
138
139
140
# File 'lib/apipie/param_description.rb', line 136

def full_name
  name_parts = parents_and_self.map{|p| p.name if p.show}.compact
  return name.to_s if name_parts.blank?
  return ([name_parts.first] + name_parts[1..-1].map { |n| "[#{n}]" }).join("")
end

#is_required?Boolean

Returns:

  • (Boolean)


258
259
260
261
262
263
264
265
266
267
268
# File 'lib/apipie/param_description.rb', line 258

def is_required?
  if @options.has_key?(:required)
    if (@options[:required] == true) || (@options[:required] == false)
      @options[:required]
    else
      Array(@options[:required]).include?(@method_description.method.to_sym)
    end
  else
    Apipie.configuration.required_by_default?
  end
end

#merge_with(other_param_desc) ⇒ Object



171
172
173
174
175
176
177
178
# File 'lib/apipie/param_description.rb', line 171

def merge_with(other_param_desc)
  if self.validator && other_param_desc.validator
    self.validator.merge_with(other_param_desc.validator)
  else
    self.validator ||= other_param_desc.validator
  end
  self
end

#normalized_value(value) ⇒ Object



106
107
108
109
110
111
112
113
114
# File 'lib/apipie/param_description.rb', line 106

def normalized_value(value)
  if value.is_a?(ActionController::Parameters) && !value.is_a?(Hash)
    value.to_unsafe_hash
  elsif value.is_a? Array
    value.map { |v| normalized_value (v) }
  else
    value
  end
end

#parents_and_selfObject

returns an array of all the parents: starting with the root parent ending with itself



144
145
146
147
148
149
150
151
# File 'lib/apipie/param_description.rb', line 144

def parents_and_self
  ret = []
  if self.parent
    ret.concat(self.parent.parents_and_self)
  end
  ret << self
  ret
end

#preformat_text(text) ⇒ Object



254
255
256
# File 'lib/apipie/param_description.rb', line 254

def preformat_text(text)
  concern_subst(Apipie.markup_to_html(text || ''))
end

#process_value(value) ⇒ Object



127
128
129
130
131
132
133
134
# File 'lib/apipie/param_description.rb', line 127

def process_value(value)
  value = normalized_value(value)
  if @validator.respond_to?(:process_value)
    @validator.process_value(value)
  else
    value
  end
end

#to_json(lang = nil) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/apipie/param_description.rb', line 153

def to_json(lang = nil)
  hash = { :name => name.to_s,
           :full_name => full_name,
           :description => preformat_text(Apipie.app.translate(@options[:desc], lang)),
           :required => required,
           :allow_nil => allow_nil,
           :allow_blank => allow_blank,
           :validator => validator.to_s,
           :expected_type => validator.expected_type,
           :metadata => ,
           :show => show,
           :validations => validations }
  if sub_params = validator.params_ordered
    hash[:params] = sub_params.map { |p| p.to_json(lang)}
  end
  hash
end

#to_sObject



29
30
31
# File 'lib/apipie/param_description.rb', line 29

def to_s
  "ParamDescription: #{method_description.id}##{name}"
end

#validate(value) ⇒ Object



116
117
118
119
120
121
122
123
124
125
# File 'lib/apipie/param_description.rb', line 116

def validate(value)
  return true if @allow_nil && value.nil?
  return true if @allow_blank && value.blank?
  value = normalized_value(value)
  if (!@allow_nil && value.nil?) || !@validator.valid?(value)
    error = @validator.error
    error = ParamError.new(error) unless error.is_a? StandardError
    raise error
  end
end