Class: RSpec::Expectations::Differ

### Home Classes Methods

### In Files

- lib/rspec/expectations/differ.rb

### Parent

Object

### Methods

- #blue
- #color
- #color_diff
- #context_lines
- #diff_as_object
- #diff_as_string
- #format
- #green
- #matching_encoding
- #object_to_string
- #red

### Class/Module Index

Quicksearch

- RSpec
- RSpec::Expectations
- RSpec::Expectations::DeprecatedConstants
- RSpec::Expectations::Deprecation
- RSpec::Expectations::Differ
- RSpec::Expectations::ExpectationHandler
- RSpec::Expectations::ExpectationNotMetError
- RSpec::Expectations::ExpectationTarget
- RSpec::Expectations::NegativeExpectationHandler
- RSpec::Expectations::PositiveExpectationHandler
- RSpec::Expectations::Syntax
- RSpec::Expectations::Syntax::ExpectExpressionGenerator
- RSpec::Expectations::Syntax::ShouldExpressionGenerator
- RSpec::Expectations::Version
- RSpec::Matchers
- RSpec::Matchers::BuiltIn
- RSpec::Matchers::BuiltIn::BaseMatcher
- RSpec::Matchers::BuiltIn::Be
- RSpec::Matchers::BuiltIn::BeAKindOf
- RSpec::Matchers::BuiltIn::BeAnInstanceOf
- RSpec::Matchers::BuiltIn::BeComparedTo
- RSpec::Matchers::BuiltIn::BeFalse
- RSpec::Matchers::BuiltIn::BeHelpers
- RSpec::Matchers::BuiltIn::BeNil
- RSpec::Matchers::BuiltIn::BePredicate
- RSpec::Matchers::BuiltIn::BeTrue
- RSpec::Matchers::BuiltIn::BeWithin
- RSpec::Matchers::BuiltIn::Change
- RSpec::Matchers::BuiltIn::Cover
- RSpec::Matchers::BuiltIn::EndWith
- RSpec::Matchers::BuiltIn::Eq
- RSpec::Matchers::BuiltIn::Eql
- RSpec::Matchers::BuiltIn::Equal
- RSpec::Matchers::BuiltIn::Exist
- RSpec::Matchers::BuiltIn::Has
- RSpec::Matchers::BuiltIn::Have
- RSpec::Matchers::BuiltIn::Include
- RSpec::Matchers::BuiltIn::Match
- RSpec::Matchers::BuiltIn::MatchArray
- RSpec::Matchers::BuiltIn::NegativeOperatorMatcher
- RSpec::Matchers::BuiltIn::PositiveOperatorMatcher
- RSpec::Matchers::BuiltIn::RaiseError
- RSpec::Matchers::BuiltIn::RespondTo
- RSpec::Matchers::BuiltIn::Satisfy
- RSpec::Matchers::BuiltIn::StartAndEndWith
- RSpec::Matchers::BuiltIn::StartWith
- RSpec::Matchers::BuiltIn::ThrowSymbol
- RSpec::Matchers::BuiltIn::YieldControl
- RSpec::Matchers::BuiltIn::YieldProbe
- RSpec::Matchers::BuiltIn::YieldSuccessiveArgs
- RSpec::Matchers::BuiltIn::YieldWithArgs
- RSpec::Matchers::BuiltIn::YieldWithNoArgs
- RSpec::Matchers::Configuration
- RSpec::Matchers::DSL
- RSpec::Matchers::DSL::Matcher
- RSpec::Matchers::Extensions
- RSpec::Matchers::Extensions::InstanceEvalWithArgs
- RSpec::Matchers::OperatorMatcher
- RSpec::Matchers::Pretty
- Array

No matching classes.

# RSpec::Expectations::Differ

### Public Instance Methods

diff_as_object(actual, expected) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 56
    def diff_as_object(actual, expected)
      actual_as_string = object_to_string(actual)
      expected_as_string = object_to_string(expected)
      if diff = diff_as_string(actual_as_string, expected_as_string)
        color_diff diff
      end
    end

diff_as_string(input_data_new, input_data_old) click to toggle source

This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)

    # File lib/rspec/expectations/differ.rb, line 9
    def diff_as_string(input_data_new, input_data_old)
      output = matching_encoding("", input_data_old)
      data_old = input_data_old.split(matching_encoding("\n", input_data_old)).map! { |e| e.chomp }
      data_new = input_data_new.split(matching_encoding("\n", input_data_new)).map! { |e| e.chomp }
      diffs = Diff::LCS.diff(data_old, data_new)
      return output if diffs.empty?
      oldhunk = hunk = nil
      file_length_difference = 0
      diffs.each do |piece|
        begin
          hunk = Diff::LCS::Hunk.new(
            data_old, data_new, piece, context_lines, file_length_difference
          )
          file_length_difference = hunk.file_length_difference
          next unless oldhunk
          # Hunks may overlap, which is why we need to be careful when our
          # diff includes lines of context. Otherwise, we might print
          # redundant lines.
          if (context_lines > 0) and hunk.overlaps?(oldhunk)
            if hunk.respond_to?(:merge)
              # diff-lcs 1.2.x
              hunk.merge(oldhunk)
            else
              # diff-lcs 1.1.3
              hunk.unshift(oldhunk)
            end
          else
            output << matching_encoding(oldhunk.diff(format).to_s, output)
          end
        ensure
          oldhunk = hunk
          output << matching_encoding("\n", output)
        end
      end
      #Handle the last remaining hunk
      output << matching_encoding(oldhunk.diff(format).to_s,output)
      output << matching_encoding("\n",output)
      color_diff output
    rescue Encoding::CompatibilityError
      if input_data_new.encoding != input_data_old.encoding
        "Could not produce a diff because the encoding of the actual string (#{input_data_old.encoding}) "+
        "differs from the encoding of the expected string (#{input_data_new.encoding})"
      else
        "Could not produce a diff because of the encoding of the string (#{input_data_old.encoding})"
      end
    end

### Protected Instance Methods

blue(text) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 86
    def blue(text)
      color(text, 34)
    end

color(text, color_code) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 74
    def color(text, color_code)
      "\e[#{color_code}m#{text}\e[0m"
    end

color_diff(diff) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 90
    def color_diff(diff)
      return diff unless RSpec::Matchers.configuration.color?

      diff.lines.map { |line|
        case line[0].chr
        when "+"
          green line
        when "-"
          red line
        when "@"
          line[1].chr == "@" ? blue(line) : line
        else
          line
        end
      }.join
    end

context_lines() click to toggle source

    # File lib/rspec/expectations/differ.rb, line 70
    def context_lines
      3
    end

format() click to toggle source

    # File lib/rspec/expectations/differ.rb, line 66
    def format
      :unified
    end

green(text) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 82
    def green(text)
      color(text, 32)
    end

matching_encoding(string, source) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 128
    def matching_encoding(string, source)
      string.encode(source.encoding)
    end

object_to_string(object) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 107
    def object_to_string(object)
      case object
      when Hash
        object.keys.sort_by { |k| k.to_s }.map do |key|
          pp_key   = PP.singleline_pp(key, "")
          pp_value = PP.singleline_pp(object[key], "")

          # on 1.9.3 PP seems to minimise to US-ASCII, ensure we're matching source encoding
          #
          # note, PP is used to ensure the ordering of the internal values of key/value e.g.
          # <# a: b: c:> not <# c: a: b:>
          matching_encoding("#{pp_key} => #{pp_value}", key)
        end.join(",\n")
      when String
        object =~ /\n/ ? object : object.inspect
      else
        PP.pp(object,"")
      end
    end

red(text) click to toggle source

    # File lib/rspec/expectations/differ.rb, line 78
    def red(text)
      color(text, 31)
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.