Class: Sinatra::SwaggerExposer::SwaggerParameterPreprocessor

Inherits:
Object
  • Object
show all
Includes:
SwaggerParameterHelper
Defined in:
lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb

Overview

Process the parameters for validation and enrichment

Constant Summary

Constants included from SwaggerParameterHelper

Sinatra::SwaggerExposer::SwaggerParameterHelper::HOW_TO_PASS, Sinatra::SwaggerExposer::SwaggerParameterHelper::HOW_TO_PASS_BODY, Sinatra::SwaggerExposer::SwaggerParameterHelper::HOW_TO_PASS_HEADER, Sinatra::SwaggerExposer::SwaggerParameterHelper::HOW_TO_PASS_PATH, Sinatra::SwaggerExposer::SwaggerParameterHelper::HOW_TO_PASS_QUERY, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_DEFAULT, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_EXAMPLE, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_EXCLUSIVE_MAXIMUM, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_EXCLUSIVE_MINIMUM, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_FORMAT, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_LIST, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_MAXIMUM, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_MAX_LENGTH, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_MINIMUM, Sinatra::SwaggerExposer::SwaggerParameterHelper::PARAMS_MIN_LENGTH, Sinatra::SwaggerExposer::SwaggerParameterHelper::PRIMITIVE_TYPES, Sinatra::SwaggerExposer::SwaggerParameterHelper::PRIMITIVE_TYPES_FOR_NON_BODY, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_BOOLEAN, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_BYTE, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_DATE, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_DATE_TIME, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_DOUBLE, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_FILE, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_FLOAT, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_INTEGER, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_LONG, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_NUMBER, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_PASSWORD, Sinatra::SwaggerExposer::SwaggerParameterHelper::TYPE_STRING

Instance Method Summary collapse

Constructor Details

#initialize(name, how_to_pass, required, type, default, params) ⇒ SwaggerParameterPreprocessor

Returns a new instance of SwaggerParameterPreprocessor.



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 16

def initialize(name, how_to_pass, required, type, default, params)
  @name = name.to_s
  @how_to_pass = how_to_pass
  @required = required
  @type = type
  @default = default
  @params = params

  # All headers are upcased
  if how_to_pass == HOW_TO_PASS_HEADER
    @name.upcase!
  end
end

Instance Method Details

#check_param(params) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 50

def check_param(params)
  if params.key?(@name)
    params[@name] = validate_param_value(params[@name])
  elsif @required
    raise SwaggerInvalidException.new("Mandatory parameter [#{@name}] is missing")
  elsif @default
    params[@name] = @default
  end
  params
end

#run(app, parsed_body) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 37

def run(app, parsed_body)
  case @how_to_pass
    when HOW_TO_PASS_PATH
      # can't validate
    when HOW_TO_PASS_QUERY
      check_param(app.params)
    when HOW_TO_PASS_HEADER
      check_param(app.headers)
    when HOW_TO_PASS_BODY
      check_param(parsed_body || {})
  end
end

#useful?Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 30

def useful?
  @required ||
      (!@default.nil?) ||
      [TYPE_NUMBER, TYPE_INTEGER, TYPE_BOOLEAN, TYPE_DATE_TIME].include?(@type) || # Must check type
      (@params.key? PARAMS_MIN_LENGTH) || (@params.key? PARAMS_MAX_LENGTH) # Must check string
end

#validate_numerical_value(value) ⇒ Object

Validate a numerical value

Parameters:

  • value (Numeric)

    the value



122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 122

def validate_numerical_value(value)
  validate_numerical_value_internal(
      value,
      PARAMS_MINIMUM,
      PARAMS_EXCLUSIVE_MINIMUM,
      '>=',
      '>')
  validate_numerical_value_internal(
      value,
      PARAMS_MAXIMUM,
      PARAMS_EXCLUSIVE_MAXIMUM,
      '<=',
      '<')
end

#validate_numerical_value_internal(value, limit_param_name, exclusive_limit_param_name, limit_param_method, exclusive_limit_param_method) ⇒ Object

Validate the value of a number

Parameters:

  • value

    the value to check

  • limit_param_name (Symbol)

    the param that contain the value to compare to

  • exclusive_limit_param_name (Symbol)

    the param that indicates if the comparison is absolute

  • limit_param_method (String)

    the comparison method to call

  • exclusive_limit_param_method (String)

    the absolute comparison method to call



174
175
176
177
178
179
180
181
182
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 174

def validate_numerical_value_internal(value, limit_param_name, exclusive_limit_param_name, limit_param_method, exclusive_limit_param_method)
  if @params.key? limit_param_name
    target_value = @params[limit_param_name]
    method_to_call = @params[exclusive_limit_param_name] ? exclusive_limit_param_method : limit_param_method
    unless value.send(method_to_call, target_value)
      raise SwaggerInvalidException.new("Parameter [#{@name}] should be #{method_to_call} than [#{target_value}] but is [#{value}]")
    end
  end
end

#validate_param_value(value) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 61

def validate_param_value(value)
  case @type
    when TYPE_NUMBER
      return validate_param_value_number(value)
    when TYPE_INTEGER
      return validate_param_value_integer(value)
    when TYPE_BOOLEAN
      return validate_param_value_boolean(value)
    when TYPE_DATE_TIME
      return validate_param_value_date_time(value)
    else
      return validate_param_value_string(value)
  end
end

#validate_param_value_boolean(value) ⇒ Object

Validate a boolean parameter



77
78
79
80
81
82
83
84
85
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 77

def validate_param_value_boolean(value)
  if (value == 'true') || value.is_a?(TrueClass)
    return true
  elsif (value == 'false') || value.is_a?(FalseClass)
    return false
  else
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be an boolean but is [#{value}]")
  end
end

#validate_param_value_date_time(value) ⇒ Object

Validate a date time parameter



138
139
140
141
142
143
144
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 138

def validate_param_value_date_time(value)
  begin
    DateTime.rfc3339(value)
  rescue ArgumentError
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be a date time but is [#{value}]")
  end
end

#validate_param_value_integer(value) ⇒ Object

Validate an integer parameter



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 88

def validate_param_value_integer(value)
  begin
    f = Float(value)
    i = Integer(value)
    if f == i
      i
    else
      raise SwaggerInvalidException.new("Parameter [#{@name}] should be an integer but is [#{value}]")
    end
    value = Integer(value)
    validate_numerical_value(value)
    value
  rescue ArgumentError
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be an integer but is [#{value}]")
  rescue TypeError
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be an integer but is [#{value}]")
  end
end

#validate_param_value_number(value) ⇒ Object

Validate a number parameter



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 108

def validate_param_value_number(value)
  begin
    value = Float(value)
    validate_numerical_value(value)
    return value
  rescue ArgumentError
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be a float but is [#{value}]")
  rescue TypeError
    raise SwaggerInvalidException.new("Parameter [#{@name}] should be a float but is [#{value}]")
  end
end

#validate_param_value_string(value) ⇒ Object

Validate a string parameter



147
148
149
150
151
152
153
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 147

def validate_param_value_string(value)
  if value
    validate_param_value_string_length(value, PARAMS_MIN_LENGTH, '>=')
    validate_param_value_string_length(value, PARAMS_MAX_LENGTH, '<=')
  end
  value
end

#validate_param_value_string_length(value, limit_param_name, limit_param_method) ⇒ Object

Validate the length of a string parameter

Parameters:

  • value

    the value to check

  • limit_param_name (Symbol)

    the param that contain the value to compare to

  • limit_param_method (String)

    the comparison method to call



159
160
161
162
163
164
165
166
# File 'lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb', line 159

def validate_param_value_string_length(value, limit_param_name, limit_param_method)
  if @params.key? limit_param_name
    target_value = @params[limit_param_name]
    unless value.length.send(limit_param_method, target_value)
      raise SwaggerInvalidException.new("Parameter [#{@name}] length should be #{limit_param_method} than #{target_value} but is #{value.length} for [#{value}]")
    end
  end
end