class RSpec::Expectations::Differ
def diff_as_string(input_data_new, input_data_old)
def diff_as_string(input_data_new, input_data_old) encoding = pick_encoding input_data_new, input_data_old output = matching_encoding("", encoding) data_old = input_data_old.split(matching_encoding("\n", encoding)).map! { |e| e.chomp } data_new = input_data_new.split(matching_encoding("\n", encoding)).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, encoding) end ensure oldhunk = hunk output << matching_encoding("\n", encoding) end end #Handle the last remaining hunk output << matching_encoding(oldhunk.diff(format).to_s, encoding) output << matching_encoding("\n", encoding) 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