dom_glancy 1.0.1 → 1.1.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/Gemfile +4 -0
  4. data/README.md +5 -0
  5. data/app/controllers/dom_glancy_controller.rb +9 -12
  6. data/app/views/dom_glancy/about.html.erb +2 -2
  7. data/app/views/dom_glancy/path_config.html.erb +10 -8
  8. data/app/views/dom_glancy/show.html.erb +3 -18
  9. data/app/views/layouts/dom_glancy.html.erb +10 -19
  10. data/app/views/shared/_dom_glancy_nav.html.erb +1 -1
  11. data/app/views/shared/_dom_set.html.erb +17 -2
  12. data/lib/assets/javascripts/dom_glancy/dom_glancy.js +37 -0
  13. data/{app/assets/stylesheets → lib/assets/stylesheets/dom_glancy}/1236_grid.css +0 -0
  14. data/{app/assets/stylesheets → lib/assets/stylesheets/dom_glancy}/720_grid.css +0 -0
  15. data/{app/assets/stylesheets → lib/assets/stylesheets/dom_glancy}/986_grid.css +0 -0
  16. data/{app/assets/stylesheets → lib/assets/stylesheets/dom_glancy}/dom_glancy.css +35 -4
  17. data/{app/assets/stylesheets → lib/assets/stylesheets/dom_glancy}/normalize.css +0 -0
  18. data/lib/dom_glancy.rb +6 -2
  19. data/lib/dom_glancy/analysis_reporter.rb +39 -0
  20. data/lib/dom_glancy/analyzer.rb +139 -0
  21. data/lib/dom_glancy/change_anlyzer.rb +22 -0
  22. data/lib/dom_glancy/dom_glancy.rb +35 -83
  23. data/lib/dom_glancy/element.rb +63 -12
  24. data/lib/dom_glancy/file_name_builder.rb +21 -0
  25. data/lib/dom_glancy/map_file.rb +14 -0
  26. data/lib/dom_glancy/page_mapper.rb +81 -0
  27. data/lib/dom_glancy/svg.rb +41 -2
  28. data/lib/dom_glancy/version.rb +1 -1
  29. data/test/page_objects/dom_glancy/show_page.rb +6 -0
  30. data/test/selenium/mapping_test.rb +28 -5
  31. data/test/selenium/viewer_test.rb +2 -2
  32. data/test/selenium_test_helper.rb +26 -43
  33. data/test/test_app/app/assets/stylesheets/local_app.css +9 -1
  34. data/test/test_app/app/views/local/index.html.erb +11 -1
  35. data/test/test_helper.rb +7 -5
  36. data/test/test_helpers/artifacts_helpers.rb +54 -0
  37. data/test/test_helpers/location_helpers.rb +5 -3
  38. data/test/test_objects/options_file_1.yaml +2145 -0
  39. data/test/test_objects/options_file_2.yaml +2177 -0
  40. data/test/test_objects/test_objects.rb +57 -6
  41. data/test/unit/analysis_reporter_test.rb +28 -0
  42. data/test/unit/analyzer_test.rb +146 -0
  43. data/test/unit/change_analyzer_test.rb +72 -0
  44. data/test/unit/dom_glancy_test.rb +16 -11
  45. data/test/unit/element_test.rb +56 -0
  46. data/test/unit/file_name_builder_test.rb +28 -0
  47. data/test/unit/map_file_test.rb +47 -0
  48. data/test/unit/page_mapper_test.rb +27 -0
  49. data/test/unit/svg_test.rb +17 -0
  50. metadata +35 -13
  51. data/app/assets/javascripts/application.js +0 -7
  52. data/lib/dom_glancy/analysis.rb +0 -146
  53. data/lib/dom_glancy/locations.rb +0 -16
  54. data/test/unit/analysis_test.rb +0 -110
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4f6b85d8b3b3b443273ccd45b0d0ebc35ac1a49
4
- data.tar.gz: 0e8ad79d21beace912bc8a6a656ca5a064045c83
3
+ metadata.gz: 3cd48c0ea852b13728e2f1248f6cb2232afc45ca
4
+ data.tar.gz: 564fd88c6ae4c6c780f832d14d202c326c1e6af4
5
5
  SHA512:
6
- metadata.gz: 09c300f922d5983a387d2e5c68566b0e33c9596661b33f89c3c5ff4150b6975ca70e7a25554be56ddc21b935e78d45a2e0c4c79b4c3b0cf7bff6b7381695d018
7
- data.tar.gz: 9f315183d832157878c0456682275ea7f059f211463179abfad71e28e065e7cea9169e09836e0a2f2ecec370aa520b6637a21a5931b74dc6047d70cf735b7efc
6
+ metadata.gz: d3b6b032528da837084dfad7e96af8f0e9557689ea2e7583cedfa86fecbf985d7f9e40045ab2af231015a60013ea8131391e9061a6f9835a1ba11679686fa8be
7
+ data.tar.gz: 8b81bfd4998db70ef47f013bbc59572c1c2c84b133db866ebde600b264dfd2ca3bbd617be5a39091f1ba480da41bfefbbb75ddc91d82c83498cda466a16f80e0
@@ -1,9 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - "1.9.3"
4
- - "2.0.0"
5
- - "2.1.0"
6
4
  - "2.1.2"
5
+ - "2.1.5"
7
6
  before_script:
8
7
  - export DISPLAY=:99.0
9
8
  - sh -e /etc/init.d/xvfb start
@@ -11,3 +10,5 @@ script:
11
10
  - bundle exec rake
12
11
  addons:
13
12
  firefox: "31.0"
13
+ code_climate:
14
+ repo_token: 83887755db231f4c094598500eb6044a9cc4cd0e3993fa5af7d705a6b64cfb2a
data/Gemfile CHANGED
@@ -13,3 +13,7 @@ gem 'mocha'
13
13
  gem 'selenium-webdriver', '2.44.0'
14
14
  gem 'capybara', '2.2.1'
15
15
  gem 'ae_page_objects', '1.3.0'
16
+
17
+ group :test do
18
+ gem 'codeclimate-test-reporter', require: nil
19
+ end
data/README.md CHANGED
@@ -8,6 +8,11 @@ _you know. like taking a quick glance at the DOM, but make it sound kinda like T
8
8
 
9
9
  [![Build Status](https://travis-ci.org/QuantumGeordie/dom_glancy.svg?branch=master)](https://travis-ci.org/QuantumGeordie/dom_glancy)
10
10
 
11
+ ## Code Climate
12
+
13
+ [![Code Climate](https://codeclimate.com/github/QuantumGeordie/dom_glancy/badges/gpa.svg)](https://codeclimate.com/github/QuantumGeordie/dom_glancy)
14
+ [![Test Coverage](https://codeclimate.com/github/QuantumGeordie/dom_glancy/badges/coverage.svg)](https://codeclimate.com/github/QuantumGeordie/dom_glancy)
15
+
11
16
  ## Installation
12
17
 
13
18
  Add this line to your application's Gemfile in the test and development groups:
@@ -34,8 +34,9 @@ class DomGlancyController < DomGlancyApplicationController
34
34
 
35
35
  def make_master
36
36
  test_root = params[:file]
37
- src = DomGlancy::DomGlancy.current_filename(test_root)
38
- dst = DomGlancy::DomGlancy.master_filename(test_root)
37
+ fnb = DomGlancy::FileNameBuilder.new(test_root)
38
+ src = fnb.current
39
+ dst = fnb.master
39
40
  FileUtils.cp src, dst
40
41
 
41
42
  redirect_to '/dom_glancy/new'
@@ -43,7 +44,8 @@ class DomGlancyController < DomGlancyApplicationController
43
44
 
44
45
  def delete_current
45
46
  test_root = params[:file]
46
- src = DomGlancy::DomGlancy.current_filename(test_root)
47
+ fnb = DomGlancy::FileNameBuilder.new(test_root)
48
+ src = fnb.current
47
49
  FileUtils.rm_rf src
48
50
 
49
51
  redirect_to '/dom_glancy/new'
@@ -74,12 +76,6 @@ class DomGlancyController < DomGlancyApplicationController
74
76
  redirect_to dom_glancy_path
75
77
  end
76
78
 
77
- def about
78
- about_file = File.expand_path('../../../README.md', __FILE__)
79
- raw = File.read(about_file)
80
- @about = Kramdown::Document.new(raw).to_html
81
- end
82
-
83
79
  def clear
84
80
  Dir[File.join(DomGlancy.configuration.diff_file_location, '*.yaml'), File.join(DomGlancy.configuration.diff_file_location, '*.html')].each { |f| FileUtils.rm_rf(f) }
85
81
  Dir[File.join(DomGlancy.configuration.current_file_location, '*.yaml')].each { |f| FileUtils.rm_rf(f) }
@@ -92,14 +88,15 @@ class DomGlancyController < DomGlancyApplicationController
92
88
 
93
89
  blessings.each do |blessing|
94
90
  base_test_name = blessing
91
+ fnb = DomGlancy::FileNameBuilder.new(base_test_name)
95
92
 
96
- src_yaml = DomGlancy::DomGlancy.current_filename(base_test_name)
97
- dst_yaml = DomGlancy::DomGlancy.master_filename(base_test_name)
93
+ src_yaml = fnb.current
94
+ dst_yaml = fnb.master
98
95
 
99
96
  FileUtils.cp src_yaml, dst_yaml if File.exist?(src_yaml)
100
97
 
101
98
  if params['delete_on_bless'] == 'true'
102
- files_to_remove = [DomGlancy::DomGlancy.diff_filename(base_test_name)]
99
+ files_to_remove = [fnb.diff]
103
100
  files_to_remove << File.join(DomGlancy.configuration.diff_file_location, blessing + '__current_not_master__diff.yaml')
104
101
  files_to_remove << File.join(DomGlancy.configuration.diff_file_location, blessing + '__master_not_current__diff.yaml')
105
102
  files_to_remove << File.join(DomGlancy.configuration.diff_file_location, blessing + '__changed_master__diff.yaml')
@@ -1,3 +1,3 @@
1
1
  <div class="row kr--about">
2
- <%= @about.html_safe %>
3
- </div>
2
+ <p>Info about Dom Glancy can be found <a href="https://github.com/QuantumGeordie/dom_glancy" class="kr">here</a> and <a href="http://quantumgeordie.github.io/dom_glancy/" class="kr">here</a>. Check it out.</p>
3
+ </div>
@@ -1,8 +1,10 @@
1
- <h2>Path Configuration</h2>
2
- <table class="kr">
3
- <tbody>
4
- <tr><th>master</th><td id="js-config_master"><%= DomGlancy.configuration.master_file_location %></td></tr>
5
- <tr><th>current</th><td id="js-config_current"><%= DomGlancy.configuration.current_file_location %></td></tr>
6
- <tr><th>diff</th><td id="js-config_diffs"><%= DomGlancy.configuration.diff_file_location %></td></tr>
7
- </tbody>
8
- </table>
1
+ <div class="kr--about">
2
+ <h2>Path Configuration</h2>
3
+ <table class="kr">
4
+ <tbody>
5
+ <tr><th>master</th><td id="js-config_master"><%= DomGlancy.configuration.master_file_location %></td></tr>
6
+ <tr><th>current</th><td id="js-config_current"><%= DomGlancy.configuration.current_file_location %></td></tr>
7
+ <tr><th>diff</th><td id="js-config_diffs"><%= DomGlancy.configuration.diff_file_location %></td></tr>
8
+ </tbody>
9
+ </table>
10
+ </div>
@@ -11,32 +11,17 @@
11
11
  <%= raw(contents) %>
12
12
  </td>
13
13
  <td>
14
- <h2>in current dom, not master</h2>
15
14
  <% elements = YAML::load_file(File.join(DomGlancy.configuration.diff_file_location, @file_set_not_master)) %>
15
+ <h2><span class="hideable" id="not_master_toggle">+</span> Not in Master [<%= elements.count %>]</h2>
16
16
  <%= render :partial => "shared/dom_set", :locals => {:elements => elements, :finder_id => 'js--not_master'} %>
17
17
 
18
- <h2>in master dom, not current</h2>
19
18
  <% elements = YAML::load_file(File.join(DomGlancy.configuration.diff_file_location, @file_set_not_current)) %>
19
+ <h2><span class="hideable" id="not_current_toggle">+</span> Not in Current [<%= elements.count %>]</h2>
20
20
  <%= render :partial => "shared/dom_set", :locals => {:elements => elements, :finder_id => 'js--not_current'} %>
21
21
 
22
- <h2>changed</h2>
23
22
  <% elements = YAML::load_file(File.join(DomGlancy.configuration.diff_file_location, @file_set_changed)) %>
23
+ <h2><span class="hideable" id="changed_toggle">+</span> Changed [<%= elements.count %>]</h2>
24
24
  <%= render :partial => "shared/dom_set", :locals => {:elements => elements, :finder_id => 'js--changed'} %>
25
-
26
25
  </td>
27
26
  </tr>
28
27
  </table>
29
-
30
- <script type="text/javascript">
31
- highlightElement = function(element_id) {
32
- var elements = document.getElementsByTagName('rect');
33
- var element = null;
34
- var length = elements.length;
35
-
36
- for (var i = 0; i < length; i++) {
37
- elements[i].setAttribute("stroke-width", "1");
38
- }
39
- var this_element = document.getElementById(element_id);
40
- this_element.setAttribute("stroke-width", "5");
41
- }
42
- </script>
@@ -3,30 +3,21 @@
3
3
  <head>
4
4
  <title>DOM Glancy</title>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
6
- <%= javascript_include_tag 'application'
7
- %>
8
- <%= stylesheet_link_tag 'normalize.css', :media => 'all' %>
9
- <%= stylesheet_link_tag '720_grid.css', :media => 'screen and (min-width: 720px)' %>
10
- <%= stylesheet_link_tag '986_grid.css', :media => 'screen and (min-width: 986px)' %>
11
- <%= stylesheet_link_tag '1236_grid.css', :media => 'screen and (min-width: 1236px)' %>
12
- <%= stylesheet_link_tag 'dom_glancy', :media => 'all' %>
6
+ <%= stylesheet_link_tag 'dom_glancy/normalize.css', :media => 'all' %>
7
+ <%= stylesheet_link_tag 'dom_glancy/720_grid.css', :media => 'screen and (min-width: 720px)' %>
8
+ <%= stylesheet_link_tag 'dom_glancy/986_grid.css', :media => 'screen and (min-width: 986px)' %>
9
+ <%= stylesheet_link_tag 'dom_glancy/1236_grid.css', :media => 'screen and (min-width: 1236px)' %>
10
+ <%= stylesheet_link_tag 'dom_glancy/dom_glancy', :media => 'all' %>
13
11
 
14
12
  <%= csrf_meta_tags %>
15
13
  </head>
16
14
  <body>
17
- <div class="grid grid_top">
18
- <div class="row">
19
- <h1>DOM Glancy</h1>
20
- </div>
21
- <div class="row">
22
- <h2 class="caramel"><%= @parent_application_name %> {<span id="js-kr--gem_rev"><%= @gem_version %></span>}</h2>
23
- </div>
15
+ <h1>DOM Glancy</h1>
16
+ <h2 class="caramel"><%= @parent_application_name %> {<span id="js-kr--gem_rev"><%= @gem_version %></span>}</h2>
24
17
 
25
- <%= render :partial => 'shared/dom_glancy_nav' %>
18
+ <%= render :partial => 'shared/dom_glancy_nav' %>
26
19
 
27
- <div class="row">
28
- <%= yield %>
29
- </div>
30
- </div>
20
+ <%= yield %>
21
+ <%= javascript_include_tag 'dom_glancy/dom_glancy' %>
31
22
  </body>
32
23
  </html>
@@ -1,4 +1,4 @@
1
- <div class="row" id="js-kr--nav"></a>
1
+ <div class="row" id="js-kr--nav">
2
2
  <a href="/dom_glancy/" class="kr"><div class="slot-0 kr--nav">home</div></a>
3
3
  <a href="/dom_glancy/new" class="kr"><div class="slot-1 kr--nav">new</div></a>
4
4
  <!--<a href="/dom_glancy/artifacts" class="kr"><div class="slot-2 kr--nav">artifacts</div></a>-->
@@ -1,4 +1,4 @@
1
- <div id="<%= finder_id %>">
1
+ <div id="<%= finder_id %>" class="hide">
2
2
  <% if elements.length > 0 %>
3
3
  <table class='kr--dom'>
4
4
  <thead>
@@ -11,12 +11,24 @@
11
11
  <th>width</th>
12
12
  <th>height</th>
13
13
  <th>visible</th>
14
+ <% if finder_id == 'js--changed' %>
15
+ <th>was</th>
16
+ <% end %>
14
17
  </tr>
15
18
  </thead>
16
19
  <tbody>
17
20
  <% reset_cycle %>
18
21
  <% elements.each do |element| %>
19
22
  <tr onclick="highlightElement(<%= element[:js_id] %>);" class="<%= cycle("kr-dom_row_odd", "kr-dom_row_even") %>">
23
+ <% was_element = element['was'] %>
24
+ <% changed = [] %>
25
+ <% if was_element %>
26
+ <% changed << "height: #{was_element['height']}" unless element['height'] == was_element['height'] %>
27
+ <% changed << "width: #{was_element['width']}" unless element['width'] == was_element['width'] %>
28
+ <% changed << "top: #{was_element['top']}" unless element['top'] == was_element['top'] %>
29
+ <% changed << "left: #{was_element['left']}" unless element['left'] == was_element['left'] %>
30
+ <% changed << "class: #{was_element['class']}" unless element['class'] == was_element['class'] %>
31
+ <% end %>
20
32
  <td><%= element['tag'] %></td>
21
33
  <td><%= element['id'] %></td>
22
34
  <td><%= element['class'] %></td>
@@ -25,6 +37,9 @@
25
37
  <td><%= element['width'] %></td>
26
38
  <td><%= element['height'] %></td>
27
39
  <td><%= element['visible'] %></td>
40
+ <% if was_element %>
41
+ <td><%= changed.join(', ') %></td>
42
+ <% end %>
28
43
  </tr>
29
44
  <% end %>
30
45
  </tbody>
@@ -32,4 +47,4 @@
32
47
  <% else %>
33
48
  <p>no elements found.</p>
34
49
  <% end %>
35
- </div>
50
+ </div>
@@ -0,0 +1,37 @@
1
+ function checkByParent(aId, aChecked) {
2
+ var collection = document.getElementById(aId).getElementsByTagName('INPUT');
3
+ for (var x=0; x<collection.length; x++) {
4
+ if (collection[x].type.toUpperCase() === 'CHECKBOX')
5
+ collection[x].checked = aChecked;
6
+ }
7
+ }
8
+
9
+ function toggleDetailSection(section_id, event) {
10
+ var section = document.getElementById(section_id);
11
+ var classes = section.classList;
12
+ if(classes.contains("hide"))
13
+ {
14
+ classes.remove("hide");
15
+ event.currentTarget.innerHTML = '-';
16
+ }else
17
+ {
18
+ classes.add("hide");
19
+ event.currentTarget.innerHTML = '+';
20
+ }
21
+ }
22
+
23
+ function highlightElement (element_id) {
24
+ var elements = document.getElementsByTagName('rect');
25
+ var element = null;
26
+ var length = elements.length;
27
+
28
+ for (var i = 0; i < length; i++) {
29
+ elements[i].setAttribute("stroke-width", "1");
30
+ }
31
+ var this_element = document.getElementById(element_id);
32
+ this_element.setAttribute("stroke-width", "5");
33
+ }
34
+
35
+ document.getElementById("changed_toggle").addEventListener("click", function(e) { toggleDetailSection('js--changed', e) });
36
+ document.getElementById("not_master_toggle").addEventListener("click", function(e) { toggleDetailSection('js--not_master', e) });
37
+ document.getElementById("not_current_toggle").addEventListener("click", function(e) { toggleDetailSection('js--not_current', e) });
@@ -27,9 +27,11 @@ html {
27
27
  body {
28
28
  background-color: #FFFBF5;
29
29
  color: #2A2111;
30
- margin-top: 0px;
30
+ margin: 0 0 0 20px;
31
31
  }
32
32
 
33
+ p { max-width: 960px; }
34
+
33
35
  a.kr:link { text-decoration:none; color: #A3906D; }
34
36
  a.kr:visited { text-decoration:none; color: #A3906D; }
35
37
  a.kr:hover { text-decoration:none; color: #956C1F; }
@@ -102,15 +104,14 @@ a.kr:active { text-decoration:none; color: #A3906D; }
102
104
  width: auto;
103
105
  min-width: 0;
104
106
  padding: 4px 4px 4px 4px;
105
-
106
107
  }
107
108
 
108
109
  .kr-dom_row_odd {
109
- background-color: #A3906D;
110
+ background-color: #ffffff;
110
111
  }
111
112
 
112
113
  .kr-dom_row_even {
113
- background-color: transparent;
114
+ background-color: #FFFBF5;
114
115
  }
115
116
 
116
117
  .kr--svg_rect_highlight {
@@ -119,6 +120,7 @@ a.kr:active { text-decoration:none; color: #A3906D; }
119
120
 
120
121
  .kr--about {
121
122
  margin-top: 30px;
123
+ margin-left: 30px;
122
124
  padding: 35px;
123
125
  color: #2A2111;
124
126
  background-color: #fff;
@@ -126,6 +128,7 @@ a.kr:active { text-decoration:none; color: #A3906D; }
126
128
  -moz-border-radius: 20px;
127
129
  -webkit-border-radius: 20px;
128
130
  border-radius: 10px; /* future proofing */
131
+ max-width: 960px;
129
132
  }
130
133
 
131
134
  .kr--artifacts td {
@@ -147,3 +150,31 @@ a.kr:active { text-decoration:none; color: #A3906D; }
147
150
  border-radius: 5px;
148
151
  font-size: 75%;
149
152
  }
153
+
154
+ .hide { display: none; }
155
+ .hideable {
156
+ color: #956C1F;
157
+ cursor: pointer;
158
+ }
159
+
160
+ /* tab list */
161
+ ul.tab_list {
162
+ float: left;
163
+ width: 100%;
164
+ padding: 0;
165
+ margin: 0;
166
+ list-style-type: none;
167
+ }
168
+
169
+ li.tab {
170
+ display: inline;
171
+ background-color: transparent;
172
+ font-size: 2em;
173
+ padding: 0 2em 0 2em;
174
+ }
175
+
176
+ .tab_active {
177
+ color: #956C1F;
178
+ background-color: #FFFBF5;
179
+ border-bottom: 4px solid #956C1F;
180
+ }
@@ -5,7 +5,11 @@ require 'dom_glancy/engine' if defined?(Rails)
5
5
  require 'dom_glancy/dom_glancy'
6
6
  require 'dom_glancy/version'
7
7
  require 'dom_glancy/element'
8
- require 'dom_glancy/analysis'
9
- require 'dom_glancy/locations'
8
+ require 'dom_glancy/analyzer'
9
+ require 'dom_glancy/file_name_builder'
10
10
  require 'dom_glancy/svg'
11
11
  require 'dom_glancy/configuration'
12
+ require 'dom_glancy/page_mapper'
13
+ require 'dom_glancy/map_file'
14
+ require 'dom_glancy/analysis_reporter'
15
+ require 'dom_glancy/change_anlyzer'
@@ -0,0 +1,39 @@
1
+ module DomGlancy
2
+ class AnalysisReporter
3
+ @test_root
4
+ @set_current_not_master
5
+ @set_master_not_current
6
+ @set_changed_master
7
+ @changed_pairs
8
+
9
+ def initialize(test_root, set_current_not_master,set_master_not_current, set_changed_master, changed_pairs)
10
+ @test_root = test_root
11
+ @set_current_not_master = set_current_not_master
12
+ @set_master_not_current = set_master_not_current
13
+ @set_changed_master = set_changed_master
14
+ @changed_pairs = changed_pairs
15
+ end
16
+
17
+ def create_diff_file
18
+ filename = ::DomGlancy::FileNameBuilder.new(@test_root).diff
19
+ svg = make_svg
20
+ File.open(filename, 'w') { |file| file.write(svg) }
21
+ save_set_info('current_not_master', @set_current_not_master)
22
+ save_set_info('master_not_current', @set_master_not_current)
23
+ save_set_info('changed_master', @set_changed_master)
24
+ save_set_info('changed_pairs', @changed_pairs)
25
+ end
26
+
27
+ private
28
+
29
+ def make_svg
30
+ svg = ::DomGlancy::SVG.new(@set_current_not_master, @set_master_not_current, @set_changed_master)
31
+ svg.generate_svg
32
+ end
33
+
34
+ def save_set_info(suffix, data_set)
35
+ filename = File.join(::DomGlancy.configuration.diff_file_location, "#{@test_root}__#{suffix}__diff.yaml")
36
+ File.open(filename, 'w') { |file| file.write(data_set.to_a.to_yaml) }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,139 @@
1
+ module DomGlancy
2
+ class Analyzer
3
+ attr_reader :set_current_not_master
4
+ attr_reader :set_master_not_current
5
+ attr_reader :set_changed_master
6
+ attr_reader :changed_element_pairs
7
+
8
+ @master_data
9
+ @current_data
10
+ @test_root
11
+
12
+ def initialize(master_data, current_data, test_root = nil)
13
+ @master_data = master_data
14
+ @current_data = current_data
15
+ @test_root = test_root
16
+ end
17
+
18
+ def analyze
19
+ clear_results
20
+
21
+ if missing_elements? || extra_elements?
22
+ remove_similar_elements
23
+ extract_changed_elements
24
+ end
25
+
26
+ # create_diff_file if @test_root && !all_same?
27
+ compile_results
28
+ end
29
+
30
+ private
31
+
32
+ def clear_results
33
+ master_set = @master_data.to_set
34
+ current_set = @current_data.to_set
35
+
36
+ @set_current_not_master = current_set - master_set
37
+ @set_master_not_current = master_set - current_set
38
+ @set_changed_master = Set.new
39
+
40
+ @changed_element_pairs = []
41
+ end
42
+
43
+ def compile_results
44
+ {
45
+ not_in_master: @set_current_not_master,
46
+ not_in_current: @set_master_not_current,
47
+ changed_element_pairs: @changed_element_pairs,
48
+ changed_master: @set_changed_master,
49
+ test_root: @test_root,
50
+ same: all_same?
51
+ }
52
+ end
53
+
54
+ def all_same?
55
+ @set_current_not_master.count == 0 && @set_master_not_current.count == 0 && @changed_element_pairs.count == 0
56
+ end
57
+
58
+ def missing_elements?
59
+ @set_master_not_current.count > 0
60
+ end
61
+
62
+ def extra_elements?
63
+ @set_current_not_master.count > 0
64
+ end
65
+
66
+ def remove_similar_elements
67
+ ok_pairs = similar_pairs(@set_current_not_master, @set_master_not_current)
68
+
69
+ ok_pairs.each do |item1, item2|
70
+ @set_current_not_master.delete(item1)
71
+ @set_master_not_current.delete(item2)
72
+ end
73
+ end
74
+
75
+ def extract_changed_elements
76
+ @changed_element_pairs = []
77
+
78
+ @set_current_not_master.each do |item1| # in current
79
+ element1 = DOMElement.new(item1)
80
+ changed_elements = []
81
+ @set_master_not_current.each do |item2| # in master
82
+ element2 = DOMElement.new(item2)
83
+ if element1.same_element?(element2)
84
+ changed_elements << element2
85
+ end
86
+ end
87
+
88
+ least_changed = changed_elements[0]
89
+ changed_elements.each do |element|
90
+ change_analyzer = ChangeAnalyzer.new
91
+ least_changed = element if change_analyzer.compare(element1, element) < change_analyzer.compare(element1, least_changed)
92
+ end
93
+
94
+ @changed_element_pairs << [item1, least_changed.to_hash] if least_changed
95
+ end
96
+
97
+ remove_elements_from_data_sets @changed_element_pairs
98
+
99
+ @changed_element_pairs.select!{ |pair| !DOMElement.new(add_similarity(pair[0])).close_enough?(DOMElement.new(add_similarity(pair[1]))) }
100
+
101
+ @changed_element_pairs.each do |pair|
102
+ current_element = pair[0].dup
103
+ master_element = pair[1].dup
104
+ current_element['was'] = master_element
105
+ @set_changed_master.add(current_element)
106
+ end
107
+ end
108
+
109
+ def remove_elements_from_data_sets(element_pairs)
110
+ element_pairs.each do |element_1, element_2|
111
+ remove_element_from_data_sets element_1
112
+ remove_element_from_data_sets element_2
113
+ end
114
+ end
115
+
116
+ def remove_element_from_data_sets(element)
117
+ @set_current_not_master.delete element
118
+ @set_master_not_current.delete element
119
+ end
120
+
121
+ def similar_pairs(set1, set2)
122
+ ok_pairs = []
123
+ set1.each do |item1|
124
+ element1 = DOMElement.new(add_similarity(item1))
125
+ set2.each do |item2|
126
+ element2 = DOMElement.new(add_similarity(item2))
127
+ if element1.same_element?(element2) && element1.close_enough?(element2)
128
+ ok_pairs << [item1, item2]
129
+ end
130
+ end
131
+ end
132
+ ok_pairs
133
+ end
134
+
135
+ def add_similarity(element)
136
+ element.merge('similarity' => ::DomGlancy.configuration.similarity)
137
+ end
138
+ end
139
+ end