deep-cover 0.1.16 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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