rspec-expectations 2.0.0.beta.8 → 2.0.0.beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/README.markdown +1 -1
  2. data/Rakefile +8 -7
  3. data/Upgrade.markdown +6 -6
  4. data/VERSION +1 -1
  5. data/features/expectations/customized_message.feature +1 -1
  6. data/features/expectations/implicit_docstrings.feature +2 -2
  7. data/features/matchers/access_running_example.feature +5 -5
  8. data/features/matchers/define_diffable_matcher.feature +2 -2
  9. data/features/matchers/define_matcher.feature +14 -14
  10. data/features/matchers/define_matcher_outside_rspec.feature +2 -2
  11. data/features/matchers/define_matcher_with_fluent_interface.feature +2 -2
  12. data/features/matchers/expect_change.feature +2 -2
  13. data/features/matchers/expect_error.feature +2 -2
  14. data/lib/rspec/expectations.rb +7 -5
  15. data/lib/rspec/expectations/backward_compatibility.rb +16 -0
  16. data/lib/rspec/expectations/differ.rb +58 -0
  17. data/lib/rspec/expectations/errors.rb +1 -1
  18. data/lib/rspec/expectations/extensions/kernel.rb +4 -4
  19. data/lib/rspec/expectations/extensions/rspec/core/example_group.rb +1 -1
  20. data/lib/rspec/expectations/fail_with.rb +6 -4
  21. data/lib/rspec/expectations/handler.rb +11 -11
  22. data/lib/rspec/expectations/version.rb +1 -1
  23. data/lib/rspec/matchers.rb +7 -8
  24. data/lib/rspec/matchers/be.rb +6 -6
  25. data/lib/rspec/matchers/be_close.rb +1 -1
  26. data/lib/rspec/matchers/be_instance_of.rb +1 -1
  27. data/lib/rspec/matchers/be_kind_of.rb +1 -1
  28. data/lib/rspec/matchers/change.rb +1 -1
  29. data/lib/rspec/matchers/compatibility.rb +2 -2
  30. data/lib/rspec/matchers/dsl.rb +4 -4
  31. data/lib/rspec/matchers/eq.rb +1 -1
  32. data/lib/rspec/matchers/eql.rb +1 -1
  33. data/lib/rspec/matchers/equal.rb +1 -1
  34. data/lib/rspec/matchers/errors.rb +1 -1
  35. data/lib/rspec/matchers/exist.rb +1 -1
  36. data/lib/rspec/matchers/extensions/instance_exec.rb +1 -1
  37. data/lib/rspec/matchers/generated_descriptions.rb +1 -1
  38. data/lib/rspec/matchers/has.rb +1 -1
  39. data/lib/rspec/matchers/have.rb +1 -1
  40. data/lib/rspec/matchers/include.rb +1 -1
  41. data/lib/rspec/matchers/match.rb +1 -1
  42. data/lib/rspec/matchers/match_array.rb +3 -3
  43. data/lib/rspec/matchers/matcher.rb +13 -13
  44. data/lib/rspec/matchers/method_missing.rb +1 -1
  45. data/lib/rspec/matchers/operator_matcher.rb +4 -4
  46. data/lib/rspec/matchers/pretty.rb +1 -1
  47. data/lib/rspec/matchers/raise_error.rb +1 -1
  48. data/lib/rspec/matchers/respond_to.rb +1 -1
  49. data/lib/rspec/matchers/satisfy.rb +1 -1
  50. data/lib/rspec/matchers/throw_symbol.rb +1 -1
  51. data/rspec-expectations.gemspec +17 -14
  52. data/spec/rspec/expectations/{differs/default_spec.rb → differ_spec.rb} +4 -36
  53. data/spec/rspec/expectations/fail_with_spec.rb +6 -50
  54. data/spec/rspec/expectations/handler_spec.rb +22 -22
  55. data/spec/rspec/matchers/be_close_spec.rb +1 -1
  56. data/spec/rspec/matchers/be_instance_of_spec.rb +1 -1
  57. data/spec/rspec/matchers/be_kind_of_spec.rb +1 -1
  58. data/spec/rspec/matchers/change_spec.rb +3 -3
  59. data/spec/rspec/matchers/compatibility_spec.rb +3 -3
  60. data/spec/rspec/matchers/description_generation_spec.rb +28 -28
  61. data/spec/rspec/matchers/dsl_spec.rb +3 -3
  62. data/spec/rspec/matchers/eq_spec.rb +1 -1
  63. data/spec/rspec/matchers/eql_spec.rb +1 -1
  64. data/spec/rspec/matchers/equal_spec.rb +1 -1
  65. data/spec/rspec/matchers/exist_spec.rb +1 -1
  66. data/spec/rspec/matchers/have_spec.rb +3 -3
  67. data/spec/rspec/matchers/match_array_spec.rb +3 -0
  68. data/spec/rspec/matchers/matcher_spec.rb +25 -25
  69. data/spec/rspec/matchers/operator_matcher_spec.rb +12 -12
  70. data/spec/rspec/matchers/throw_symbol_spec.rb +1 -1
  71. data/spec/spec_helper.rb +6 -7
  72. data/spec/support/classes.rb +1 -1
  73. metadata +35 -21
  74. data/lib/rspec/expectations/differs/default.rb +0 -62
  75. data/lib/rspec/expectations/differs/load-diff-lcs.rb +0 -7
@@ -1,7 +1,7 @@
1
1
  # RSpec Expectations
2
2
 
3
3
  rspec-expectations adds `should` and `should_not` to every object and includes
4
- Rspec::Matchers, a library of standard matchers.
4
+ RSpec::Matchers, a library of standard matchers.
5
5
 
6
6
  rspec-expectations is currently in alpha release. While you are welcome to
7
7
  track, fork, explore, etc, we're too early in the process to start fielding
data/Rakefile CHANGED
@@ -6,17 +6,18 @@ begin
6
6
  require 'jeweler'
7
7
  Jeweler::Tasks.new do |gem|
8
8
  gem.name = "rspec-expectations"
9
- gem.version = Rspec::Expectations::Version::STRING
10
- gem.summary = "rspec-expectations-#{Rspec::Expectations::Version::STRING}"
9
+ gem.version = RSpec::Expectations::Version::STRING
10
+ gem.summary = "rspec-expectations-#{RSpec::Expectations::Version::STRING}"
11
11
  gem.description = "rspec expectations (should[_not] and matchers)"
12
12
  gem.rubyforge_project = "rspec"
13
13
  gem.email = "dchelimsky@gmail.com;chad.humphries@gmail.com"
14
14
  gem.homepage = "http://github.com/rspec/expectations"
15
15
  gem.authors = ["David Chelimsky", "Chad Humphries"]
16
+ gem.add_dependency('diff-lcs', ">= 1.1.2")
16
17
  gem.add_development_dependency('cucumber', ">= 0.6.2")
17
18
  gem.add_development_dependency('aruba', ">= 0.1.1")
18
- gem.add_development_dependency('rspec-core', ">= #{Rspec::Expectations::Version::STRING}")
19
- gem.add_development_dependency('rspec-mocks', ">= #{Rspec::Expectations::Version::STRING}")
19
+ gem.add_development_dependency('rspec-core', ">= #{RSpec::Expectations::Version::STRING}")
20
+ gem.add_development_dependency('rspec-mocks', ">= #{RSpec::Expectations::Version::STRING}")
20
21
  gem.post_install_message = <<-EOM
21
22
  #{"*"*50}
22
23
 
@@ -36,15 +37,15 @@ end
36
37
  namespace :gem do
37
38
  desc "push to gemcutter"
38
39
  task :push => :build do
39
- system "gem push pkg/rspec-expectations-#{Rspec::Expectations::Version::STRING}.gem"
40
+ system "gem push pkg/rspec-expectations-#{RSpec::Expectations::Version::STRING}.gem"
40
41
  end
41
42
  end
42
43
 
43
44
  begin
44
45
  require 'rspec/core/rake_task'
45
- Rspec::Core::RakeTask.new(:spec)
46
+ RSpec::Core::RakeTask.new(:spec)
46
47
  rescue LoadError
47
- puts "Rspec core or one of its dependencies is not installed. Install it with: gem install rspec-core"
48
+ puts "RSpec core or one of its dependencies is not installed. Install it with: gem install rspec-core"
48
49
  end
49
50
 
50
51
  begin
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### New `eq` matcher.
6
6
 
7
- `Rspec::Matchers` now offers you two approaches to differentiating between
7
+ `RSpec::Matchers` now offers you two approaches to differentiating between
8
8
  object identity. You can use the rspec-1 approach:
9
9
 
10
10
  actual.should == expected # object equality
@@ -19,7 +19,7 @@ object identity. You can use the rspec-1 approach:
19
19
 
20
20
  ### simple_matcher
21
21
 
22
- Use Rspec::Matchers.define instead. For example, if you had:
22
+ Use RSpec::Matchers.define instead. For example, if you had:
23
23
 
24
24
  def eat_cheese
25
25
  simple_matcher("eat cheese") do |actual|
@@ -29,7 +29,7 @@ Use Rspec::Matchers.define instead. For example, if you had:
29
29
 
30
30
  Change it to:
31
31
 
32
- Rspec::Matchers.define :eat_cheese do
32
+ RSpec::Matchers.define :eat_cheese do
33
33
  match do |actual|
34
34
  actual.eat?(:cheese)
35
35
  end
@@ -37,15 +37,15 @@ Change it to:
37
37
 
38
38
  ### wrap_expectation
39
39
 
40
- Use Rspec::Matchers.define instead.
40
+ Use RSpec::Matchers.define instead.
41
41
 
42
- Rspec::Matchers.define :eat_cheese do
42
+ RSpec::Matchers.define :eat_cheese do
43
43
  match do |actual|
44
44
  actual.should eat?(:cheese)
45
45
  end
46
46
  end
47
47
 
48
- Rspec::Matchers.define :eat_cheese do
48
+ RSpec::Matchers.define :eat_cheese do
49
49
  include MyCheesyAssertions
50
50
  match_unless_raises Test::Unit::AssertionFailedError do |actual|
51
51
  assert_eats_chesse actual
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.beta.8
1
+ 2.0.0.beta.9
@@ -45,7 +45,7 @@ Feature: customized message
45
45
  end
46
46
 
47
47
  """
48
- When I run "rspec node_spec.rb --format documentation"
48
+ When I run "rspec ./node_spec.rb --format documentation"
49
49
  Then I should see "3 examples, 3 failures"
50
50
  And I should not see "to return true, got false"
51
51
  And I should not see "to return false, got true"
@@ -18,7 +18,7 @@ Feature: implicit docstrings
18
18
  end
19
19
  """
20
20
 
21
- When I run "rspec implicit_docstrings_spec.rb -fdoc"
21
+ When I run "rspec ./implicit_docstrings_spec.rb -fdoc"
22
22
 
23
23
  Then I should see "should be < 5"
24
24
  And I should see "should include 2"
@@ -44,7 +44,7 @@ Feature: implicit docstrings
44
44
  end
45
45
  """
46
46
 
47
- When I run "rspec failing_implicit_docstrings_spec.rb -fdoc"
47
+ When I run "rspec ./failing_implicit_docstrings_spec.rb -fdoc"
48
48
 
49
49
  Then I should see "should equal 2"
50
50
  And I should see "should be > 5"
@@ -12,7 +12,7 @@ Feature: access running example
12
12
  Scenario: call method defined on example from matcher
13
13
  Given a file named "example_spec.rb" with:
14
14
  """
15
- Rspec::Matchers.define :bar do
15
+ RSpec::Matchers.define :bar do
16
16
  match do |_|
17
17
  foo == "foo"
18
18
  end
@@ -28,13 +28,13 @@ Feature: access running example
28
28
  end
29
29
  end
30
30
  """
31
- When I run "rspec example_spec.rb"
31
+ When I run "rspec ./example_spec.rb"
32
32
  Then I should see "1 example, 0 failures"
33
33
 
34
34
  Scenario: call method _not_ defined on example from matcher
35
35
  Given a file named "example_spec.rb" with:
36
36
  """
37
- Rspec::Matchers.define :bar do
37
+ RSpec::Matchers.define :bar do
38
38
  match do |_|
39
39
  foo == "foo"
40
40
  end
@@ -46,8 +46,8 @@ Feature: access running example
46
46
  end
47
47
  end
48
48
  """
49
- When I run "rspec example_spec.rb"
49
+ When I run "rspec ./example_spec.rb"
50
50
  Then I should see "1 example, 1 failure"
51
51
  And I should see "undefined local variable"
52
- And I should see "Rspec::Matchers::Matcher"
52
+ And I should see "RSpec::Matchers::Matcher"
53
53
  And I should not see "ExampleGroup"
@@ -8,7 +8,7 @@ Feature: define diffable matcher
8
8
  Scenario: define a diffable matcher
9
9
  Given a file named "diffable_matcher_spec.rb" with:
10
10
  """
11
- Rspec::Matchers.define :be_just_like do |expected|
11
+ RSpec::Matchers.define :be_just_like do |expected|
12
12
  match do |actual|
13
13
  actual == expected
14
14
  end
@@ -20,7 +20,7 @@ Feature: define diffable matcher
20
20
  it {should be_just_like("that")}
21
21
  end
22
22
  """
23
- When I run "rspec diffable_matcher_spec.rb --diff"
23
+ When I run "rspec ./diffable_matcher_spec.rb --diff"
24
24
  Then the exit status should not be 0
25
25
 
26
26
  And I should see "should be just like that"
@@ -9,7 +9,7 @@ Feature: define matcher
9
9
  """
10
10
  require 'rspec/expectations'
11
11
 
12
- Rspec::Matchers.define :be_a_multiple_of do |expected|
12
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
13
13
  match do |actual|
14
14
  actual % expected == 0
15
15
  end
@@ -34,7 +34,7 @@ Feature: define matcher
34
34
  end
35
35
 
36
36
  """
37
- When I run "rspec matcher_with_default_message_spec.rb --format documentation"
37
+ When I run "rspec ./matcher_with_default_message_spec.rb --format documentation"
38
38
  Then the exit status should not be 0
39
39
 
40
40
  And I should see "should be a multiple of 3"
@@ -51,7 +51,7 @@ Feature: define matcher
51
51
  """
52
52
  require 'rspec/expectations'
53
53
 
54
- Rspec::Matchers.define :be_a_multiple_of do |expected|
54
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
55
55
  match do |actual|
56
56
  actual % expected == 0
57
57
  end
@@ -65,7 +65,7 @@ Feature: define matcher
65
65
  it {should be_a_multiple_of(4)}
66
66
  end
67
67
  """
68
- When I run "rspec matcher_with_failure_message_spec.rb"
68
+ When I run "rspec ./matcher_with_failure_message_spec.rb"
69
69
  Then the exit status should not be 0
70
70
  And the stdout should contain "1 example, 1 failure"
71
71
  And the stdout should contain "expected that 9 would be a multiple of 4"
@@ -75,7 +75,7 @@ Feature: define matcher
75
75
  """
76
76
  require 'rspec/expectations'
77
77
 
78
- Rspec::Matchers.define :be_a_multiple_of do |expected|
78
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
79
79
  match do |actual|
80
80
  actual % expected == 0
81
81
  end
@@ -89,7 +89,7 @@ Feature: define matcher
89
89
  it {should_not be_a_multiple_of(3)}
90
90
  end
91
91
  """
92
- When I run "rspec matcher_with_failure_for_message_spec.rb"
92
+ When I run "rspec ./matcher_with_failure_for_message_spec.rb"
93
93
  Then the exit status should not be 0
94
94
  And the stdout should contain "1 example, 1 failure"
95
95
  And the stdout should contain "expected that 9 would not be a multiple of 3"
@@ -99,7 +99,7 @@ Feature: define matcher
99
99
  """
100
100
  require 'rspec/expectations'
101
101
 
102
- Rspec::Matchers.define :be_a_multiple_of do |expected|
102
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
103
103
  match do |actual|
104
104
  actual % expected == 0
105
105
  end
@@ -116,7 +116,7 @@ Feature: define matcher
116
116
  it {should_not be_a_multiple_of(4)}
117
117
  end
118
118
  """
119
- When I run "rspec matcher_overriding_description_spec.rb --format documentation"
119
+ When I run "rspec ./matcher_overriding_description_spec.rb --format documentation"
120
120
  Then the exit status should be 0
121
121
  And the stdout should contain "2 examples, 0 failures"
122
122
  And the stdout should contain "should be multiple of 3"
@@ -127,7 +127,7 @@ Feature: define matcher
127
127
  """
128
128
  require 'rspec/expectations'
129
129
 
130
- Rspec::Matchers.define :have_7_fingers do
130
+ RSpec::Matchers.define :have_7_fingers do
131
131
  match do |thing|
132
132
  thing.fingers.length == 7
133
133
  end
@@ -141,7 +141,7 @@ Feature: define matcher
141
141
  it {should have_7_fingers}
142
142
  end
143
143
  """
144
- When I run "rspec matcher_with_no_args_spec.rb --format documentation"
144
+ When I run "rspec ./matcher_with_no_args_spec.rb --format documentation"
145
145
  Then the exit status should be 0
146
146
  And the stdout should contain "1 example, 0 failures"
147
147
  And the stdout should contain "should have 7 fingers"
@@ -151,7 +151,7 @@ Feature: define matcher
151
151
  """
152
152
  require 'rspec/expectations'
153
153
 
154
- Rspec::Matchers.define :be_the_sum_of do |a,b,c,d|
154
+ RSpec::Matchers.define :be_the_sum_of do |a,b,c,d|
155
155
  match do |sum|
156
156
  a + b + c + d == sum
157
157
  end
@@ -161,7 +161,7 @@ Feature: define matcher
161
161
  it {should be_the_sum_of(1,2,3,4)}
162
162
  end
163
163
  """
164
- When I run "rspec matcher_with_multiple_args_spec.rb --format documentation"
164
+ When I run "rspec ./matcher_with_multiple_args_spec.rb --format documentation"
165
165
  Then the exit status should be 0
166
166
  And the stdout should contain "1 example, 0 failures"
167
167
  And the stdout should contain "should be the sum of 1, 2, 3, and 4"
@@ -171,7 +171,7 @@ Feature: define matcher
171
171
  """
172
172
  require 'rspec/expectations'
173
173
 
174
- Rspec::Matchers.define :have_same_elements_as do |sample|
174
+ RSpec::Matchers.define :have_same_elements_as do |sample|
175
175
  match do |actual|
176
176
  similar?(sample, actual)
177
177
  end
@@ -187,7 +187,7 @@ Feature: define matcher
187
187
  end
188
188
  end
189
189
  """
190
- When I run "rspec matcher_with_internal_helper_spec.rb"
190
+ When I run "rspec ./matcher_with_internal_helper_spec.rb"
191
191
  Then the exit status should be 0
192
192
  And the stdout should contain "1 example, 0 failures"
193
193
 
@@ -10,14 +10,14 @@ Feature: define matcher outside rspec
10
10
  require "rspec/expectations"
11
11
  require "test/unit"
12
12
 
13
- Rspec::Matchers.define :be_a_multiple_of do |expected|
13
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
14
14
  match do |actual|
15
15
  actual % expected == 0
16
16
  end
17
17
  end
18
18
 
19
19
  class Test::Unit::TestCase
20
- include Rspec::Matchers
20
+ include RSpec::Matchers
21
21
  end
22
22
 
23
23
  class TestMultiples < Test::Unit::TestCase
@@ -7,7 +7,7 @@ Feature: define matcher
7
7
  Scenario: one additional method
8
8
  Given a file named "between_spec.rb" with:
9
9
  """
10
- Rspec::Matchers.define :be_bigger_than do |first|
10
+ RSpec::Matchers.define :be_bigger_than do |first|
11
11
  def but_smaller_than(second)
12
12
  @second = second
13
13
  self
@@ -22,6 +22,6 @@ Feature: define matcher
22
22
  it { should be_bigger_than(4).but_smaller_than(6) }
23
23
  end
24
24
  """
25
- When I run "rspec between_spec.rb --format documentation"
25
+ When I run "rspec ./between_spec.rb --format documentation"
26
26
  Then I should see "1 example, 0 failures"
27
27
  And I should see "should be bigger than 4"
@@ -29,7 +29,7 @@ Feature: expect change
29
29
  end
30
30
  end
31
31
  """
32
- When I run "rspec expect_change_spec.rb"
32
+ When I run "rspec ./expect_change_spec.rb"
33
33
  Then I should see "2 examples, 1 failure"
34
34
  Then I should see "should have been changed by 2, but was changed by 1"
35
35
 
@@ -60,6 +60,6 @@ Feature: expect change
60
60
  end
61
61
  end
62
62
  """
63
- When I run "rspec expect_no_change_spec.rb"
63
+ When I run "rspec ./expect_no_change_spec.rb"
64
64
  Then I should see "2 examples, 1 failure"
65
65
  Then I should see "should not have changed, but did change from 1 to 2"
@@ -18,7 +18,7 @@ Feature: expect error
18
18
  end
19
19
  end
20
20
  """
21
- When I run "rspec expect_error_spec.rb"
21
+ When I run "rspec ./expect_error_spec.rb"
22
22
  Then I should see "2 examples, 1 failure"
23
23
  Then I should see "expected NameError but nothing was raised"
24
24
 
@@ -38,7 +38,7 @@ Feature: expect error
38
38
  end
39
39
  end
40
40
  """
41
- When I run "rspec expect_no_error_spec.rb"
41
+ When I run "rspec ./expect_no_error_spec.rb"
42
42
  Then I should see "2 examples, 1 failure"
43
43
  Then I should see "undefined method `non_existent_message'"
44
44
 
@@ -4,22 +4,24 @@ require 'rspec/expectations/errors'
4
4
  require 'rspec/expectations/extensions'
5
5
  require 'rspec/expectations/handler'
6
6
  require 'rspec/expectations/version'
7
+ require 'rspec/expectations/backward_compatibility'
8
+ require 'rspec/expectations/differ'
7
9
 
8
- module Rspec
10
+ module RSpec
9
11
 
10
- # Rspec::Expectations lets you set expectations on your objects.
12
+ # RSpec::Expectations lets you set expectations on your objects.
11
13
  #
12
14
  # result.should == 37
13
15
  # team.should have(11).players_on_the_field
14
16
  #
15
17
  # == How Expectations work.
16
18
  #
17
- # Rspec::Expectations adds two methods to Object:
19
+ # RSpec::Expectations adds two methods to Object:
18
20
  #
19
21
  # should(matcher=nil)
20
22
  # should_not(matcher=nil)
21
23
  #
22
- # Both methods take an optional Expression Matcher (See Rspec::Matchers).
24
+ # Both methods take an optional Expression Matcher (See RSpec::Matchers).
23
25
  #
24
26
  # When +should+ receives an Expression Matcher, it calls <tt>matches?(self)</tt>. If
25
27
  # it returns +true+, the spec passes and execution continues. If it returns
@@ -30,7 +32,7 @@ module Rspec
30
32
  # +true+, then the spec fails with the message returned by <tt>matcher.negative_failure_message</tt>.
31
33
  #
32
34
  # RSpec ships with a standard set of useful matchers, and writing your own
33
- # matchers is quite simple. See Rspec::Matchers for details.
35
+ # matchers is quite simple. See RSpec::Matchers for details.
34
36
  module Expectations
35
37
  end
36
38
  end
@@ -0,0 +1,16 @@
1
+ # Cucumber 0.7 includes Rspec::Expectations
2
+ module RSpec
3
+ module Expectations
4
+ module ConstMissing
5
+ def const_missing(name)
6
+ name == :Rspec ? RSpec : super(name)
7
+ end
8
+ end
9
+
10
+ def differ=(ignore)
11
+ RSpec.deprecate("RSpec::Expectations.differ=(differ)", "nothing at all (diffing is now automatic and no longer configurable)")
12
+ end
13
+ end
14
+ end
15
+
16
+ Object.extend(RSpec::Expectations::ConstMissing)
@@ -0,0 +1,58 @@
1
+ require 'diff/lcs'
2
+ require 'diff/lcs/hunk'
3
+ require 'pp'
4
+
5
+ module RSpec
6
+ module Expectations
7
+ class Differ
8
+ def initialize(ignore=nil)
9
+ end
10
+
11
+ # This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
12
+ def diff_as_string(data_new, data_old)
13
+ data_old = data_old.split(/\n/).map! { |e| e.chomp }
14
+ data_new = data_new.split(/\n/).map! { |e| e.chomp }
15
+ output = ""
16
+ diffs = Diff::LCS.diff(data_old, data_new)
17
+ return output if diffs.empty?
18
+ oldhunk = hunk = nil
19
+ file_length_difference = 0
20
+ diffs.each do |piece|
21
+ begin
22
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
23
+ file_length_difference)
24
+ file_length_difference = hunk.file_length_difference
25
+ next unless oldhunk
26
+ # Hunks may overlap, which is why we need to be careful when our
27
+ # diff includes lines of context. Otherwise, we might print
28
+ # redundant lines.
29
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
30
+ hunk.unshift(oldhunk)
31
+ else
32
+ output << oldhunk.diff(format)
33
+ end
34
+ ensure
35
+ oldhunk = hunk
36
+ output << "\n"
37
+ end
38
+ end
39
+ #Handle the last remaining hunk
40
+ output << oldhunk.diff(format) << "\n"
41
+ end
42
+
43
+ def diff_as_object(target,expected)
44
+ diff_as_string(PP.pp(target,""), PP.pp(expected,""))
45
+ end
46
+
47
+ protected
48
+ def format
49
+ :unified
50
+ end
51
+
52
+ def context_lines
53
+ 3
54
+ end
55
+ end
56
+
57
+ end
58
+ end