nokogiri-diff 0.2.0 → 0.3.0
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 +7 -0
- data/.github/workflows/ruby.yml +28 -0
- data/.gitignore +4 -2
- data/ChangeLog.md +7 -0
- data/Gemfile +15 -0
- data/LICENSE.txt +1 -1
- data/README.md +39 -32
- data/Rakefile +6 -32
- data/gemspec.yml +10 -5
- data/lib/nokogiri/diff/version.rb +3 -1
- data/lib/nokogiri/diff/xml/document.rb +3 -1
- data/lib/nokogiri/diff/xml/node.rb +3 -1
- data/lib/nokogiri/diff/xml.rb +4 -2
- data/lib/nokogiri/diff.rb +4 -2
- data/nokogiri-diff.gemspec +1 -4
- data/spec/diff_spec.rb +113 -113
- data/spec/spec_helper.rb +2 -1
- metadata +28 -74
- data/.gemtest +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4374cae69c49465afb2391000bc4c57c0f30db34155afe50c463cf54a86fe719
|
4
|
+
data.tar.gz: eb6e14af7ddca3cf72555d83f8f608cd90310d532c18bd6645afedd3bf3d8437
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d67440441d4581bf0ab7a59dc9ce7ab34fbc3c8078a36f305ee91b3835d808c9cdd7221c5e080fcd6dd7552f61698cb72b7a2df9d0bc1208ddfdc4b46ef7d364
|
7
|
+
data.tar.gz: 995fe16d4e4299b02f4d34a3a1c6a4061ae8f727343e64d5692c9fdeca89bd128d9eb8fa40ff934178580326c35fe63a07ed8fa5dc61458330c4dfe22cc1bd92
|
@@ -0,0 +1,28 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [ push, pull_request ]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
tests:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby:
|
12
|
+
- '3.0'
|
13
|
+
- '3.1'
|
14
|
+
- '3.2'
|
15
|
+
- '3.3'
|
16
|
+
- jruby
|
17
|
+
- truffleruby
|
18
|
+
name: Ruby ${{ matrix.ruby }}
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v4
|
21
|
+
- name: Set up Ruby
|
22
|
+
uses: ruby/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.ruby }}
|
25
|
+
- name: Install dependencies
|
26
|
+
run: bundle install --jobs 4 --retry 3
|
27
|
+
- name: Run tests
|
28
|
+
run: bundle exec rake test
|
data/.gitignore
CHANGED
data/ChangeLog.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 0.3.0 / 2024-01-24
|
2
|
+
|
3
|
+
* Require [ruby](http://www.ruby-lang.org/) >= 2.0.0.
|
4
|
+
* Require [tdiff](http://github.com/postmodern/tdiff) ~> 0.4.
|
5
|
+
* Switched to using `require_relative` to improve load-times.
|
6
|
+
* Added `# frozen_string_literal: true` to all files.
|
7
|
+
|
1
8
|
### 0.2.0 / 2013-04-22
|
2
9
|
|
3
10
|
* {Nokogiri::XML::Node#tdiff_each_child} now sorts attributes by name, so that
|
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rubygems-tasks', '~> 0.2'
|
8
|
+
|
9
|
+
gem 'rspec', '~> 3.0'
|
10
|
+
gem 'simplecov', '~> 0.20', require: false
|
11
|
+
|
12
|
+
gem 'kramdown'
|
13
|
+
gem 'redcarpet', platform: :mri
|
14
|
+
gem 'yard', '~> 0.9'
|
15
|
+
end
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# nokogiri-diff
|
2
2
|
|
3
|
+
[](https://github.com/postmodern/nokogiri-diff/actions/workflows/ruby.yml)
|
4
|
+
|
3
5
|
* [Source](https://github.com/postmodern/nokogiri-diff)
|
4
6
|
* [Issues](https://github.com/postmodern/nokogiri-diff/issues)
|
5
7
|
* [Documentation](http://rubydoc.info/gems/nokogiri-diff/frames)
|
6
|
-
* [Email](mailto:postmodern.mod3 at gmail.com)
|
7
8
|
|
8
9
|
## Description
|
9
10
|
|
@@ -19,56 +20,62 @@ removed nodes) between two XML/HTML documents.
|
|
19
20
|
|
20
21
|
## Examples
|
21
22
|
|
22
|
-
Enumerate over the
|
23
|
+
Enumerate over the differences between two HTML documents:
|
23
24
|
|
24
|
-
|
25
|
+
```ruby
|
26
|
+
require 'nokogiri/diff'
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
+
doc1 = Nokogiri::HTML('<div><p>one</p> two </div>')
|
29
|
+
doc2 = Nokogiri::HTML('<div><p id="1">one</p> <p>three</p></div>')
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
doc1.diff(doc2) do |change,node|
|
32
|
+
puts "#{change} #{node.to_html}".ljust(30) + node.parent.path
|
33
|
+
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
# <div>
|
36
|
+
# <p>one</p> two </div> /
|
37
|
+
# <p>one</p> /div
|
38
|
+
# - two /div
|
39
|
+
# + /div
|
40
|
+
# + <p>three</p> /div
|
41
|
+
# + id="1" /div/p[1]
|
42
|
+
# one /div/p
|
43
|
+
```
|
41
44
|
|
42
45
|
Only find the added nodes:
|
43
46
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
```ruby
|
48
|
+
doc1.diff(doc2, :added => true) do |change,node|
|
49
|
+
puts node.to_html.ljust(30) + node.parent.path
|
50
|
+
end
|
47
51
|
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
# /div
|
53
|
+
# <p>three</p> /div
|
54
|
+
# id="1" /div/p[1]
|
55
|
+
```
|
51
56
|
|
52
57
|
Only find the removed nodes:
|
53
58
|
|
54
|
-
|
55
|
-
|
56
|
-
|
59
|
+
```ruby
|
60
|
+
doc1.diff(doc2, :removed => true) do |change,node|
|
61
|
+
puts node.to_html.ljust(30) + node.parent.path
|
62
|
+
end
|
57
63
|
|
58
|
-
|
64
|
+
# two /div
|
65
|
+
```
|
59
66
|
|
60
67
|
## Requirements
|
61
68
|
|
62
|
-
* [ruby](http://www.ruby-lang.org/) >=
|
63
|
-
* [tdiff](http://github.com/postmodern/tdiff) ~> 0.
|
69
|
+
* [ruby](http://www.ruby-lang.org/) >= 2.0.0
|
70
|
+
* [tdiff](http://github.com/postmodern/tdiff) ~> 0.4
|
64
71
|
* [nokogiri](http://nokogiri.rubyforge.org/) ~> 1.5
|
65
72
|
|
66
73
|
## Install
|
67
74
|
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
```shell
|
76
|
+
$ gem install nokogiri-diff
|
77
|
+
```
|
71
78
|
|
72
|
-
|
79
|
+
## License
|
73
80
|
|
74
81
|
See {file:LICENSE.txt} for details.
|
data/Rakefile
CHANGED
@@ -1,36 +1,10 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
1
|
+
require 'rubygems/tasks'
|
2
|
+
Gem::Tasks.new
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
require 'rubygems/tasks'
|
7
|
-
|
8
|
-
Gem::Tasks.new
|
9
|
-
rescue LoadError => e
|
10
|
-
warn e.message
|
11
|
-
warn "Run `gem install rubygems-tasks` to install 'rubygems/tasks'."
|
12
|
-
end
|
13
|
-
|
14
|
-
begin
|
15
|
-
gem 'rspec', '~> 2.4'
|
16
|
-
require 'rspec/core/rake_task'
|
17
|
-
|
18
|
-
RSpec::Core::RakeTask.new
|
19
|
-
rescue LoadError => e
|
20
|
-
task :spec do
|
21
|
-
abort "Please run `gem install rspec` to install RSpec."
|
22
|
-
end
|
23
|
-
end
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
RSpec::Core::RakeTask.new
|
24
6
|
task :test => :spec
|
25
7
|
task :default => :spec
|
26
8
|
|
27
|
-
|
28
|
-
|
29
|
-
require 'yard'
|
30
|
-
|
31
|
-
YARD::Rake::YardocTask.new
|
32
|
-
rescue LoadError => e
|
33
|
-
task :yard do
|
34
|
-
abort "Please run `gem install yard` to install YARD."
|
35
|
-
end
|
36
|
-
end
|
9
|
+
require 'yard'
|
10
|
+
YARD::Rake::YardocTask.new
|
data/gemspec.yml
CHANGED
@@ -10,13 +10,18 @@ email: postmodern.mod3@gmail.com
|
|
10
10
|
homepage: https://github.com/postmodern/nokogiri-diff#readme
|
11
11
|
has_yard: true
|
12
12
|
|
13
|
-
|
13
|
+
metadata:
|
14
|
+
documentation_uri: https://rubydoc.info/gems/nokogiri-diff
|
15
|
+
source_code_uri: https://github.com/postmodern/nokogiri-diff
|
16
|
+
bug_tracker_uri: https://github.com/postmodern/nokogiri-diff/issues
|
17
|
+
changelog_uri: https://github.com/postmodern/nokogiri-diff/blob/main/ChangeLog.md
|
18
|
+
rubygems_mfa_required: 'true'
|
19
|
+
|
20
|
+
required_ruby_version: ">= 2.0.0"
|
14
21
|
|
15
22
|
dependencies:
|
16
|
-
tdiff: ~> 0.
|
23
|
+
tdiff: ~> 0.4
|
17
24
|
nokogiri: ~> 1.5
|
18
25
|
|
19
26
|
development_dependencies:
|
20
|
-
|
21
|
-
rspec: ~> 2.4
|
22
|
-
yard: ~> 0.7
|
27
|
+
bundler: ~> 2.0
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'nokogiri'
|
2
4
|
require 'tdiff'
|
3
5
|
|
@@ -25,7 +27,7 @@ class Nokogiri::XML::Node
|
|
25
27
|
when Nokogiri::XML::Text, Nokogiri::XML::Comment
|
26
28
|
self.text == node.text
|
27
29
|
when Nokogiri::XML::ProcessingInstruction
|
28
|
-
(self.name == node.name && self.content
|
30
|
+
(self.name == node.name && self.content == node.content)
|
29
31
|
else
|
30
32
|
false
|
31
33
|
end
|
data/lib/nokogiri/diff/xml.rb
CHANGED
data/lib/nokogiri/diff.rb
CHANGED
data/nokogiri-diff.gemspec
CHANGED
@@ -7,10 +7,7 @@ Gem::Specification.new do |gem|
|
|
7
7
|
|
8
8
|
gem.name = gemspec.fetch('name')
|
9
9
|
gem.version = gemspec.fetch('version') do
|
10
|
-
|
11
|
-
$LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
|
12
|
-
|
13
|
-
require 'nokogiri/diff/version'
|
10
|
+
require_relative 'lib/nokogiri/diff/version'
|
14
11
|
Nokogiri::Diff::VERSION
|
15
12
|
end
|
16
13
|
|
data/spec/diff_spec.rb
CHANGED
@@ -21,197 +21,197 @@ describe "nokogiri/diff" do
|
|
21
21
|
let(:removed_attr) { Nokogiri::XML('<div><p>one</p></div>') }
|
22
22
|
|
23
23
|
it "should add #diff to Nokogiri::XML::Docuemnt" do
|
24
|
-
doc.
|
24
|
+
expect(doc).to respond_to(:diff)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should add #diff to Nokogiri::XML::Element" do
|
28
|
-
added_element.at('div').
|
28
|
+
expect(added_element.at('div')).to respond_to(:diff)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should add #diff to Nokogiri::XML::Text" do
|
32
|
-
added_text.at('p/text()').
|
32
|
+
expect(added_text.at('p/text()')).to respond_to(:diff)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should add #diff to Nokogiri::XML::Attr" do
|
36
|
-
added_attr.at('p/@id').
|
36
|
+
expect(added_attr.at('p/@id')).to respond_to(:diff)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should not compare the Document objects" do
|
40
40
|
change = doc.diff(doc).first
|
41
41
|
|
42
|
-
change[0].
|
43
|
-
change[1].
|
42
|
+
expect(change[0]).to eq(' ')
|
43
|
+
expect(change[1]).to eq(doc.root)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should determine when two different documents are identical" do
|
47
|
-
doc.diff(Nokogiri::XML(contents)).all? { |change,node|
|
47
|
+
expect(doc.diff(Nokogiri::XML(contents)).all? { |change,node|
|
48
48
|
change == ' '
|
49
|
-
}.
|
49
|
+
}).to eq(true)
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should search down within Nokogiri::XML::Document objects" do
|
53
|
-
doc.diff(changed_text).any? { |change,node|
|
53
|
+
expect(doc.diff(changed_text).any? { |change,node|
|
54
54
|
change != ' '
|
55
|
-
}.
|
55
|
+
}).to eq(true)
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should determine when text nodes are added" do
|
59
59
|
changes = doc.at('div').diff(added_text.at('div')).to_a
|
60
60
|
|
61
|
-
changes.length.
|
61
|
+
expect(changes.length).to eq(4)
|
62
62
|
|
63
|
-
changes[0][0].
|
64
|
-
changes[0][1].
|
63
|
+
expect(changes[0][0]).to eq(' ')
|
64
|
+
expect(changes[0][1]).to eq(doc.at('div'))
|
65
65
|
|
66
|
-
changes[1][0].
|
67
|
-
changes[1][1].
|
66
|
+
expect(changes[1][0]).to eq(' ')
|
67
|
+
expect(changes[1][1]).to eq(doc.at('//p'))
|
68
68
|
|
69
|
-
changes[2][0].
|
70
|
-
changes[2][1].
|
69
|
+
expect(changes[2][0]).to eq('+')
|
70
|
+
expect(changes[2][1]).to eq(added_text.at('//div/text()'))
|
71
71
|
|
72
|
-
changes[3][0].
|
73
|
-
changes[3][1].
|
72
|
+
expect(changes[3][0]).to eq(' ')
|
73
|
+
expect(changes[3][1]).to eq(doc.at('//p/text()'))
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should determine when elements are added" do
|
77
77
|
changes = doc.at('div').diff(added_element.at('div')).to_a
|
78
78
|
|
79
|
-
changes.length.
|
79
|
+
expect(changes.length).to eq(5)
|
80
80
|
|
81
|
-
changes[0][0].
|
82
|
-
changes[0][1].
|
81
|
+
expect(changes[0][0]).to eq(' ')
|
82
|
+
expect(changes[0][1]).to eq(doc.at('div'))
|
83
83
|
|
84
|
-
changes[1][0].
|
85
|
-
changes[1][1].
|
84
|
+
expect(changes[1][0]).to eq('+')
|
85
|
+
expect(changes[1][1]).to eq(added_element.at('//p[1]'))
|
86
86
|
|
87
|
-
changes[2][0].
|
88
|
-
changes[2][1].
|
87
|
+
expect(changes[2][0]).to eq(' ')
|
88
|
+
expect(changes[2][1]).to eq(doc.at('//p'))
|
89
89
|
|
90
|
-
changes[3][0].
|
91
|
-
changes[3][1].
|
90
|
+
expect(changes[3][0]).to eq('-')
|
91
|
+
expect(changes[3][1]).to eq(doc.at('//p/text()'))
|
92
92
|
|
93
|
-
changes[4][0].
|
94
|
-
changes[4][1].
|
93
|
+
expect(changes[4][0]).to eq('+')
|
94
|
+
expect(changes[4][1]).to eq(added_element.at('//p[2]/text()'))
|
95
95
|
end
|
96
96
|
|
97
97
|
it "should ignore when attribute order changes" do
|
98
98
|
changes = added_attrs.at('p').diff(changed_attr_order.at('p')).to_a
|
99
99
|
|
100
|
-
changes.all? { |change| change[0] == ' ' }.
|
100
|
+
expect(changes.all? { |change| change[0] == ' ' }).to be_truthy
|
101
101
|
end
|
102
102
|
|
103
103
|
it "should determine when attributes are added" do
|
104
104
|
changes = doc.at('p').diff(added_attr.at('p')).to_a
|
105
105
|
|
106
|
-
changes.length.
|
106
|
+
expect(changes.length).to eq(3)
|
107
107
|
|
108
|
-
changes[0][0].
|
109
|
-
changes[0][1].
|
108
|
+
expect(changes[0][0]).to eq(' ')
|
109
|
+
expect(changes[0][1]).to eq(doc.at('p'))
|
110
110
|
|
111
|
-
changes[1][0].
|
112
|
-
changes[1][1].
|
111
|
+
expect(changes[1][0]).to eq('+')
|
112
|
+
expect(changes[1][1]).to eq(added_attr.at('//p/@id'))
|
113
113
|
|
114
|
-
changes[2][0].
|
115
|
-
changes[2][1].
|
114
|
+
expect(changes[2][0]).to eq(' ')
|
115
|
+
expect(changes[2][1]).to eq(doc.at('//p/text()'))
|
116
116
|
end
|
117
117
|
|
118
118
|
it "should determine when text nodes differ" do
|
119
119
|
changes = doc.at('p').diff(changed_text.at('p')).to_a
|
120
120
|
|
121
|
-
changes.length.
|
121
|
+
expect(changes.length).to eq(3)
|
122
122
|
|
123
|
-
changes[0][0].
|
124
|
-
changes[0][1].
|
123
|
+
expect(changes[0][0]).to eq(' ')
|
124
|
+
expect(changes[0][1]).to eq(doc.at('p'))
|
125
125
|
|
126
|
-
changes[1][0].
|
127
|
-
changes[1][1].
|
126
|
+
expect(changes[1][0]).to eq('-')
|
127
|
+
expect(changes[1][1]).to eq(doc.at('//p/text()'))
|
128
128
|
|
129
|
-
changes[2][0].
|
130
|
-
changes[2][1].
|
129
|
+
expect(changes[2][0]).to eq('+')
|
130
|
+
expect(changes[2][1]).to eq(changed_text.at('//p/text()'))
|
131
131
|
end
|
132
132
|
|
133
133
|
it "should determine when element names differ" do
|
134
134
|
changes = doc.at('div').diff(changed_element.at('div')).to_a
|
135
135
|
|
136
|
-
changes.length.
|
136
|
+
expect(changes.length).to eq(3)
|
137
137
|
|
138
|
-
changes[0][0].
|
139
|
-
changes[0][1].
|
138
|
+
expect(changes[0][0]).to eq(' ')
|
139
|
+
expect(changes[0][1]).to eq(doc.at('div'))
|
140
140
|
|
141
|
-
changes[1][0].
|
142
|
-
changes[1][1].
|
141
|
+
expect(changes[1][0]).to eq('-')
|
142
|
+
expect(changes[1][1]).to eq(doc.at('p'))
|
143
143
|
|
144
|
-
changes[2][0].
|
145
|
-
changes[2][1].
|
144
|
+
expect(changes[2][0]).to eq('+')
|
145
|
+
expect(changes[2][1]).to eq(changed_element.at('span'))
|
146
146
|
end
|
147
147
|
|
148
148
|
it "should determine when attribute names differ" do
|
149
149
|
changes = added_attr.at('p').diff(changed_attr_name.at('p')).to_a
|
150
150
|
|
151
|
-
changes.length.
|
151
|
+
expect(changes.length).to eq(4)
|
152
152
|
|
153
|
-
changes[0][0].
|
154
|
-
changes[0][1].
|
153
|
+
expect(changes[0][0]).to eq(' ')
|
154
|
+
expect(changes[0][1]).to eq(added_attr.at('p'))
|
155
155
|
|
156
|
-
changes[1][0].
|
157
|
-
changes[1][1].
|
156
|
+
expect(changes[1][0]).to eq('-')
|
157
|
+
expect(changes[1][1]).to eq(added_attr.at('//p/@id'))
|
158
158
|
|
159
|
-
changes[2][0].
|
160
|
-
changes[2][1].
|
159
|
+
expect(changes[2][0]).to eq('+')
|
160
|
+
expect(changes[2][1]).to eq(changed_attr_name.at('//p/@i'))
|
161
161
|
|
162
|
-
changes[3][0].
|
163
|
-
changes[3][1].
|
162
|
+
expect(changes[3][0]).to eq(' ')
|
163
|
+
expect(changes[3][1]).to eq(added_attr.at('//p/text()'))
|
164
164
|
end
|
165
165
|
|
166
166
|
it "should determine when attribute values differ" do
|
167
167
|
changes = added_attr.at('p').diff(changed_attr_value.at('p')).to_a
|
168
168
|
|
169
|
-
changes.length.
|
169
|
+
expect(changes.length).to eq(4)
|
170
170
|
|
171
|
-
changes[0][0].
|
172
|
-
changes[0][1].
|
171
|
+
expect(changes[0][0]).to eq(' ')
|
172
|
+
expect(changes[0][1]).to eq(added_attr.at('p'))
|
173
173
|
|
174
|
-
changes[1][0].
|
175
|
-
changes[1][1].
|
174
|
+
expect(changes[1][0]).to eq('-')
|
175
|
+
expect(changes[1][1]).to eq(added_attr.at('//p/@id'))
|
176
176
|
|
177
|
-
changes[2][0].
|
178
|
-
changes[2][1].
|
177
|
+
expect(changes[2][0]).to eq('+')
|
178
|
+
expect(changes[2][1]).to eq(changed_attr_value.at('//p/@id'))
|
179
179
|
|
180
|
-
changes[3][0].
|
181
|
-
changes[3][1].
|
180
|
+
expect(changes[3][0]).to eq(' ')
|
181
|
+
expect(changes[3][1]).to eq(added_attr.at('//p/text()'))
|
182
182
|
end
|
183
183
|
|
184
184
|
it "should determine when text nodes are removed" do
|
185
185
|
changes = added_text.at('div').diff(removed_text.at('div')).to_a
|
186
186
|
|
187
|
-
changes.length.
|
187
|
+
expect(changes.length).to eq(4)
|
188
188
|
|
189
|
-
changes[0][0].
|
190
|
-
changes[0][1].
|
189
|
+
expect(changes[0][0]).to eq(' ')
|
190
|
+
expect(changes[0][1]).to eq(added_text.at('div'))
|
191
191
|
|
192
|
-
changes[1][0].
|
193
|
-
changes[1][1].
|
192
|
+
expect(changes[1][0]).to eq(' ')
|
193
|
+
expect(changes[1][1]).to eq(added_text.at('p'))
|
194
194
|
|
195
|
-
changes[2][0].
|
196
|
-
changes[2][1].
|
195
|
+
expect(changes[2][0]).to eq(' ')
|
196
|
+
expect(changes[2][1]).to eq(added_text.at('//div/text()'))
|
197
197
|
|
198
|
-
changes[3][0].
|
199
|
-
changes[3][1].
|
198
|
+
expect(changes[3][0]).to eq('-')
|
199
|
+
expect(changes[3][1]).to eq(added_text.at('//p/text()'))
|
200
200
|
end
|
201
201
|
|
202
202
|
it "should determine when elements are removed" do
|
203
203
|
changes = added_element.at('div').diff(removed_element.at('div')).to_a
|
204
204
|
|
205
|
-
changes.length.
|
205
|
+
expect(changes.length).to eq(3)
|
206
206
|
|
207
|
-
changes[0][0].
|
208
|
-
changes[0][1].
|
207
|
+
expect(changes[0][0]).to eq(' ')
|
208
|
+
expect(changes[0][1]).to eq(added_element.at('div'))
|
209
209
|
|
210
|
-
changes[1][0].
|
211
|
-
changes[1][1].
|
210
|
+
expect(changes[1][0]).to eq('-')
|
211
|
+
expect(changes[1][1]).to eq(added_element.at('//p[1]'))
|
212
212
|
|
213
|
-
changes[2][0].
|
214
|
-
changes[2][1].
|
213
|
+
expect(changes[2][0]).to eq('-')
|
214
|
+
expect(changes[2][1]).to eq(added_element.at('//p[2]'))
|
215
215
|
end
|
216
216
|
|
217
217
|
it "should ignore when attributes change order" do
|
@@ -220,47 +220,47 @@ describe "nokogiri/diff" do
|
|
220
220
|
it "should determine when attributes are removed" do
|
221
221
|
changes = added_attr.at('div').diff(removed_attr.at('div')).to_a
|
222
222
|
|
223
|
-
changes.length.
|
223
|
+
expect(changes.length).to eq(4)
|
224
224
|
|
225
|
-
changes[0][0].
|
226
|
-
changes[0][1].
|
225
|
+
expect(changes[0][0]).to eq(' ')
|
226
|
+
expect(changes[0][1]).to eq(added_attr.at('div'))
|
227
227
|
|
228
|
-
changes[1][0].
|
229
|
-
changes[1][1].
|
228
|
+
expect(changes[1][0]).to eq(' ')
|
229
|
+
expect(changes[1][1]).to eq(added_attr.at('p'))
|
230
230
|
|
231
|
-
changes[2][0].
|
232
|
-
changes[2][1].
|
231
|
+
expect(changes[2][0]).to eq('-')
|
232
|
+
expect(changes[2][1]).to eq(added_attr.at('//p/@id'))
|
233
233
|
|
234
|
-
changes[3][0].
|
235
|
-
changes[3][1].
|
234
|
+
expect(changes[3][0]).to eq(' ')
|
235
|
+
expect(changes[3][1]).to eq(added_attr.at('//p/text()'))
|
236
236
|
end
|
237
237
|
|
238
238
|
context ":added" do
|
239
239
|
it "should determine only when text nodes are added" do
|
240
240
|
changes = doc.at('div').diff(added_text.at('div'), :added => true).to_a
|
241
241
|
|
242
|
-
changes.length.
|
242
|
+
expect(changes.length).to eq(1)
|
243
243
|
|
244
|
-
changes[0][0].
|
245
|
-
changes[0][1].
|
244
|
+
expect(changes[0][0]).to eq('+')
|
245
|
+
expect(changes[0][1]).to eq(added_text.at('//div/text()'))
|
246
246
|
end
|
247
247
|
|
248
248
|
it "should determine only when elements are added" do
|
249
249
|
changes = doc.at('div').diff(added_element.at('div'), :added => true).to_a
|
250
250
|
|
251
|
-
changes.length.
|
251
|
+
expect(changes.length).to eq(1)
|
252
252
|
|
253
|
-
changes[0][0].
|
254
|
-
changes[0][1].
|
253
|
+
expect(changes[0][0]).to eq('+')
|
254
|
+
expect(changes[0][1]).to eq(added_element.at('//div/p[2]'))
|
255
255
|
end
|
256
256
|
|
257
257
|
it "should determine only when attributes are added" do
|
258
258
|
changes = doc.at('div').diff(added_attr.at('div'), :added => true).to_a
|
259
259
|
|
260
|
-
changes.length.
|
260
|
+
expect(changes.length).to eq(1)
|
261
261
|
|
262
|
-
changes[0][0].
|
263
|
-
changes[0][1].
|
262
|
+
expect(changes[0][0]).to eq('+')
|
263
|
+
expect(changes[0][1]).to eq(added_attr.at('//p/@id'))
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -268,28 +268,28 @@ describe "nokogiri/diff" do
|
|
268
268
|
it "should determine only when text nodes are removed" do
|
269
269
|
changes = doc.at('div').diff(removed_text.at('div'), :removed => true).to_a
|
270
270
|
|
271
|
-
changes.length.
|
271
|
+
expect(changes.length).to eq(1)
|
272
272
|
|
273
|
-
changes[0][0].
|
274
|
-
changes[0][1].
|
273
|
+
expect(changes[0][0]).to eq('-')
|
274
|
+
expect(changes[0][1]).to eq(doc.at('//p/text()'))
|
275
275
|
end
|
276
276
|
|
277
277
|
it "should determine only when elements are removed" do
|
278
278
|
changes = doc.at('div').diff(removed_element.at('div'), :removed => true).to_a
|
279
279
|
|
280
|
-
changes.length.
|
280
|
+
expect(changes.length).to eq(1)
|
281
281
|
|
282
|
-
changes[0][0].
|
283
|
-
changes[0][1].
|
282
|
+
expect(changes[0][0]).to eq('-')
|
283
|
+
expect(changes[0][1]).to eq(doc.at('//div/p'))
|
284
284
|
end
|
285
285
|
|
286
286
|
it "should determine only when attributes are removed" do
|
287
287
|
changes = added_attr.at('div').diff(removed_attr.at('div'), :removed => true).to_a
|
288
288
|
|
289
|
-
changes.length.
|
289
|
+
expect(changes.length).to eq(1)
|
290
290
|
|
291
|
-
changes[0][0].
|
292
|
-
changes[0][1].
|
291
|
+
expect(changes[0][0]).to eq('-')
|
292
|
+
expect(changes[0][1]).to eq(added_attr.at('//p/@id'))
|
293
293
|
end
|
294
294
|
end
|
295
295
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,102 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokogiri-diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Postmodern
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2024-01-25 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: tdiff
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: '0.
|
22
|
-
- - ! '>='
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: 0.3.2
|
19
|
+
version: '0.4'
|
25
20
|
type: :runtime
|
26
21
|
prerelease: false
|
27
22
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
23
|
requirements:
|
30
|
-
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '0.3'
|
33
|
-
- - ! '>='
|
24
|
+
- - "~>"
|
34
25
|
- !ruby/object:Gem::Version
|
35
|
-
version: 0.
|
26
|
+
version: '0.4'
|
36
27
|
- !ruby/object:Gem::Dependency
|
37
28
|
name: nokogiri
|
38
29
|
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
30
|
requirements:
|
41
|
-
- - ~>
|
31
|
+
- - "~>"
|
42
32
|
- !ruby/object:Gem::Version
|
43
33
|
version: '1.5'
|
44
34
|
type: :runtime
|
45
35
|
prerelease: false
|
46
36
|
version_requirements: !ruby/object:Gem::Requirement
|
47
|
-
none: false
|
48
37
|
requirements:
|
49
|
-
- - ~>
|
38
|
+
- - "~>"
|
50
39
|
- !ruby/object:Gem::Version
|
51
40
|
version: '1.5'
|
52
41
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
54
|
-
requirement: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
|
-
requirements:
|
57
|
-
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '0.1'
|
60
|
-
type: :development
|
61
|
-
prerelease: false
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
|
-
requirements:
|
65
|
-
- - ~>
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0.1'
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: rspec
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
|
-
requirements:
|
73
|
-
- - ~>
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '2.4'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
|
-
requirements:
|
81
|
-
- - ~>
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version: '2.4'
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: yard
|
42
|
+
name: bundler
|
86
43
|
requirement: !ruby/object:Gem::Requirement
|
87
|
-
none: false
|
88
44
|
requirements:
|
89
|
-
- - ~>
|
45
|
+
- - "~>"
|
90
46
|
- !ruby/object:Gem::Version
|
91
|
-
version: '0
|
47
|
+
version: '2.0'
|
92
48
|
type: :development
|
93
49
|
prerelease: false
|
94
50
|
version_requirements: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
51
|
requirements:
|
97
|
-
- - ~>
|
52
|
+
- - "~>"
|
98
53
|
- !ruby/object:Gem::Version
|
99
|
-
version: '0
|
54
|
+
version: '2.0'
|
100
55
|
description: Nokogiri::Diff adds the ability to calculate the differences (added or
|
101
56
|
removed nodes) between two XML/HTML documents.
|
102
57
|
email: postmodern.mod3@gmail.com
|
@@ -107,12 +62,13 @@ extra_rdoc_files:
|
|
107
62
|
- LICENSE.txt
|
108
63
|
- README.md
|
109
64
|
files:
|
110
|
-
- .document
|
111
|
-
- .
|
112
|
-
- .gitignore
|
113
|
-
- .rspec
|
114
|
-
- .yardopts
|
65
|
+
- ".document"
|
66
|
+
- ".github/workflows/ruby.yml"
|
67
|
+
- ".gitignore"
|
68
|
+
- ".rspec"
|
69
|
+
- ".yardopts"
|
115
70
|
- ChangeLog.md
|
71
|
+
- Gemfile
|
116
72
|
- LICENSE.txt
|
117
73
|
- README.md
|
118
74
|
- Rakefile
|
@@ -128,26 +84,24 @@ files:
|
|
128
84
|
homepage: https://github.com/postmodern/nokogiri-diff#readme
|
129
85
|
licenses:
|
130
86
|
- MIT
|
131
|
-
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
132
89
|
rdoc_options: []
|
133
90
|
require_paths:
|
134
91
|
- lib
|
135
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
-
none: false
|
137
93
|
requirements:
|
138
|
-
- -
|
94
|
+
- - ">="
|
139
95
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
96
|
+
version: 2.0.0
|
141
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
-
none: false
|
143
98
|
requirements:
|
144
|
-
- -
|
99
|
+
- - ">="
|
145
100
|
- !ruby/object:Gem::Version
|
146
101
|
version: '0'
|
147
102
|
requirements: []
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
specification_version: 3
|
103
|
+
rubygems_version: 3.4.10
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
152
106
|
summary: Calculate the differences between two XML/HTML documents.
|
153
107
|
test_files: []
|
data/.gemtest
DELETED
File without changes
|