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 +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
|
-
|