class RegApi2::RequestContract

Contract for API requests. Checks for specified ‘required` fields. Also checks for `optional` fields. Take in care :re option.

Attributes

opts[R]

Options of contract. @return [Hash] Options hash.

Public Class Methods

new(opts = {}) click to toggle source
# File lib/reg_api2/request_contract.rb, line 14
def initialize(opts = {})
  @opts = opts
end

Public Instance Methods

fields_to_validate() click to toggle source

Gets fields to validate @return [Hash] Fields to validate.

# File lib/reg_api2/request_contract.rb, line 31
def fields_to_validate
  required_fields = to_hash opts[:required]
  optional_fields = to_hash opts[:optional]
  required_fields.keys.each { |key| required_fields[key][:required] = true }
  optional_fields.merge(required_fields)
end
to_hash(arr) click to toggle source

Normalizes ‘required` and `optional` fields to the form of Hash with options. @param [NilClass,Hash,Array, etc.] arr Something to normalize.

# File lib/reg_api2/request_contract.rb, line 20
def to_hash arr
  return {}   if arr.nil?
  return arr  if arr.kind_of?(Hash)
  arr = [ arr.to_sym ]  unless arr.kind_of?(Array)
  ret = {}
  arr.each { |key| ret[key.to_sym] = {} }
  ret
end
validate(form) click to toggle source

Validates specified ‘form` with `required` and `optional` fields. @param [Hash] form Form to validate. @return [Hash] Updated form. @raise ContractError

# File lib/reg_api2/request_contract.rb, line 105
def validate(form)
  fields = fields_to_validate
  return form  if fields.empty?

  validate_presence_of_required_fields form, fields

  fields.each_pair do |key, opts|
    next  if !form.has_key?(key) || form[key].nil?

    form[key] = validate_re key, form[key], opts
    form[key] = validate_iso_date key, form[key], opts
    form[key] = validate_ipaddr key, form[key], opts
  end

  form
end
validate_ipaddr(key, value, opts) click to toggle source

Validates specified ‘value` with `ipaddr` field. @param [Object] key Value to validate. @param [Object] value Value to validate. @param [Hash] opts opts with optional ipaddr field. @return [String] Updated `value`

# File lib/reg_api2/request_contract.rb, line 72
def validate_ipaddr key, value, opts
  if opts[:ipaddr] == true && value.kind_of?(String)
    value = IPAddr.new(value)
  end
  value.to_s
end
validate_iso_date(key, value, opts) click to toggle source

Validates specified ‘value` with `re` field. @param [Object] key Value to validate. @param [Object] value Value to validate. @param [Hash] opts opts with optional re field. @return [Object] Updated `value`

# File lib/reg_api2/request_contract.rb, line 60
def validate_iso_date key, value, opts
  if opts[:iso_date]
    return value.strftime("%Y-%m-%d")  if value.respond_to?(:strftime)
  end
  value
end
validate_presence_of_required_fields(form, fields) click to toggle source

Validates specified ‘form` for presence of all required fields. @param [Hash] form Form to validate. @param [Hash] fields Fields to test. return void @raise ContractError

# File lib/reg_api2/request_contract.rb, line 84
def validate_presence_of_required_fields form, fields
  absent_fields = []
  fields.each_pair do |key, opts|
    next  unless opts[:required]
    if !form.has_key?(key) || form[key].nil?
      absent_fields << key
    end
  end
  unless absent_fields.empty?
    raise RegApi2::ContractError.new(
      "Required fields missed: #{absent_fields.join(', ')}",
      absent_fields
    )
  end
  nil
end
validate_re(key, value, opts) click to toggle source

Validates specified ‘value` with `re` field. @param [Object] key Value to validate. @param [Object] value Value to validate. @param [Hash] opts opts with optional re field. @raise ContractError

# File lib/reg_api2/request_contract.rb, line 43
def validate_re key, value, opts
  if opts[:re]
    if value.to_s !~ opts[:re]
      raise RegApi2::ContractError.new(
        "Field #{key} mismatch regular expression: #{value}",
        key
      )
    end
  end
  value
end