unified_diff 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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
-