optical_diff 0.0.2 → 0.0.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/README.md CHANGED
@@ -18,6 +18,8 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ ### Ignore specified html element by css selector or xpath
22
+
21
23
  ```ruby
22
24
  html1 = "<html><body>text</body></html>"
23
25
  html2 = "<html><body>text<p class = 'random_text'>qwerty</p></body></html>"
@@ -25,6 +27,17 @@ diff = OpticalDiff.diff(html1, html2, :ignore => 'p.random_text')
25
27
  diff.changed? #=> false
26
28
  ```
27
29
 
30
+ ### Replace text
31
+
32
+ ```ruby
33
+ html1 = "<html><body><a href='/link?abcde'>text</a></body></html>"
34
+ html2 = "<html><body><a href='/link?fghij'>text</a></body></html>"
35
+ diff = OpticalDiff.diff(html1, html2, :replace => [[/\?.+?'/, "'"]])
36
+ diff.changed? #=> false
37
+ ```
38
+
39
+ ``:replace`` is always processed before ``:ignore``
40
+
28
41
  ## Contributing
29
42
 
30
43
  1. Fork it
data/lib/optical_diff.rb CHANGED
@@ -6,14 +6,24 @@ class OpticalDiff
6
6
  class << self
7
7
  def diff(html1, html2, options = {})
8
8
  options = {
9
+ :replace => [],
9
10
  :ignore => []
10
11
  }.merge(options)
11
12
 
12
- parsed_htmls = [html1, html2].map {|html| Nokogiri::HTML.parse(html) }
13
+ replaced_htmls = [html1, html2].map {|html| replace(html, options[:replace]) }
14
+ parsed_htmls = replaced_htmls.map {|html| Nokogiri::HTML.parse(html) }
13
15
  stripped_htmls = parsed_htmls.map {|html| strip_ignore_elements(html, options[:ignore]) }
14
16
  DiffResult.new(Diffy::Diff.new(*stripped_htmls.map(&:to_html)))
15
17
  end
16
18
 
19
+ def replace(page, patterns = [])
20
+ page = page.dup
21
+ patterns.each do |pattern, replace|
22
+ page.gsub!(pattern, replace)
23
+ end
24
+ page
25
+ end
26
+
17
27
  def strip_ignore_elements(page, ignore = [])
18
28
  ignore.each do |selector|
19
29
  page.search(selector).remove
@@ -1,3 +1,3 @@
1
1
  class OpticalDiff
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -34,5 +34,25 @@ describe OpticalDiff do
34
34
  subject { OpticalDiff.diff(html1, html3, :ignore => ['.ignore', '//p[contains(text(), "xpath")]']) }
35
35
  it { should_not be_changed }
36
36
  end
37
+
38
+ context 'by regex filter' do
39
+ let(:html3) { "<html><body>abcde<p class='ignore'>ignore</p><p>xpath</p></body></html>" }
40
+ subject { OpticalDiff.diff(html1, html2, :filter => [/ignore/], :ignore => ['.ignore', '//p[contains(text(), "xpath")]']) }
41
+ it { should_not be_changed }
42
+ end
43
+ end
44
+
45
+ context 'replace' do
46
+ let(:html1) { "<html><body><a href='/link?efghi'>abcde</a>zzzzz</body></html>" }
47
+ let(:html2) { "<html><body><a href='/link?jklmn'>abcde</a>zzzzz</body></html>" }
48
+
49
+ subject { OpticalDiff.diff(html1, html2, :replace => [[/\?.+?'/, "'"], [/zzzzz/, '']]) }
50
+ it { should_not be_changed }
51
+
52
+ context 'with ignore option' do
53
+ let(:html3) { "<html><body><a href='/link?opqrs'>abcde</a><p class='ignore'>ignore</p><p>xpath</p></body></html>" }
54
+ subject { OpticalDiff.diff(html1, html3, :replace => [[/\?.+?'/, "'"], [/zzzzz/, '']], :ignore => ['.ignore', '//p[contains(text(), "xpath")]']) }
55
+ it { should_not be_changed }
56
+ end
37
57
  end
38
58
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optical_diff
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Yusuke Mito
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-09-12 00:00:00 Z
18
+ date: 2012-09-25 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: diffy