Class: Remi::Transform::EnforceType

Inherits:
Remi::Transform show all
Defined in:
lib/remi/transform.rb

Overview

Public: Enforces the type declared in the :type metadata field (if it exists)

Examples:

tform = EnforceType.new tform.source_metadata = { type: :date, in_format: '%m/%d/%Y' } tform.to_proc.call('02/22/2013') # => Date.new(2013,2,22)

tform = EnforceType.new tform.source_metadata = { type: :integer } tform.to_proc.call('12') # => 12

tform = EnforceType.new tform.source_metadata = { type: :integer } tform.to_proc.call('12A') # => ArgumentError: invalid value for Integer(): "12A"

Instance Attribute Summary

Attributes inherited from Remi::Transform

#multi_args, #source_metadata, #target_metadata

Instance Method Summary collapse

Methods inherited from Remi::Transform

#call, #to_proc

Constructor Details

#initialize(*args, **kargs, &block) ⇒ EnforceType

Returns a new instance of EnforceType.



481
482
483
# File 'lib/remi/transform.rb', line 481

def initialize(*args, **kargs, &block)
  super
end

Instance Method Details

#blank_handler(value) ⇒ Object



503
504
505
506
507
508
509
510
511
# File 'lib/remi/transform.rb', line 503

def blank_handler(value)
  return value unless value.blank?

  if if_blank.respond_to? :to_proc
    if_blank.to_proc.call(value)
  else
    if_blank
  end
end

#default_if_blankObject



513
514
515
# File 'lib/remi/transform.rb', line 513

def default_if_blank
  type == :string ? '' : nil
end

#if_blankObject



497
498
499
500
501
# File 'lib/remi/transform.rb', line 497

def if_blank
  return @if_blank if @if_blank_set
  @if_blank_set = true
  @if_blank = .fetch(:if_blank, default_if_blank)
end

#in_formatObject



489
490
491
# File 'lib/remi/transform.rb', line 489

def in_format
  @in_format ||= .fetch(:in_format, '')
end

#scaleObject



493
494
495
# File 'lib/remi/transform.rb', line 493

def scale
  @scale ||= .fetch(:scale, 0)
end

#transform(value) ⇒ Object



522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
# File 'lib/remi/transform.rb', line 522

def transform(value)
  if value.blank? && type != :json
    blank_handler(value)
  else
    case type
    when :string
      value
    when :integer
      Integer(value)
    when :float
      Float(value)
    when :decimal
      Float("%.#{scale}f" % Float(value))
    when :date
      value.is_a?(Date) ? value : Date.strptime(value, in_format)
    when :datetime
      value.is_a?(Time) ? value : Time.strptime(value, in_format)
    when :json
      if value.blank? && value != [] && value != {}
        blank_handler(value)
      else
        value.is_a?(Hash) || value.is_a?(Array) ? value : JSON.parse(value)
      end
    when :boolean
      # Ugh, there is a bug with Daru 0.1.4 that converts false values to nil when joining
      # For now, we'll just standardize boolean values (#to_s)
      truthy(value).to_s
    else
      raise ArgumentError, "Unknown type enforcement: #{type}"
    end
  end
end

#truthy(value) ⇒ Object



517
518
519
520
# File 'lib/remi/transform.rb', line 517

def truthy(value)
  @truthy ||= Truthy.new(allow_nils: false).to_proc
  @truthy.call(value)
end

#typeObject



485
486
487
# File 'lib/remi/transform.rb', line 485

def type
  @type ||= .fetch(:type, :string)
end