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 +0 -1
- data/Gemfile.lock +9 -8
- data/VERSION +1 -1
- data/lib/unified_diff/diff.rb +27 -13
- data/test/test_unified_diff.rb +100 -1
- data/unified_diff.gemspec +8 -11
- metadata +56 -60
data/Gemfile
CHANGED
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.
|
6
|
-
bundler (~> 1.0
|
5
|
+
jeweler (1.6.4)
|
6
|
+
bundler (~> 1.0)
|
7
7
|
git (>= 1.2.5)
|
8
8
|
rake
|
9
|
-
minitest (
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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.
|
1
|
+
0.3.3
|
data/lib/unified_diff/diff.rb
CHANGED
@@ -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 = /(
|
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
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
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
|
51
|
+
@original_file = $1
|
52
|
+
@original_timestamp = Time.parse($2) if $2
|
43
53
|
when NEW_FILE_PATTERN
|
44
|
-
@modified_file
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
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
|
data/test/test_unified_diff.rb
CHANGED
@@ -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 =
|
8
|
-
s.version = "0.3.
|
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 =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
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 =
|
35
|
+
s.homepage = "http://github.com/rkneufeld/unified_diff"
|
36
36
|
s.licenses = ["MIT"]
|
37
37
|
s.require_paths = ["lib"]
|
38
|
-
s.rubygems_version =
|
39
|
-
s.summary =
|
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
|
-
|
14
|
-
|
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:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :development
|
25
23
|
prerelease: false
|
26
|
-
version_requirements:
|
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:
|
35
|
-
|
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:
|
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:
|
49
|
-
|
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:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
52
49
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
57
54
|
type: :development
|
58
55
|
prerelease: false
|
59
|
-
version_requirements:
|
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
|
-
|
99
|
-
segments:
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
100
98
|
- 0
|
101
|
-
|
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:
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
108
106
|
requirements: []
|
109
|
-
|
110
107
|
rubyforge_project:
|
111
|
-
rubygems_version: 1.
|
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
|
-
|