unified_diff 0.3.2 → 0.3.3

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.
data/Gemfile CHANGED
@@ -2,7 +2,6 @@ source "http://rubygems.org"
2
2
 
3
3
  group :development do
4
4
  gem 'minitest'
5
- gem "bundler", "~> 1.0.0"
6
5
  gem "jeweler", "~> 1.6.0"
7
6
  gem 'simplecov'
8
7
  end
data/Gemfile.lock CHANGED
@@ -2,21 +2,22 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  git (1.2.5)
5
- jeweler (1.6.0)
6
- bundler (~> 1.0.0)
5
+ jeweler (1.6.4)
6
+ bundler (~> 1.0)
7
7
  git (>= 1.2.5)
8
8
  rake
9
- minitest (2.1.0)
10
- rake (0.9.0)
11
- simplecov (0.4.2)
12
- simplecov-html (~> 0.4.4)
13
- simplecov-html (0.4.5)
9
+ minitest (3.4.0)
10
+ multi_json (1.3.6)
11
+ rake (0.9.2.2)
12
+ simplecov (0.6.4)
13
+ multi_json (~> 1.0)
14
+ simplecov-html (~> 0.5.3)
15
+ simplecov-html (0.5.3)
14
16
 
15
17
  PLATFORMS
16
18
  ruby
17
19
 
18
20
  DEPENDENCIES
19
- bundler (~> 1.0.0)
20
21
  jeweler (~> 1.6.0)
21
22
  minitest
22
23
  simplecov
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.3.3
@@ -4,14 +4,23 @@ module UnifiedDiff
4
4
  attr_reader :original, :original_file, :original_timestamp, :modified_file, :modified_timestamp, :chunks
5
5
  class UnifiedDiffException < Exception; end
6
6
 
7
- FILE_PATTERN = /(.*)\t'{2}?(.*)'{2}?/
7
+ FILE_PATTERN = /([^\t\n]+)(?:\t'{2}?([^']+)'{2}?)?/
8
8
  OLD_FILE_PATTERN = /--- #{FILE_PATTERN}/
9
9
  NEW_FILE_PATTERN = /\+\+\+ #{FILE_PATTERN}/
10
10
  # Match assignment is tricky for CHUNK_PATTERN
11
- # $1,$2 are static, but $3,$4,$5 vary
12
- # if pattern is X,Y then $3 = X,Y, $4 = X, $5 = Y
13
- # if pattern is X then $3 = X
14
- CHUNK_PATTERN = /@@ -(\d+),(\d+) \+((\d+),(\d+)|(\d+)) @@/
11
+ # $1 and $3 are static, but $2 and $4 can be nil
12
+ #
13
+ # "In many versions of GNU diff, each range can omit the comma and
14
+ # trailing value s, in which case s defaults to 1. Note that the
15
+ # only really interesting value is the l line number of the first
16
+ # range; all the other values can be computed from the diff."
17
+ # -- http://en.wikipedia.org/wiki/Diff#Unified_format
18
+ #
19
+ # Pattern -W,X +Y,Z has $1 = W, $2 = X, $3 = Y, $4 = Z
20
+ # Pattern -W +Y,Z has $1 = W, $2 = nil, $3 = Y, $4 = Z
21
+ # Pattern -W +Y has $1 = W, $2 = nil, $3 = Y, $4 = nil
22
+ # Pattern -W,X +Y has $1 = W, $2 = X, $3 = Y, $4 = nil
23
+ CHUNK_PATTERN = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/
15
24
  ADDED_PATTERN = /^\+(.*)/
16
25
  REMOVED_PATTERN = /^-(.*)/
17
26
  UNCHANGED_PATTERN = /^ (.*)/
@@ -39,18 +48,23 @@ module UnifiedDiff
39
48
  @original.each_line do |line|
40
49
  case line
41
50
  when OLD_FILE_PATTERN
42
- @original_file, @original_timestamp = $1, Time.parse($2)
51
+ @original_file = $1
52
+ @original_timestamp = Time.parse($2) if $2
43
53
  when NEW_FILE_PATTERN
44
- @modified_file, @modified_timestamp = $1, Time.parse($2)
54
+ @modified_file = $1
55
+ @modified_timestamp = Time.parse($2) if $2
45
56
  when CHUNK_PATTERN
46
57
  old_begin = $1.to_i
47
- old_end = old_begin + $2.to_i
48
- if $3.include?(',') # Will match if non-edge case encountered
49
- new_begin = $4.to_i
50
- new_end = new_begin + $5.to_i
58
+ if $2.nil?
59
+ old_end = old_begin + 1
60
+ else
61
+ old_end = old_begin + $2.to_i
62
+ end
63
+ new_begin = $3.to_i
64
+ if $4.nil?
65
+ new_end = new_begin+1
51
66
  else
52
- new_begin = $3.to_i
53
- new_end = new_begin + 1
67
+ new_end = new_begin + $4.to_i
54
68
  end
55
69
  @working_chunk = Chunk.new(original: (old_begin...old_end), modified: (new_begin...new_end))
56
70
  @chunks << @working_chunk
@@ -5,7 +5,7 @@ class TestUnifiedDiff < MiniTest::Unit::TestCase
5
5
  @original = <<-DIFF.unindent
6
6
  --- original.txt 2011-05-31 11:14:13.000000000 -0500
7
7
  +++ modified.txt 2011-05-31 11:14:44.000000000 -0500
8
- @@ -1,5 +1,5 @@
8
+ @@ -1,5 +1,5 @@ Optional Text goes here.
9
9
  foo
10
10
  bar
11
11
  -baz
@@ -25,6 +25,42 @@ class TestUnifiedDiff < MiniTest::Unit::TestCase
25
25
  assert_equal Time.parse('2011-05-31 11:14:13.000000000 -0500'), @diff.original_timestamp
26
26
  end
27
27
 
28
+ def test_parses_original_information_with_single_quotes
29
+ original = <<-DIFF.unindent
30
+ --- original.txt ''2011-05-31 11:14:13.000000000 -0500''
31
+ +++ modified.txt ''2011-05-31 11:14:44.000000000 -0500''
32
+ @@ -1,5 +1,5 @@ Optional Text goes here.
33
+ foo
34
+ bar
35
+ -baz
36
+ +Baz
37
+ qux
38
+ quux
39
+ DIFF
40
+ diff = UnifiedDiff.parse(original)
41
+
42
+ assert_equal "modified.txt", diff.modified_file
43
+ assert_equal Time.parse('2011-05-31 11:14:44.000000000 -0500'), diff.modified_timestamp
44
+ end
45
+
46
+ def test_parses_original_information_without_dates
47
+ original = <<-DIFF.unindent
48
+ --- original.txt
49
+ +++ modified.txt
50
+ @@ -1,5 +1,5 @@ Optional Text goes here.
51
+ foo
52
+ bar
53
+ -baz
54
+ +Baz
55
+ qux
56
+ quux
57
+ DIFF
58
+ diff = UnifiedDiff.parse(original)
59
+
60
+ assert_equal "modified.txt", diff.modified_file
61
+ assert_nil diff.modified_timestamp
62
+ end
63
+
28
64
  def test_parses_modified_filename
29
65
  assert_equal "modified.txt", @diff.modified_file
30
66
  assert_equal Time.parse('2011-05-31 11:14:44.000000000 -0500'), @diff.modified_timestamp
@@ -105,4 +141,67 @@ class TestUnifiedDiff < MiniTest::Unit::TestCase
105
141
  @chunk = @diff.chunks.first
106
142
  assert_equal (1...2), @chunk.modified_range
107
143
  end
144
+
145
+ # For files:
146
+ # odd_line_original
147
+ # containing one line:
148
+ # foo
149
+ #
150
+ # and
151
+ # odd_line_modified
152
+ # containing five lines:
153
+ # foo
154
+ # bar
155
+ # Baz
156
+ # qux
157
+ # quux
158
+ def test_handles_one_element_origin_chunk_range
159
+ diff = <<-DIFF.unindent
160
+ --- original.txt 2012-09-06 16:56:08.320483113 -0400
161
+ +++ modified.txt 2012-09-06 16:56:44.488483939 -0400
162
+ @@ -1 +1,5 @@
163
+ foo
164
+ +bar
165
+ +Baz
166
+ +qux
167
+ +quux
168
+ DIFF
169
+ @diff = UnifiedDiff.parse(diff)
170
+ @chunk = @diff.chunks.first
171
+ assert_equal (1...2), @chunk.original_range
172
+ assert_equal (1...6), @chunk.modified_range
173
+ assert_equal 0, @chunk.removed_lines.length
174
+ assert_equal 4, @chunk.added_lines.length
175
+ end
176
+
177
+ def test_handles_chunks_within_chunks
178
+ # Hand modified git diff -U of this file to create this diff.
179
+ # The git version of unified does not have a timestamp after
180
+ # the filename.
181
+ #
182
+ # The lines:
183
+ # --- a/test/test_unified_diff.rb 2012-09-06 16:56:08.320483113 -0400
184
+ # +++ b/test/test_unified_diff.rb 2012-09-06 16:56:44.488483939 -0400
185
+ # are really supposed to be:
186
+ # --- a/test/test_unified_diff.rb
187
+ # +++ b/test/test_unified_diff.rb
188
+ # That may well be a new issue.
189
+ diff = <<-DIFF.unindent
190
+ --- a/test/test_unified_diff.rb 2012-09-06 16:56:08.320483113 -0400
191
+ +++ b/test/test_unified_diff.rb 2012-09-06 16:56:44.488483939 -0400
192
+ @@ -5,7 +5,7 @@ class TestUnifiedDiff < MiniTest::Unit::TestCase
193
+ @original = <<-DIFF.unindent
194
+ --- original.txt 2011-05-31 11:14:13.000000000 -0500
195
+ +++ modified.txt 2011-05-31 11:14:44.000000000 -0500
196
+ - @@ -1,5 +1,5 @@
197
+ + @@ -1,5 +1,5 @@ Optional Text goes here.
198
+ foo
199
+ bar
200
+ -baz
201
+ DIFF
202
+ @diff = UnifiedDiff.parse(diff)
203
+ @chunk = @diff.chunks.first
204
+ assert_equal (5...12), @chunk.original_range
205
+ assert_equal (5...12), @chunk.modified_range
206
+ end
108
207
  end
data/unified_diff.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{unified_diff}
8
- s.version = "0.3.2"
7
+ s.name = "unified_diff"
8
+ s.version = "0.3.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ryan Neufeld"]
12
- s.date = %q{2011-06-01}
13
- s.description = %q{unified_diff parses unified diff contents into easy-to-use Ruby objects}
14
- s.email = %q{ryan@ryanneufeld.ca}
12
+ s.date = "2013-04-16"
13
+ s.description = "unified_diff parses unified diff contents into easy-to-use Ruby objects"
14
+ s.email = "ryan@ryanneufeld.ca"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
17
  "README.rdoc"
@@ -32,29 +32,26 @@ Gem::Specification.new do |s|
32
32
  "test/test_unified_diff.rb",
33
33
  "unified_diff.gemspec"
34
34
  ]
35
- s.homepage = %q{http://github.com/rkneufeld/unified_diff}
35
+ s.homepage = "http://github.com/rkneufeld/unified_diff"
36
36
  s.licenses = ["MIT"]
37
37
  s.require_paths = ["lib"]
38
- s.rubygems_version = %q{1.6.2}
39
- s.summary = %q{Parse unified diffs in style}
38
+ s.rubygems_version = "1.8.24"
39
+ s.summary = "Parse unified diffs in style"
40
40
 
41
41
  if s.respond_to? :specification_version then
42
42
  s.specification_version = 3
43
43
 
44
44
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
45
  s.add_development_dependency(%q<minitest>, [">= 0"])
46
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
47
46
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
48
47
  s.add_development_dependency(%q<simplecov>, [">= 0"])
49
48
  else
50
49
  s.add_dependency(%q<minitest>, [">= 0"])
51
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
52
50
  s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
53
51
  s.add_dependency(%q<simplecov>, [">= 0"])
54
52
  end
55
53
  else
56
54
  s.add_dependency(%q<minitest>, [">= 0"])
57
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
58
55
  s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
59
56
  s.add_dependency(%q<simplecov>, [">= 0"])
60
57
  end
metadata CHANGED
@@ -1,72 +1,72 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: unified_diff
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.3
4
5
  prerelease:
5
- version: 0.3.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Ryan Neufeld
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-01 00:00:00 -05:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2013-04-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: minitest
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :development
25
23
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
32
- - - ~>
33
- - !ruby/object:Gem::Version
34
- version: 1.0.0
35
- type: :development
36
- prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
39
31
  name: jeweler
40
- requirement: &id003 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
41
33
  none: false
42
- requirements:
34
+ requirements:
43
35
  - - ~>
44
- - !ruby/object:Gem::Version
36
+ - !ruby/object:Gem::Version
45
37
  version: 1.6.0
46
38
  type: :development
47
39
  prerelease: false
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.0
46
+ - !ruby/object:Gem::Dependency
50
47
  name: simplecov
51
- requirement: &id004 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
52
49
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
57
54
  type: :development
58
55
  prerelease: false
59
- version_requirements: *id004
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
60
62
  description: unified_diff parses unified diff contents into easy-to-use Ruby objects
61
63
  email: ryan@ryanneufeld.ca
62
64
  executables: []
63
-
64
65
  extensions: []
65
-
66
- extra_rdoc_files:
66
+ extra_rdoc_files:
67
67
  - LICENSE.txt
68
68
  - README.rdoc
69
- files:
69
+ files:
70
70
  - .document
71
71
  - Gemfile
72
72
  - Gemfile.lock
@@ -81,36 +81,32 @@ files:
81
81
  - test/test_chunk.rb
82
82
  - test/test_unified_diff.rb
83
83
  - unified_diff.gemspec
84
- has_rdoc: true
85
84
  homepage: http://github.com/rkneufeld/unified_diff
86
- licenses:
85
+ licenses:
87
86
  - MIT
88
87
  post_install_message:
89
88
  rdoc_options: []
90
-
91
- require_paths:
89
+ require_paths:
92
90
  - lib
93
- required_ruby_version: !ruby/object:Gem::Requirement
91
+ required_ruby_version: !ruby/object:Gem::Requirement
94
92
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: -1898865572022610731
99
- segments:
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ segments:
100
98
  - 0
101
- version: "0"
102
- required_rubygems_version: !ruby/object:Gem::Requirement
99
+ hash: -685931603
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
101
  none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- version: "0"
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
108
106
  requirements: []
109
-
110
107
  rubyforge_project:
111
- rubygems_version: 1.6.2
108
+ rubygems_version: 1.8.24
112
109
  signing_key:
113
110
  specification_version: 3
114
111
  summary: Parse unified diffs in style
115
112
  test_files: []
116
-