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
inspectis 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 |