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.



79
80
81
82
83
84
85
# File 'lib/aruba/matchers/base/object_formatter.rb', line 79

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



64
65
66
# File 'lib/aruba/matchers/base/object_formatter.rb', line 64

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.



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

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



54
55
56
57
58
# File 'lib/aruba/matchers/base/object_formatter.rb', line 54

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