Module: Aruba::Matchers::ObjectFormatter

Defined in:
lib/aruba/matchers/base/object_formatter.rb

Overview

Provide additional output details beyond what inspect provides when printing Time, DateTime, or BigDecimal

Defined Under Namespace

Classes: DelegatingInspector, InspectableItem

Constant Summary collapse

TIME_FORMAT =
'%Y-%m-%d %H:%M:%S'.freeze
DATE_TIME_FORMAT =
'%a, %d %b %Y %H:%M:%S.%N %z'.freeze

Class Method Summary collapse

Class Method Details

.format(object) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



11
12
13
# File 'lib/aruba/matchers/base/object_formatter.rb', line 11

def self.format(object)
  prepare_for_inspection(object).inspect
end

.format_date_time(date_time) ⇒ Object

ActiveSupport sometimes overrides inspect. If ActiveSupport is defined use a custom format string that includes more time precision.



69
70
71
72
73
74
75
# File 'lib/aruba/matchers/base/object_formatter.rb', line 69

def self.format_date_time(date_time)
  if defined?(ActiveSupport)
    date_time.strftime(DATE_TIME_FORMAT)
  else
    date_time.inspect
  end
end

.format_time(time) ⇒ Object



59
60
61
# File 'lib/aruba/matchers/base/object_formatter.rb', line 59

def self.format_time(time)
  time.strftime("#{TIME_FORMAT}.#{format('%09d', time.nsec)} %z")
end

.prepare_for_inspection(object) ⇒ Object

Prepares the provided object to be formatted by wrapping it as needed in something that, when inspect is called on it, will produce the desired output.

This allows us to apply the desired formatting to hash/array data structures at any level of nesting, simply by walking that structure and replacing items with custom items that have inspect defined to return the desired output for that item. Then we can just use Array#inspect or Hash#inspect to format the entire thing.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/aruba/matchers/base/object_formatter.rb', line 25

def self.prepare_for_inspection(object)
  case object
  when Array
    return object.map { |o| prepare_for_inspection(o) }
  when Hash
    return prepare_hash(object)
  when Time
    inspection = format_time(object)
  else
    if defined?(DateTime) && DateTime === object
      inspection = format_date_time(object)
    elsif defined?(BigDecimal) && BigDecimal === object
      inspection = "#{object.to_s 'F'} (#{object.inspect})"
    elsif RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description)
      inspection = object.description
    else
      return DelegatingInspector.new(object)
    end
  end

  InspectableItem.new(inspection)
end

.prepare_hash(input) ⇒ Object



49
50
51
52
53
# File 'lib/aruba/matchers/base/object_formatter.rb', line 49

def self.prepare_hash(input)
  input.each_with_object({}) do |(k, v), hash|
    hash[prepare_for_inspection(k)] = prepare_for_inspection(v)
  end
end