diffing 0.2.0 → 0.2.1
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.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/Gemfile +1 -1
- data/README.md +8 -4
- data/Rakefile +3 -0
- data/lib/diffing/diff.rb +16 -16
- data/lib/diffing/formats/ascii.rb +6 -6
- data/lib/diffing/formats/html.rb +33 -33
- data/lib/diffing/part.rb +6 -6
- data/lib/diffing.rb +10 -10
- data/spec/diffing/diff_spec.rb +48 -0
- data/spec/diffing/formats_spec.rb +29 -0
- data/spec/diffing/part_spec.rb +33 -0
- data/spec/diffing_spec.rb +19 -0
- data/spec/spec_helper.rb +34 -0
- metadata +36 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f515a9445aa155f3572e497fd3074293485f80b
|
4
|
+
data.tar.gz: 7fb8fb8c02e4e94c45c5f4d4a579839cc0819a62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf83c911a89640fcdf1716603d9b60305798b3a670478f5bb49d75cff7aeaa12461f212b20bd685c64d538af406e0fa20ff5cb5be68861646e9768d2c6846dc7
|
7
|
+
data.tar.gz: 4a117ea61cd887661511e6a022ab5b22f2e8f17c83fb4d8959fb29206f5df6774655652cca3a7d2cd20d696fc72ff7371074fd2274cb40757235adeed528cb5d
|
data/.rspec
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Diffing
|
2
2
|
|
3
|
+
[](https://travis-ci.org/4urbanoff/Diffing)
|
4
|
+
[](https://codeclimate.com/github/4urbanoff/Diffing)
|
5
|
+
[](https://codeclimate.com/github/4urbanoff/Diffing/coverage)
|
6
|
+
|
3
7
|
## Installation
|
4
8
|
|
5
9
|
```
|
@@ -59,11 +63,11 @@ module CustomFormat
|
|
59
63
|
"(++#{ value })"
|
60
64
|
end
|
61
65
|
|
62
|
-
def
|
66
|
+
def remove( value )
|
63
67
|
"(--#{ value })"
|
64
68
|
end
|
65
69
|
|
66
|
-
def
|
70
|
+
def change( from, to )
|
67
71
|
"(#{ from } => #{ to })"
|
68
72
|
end
|
69
73
|
|
@@ -89,11 +93,11 @@ Diffing.by_words( from, to ).parts.map { |part|
|
|
89
93
|
result = ''
|
90
94
|
result << "<source:#{ part.source }>" if part.source?
|
91
95
|
result << "<insert:#{ part.insert }>" if part.insert?
|
92
|
-
result << "<
|
96
|
+
result << "<remove:#{ part.remove }>" if part.remove?
|
93
97
|
result
|
94
98
|
|
95
99
|
}.join
|
96
|
-
# => <insert:Hi!><
|
100
|
+
# => <insert:Hi!><remove:Hello!><source: I am><insert: two><source: string for diffing><remove: test>
|
97
101
|
```
|
98
102
|
|
99
103
|
|
data/Rakefile
CHANGED
data/lib/diffing/diff.rb
CHANGED
@@ -5,28 +5,28 @@ module Diffing
|
|
5
5
|
|
6
6
|
attr_reader :parts
|
7
7
|
|
8
|
-
def initialize( from, to, pattern = nil )
|
9
|
-
@pattern = pattern
|
10
|
-
@parts =
|
8
|
+
def initialize( from, to, pattern = nil )
|
9
|
+
@pattern = pattern
|
10
|
+
@parts = calculate( split( from.to_s ), split( to.to_s ) ).flatten
|
11
11
|
end
|
12
12
|
|
13
13
|
def format( format )
|
14
14
|
result = []
|
15
15
|
@parts.each do |part|
|
16
|
-
result << format.source(
|
17
|
-
result << format.insert(
|
18
|
-
result << format.
|
19
|
-
result << format.
|
16
|
+
result << format.source( part.source ) if part.source?
|
17
|
+
result << format.insert( part.insert ) if part.insert? && !part.remove?
|
18
|
+
result << format.remove( part.remove ) if part.remove? && !part.insert?
|
19
|
+
result << format.change( part.remove, part.insert ) if part.insert? && part.remove?
|
20
20
|
end
|
21
|
-
result.join
|
21
|
+
result.join
|
22
22
|
end
|
23
23
|
|
24
24
|
def as_ascii
|
25
|
-
format
|
25
|
+
format Formats::Ascii
|
26
26
|
end
|
27
27
|
|
28
28
|
def as_html
|
29
|
-
format
|
29
|
+
format Formats::Html
|
30
30
|
end
|
31
31
|
|
32
32
|
alias :to_s :as_ascii
|
@@ -35,12 +35,12 @@ module Diffing
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
-
def
|
38
|
+
def calculate( from, to )
|
39
39
|
if found = find_middle( from, to )
|
40
40
|
from_l, to_l, source, from_r, to_r = found
|
41
|
-
[
|
41
|
+
[ calculate( from_l, to_l ), Part.new( source: join( source ) ), calculate( from_r, to_r ) ]
|
42
42
|
else
|
43
|
-
[ Part.new( insert: join( to ),
|
43
|
+
[ Part.new( insert: join( to ), remove: join( from ) ) ]
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -75,7 +75,7 @@ module Diffing
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def find_middle_index( set, search_subset )
|
78
|
-
return set.index( search_subset )
|
78
|
+
return set.index( search_subset ) if set.is_a?( String ) && search_subset.is_a?( String )
|
79
79
|
subsets_each( set, search_subset.size ){ |subset, first, last| return first if subset == search_subset }
|
80
80
|
nil
|
81
81
|
end
|
@@ -89,11 +89,11 @@ module Diffing
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def split( set )
|
92
|
-
@pattern ? set.scan( @pattern ) : set
|
92
|
+
@pattern ? set.scan( @pattern ) : set
|
93
93
|
end
|
94
94
|
|
95
95
|
def join( set )
|
96
|
-
|
96
|
+
set.is_a?( Array ) ? set.join : set
|
97
97
|
end
|
98
98
|
|
99
99
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Diffing
|
2
2
|
|
3
|
-
module
|
3
|
+
module Formats
|
4
4
|
|
5
5
|
module Ascii
|
6
6
|
|
@@ -12,15 +12,15 @@ module Diffing
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def insert( value )
|
15
|
-
"{+`#{ value }`}"
|
15
|
+
"{+`#{ value }`}"
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
"{-`#{ value }`}"
|
18
|
+
def remove( value )
|
19
|
+
"{-`#{ value }`}"
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
"{`#{ from }`>>`#{ to }`}"
|
22
|
+
def change( from, to )
|
23
|
+
"{`#{ from }`>>`#{ to }`}"
|
24
24
|
end
|
25
25
|
|
26
26
|
|
data/lib/diffing/formats/html.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
module Diffing
|
2
|
-
|
3
|
-
module
|
4
|
-
|
5
|
-
module Html
|
6
|
-
|
7
|
-
class << self
|
8
|
-
|
9
|
-
|
10
|
-
def source( value )
|
11
|
-
value
|
12
|
-
end
|
13
|
-
|
14
|
-
def insert( value )
|
15
|
-
"<ins>#{ value }</ins>"
|
16
|
-
end
|
17
|
-
|
18
|
-
def
|
19
|
-
"<del>#{ value }</del>"
|
20
|
-
end
|
21
|
-
|
22
|
-
def
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
1
|
+
module Diffing
|
2
|
+
|
3
|
+
module Formats
|
4
|
+
|
5
|
+
module Html
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
|
10
|
+
def source( value )
|
11
|
+
value
|
12
|
+
end
|
13
|
+
|
14
|
+
def insert( value )
|
15
|
+
"<ins>#{ value }</ins>"
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove( value )
|
19
|
+
"<del>#{ value }</del>"
|
20
|
+
end
|
21
|
+
|
22
|
+
def change( from, to )
|
23
|
+
remove( from ) + insert( to )
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/diffing/part.rb
CHANGED
@@ -3,10 +3,10 @@ module Diffing
|
|
3
3
|
|
4
4
|
class Part
|
5
5
|
|
6
|
-
attr_reader :source, :insert, :
|
6
|
+
attr_reader :source, :insert, :remove
|
7
7
|
|
8
|
-
def initialize( source: '', insert: '',
|
9
|
-
@source, @insert, @
|
8
|
+
def initialize( source: '', insert: '', remove: '' )
|
9
|
+
@source, @insert, @remove = source, insert, remove
|
10
10
|
end
|
11
11
|
|
12
12
|
def source?
|
@@ -17,10 +17,10 @@ module Diffing
|
|
17
17
|
not @insert.empty?
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
not @
|
20
|
+
def remove?
|
21
|
+
not @remove.empty?
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
end
|
25
25
|
|
26
26
|
|
data/lib/diffing.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'diffing/diff'
|
2
|
-
require 'diffing/part'
|
3
|
-
require 'diffing/formats/ascii'
|
4
|
-
require 'diffing/formats/html'
|
1
|
+
require 'diffing/diff'
|
2
|
+
require 'diffing/part'
|
3
|
+
require 'diffing/formats/ascii'
|
4
|
+
require 'diffing/formats/html'
|
5
5
|
|
6
6
|
|
7
7
|
module Diffing
|
@@ -9,16 +9,16 @@ module Diffing
|
|
9
9
|
class << self
|
10
10
|
|
11
11
|
|
12
|
-
def by_chars( from, to )
|
13
|
-
Diff.new from, to
|
12
|
+
def by_chars( from, to )
|
13
|
+
Diff.new from, to
|
14
14
|
end
|
15
15
|
|
16
16
|
def by_words( from, to )
|
17
|
-
Diff.new from, to, /\S+|\s+/
|
17
|
+
Diff.new from, to, /\S+|\s+/
|
18
18
|
end
|
19
|
-
|
20
|
-
def by_lines( from, to )
|
21
|
-
Diff.new from, to, /[^\n]+|\n+/
|
19
|
+
|
20
|
+
def by_lines( from, to )
|
21
|
+
Diff.new from, to, /[^\n]+|\n+/
|
22
22
|
end
|
23
23
|
|
24
24
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
describe Diffing::Diff do
|
2
|
+
|
3
|
+
it '#initialize' do
|
4
|
+
expect( diff ).to an_instance_of( Diffing::Diff )
|
5
|
+
end
|
6
|
+
|
7
|
+
it '#calculate' do
|
8
|
+
ex = diff_by_chars.send( :calculate, 'ab', 'bc' ).flatten.map { |part|
|
9
|
+
( part.source? and part.source ) or ( part.insert? and part.insert ) or ( part.remove? and part.remove )
|
10
|
+
}.join
|
11
|
+
expect( ex ).to eql( 'abc' )
|
12
|
+
ex = diff_by_words.send( :calculate, %w(a b), %w(b c) ).flatten.map { |part|
|
13
|
+
( part.source? and part.source ) or ( part.insert? and part.insert ) or ( part.remove? and part.remove )
|
14
|
+
}.join
|
15
|
+
expect( ex ).to eql( 'abc' )
|
16
|
+
end
|
17
|
+
|
18
|
+
it '#find_middle' do
|
19
|
+
expect( diff_by_chars.send( :find_middle, '.mid..', '--mid-' ) ).to eq( ['.', '--', 'mid', '..', '-'] )
|
20
|
+
expect( diff_by_chars.send( :find_middle, '.mid..', '__===_' ) ).to eq( nil )
|
21
|
+
expect( diff_by_words.send( :find_middle, %w(. m i d . .), %w(- - m i d -) ) ).to eq( [['.'], ['-', '-'], ['m', 'i', 'd'], ['.', '.'], ['-']] )
|
22
|
+
expect( diff_by_words.send( :find_middle, %w(. m i d . .), %w(_ _ = = = _) ) ).to eq( nil )
|
23
|
+
end
|
24
|
+
|
25
|
+
it '#find_middle_index' do
|
26
|
+
expect( diff_by_chars.send( :find_middle_index, '...mid...', 'mid' ) ).to eq( 3 )
|
27
|
+
expect( diff_by_words.send( :find_middle_index, %w(. . . m i d . . .), %w(m i d) ) ).to eq( 3 )
|
28
|
+
expect( diff_by_chars.send( :find_middle_index, '...mid...', 'nil' ) ).to eq( nil )
|
29
|
+
expect( diff_by_words.send( :find_middle_index, %w(. . . m i d . . .), %w(n i l) ) ).to eq( nil )
|
30
|
+
end
|
31
|
+
|
32
|
+
it '#subsets_each' do
|
33
|
+
result = []
|
34
|
+
diff.send( :subsets_each, 'abcde', 3 ){ |*args| result << args }
|
35
|
+
expect( result ).to eq( [ ['abc', 0, 3], ['bcd', 1, 4], ['cde', 2, 5] ] )
|
36
|
+
end
|
37
|
+
|
38
|
+
it '#split' do
|
39
|
+
expect( diff_by_chars.send( :split, 'abc' ) ).to an_instance_of( String )
|
40
|
+
expect( diff_by_words.send( :split, 'a b' ) ).to an_instance_of( Array )
|
41
|
+
end
|
42
|
+
|
43
|
+
it '#join' do
|
44
|
+
expect( diff.send( :join, 'abc' ) ).to eq( 'abc' )
|
45
|
+
expect( diff.send( :join, %w(a b c) ) ).to eq( 'abc' )
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
describe Diffing::Formats do
|
2
|
+
|
3
|
+
Diffing::Formats.constants.each do |name|
|
4
|
+
|
5
|
+
name do
|
6
|
+
|
7
|
+
subject = Diffing::Formats.const_get name
|
8
|
+
|
9
|
+
it 'does not have method source' do
|
10
|
+
subject.source ''
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'does not have method insert' do
|
14
|
+
subject.insert ''
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'does not have method remove' do
|
18
|
+
subject.remove ''
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'does not have method change' do
|
22
|
+
subject.change '', ''
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
describe Diffing::Part do
|
2
|
+
|
3
|
+
subject { Diffing::Part.new( source: 'a', insert: 'b', remove: 'c' ) }
|
4
|
+
|
5
|
+
it '#initialize' do
|
6
|
+
expect( subject ).to an_instance_of( Diffing::Part )
|
7
|
+
end
|
8
|
+
|
9
|
+
it '#source' do
|
10
|
+
expect( subject.source ).to eq( 'a' )
|
11
|
+
end
|
12
|
+
|
13
|
+
it '#insert' do
|
14
|
+
expect( subject.insert ).to eq( 'b' )
|
15
|
+
end
|
16
|
+
|
17
|
+
it '#remove' do
|
18
|
+
expect( subject.remove ).to eq( 'c' )
|
19
|
+
end
|
20
|
+
|
21
|
+
it '#source?' do
|
22
|
+
expect( subject.source? ).to eq( true )
|
23
|
+
end
|
24
|
+
|
25
|
+
it '#insert?' do
|
26
|
+
expect( subject.insert? ).to eq( true )
|
27
|
+
end
|
28
|
+
|
29
|
+
it '#remove?' do
|
30
|
+
expect( subject.remove? ).to eq( true )
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe Diffing do
|
2
|
+
|
3
|
+
it 'does not exists' do
|
4
|
+
Diffing
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'does not have method by_chars( from, to )' do
|
8
|
+
Diffing.by_chars "", ""
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'does not have method by_words( from, to )' do
|
12
|
+
Diffing.by_words "", ""
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'does not have method by_lines( from, to )' do
|
16
|
+
Diffing.by_lines "", ""
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'diffing'
|
2
|
+
|
3
|
+
|
4
|
+
module Diffing
|
5
|
+
|
6
|
+
module SpecHelper
|
7
|
+
|
8
|
+
def diff( type = :by_chars, from = "", to = "" )
|
9
|
+
Diffing.send type, from, to
|
10
|
+
end
|
11
|
+
|
12
|
+
def diff_by_chars( from = "", to = "" )
|
13
|
+
diff :by_chars, from, to
|
14
|
+
end
|
15
|
+
|
16
|
+
def diff_by_words( from = "", to = "" )
|
17
|
+
diff :by_words, from, to
|
18
|
+
end
|
19
|
+
|
20
|
+
def diff_by_lines( from = "", to = "" )
|
21
|
+
diff :by_lines, from, to
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
RSpec.configure do |config|
|
31
|
+
|
32
|
+
config.include Diffing::SpecHelper
|
33
|
+
|
34
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diffing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Denis Churbanov
|
@@ -9,7 +9,35 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-08-05 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
description: Diffing of two strings
|
14
42
|
email: 4urbanoff@gmail.com
|
15
43
|
executables: []
|
@@ -21,10 +49,16 @@ files:
|
|
21
49
|
- lib/diffing/formats/html.rb
|
22
50
|
- lib/diffing/part.rb
|
23
51
|
- lib/diffing.rb
|
52
|
+
- spec/diffing/diff_spec.rb
|
53
|
+
- spec/diffing/formats_spec.rb
|
54
|
+
- spec/diffing/part_spec.rb
|
55
|
+
- spec/diffing_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
24
57
|
- LICENSE.txt
|
25
58
|
- Rakefile
|
26
59
|
- Gemfile
|
27
60
|
- README.md
|
61
|
+
- .rspec
|
28
62
|
homepage: https://github.com/4urbanoff/Diffing
|
29
63
|
licenses:
|
30
64
|
- MIT
|