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
- .format(object) ⇒ Object private
-
.format_date_time(date_time) ⇒ Object
ActiveSupport sometimes overrides inspect.
- .format_time(time) ⇒ Object
-
.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.
- .prepare_hash(input) ⇒ Object
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 |