module Aruba::Matchers::ObjectFormatter
Provide additional output details beyond what `inspect` provides when printing Time, DateTime, or BigDecimal
@private
Constants
- DATE_TIME_FORMAT
- DelegatingInspector
@private
- InspectableItem
@private
- TIME_FORMAT
Public Class Methods
@api private
# File lib/aruba/matchers/base/object_formatter.rb, line 11 def self.format(object) prepare_for_inspection(object).inspect end
ActiveSupport sometimes overrides inspect. If `ActiveSupport` is defined use a custom format string that includes more time precision. @private
# 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
@private
# 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
@private 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.
# 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
@private
# 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