deep-cover 0.1.16 → 0.2.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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +3 -8
  4. data/.travis.yml +4 -4
  5. data/CHANGELOG.md +10 -0
  6. data/Gemfile +3 -1
  7. data/README.md +9 -4
  8. data/Rakefile +6 -3
  9. data/deep_cover.gemspec +2 -2
  10. data/lib/deep_cover.rb +10 -0
  11. data/lib/deep_cover/analyser.rb +1 -2
  12. data/lib/deep_cover/analyser/base.rb +32 -0
  13. data/lib/deep_cover/analyser/branch.rb +19 -4
  14. data/lib/deep_cover/analyser/node.rb +52 -0
  15. data/lib/deep_cover/analyser/per_char.rb +18 -1
  16. data/lib/deep_cover/analyser/stats.rb +54 -0
  17. data/lib/deep_cover/backports.rb +1 -0
  18. data/lib/deep_cover/base.rb +17 -1
  19. data/lib/deep_cover/builtin_takeover.rb +5 -0
  20. data/lib/deep_cover/cli/deep_cover.rb +2 -1
  21. data/lib/deep_cover/cli/instrumented_clone_reporter.rb +12 -10
  22. data/lib/deep_cover/config.rb +22 -8
  23. data/lib/deep_cover/core_ext/coverage_replacement.rb +22 -18
  24. data/lib/deep_cover/coverage.rb +3 -203
  25. data/lib/deep_cover/coverage/analysis.rb +36 -0
  26. data/lib/deep_cover/coverage/base.rb +91 -0
  27. data/lib/deep_cover/coverage/istanbul.rb +34 -0
  28. data/lib/deep_cover/coverage/persistence.rb +93 -0
  29. data/lib/deep_cover/covered_code.rb +12 -22
  30. data/lib/deep_cover/custom_requirer.rb +6 -2
  31. data/lib/deep_cover/node/base.rb +1 -1
  32. data/lib/deep_cover/node/case.rb +13 -2
  33. data/lib/deep_cover/node/exceptions.rb +2 -2
  34. data/lib/deep_cover/node/if.rb +21 -2
  35. data/lib/deep_cover/node/mixin/flow_accounting.rb +1 -0
  36. data/lib/deep_cover/node/send.rb +9 -2
  37. data/lib/deep_cover/node/short_circuit.rb +10 -0
  38. data/lib/deep_cover/parser_ext/range.rb +4 -4
  39. data/lib/deep_cover/reporter/html.rb +15 -0
  40. data/lib/deep_cover/reporter/html/base.rb +14 -0
  41. data/lib/deep_cover/reporter/html/index.rb +78 -0
  42. data/lib/deep_cover/reporter/html/site.rb +78 -0
  43. data/lib/deep_cover/reporter/html/source.rb +136 -0
  44. data/lib/deep_cover/reporter/html/template/assets/32px.png +0 -0
  45. data/lib/deep_cover/reporter/html/template/assets/40px.png +0 -0
  46. data/lib/deep_cover/reporter/html/template/assets/deep_cover.css.sass +338 -0
  47. data/lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.js +4 -0
  48. data/lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.map +1 -0
  49. data/lib/deep_cover/reporter/html/template/assets/jstree.css +1108 -0
  50. data/lib/deep_cover/reporter/html/template/assets/jstree.js +8424 -0
  51. data/lib/deep_cover/reporter/html/template/assets/jstreetable.js +1069 -0
  52. data/lib/deep_cover/reporter/html/template/assets/throbber.gif +0 -0
  53. data/lib/deep_cover/reporter/html/template/index.html.erb +75 -0
  54. data/lib/deep_cover/reporter/html/template/source.html.erb +35 -0
  55. data/lib/deep_cover/reporter/html/tree.rb +55 -0
  56. data/lib/deep_cover/tools/content_tag.rb +11 -0
  57. data/lib/deep_cover/tools/covered.rb +9 -0
  58. data/lib/deep_cover/tools/merge.rb +16 -0
  59. data/lib/deep_cover/tools/render_template.rb +13 -0
  60. data/lib/deep_cover/tools/transform_keys.rb +9 -0
  61. data/lib/deep_cover/version.rb +1 -1
  62. metadata +33 -7
  63. data/lib/deep_cover/analyser/ignore_uncovered.rb +0 -21
  64. data/lib/deep_cover/analyser/optionally_covered.rb +0 -19
@@ -0,0 +1,75 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <script src="assets/jquery-3.2.1.min.js"></script>
5
+ <script src="assets/jstree.js"></script>
6
+ <script src="assets/jstreetable.js"></script>
7
+ <script src="https://use.fontawesome.com/81e98abb93.js"></script>
8
+ <link href="assets/jstree.css" rel="stylesheet">
9
+ <link href="assets/deep_cover.css" rel="stylesheet">
10
+
11
+ <script>
12
+ window.DeepCover = {
13
+ index: <%= stats_to_data.to_json %>,
14
+ columns: <%= columns.to_json %>
15
+ };
16
+ var numColumns = {
17
+ width: 100,
18
+ sort: function(a, b) {
19
+ return (a.executed + a.ignored > b.executed + b.ignored ? 1 : -1);
20
+ },
21
+ format: function(stats) {
22
+ var ok = stats.executed + stats.ignored;
23
+ return '' + ok + '/' + (ok + stats.not_executed);
24
+ }
25
+ };
26
+ var percentColumns = {
27
+ width: 60,
28
+ format: function(percent) {
29
+ var decile = Math.floor(percent / 10);
30
+ return '<span class="percent-' + decile + '0">' + percent + '</span>';
31
+ }
32
+ }
33
+ for(var i = 1; i < DeepCover.columns.length;) {
34
+ $.extend(DeepCover.columns[i++], numColumns);
35
+ $.extend(DeepCover.columns[i++], percentColumns);
36
+ }
37
+ </script>
38
+
39
+ <script>
40
+ $(function() {
41
+ $(".tree").jstree({
42
+ plugins: ["table","sort"],
43
+ core: {
44
+ data: DeepCover.index
45
+ },
46
+ // configure tree table
47
+ table: {
48
+ columns: DeepCover.columns,
49
+ resizable: true,
50
+ width: "100%",
51
+ height: "100%"
52
+ }
53
+ });
54
+ });
55
+ </script>
56
+ </head>
57
+ <body class="index">
58
+ <header>
59
+ <div class="content">
60
+ <div class="info"><span class="deep-cover"><span class="deep">Deep</span>Cover</span>
61
+ <span class="version">v<%= DeepCover::VERSION %></span>
62
+ </div>
63
+ </div>
64
+ </header>
65
+ <main>
66
+ <div class="tree"></div>
67
+ </main>
68
+ <footer>
69
+ <div class="details">
70
+ <span class="date"><%= Time.now %></span>
71
+ <span class="setup"><%= setup %></span>
72
+ </div>
73
+ </footer>
74
+ </body>
75
+ </html>
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <base href="<%= root_path %>"/>
5
+ <script src="assets/jquery-3.2.1.min.js"></script>
6
+ <script src="https://use.fontawesome.com/81e98abb93.js"></script>
7
+ <link rel="stylesheet" href="assets/deep_cover.css" type="text/css"/>
8
+ </head>
9
+ <body class="source">
10
+ <div class="overlay">
11
+ <div class="center">
12
+ <div class="stats"><%= stats %></div>
13
+ </div>
14
+ </div>
15
+ <header>
16
+ <div class="content">
17
+ <div class="info"><span class="deep-cover"><span class="deep">Deep</span>Cover</span>
18
+ <span class="version">v<%= DeepCover::VERSION %></span>
19
+ </div>
20
+ <div class="nav">
21
+ <a href="index.html" aria-label="Home"><i class="fa fa-home" aria-hidden="true"></i></a>
22
+ <span class="path"><%= covered_code.name %><span>
23
+ </div>
24
+ </div>
25
+ </header>
26
+ <main class="source"><%= format_source %></main>
27
+ <script>
28
+ $(function() {
29
+ $('.stats .branch').click(function() {
30
+ $('body').toggleClass('show-forks')
31
+ });
32
+ });
33
+ </script>
34
+ </body>
35
+ </html>
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Reporter
5
+ # Utility functions to deal with trees
6
+ module HTML::Tree
7
+ def paths_to_tree(paths)
8
+ twigs = paths.map do |path|
9
+ partials = path_to_partial_paths(path)
10
+ list_to_twig(partials)
11
+ end
12
+ tree = deep_merge(twigs)
13
+ simplify(tree)
14
+ end
15
+
16
+ # 'some/example/path' => %w[some example path]
17
+ def path_to_partial_paths(path)
18
+ path.to_s.split('/')
19
+ end
20
+
21
+ # A twig is a tree with only single branches
22
+ # [a, b, c] =>
23
+ # {a: {b: {c: {} } } }
24
+ def list_to_twig(items)
25
+ result = {}
26
+ items.inject(result) do |parent, value|
27
+ parent[value] = {}
28
+ end
29
+ result
30
+ end
31
+
32
+ # [{a: {b: {c: {} } } }
33
+ # {a: {b: {d: {} } } }]
34
+ # => {a: {b: {c: {}, d: {} }}}
35
+ def deep_merge(trees)
36
+ trees.inject do |result, h|
37
+ result.merge(h) { |k, val, val_b| deep_merge([val, val_b]) }
38
+ end
39
+ end
40
+
41
+ # {a: {b: {c: {}, d: {} }}}
42
+ # => {a/b: {c: {}, d: {} }}
43
+ def simplify(tree)
44
+ tree.map do |key, sub_tree|
45
+ sub_tree = simplify(sub_tree)
46
+ if sub_tree.size == 1
47
+ key2, sub_tree = sub_tree.first
48
+ key = "#{key}/#{key2}"
49
+ end
50
+ [key, sub_tree]
51
+ end.to_h
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Tools::ContentTag
5
+ # Poor man's content_tag. No HTML escaping included
6
+ def content_tag(tag, content, **options)
7
+ attrs = options.map { |kind, value| %{ #{kind}="#{value}"} }.join
8
+ "<#{tag}#{attrs}>#{content}</#{tag}>"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Tools::Covered
5
+ def covered?(runs)
6
+ runs && runs > 0
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Tools::Merge
5
+ def merge(*hashes)
6
+ if hashes.last.is_a?(Symbol)
7
+ oper = hashes.pop
8
+ merge(*hashes) { |a, b| a.public_send(oper, b) }
9
+ elsif !block_given?
10
+ merge(*hashes, &:last)
11
+ else
12
+ hashes.inject { |result, h| result.merge(h) { |key, a, b| yield [a, b] } }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Tools::RenderTemplate
5
+ def render_template(template, bound_object)
6
+ require 'erb'
7
+ caller_path = Pathname.new(caller(1..1).first.partition(/\.rb:\d/).first).dirname
8
+ template = caller_path.join("template/#{template}.html.erb").read
9
+ erb = ERB.new(template)
10
+ erb.result(bound_object.instance_eval { binding })
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepCover
4
+ module Tools::TransformKeys
5
+ def transform_keys(hash)
6
+ hash.map { |key, value| [yield(key), value] }.to_h
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeepCover
4
- VERSION = '0.1.16'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep-cover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc-André Lafortune
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-11-15 00:00:00.000000000 Z
12
+ date: 2017-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parser
@@ -171,14 +171,14 @@ dependencies:
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
- version: '10.0'
174
+ version: '12.0'
175
175
  type: :development
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
- version: '10.0'
181
+ version: '12.0'
182
182
  - !ruby/object:Gem::Dependency
183
183
  name: rspec
184
184
  requirement: !ruby/object:Gem::Requirement
@@ -221,6 +221,7 @@ files:
221
221
  - ".rspec_all"
222
222
  - ".rubocop.yml"
223
223
  - ".travis.yml"
224
+ - CHANGELOG.md
224
225
  - CODE_OF_CONDUCT.md
225
226
  - CONTRIBUTING.md
226
227
  - Gemfile
@@ -244,12 +245,11 @@ files:
244
245
  - lib/deep_cover/analyser/branch.rb
245
246
  - lib/deep_cover/analyser/covered_code_source.rb
246
247
  - lib/deep_cover/analyser/function.rb
247
- - lib/deep_cover/analyser/ignore_uncovered.rb
248
248
  - lib/deep_cover/analyser/node.rb
249
- - lib/deep_cover/analyser/optionally_covered.rb
250
249
  - lib/deep_cover/analyser/per_char.rb
251
250
  - lib/deep_cover/analyser/per_line.rb
252
251
  - lib/deep_cover/analyser/statement.rb
252
+ - lib/deep_cover/analyser/stats.rb
253
253
  - lib/deep_cover/analyser/subset.rb
254
254
  - lib/deep_cover/auto_run.rb
255
255
  - lib/deep_cover/autoload_tracker.rb
@@ -265,6 +265,10 @@ files:
265
265
  - lib/deep_cover/core_ext/load_overrides.rb
266
266
  - lib/deep_cover/core_ext/require_overrides.rb
267
267
  - lib/deep_cover/coverage.rb
268
+ - lib/deep_cover/coverage/analysis.rb
269
+ - lib/deep_cover/coverage/base.rb
270
+ - lib/deep_cover/coverage/istanbul.rb
271
+ - lib/deep_cover/coverage/persistence.rb
268
272
  - lib/deep_cover/covered_code.rb
269
273
  - lib/deep_cover/custom_requirer.rb
270
274
  - lib/deep_cover/memoize.rb
@@ -307,25 +311,47 @@ files:
307
311
  - lib/deep_cover/parser_ext/range.rb
308
312
  - lib/deep_cover/problem_with_diagnostic.rb
309
313
  - lib/deep_cover/reporter.rb
314
+ - lib/deep_cover/reporter/html.rb
315
+ - lib/deep_cover/reporter/html/base.rb
316
+ - lib/deep_cover/reporter/html/index.rb
317
+ - lib/deep_cover/reporter/html/site.rb
318
+ - lib/deep_cover/reporter/html/source.rb
319
+ - lib/deep_cover/reporter/html/template/assets/32px.png
320
+ - lib/deep_cover/reporter/html/template/assets/40px.png
321
+ - lib/deep_cover/reporter/html/template/assets/deep_cover.css.sass
322
+ - lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.js
323
+ - lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.map
324
+ - lib/deep_cover/reporter/html/template/assets/jstree.css
325
+ - lib/deep_cover/reporter/html/template/assets/jstree.js
326
+ - lib/deep_cover/reporter/html/template/assets/jstreetable.js
327
+ - lib/deep_cover/reporter/html/template/assets/throbber.gif
328
+ - lib/deep_cover/reporter/html/template/index.html.erb
329
+ - lib/deep_cover/reporter/html/template/source.html.erb
330
+ - lib/deep_cover/reporter/html/tree.rb
310
331
  - lib/deep_cover/reporter/istanbul.rb
311
332
  - lib/deep_cover/tools.rb
312
333
  - lib/deep_cover/tools/builtin_coverage.rb
313
334
  - lib/deep_cover/tools/camelize.rb
335
+ - lib/deep_cover/tools/content_tag.rb
336
+ - lib/deep_cover/tools/covered.rb
314
337
  - lib/deep_cover/tools/dasherize.rb
315
338
  - lib/deep_cover/tools/dump_covered_code.rb
316
339
  - lib/deep_cover/tools/execute_sample.rb
317
340
  - lib/deep_cover/tools/format.rb
318
341
  - lib/deep_cover/tools/format_char_cover.rb
319
342
  - lib/deep_cover/tools/format_generated_code.rb
343
+ - lib/deep_cover/tools/merge.rb
320
344
  - lib/deep_cover/tools/number_lines.rb
321
345
  - lib/deep_cover/tools/our_coverage.rb
322
346
  - lib/deep_cover/tools/profiling.rb
347
+ - lib/deep_cover/tools/render_template.rb
323
348
  - lib/deep_cover/tools/require_relative_dir.rb
324
349
  - lib/deep_cover/tools/silence_warnings.rb
325
350
  - lib/deep_cover/tools/slice.rb
351
+ - lib/deep_cover/tools/transform_keys.rb
326
352
  - lib/deep_cover/tools/truncate_backtrace.rb
327
353
  - lib/deep_cover/version.rb
328
- homepage: http://github.com
354
+ homepage: https://github.com/deep-cover/deep-cover
329
355
  licenses:
330
356
  - MIT
331
357
  metadata: {}
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DeepCover
4
- module Analyser::IgnoreUncovered
5
- def initialize(source, ignore_uncovered: [], **options)
6
- super
7
- @allow_filters = Array(ignore_uncovered)
8
- .map { |kind| :"is_#{kind}?" }
9
- .select { |name| respond_to?(name) }
10
- .map { |name| method(name) } # So was tempted to write `.map(&method(:method))`!
11
- end
12
-
13
- def node_runs(node)
14
- runs = super
15
- if runs == 0 && @allow_filters.any? { |f| f[node] }
16
- runs = nil
17
- end
18
- runs
19
- end
20
- end
21
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DeepCover
4
- module Analyser::OptionallyCovered
5
- def optionally_covered
6
- @optionally_covered ||= Analyser
7
- .constants.map { |c| Analyser.const_get(c) }
8
- .select { |klass| klass < Analyser }
9
- .flat_map do |klass|
10
- klass.instance_methods(false).map do |method|
11
- method =~ /^is_(.*)\?$/
12
- Regexp.last_match(1)
13
- end
14
- end
15
- .compact
16
- .map(&:to_sym)
17
- end
18
- end
19
- end