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.


74
75
76
77
78
79
80
# File 'lib/aruba/matchers/base/object_formatter.rb', line 74

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