123456789_123456789_123456789_123456789_123456789_

Class: RSpec::Support::ObjectFormatter Private

Do not use. This class is for internal use only.

Overview

Provide additional output details beyond what ‘inspect` provides when printing Time, DateTime, or BigDecimal

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Class Method Details

.default_instance

Methods are deferred to a default instance of the class to maintain the interface For example, calling ObjectFormatter.format is still possible

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 17

def self.default_instance
  @default_instance ||= new
end

.format(object)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 21

def self.format(object)
  default_instance.format(object)
end

.prepare_for_inspection(object)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 25

def self.prepare_for_inspection(object)
  default_instance.prepare_for_inspection(object)
end

Instance Attribute Details

#max_formatted_output_length (rw)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 13

attr_accessor :max_formatted_output_length

Instance Method Details

#format(object)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 34

def format(object)
  if max_formatted_output_length.nil?
    prepare_for_inspection(object).inspect
  else
    formatted_object = prepare_for_inspection(object).inspect
    if formatted_object.length < max_formatted_output_length
      formatted_object
    else
      beginning = truncate_string formatted_object, 0, max_formatted_output_length / 2
      ending = truncate_string formatted_object, -max_formatted_output_length / 2, -1
      beginning + ELLIPSIS + ending
    end
  end
end

#prepare_array(array)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 70

def prepare_array(array)
  with_entering_structure(array) do
    array.map { |element| prepare_element(element) }
  end
end

#prepare_element(element)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 94

def prepare_element(element)
  if recursive_structure?(element)
    case element
    when Array then InspectableItem.new('[...]')
    when Hash then InspectableItem.new('{...}')
    else raise # This won't happen
    end
  else
    prepare_for_inspection(element)
  end
end

#prepare_for_inspection(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.

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 58

def prepare_for_inspection(object)
  case object
  when Array
    prepare_array(object)
  when Hash
    prepare_hash(object)
  else
    inspector_class = INSPECTOR_CLASSES.find { |inspector| inspector.can_inspect?(object) }
    inspector_class.new(object, self)
  end
end

#prepare_hash(input_hash)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 76

def prepare_hash(input_hash)
  with_entering_structure(input_hash) do
    sort_hash_keys(input_hash).inject({}) do |output_hash, key_and_value|
      key, value = key_and_value.map { |element| prepare_element(element) }
      output_hash[key] = value
      output_hash
    end
  end
end

#recursive_structure?(object) ⇒ Boolean

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 113

def recursive_structure?(object)
  @current_structure_stack.any? { |seen_structure| seen_structure.equal?(object) }
end

#sort_hash_keys(input_hash)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 86

def sort_hash_keys(input_hash)
  if input_hash.keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) }
    Hash[input_hash.sort_by { |k, _v| k.to_s }]
  else
    input_hash
  end
end

#truncate_string(str, start_index, end_index) (private)

Returns the substring defined by the start_index and end_index If the string ends with a partial ANSI code code then that will be removed as printing partial ANSI codes to the terminal can lead to corruption

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 268

def truncate_string(str, start_index, end_index)
  cut_str = str[start_index..end_index]

  # ANSI color codes are like: \e[33m so anything with \e[ and a
  # number without a 'm' is an incomplete color code
  cut_str.sub(/\e\[\d+$/, '')
end

#with_entering_structure(structure)

[ GitHub ]

  
# File 'rspec-support/lib/rspec/support/object_formatter.rb', line 106

def with_entering_structure(structure)
  @current_structure_stack.push(structure)
  return_value = yield
  @current_structure_stack.pop
  return_value
end