reverse_coverage 0.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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +56 -0
  3. data/.rubocop.yml +19 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE +21 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +70 -0
  8. data/Rakefile +23 -0
  9. data/lib/reverse_coverage.rb +9 -0
  10. data/lib/reverse_coverage/formatters/html/assets/javascripts/application.js +204 -0
  11. data/lib/reverse_coverage/formatters/html/assets/javascripts/libraries/jquery-1.6.2.min.js +18 -0
  12. data/lib/reverse_coverage/formatters/html/assets/javascripts/plugins/highlight.pack.js +1 -0
  13. data/lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.colorbox.js +1090 -0
  14. data/lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.dataTables.min.js +152 -0
  15. data/lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.timeago.js +141 -0
  16. data/lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.url.js +174 -0
  17. data/lib/reverse_coverage/formatters/html/assets/javascripts/settings.js +1 -0
  18. data/lib/reverse_coverage/formatters/html/assets/javascripts/treeview.js +261 -0
  19. data/lib/reverse_coverage/formatters/html/assets/stylesheets/application.css +4 -0
  20. data/lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/highlight.css +129 -0
  21. data/lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/jquery-ui-1.8.4.custom.css +295 -0
  22. data/lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/jquery.colorbox.css +52 -0
  23. data/lib/reverse_coverage/formatters/html/assets/stylesheets/reset.css +103 -0
  24. data/lib/reverse_coverage/formatters/html/assets/stylesheets/screen.css.sass +249 -0
  25. data/lib/reverse_coverage/formatters/html/assets/stylesheets/treeview.css +12 -0
  26. data/lib/reverse_coverage/formatters/html/formatter.rb +141 -0
  27. data/lib/reverse_coverage/formatters/html/public/application.css +841 -0
  28. data/lib/reverse_coverage/formatters/html/public/application.js +2045 -0
  29. data/lib/reverse_coverage/formatters/html/public/colorbox/border.png +0 -0
  30. data/lib/reverse_coverage/formatters/html/public/colorbox/controls.png +0 -0
  31. data/lib/reverse_coverage/formatters/html/public/colorbox/loading.gif +0 -0
  32. data/lib/reverse_coverage/formatters/html/public/colorbox/loading_background.png +0 -0
  33. data/lib/reverse_coverage/formatters/html/public/favicon.png +0 -0
  34. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  35. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  36. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  37. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  38. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  39. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  40. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  41. data/lib/reverse_coverage/formatters/html/public/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  42. data/lib/reverse_coverage/formatters/html/public/images/ui-icons_222222_256x240.png +0 -0
  43. data/lib/reverse_coverage/formatters/html/public/images/ui-icons_2e83ff_256x240.png +0 -0
  44. data/lib/reverse_coverage/formatters/html/public/images/ui-icons_454545_256x240.png +0 -0
  45. data/lib/reverse_coverage/formatters/html/public/images/ui-icons_888888_256x240.png +0 -0
  46. data/lib/reverse_coverage/formatters/html/public/images/ui-icons_cd0a0a_256x240.png +0 -0
  47. data/lib/reverse_coverage/formatters/html/public/loading.gif +0 -0
  48. data/lib/reverse_coverage/formatters/html/public/magnify.png +0 -0
  49. data/lib/reverse_coverage/formatters/html/public/settings.js +2 -0
  50. data/lib/reverse_coverage/formatters/html/views/file_list.erb +24 -0
  51. data/lib/reverse_coverage/formatters/html/views/layout.erb +39 -0
  52. data/lib/reverse_coverage/formatters/html/views/source_file.erb +24 -0
  53. data/lib/reverse_coverage/main.rb +107 -0
  54. data/lib/reverse_coverage/version.rb +5 -0
  55. data/reverse_coverage.gemspec +36 -0
  56. metadata +240 -0
@@ -0,0 +1,2 @@
1
+ window.base_url='../'
2
+ ;
@@ -0,0 +1,24 @@
1
+ <div class="file_list_container" id="<%= title_id %>">
2
+ <h2>
3
+ <span class="group_name"><%= title %></span>
4
+ </h2>
5
+ <a name="<%= title_id %>"></a>
6
+ <table class="file_list">
7
+ <thead>
8
+ <tr>
9
+ <th>File name</th>
10
+ <th>Lines covered</th>
11
+ <th>Lines examples</th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% source_files.each do |source_file| %>
16
+ <tr>
17
+ <td class="strong"><%= link_to_source_file(source_file) %></td>
18
+ <td><%= source_file[1].count %></td>
19
+ <td><%= source_file[1].inject(0) { |old, val| old += val.count } %></td>
20
+ </tr>
21
+ <% end %>
22
+ </tbody>
23
+ </table>
24
+ </div>
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>Code coverage for </title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='<%= assets_path('application.js') %>' type='text/javascript'></script>
7
+ <script src='<%= assets_path('settings.js') %>' type='text/javascript'></script>
8
+ <link href='<%= assets_path('application.css') %>' media='screen, projection, print' rel='stylesheet' type='text/css'>
9
+ <link rel="icon" type="image/png" href="<%= assets_path('favicon.png') %>" />
10
+
11
+ <script>
12
+ window.examples = <%= result.flat_map { |_file_path, obj| obj.flat_map { |_line, examples| examples.map { |example| [example[:example_ref].to_s, example] } } }.to_h.to_json %>
13
+ </script>
14
+ </head>
15
+
16
+ <body>
17
+ <div id="loading">
18
+ <img src="<%= assets_path('loading.gif') %>" alt="loading"/>
19
+ </div>
20
+ <div id="wrapper" style="display:none;">
21
+ <div class="timestamp">Generated <%= timeago(Time.now) %></div>
22
+ <ul class="group_tabs"></ul>
23
+
24
+ <div id="content">
25
+ <%= formatted_file_list("All Files", result) %>
26
+
27
+ <% grouped(result).each do |name, files| %>
28
+ <%= formatted_file_list(name, files) %>
29
+ <% end %>
30
+ </div>
31
+
32
+ <div class="source_files">
33
+ <% result.each do |source_file| %>
34
+ <%= formatted_source_file(source_file) %>
35
+ <% end %>
36
+ </div>
37
+ </div>
38
+ </body>
39
+ </html>
@@ -0,0 +1,24 @@
1
+ <% result_data = source_file[1].sort_by { |k, v| k }.to_h %>
2
+ <% lines = result_data.keys %>
3
+ <div class="source_table" id="<%= id source_file %>">
4
+ <div class="header">
5
+ <h3><%= shortened_filename source_file %></h3>
6
+ <h4><%= lines.count %> covered lines</h4>
7
+ </div>
8
+
9
+ <pre>
10
+ <ol>
11
+ <% readfile(source_file).each_with_index do |line, line_number| %>
12
+ <% covered = lines.include?(line_number) %>
13
+ <% attrs = covered ? " class=\"covered\" title=\"#{result_data[line_number].count} examples\"" : ' class="never"' %>
14
+ <li data-linenumber="<%= line_number %>"<%= attrs %>>
15
+ <code class="ruby"><%= CGI.escapeHTML(line.chomp) %></code>
16
+ <% if covered %>
17
+ <% example_refs = result_data[line_number].map {|e| e[:example_ref] } %>
18
+ <div class="reverse_coverage" data-example-refs="<%= example_refs.join(',') %>"></div>
19
+ <% end %>
20
+ </li>
21
+ <% end %>
22
+ </ol>
23
+ </pre>
24
+ </div>
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ Coverage.start
4
+
5
+ module ReverseCoverage
6
+ class Main
7
+ include Singleton
8
+
9
+ attr_reader :coverage_matrix
10
+ attr_accessor :config, :output_path
11
+
12
+ def initialize
13
+ @config = {
14
+ file_filter: ->(file_path) { file_of_project?(file_path) }
15
+ }
16
+ @output_path = 'tmp'
17
+ end
18
+
19
+ def add(example)
20
+ coverage_result = Coverage.peek_result
21
+ example_data = slice_attributes(example.metadata, *example_attributes)
22
+ example_data[:example_ref] = example_data.hash
23
+ current_state = select_project_files(coverage_result)
24
+ all_changed_files = changed_lines(@last_state, current_state)
25
+
26
+ changes = {}
27
+
28
+ all_changed_files.each do |file_path, lines|
29
+ lines.each_with_index do |changed, line_index|
30
+ next if changed.nil? || changed.zero?
31
+
32
+ file_info = { file_path: file_path, line_index: line_index }
33
+
34
+ save_changes(changes, example_data, file_info)
35
+ save_changes(coverage_matrix, example_data, file_info)
36
+ end
37
+ end
38
+
39
+ reset_last_state
40
+ changes
41
+ end
42
+
43
+ def reset_last_state(result = Coverage.peek_result)
44
+ @last_state = select_project_files(result)
45
+ end
46
+
47
+ def start
48
+ @coverage_matrix = {}
49
+ reset_last_state
50
+ end
51
+
52
+ def save_results(file_name: 'reverse_coverage.yml')
53
+ result_and_stop_coverage
54
+ path = File.join(output_path, file_name)
55
+ FileUtils.mkdir_p(output_path)
56
+
57
+ File.open(path, 'w') do |f|
58
+ results = @coverage_matrix.sort.map { |k, v| [k, v.sort.to_h] }.to_h
59
+ f.write results.to_yaml
60
+ end
61
+ end
62
+
63
+ def result_and_stop_coverage
64
+ Coverage.result
65
+ end
66
+
67
+ class << self
68
+ def method_missing(method, *args, &block)
69
+ instance.respond_to?(method) ? instance.send(method, *args, &block) : super
70
+ end
71
+
72
+ def respond_to_missing?(method, include_private = false)
73
+ instance.respond_to?(method) || super
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def save_changes(hash, example_data, file_path:, line_index:)
80
+ hash[file_path] ||= {}
81
+ hash[file_path][line_index] ||= []
82
+ hash[file_path][line_index] << example_data
83
+ end
84
+
85
+ def slice_attributes(hash, *keys)
86
+ keys.each_with_object({}) { |k, new_hash| new_hash[k] = hash[k] if hash.key?(k) }
87
+ end
88
+
89
+ def changed_lines(prev_state, current_state)
90
+ prev_state.merge(current_state) do |_file_path, prev_line, current_line|
91
+ prev_line.zip(current_line).map { |values| values[0] == values[1] ? nil : (values[1] - values[0]) }
92
+ end
93
+ end
94
+
95
+ def example_attributes
96
+ %I[description full_description file_path line_number scoped_id type]
97
+ end
98
+
99
+ def select_project_files(coverage_result)
100
+ coverage_result.select { |file_path, _lines| @config[:file_filter].call(file_path) }
101
+ end
102
+
103
+ def file_of_project?(file_path)
104
+ file_path.start_with?(Dir.pwd) && !file_path.start_with?(Dir.pwd + '/spec')
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseCoverage
4
+ VERSION = '0.1.0'.freeze
5
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'reverse_coverage/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'reverse_coverage'
10
+ spec.version = ReverseCoverage::VERSION
11
+ spec.summary = 'Reverse coverage'
12
+ spec.description = 'Statistics on specs coverage'
13
+ spec.license = 'MIT'
14
+ spec.authors = ['Daniele Palombo', 'Mattia Roccoberton']
15
+ spec.email = ['danielepalombo@nebulab.it', 'mattiaroccoberton@nebulab.it']
16
+ spec.homepage = 'https://github.com/nebulab/reverse_coverage'
17
+
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|extra)/}) }
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_runtime_dependency 'rspec', '~> 3.8'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 2.0'
28
+ spec.add_development_dependency 'pry', '~> 0.12.2'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.0'
31
+ spec.add_development_dependency 'rubocop', '~> 0.67.2'
32
+ spec.add_development_dependency 'rubocop-performance', '~> 1.1.0'
33
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.32.0'
34
+ spec.add_development_dependency 'sass', '~> 3.7.4' # TODO: replace with sassc
35
+ spec.add_development_dependency 'sprockets', '~> 3.7.2'
36
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reverse_coverage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniele Palombo
8
+ - Mattia Roccoberton
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2020-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.8'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.8'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: pry
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.12.2
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.12.2
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '10.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '10.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 0.67.2
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 0.67.2
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-performance
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 1.1.0
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 1.1.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop-rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: 1.32.0
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: 1.32.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: sass
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 3.7.4
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 3.7.4
140
+ - !ruby/object:Gem::Dependency
141
+ name: sprockets
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 3.7.2
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 3.7.2
154
+ description: Statistics on specs coverage
155
+ email:
156
+ - danielepalombo@nebulab.it
157
+ - mattiaroccoberton@nebulab.it
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - ".gitignore"
163
+ - ".rubocop.yml"
164
+ - Gemfile
165
+ - LICENSE
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - lib/reverse_coverage.rb
170
+ - lib/reverse_coverage/formatters/html/assets/javascripts/application.js
171
+ - lib/reverse_coverage/formatters/html/assets/javascripts/libraries/jquery-1.6.2.min.js
172
+ - lib/reverse_coverage/formatters/html/assets/javascripts/plugins/highlight.pack.js
173
+ - lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.colorbox.js
174
+ - lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.dataTables.min.js
175
+ - lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.timeago.js
176
+ - lib/reverse_coverage/formatters/html/assets/javascripts/plugins/jquery.url.js
177
+ - lib/reverse_coverage/formatters/html/assets/javascripts/settings.js
178
+ - lib/reverse_coverage/formatters/html/assets/javascripts/treeview.js
179
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/application.css
180
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/highlight.css
181
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/jquery-ui-1.8.4.custom.css
182
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/plugins/jquery.colorbox.css
183
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/reset.css
184
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/screen.css.sass
185
+ - lib/reverse_coverage/formatters/html/assets/stylesheets/treeview.css
186
+ - lib/reverse_coverage/formatters/html/formatter.rb
187
+ - lib/reverse_coverage/formatters/html/public/application.css
188
+ - lib/reverse_coverage/formatters/html/public/application.js
189
+ - lib/reverse_coverage/formatters/html/public/colorbox/border.png
190
+ - lib/reverse_coverage/formatters/html/public/colorbox/controls.png
191
+ - lib/reverse_coverage/formatters/html/public/colorbox/loading.gif
192
+ - lib/reverse_coverage/formatters/html/public/colorbox/loading_background.png
193
+ - lib/reverse_coverage/formatters/html/public/favicon.png
194
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_flat_0_aaaaaa_40x100.png
195
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_flat_75_ffffff_40x100.png
196
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_55_fbf9ee_1x400.png
197
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_65_ffffff_1x400.png
198
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_75_dadada_1x400.png
199
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_75_e6e6e6_1x400.png
200
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_glass_95_fef1ec_1x400.png
201
+ - lib/reverse_coverage/formatters/html/public/images/ui-bg_highlight-soft_75_cccccc_1x100.png
202
+ - lib/reverse_coverage/formatters/html/public/images/ui-icons_222222_256x240.png
203
+ - lib/reverse_coverage/formatters/html/public/images/ui-icons_2e83ff_256x240.png
204
+ - lib/reverse_coverage/formatters/html/public/images/ui-icons_454545_256x240.png
205
+ - lib/reverse_coverage/formatters/html/public/images/ui-icons_888888_256x240.png
206
+ - lib/reverse_coverage/formatters/html/public/images/ui-icons_cd0a0a_256x240.png
207
+ - lib/reverse_coverage/formatters/html/public/loading.gif
208
+ - lib/reverse_coverage/formatters/html/public/magnify.png
209
+ - lib/reverse_coverage/formatters/html/public/settings.js
210
+ - lib/reverse_coverage/formatters/html/views/file_list.erb
211
+ - lib/reverse_coverage/formatters/html/views/layout.erb
212
+ - lib/reverse_coverage/formatters/html/views/source_file.erb
213
+ - lib/reverse_coverage/main.rb
214
+ - lib/reverse_coverage/version.rb
215
+ - reverse_coverage.gemspec
216
+ homepage: https://github.com/nebulab/reverse_coverage
217
+ licenses:
218
+ - MIT
219
+ metadata: {}
220
+ post_install_message:
221
+ rdoc_options: []
222
+ require_paths:
223
+ - lib
224
+ required_ruby_version: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ required_rubygems_version: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ requirements: []
235
+ rubyforge_project:
236
+ rubygems_version: 2.5.2.3
237
+ signing_key:
238
+ specification_version: 4
239
+ summary: Reverse coverage
240
+ test_files: []