rspec-tracer 1.2.3 → 2.0.0.pre.2

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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +384 -67
  3. data/README.md +454 -429
  4. data/bin/rspec-tracer +15 -0
  5. data/lib/rspec_tracer/cache/Rakefile +43 -0
  6. data/lib/rspec_tracer/cli/cache_clear.rb +111 -0
  7. data/lib/rspec_tracer/cli/cache_info.rb +104 -0
  8. data/lib/rspec_tracer/cli/doctor.rb +284 -0
  9. data/lib/rspec_tracer/cli/explain.rb +158 -0
  10. data/lib/rspec_tracer/cli/report_open.rb +82 -0
  11. data/lib/rspec_tracer/cli.rb +116 -0
  12. data/lib/rspec_tracer/configuration.rb +1196 -3
  13. data/lib/rspec_tracer/engine.rb +1168 -0
  14. data/lib/rspec_tracer/example.rb +141 -11
  15. data/lib/rspec_tracer/filter.rb +35 -0
  16. data/lib/rspec_tracer/line_stub.rb +61 -0
  17. data/lib/rspec_tracer/load_config.rb +2 -2
  18. data/lib/rspec_tracer/logger.rb +15 -0
  19. data/lib/rspec_tracer/rails/README.md +78 -0
  20. data/lib/rspec_tracer/rails/i18n_tracking.rb +137 -0
  21. data/lib/rspec_tracer/rails/notifications.rb +263 -0
  22. data/lib/rspec_tracer/rails/preset.rb +94 -0
  23. data/lib/rspec_tracer/rails/railtie.rb +22 -0
  24. data/lib/rspec_tracer/rails.rb +15 -0
  25. data/lib/rspec_tracer/remote_cache/README.md +140 -0
  26. data/lib/rspec_tracer/remote_cache/Rakefile +35 -11
  27. data/lib/rspec_tracer/remote_cache/archive.rb +137 -0
  28. data/lib/rspec_tracer/remote_cache/backend.rb +73 -0
  29. data/lib/rspec_tracer/remote_cache/git_ancestry.rb +241 -0
  30. data/lib/rspec_tracer/remote_cache/local_fs_backend.rb +439 -0
  31. data/lib/rspec_tracer/remote_cache/redis_backend.rb +554 -0
  32. data/lib/rspec_tracer/remote_cache/s3_backend.rb +712 -0
  33. data/lib/rspec_tracer/remote_cache/user_tasks.rb +436 -0
  34. data/lib/rspec_tracer/remote_cache/validator.rb +40 -62
  35. data/lib/rspec_tracer/remote_cache.rb +22 -0
  36. data/lib/rspec_tracer/reporters/README.md +103 -0
  37. data/lib/rspec_tracer/reporters/base.rb +87 -0
  38. data/lib/rspec_tracer/reporters/coverage_json_reporter.rb +338 -0
  39. data/lib/rspec_tracer/reporters/html/.gitignore +19 -0
  40. data/lib/rspec_tracer/reporters/html/.prettierignore +4 -0
  41. data/lib/rspec_tracer/reporters/html/.prettierrc.json +9 -0
  42. data/lib/rspec_tracer/reporters/html/README.md +80 -0
  43. data/lib/rspec_tracer/reporters/html/dist/assets/index.css +2 -0
  44. data/lib/rspec_tracer/reporters/html/dist/assets/index.js +1 -0
  45. data/lib/rspec_tracer/reporters/html/dist/index.html +24 -0
  46. data/lib/rspec_tracer/reporters/html/eslint.config.js +62 -0
  47. data/lib/rspec_tracer/reporters/html/package-lock.json +4941 -0
  48. data/lib/rspec_tracer/reporters/html/package.json +29 -0
  49. data/lib/rspec_tracer/reporters/html/src/app.jsx +130 -0
  50. data/lib/rspec_tracer/reporters/html/src/components/AllExamples.jsx +86 -0
  51. data/lib/rspec_tracer/reporters/html/src/components/DuplicateExamples.jsx +68 -0
  52. data/lib/rspec_tracer/reporters/html/src/components/ExamplesDependency.jsx +78 -0
  53. data/lib/rspec_tracer/reporters/html/src/components/FilesDependency.jsx +72 -0
  54. data/lib/rspec_tracer/reporters/html/src/components/FlakyExamples.jsx +42 -0
  55. data/lib/rspec_tracer/reporters/html/src/components/ReportTable.jsx +131 -0
  56. data/lib/rspec_tracer/reporters/html/src/components/SearchBar.jsx +19 -0
  57. data/lib/rspec_tracer/reporters/html/src/index.html +23 -0
  58. data/lib/rspec_tracer/reporters/html/src/main.jsx +37 -0
  59. data/lib/rspec_tracer/reporters/html/src/styles.css +434 -0
  60. data/lib/rspec_tracer/reporters/html/vite.config.js +42 -0
  61. data/lib/rspec_tracer/reporters/html_reporter.rb +266 -0
  62. data/lib/rspec_tracer/reporters/json_reporter.rb +88 -0
  63. data/lib/rspec_tracer/reporters/payload_builder.rb +235 -0
  64. data/lib/rspec_tracer/reporters/registry.rb +120 -0
  65. data/lib/rspec_tracer/reporters/terminal_reporter.rb +264 -0
  66. data/lib/rspec_tracer/rspec/README.md +73 -0
  67. data/lib/rspec_tracer/rspec/installation.rb +97 -0
  68. data/lib/rspec_tracer/rspec/metadata.rb +96 -0
  69. data/lib/rspec_tracer/rspec/parallel_tests.rb +459 -0
  70. data/lib/rspec_tracer/rspec/reporter_hook.rb +84 -0
  71. data/lib/rspec_tracer/rspec/runner_hook.rb +239 -0
  72. data/lib/rspec_tracer/source_file.rb +24 -7
  73. data/lib/rspec_tracer/storage/README.md +35 -0
  74. data/lib/rspec_tracer/storage/backend.rb +130 -0
  75. data/lib/rspec_tracer/storage/json_backend.rb +884 -0
  76. data/lib/rspec_tracer/storage/lazy_snapshot.rb +65 -0
  77. data/lib/rspec_tracer/storage/schema.rb +50 -0
  78. data/lib/rspec_tracer/storage/serializer/json.rb +41 -0
  79. data/lib/rspec_tracer/storage/serializer/msgpack.rb +167 -0
  80. data/lib/rspec_tracer/storage/snapshot.rb +141 -0
  81. data/lib/rspec_tracer/storage/sqlite_backend.rb +693 -0
  82. data/lib/rspec_tracer/time_formatter.rb +37 -18
  83. data/lib/rspec_tracer/tracker/README.md +36 -0
  84. data/lib/rspec_tracer/tracker/coverage_adapter.rb +174 -0
  85. data/lib/rspec_tracer/tracker/declared_globs.rb +100 -0
  86. data/lib/rspec_tracer/tracker/dependency_graph.rb +134 -0
  87. data/lib/rspec_tracer/tracker/env_matcher.rb +127 -0
  88. data/lib/rspec_tracer/tracker/env_snapshot.rb +77 -0
  89. data/lib/rspec_tracer/tracker/example_registry.rb +153 -0
  90. data/lib/rspec_tracer/tracker/file_digest.rb +61 -0
  91. data/lib/rspec_tracer/tracker/filter.rb +127 -0
  92. data/lib/rspec_tracer/tracker/input.rb +99 -0
  93. data/lib/rspec_tracer/tracker/io_hooks/file.rb +55 -0
  94. data/lib/rspec_tracer/tracker/io_hooks/io.rb +24 -0
  95. data/lib/rspec_tracer/tracker/io_hooks/json.rb +23 -0
  96. data/lib/rspec_tracer/tracker/io_hooks/kernel.rb +26 -0
  97. data/lib/rspec_tracer/tracker/io_hooks/yaml.rb +38 -0
  98. data/lib/rspec_tracer/tracker/io_hooks.rb +195 -0
  99. data/lib/rspec_tracer/tracker/loaded_files_tracker.rb +295 -0
  100. data/lib/rspec_tracer/tracker/new_file_detector.rb +62 -0
  101. data/lib/rspec_tracer/tracker/whole_suite_invalidators.rb +96 -0
  102. data/lib/rspec_tracer/version.rb +4 -1
  103. data/lib/rspec_tracer.rb +231 -491
  104. metadata +94 -43
  105. data/lib/rspec_tracer/cache.rb +0 -207
  106. data/lib/rspec_tracer/coverage_merger.rb +0 -42
  107. data/lib/rspec_tracer/coverage_reporter.rb +0 -187
  108. data/lib/rspec_tracer/coverage_writer.rb +0 -58
  109. data/lib/rspec_tracer/html_reporter/Rakefile +0 -18
  110. data/lib/rspec_tracer/html_reporter/assets/javascripts/application.js +0 -56
  111. data/lib/rspec_tracer/html_reporter/assets/javascripts/libraries/jquery.js +0 -10881
  112. data/lib/rspec_tracer/html_reporter/assets/javascripts/plugins/datatables.js +0 -15381
  113. data/lib/rspec_tracer/html_reporter/assets/stylesheets/application.css +0 -196
  114. data/lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/datatables.css +0 -459
  115. data/lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/jquery-ui.css +0 -436
  116. data/lib/rspec_tracer/html_reporter/assets/stylesheets/print.css +0 -92
  117. data/lib/rspec_tracer/html_reporter/assets/stylesheets/reset.css +0 -265
  118. data/lib/rspec_tracer/html_reporter/public/application.css +0 -5
  119. data/lib/rspec_tracer/html_reporter/public/application.js +0 -6
  120. data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc.png +0 -0
  121. data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc_disabled.png +0 -0
  122. data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_both.png +0 -0
  123. data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc.png +0 -0
  124. data/lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc_disabled.png +0 -0
  125. data/lib/rspec_tracer/html_reporter/public/favicon.png +0 -0
  126. data/lib/rspec_tracer/html_reporter/public/loading.gif +0 -0
  127. data/lib/rspec_tracer/html_reporter/reporter.rb +0 -242
  128. data/lib/rspec_tracer/html_reporter/views/duplicate_examples.erb +0 -34
  129. data/lib/rspec_tracer/html_reporter/views/examples.erb +0 -58
  130. data/lib/rspec_tracer/html_reporter/views/examples_dependency.erb +0 -36
  131. data/lib/rspec_tracer/html_reporter/views/files_dependency.erb +0 -36
  132. data/lib/rspec_tracer/html_reporter/views/flaky_examples.erb +0 -38
  133. data/lib/rspec_tracer/html_reporter/views/layout.erb +0 -38
  134. data/lib/rspec_tracer/remote_cache/aws.rb +0 -176
  135. data/lib/rspec_tracer/remote_cache/cache.rb +0 -75
  136. data/lib/rspec_tracer/remote_cache/repo.rb +0 -210
  137. data/lib/rspec_tracer/report_generator.rb +0 -158
  138. data/lib/rspec_tracer/report_merger.rb +0 -68
  139. data/lib/rspec_tracer/report_writer.rb +0 -141
  140. data/lib/rspec_tracer/reporter.rb +0 -204
  141. data/lib/rspec_tracer/rspec_reporter.rb +0 -41
  142. data/lib/rspec_tracer/rspec_runner.rb +0 -56
  143. data/lib/rspec_tracer/ruby_coverage.rb +0 -9
  144. data/lib/rspec_tracer/runner.rb +0 -278
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-tracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 2.0.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abhimanyu Singh
@@ -44,76 +44,127 @@ description: RSpec Tracer is a specs dependency analyzer, flaky tests detector,
44
44
  of the coverage for each test.
45
45
  email:
46
46
  - abhisinghabhimanyu@gmail.com
47
- executables: []
47
+ executables:
48
+ - rspec-tracer
48
49
  extensions: []
49
50
  extra_rdoc_files: []
50
51
  files:
51
52
  - CHANGELOG.md
52
53
  - LICENSE
53
54
  - README.md
55
+ - bin/rspec-tracer
54
56
  - lib/rspec_tracer.rb
55
- - lib/rspec_tracer/cache.rb
57
+ - lib/rspec_tracer/cache/Rakefile
58
+ - lib/rspec_tracer/cli.rb
59
+ - lib/rspec_tracer/cli/cache_clear.rb
60
+ - lib/rspec_tracer/cli/cache_info.rb
61
+ - lib/rspec_tracer/cli/doctor.rb
62
+ - lib/rspec_tracer/cli/explain.rb
63
+ - lib/rspec_tracer/cli/report_open.rb
56
64
  - lib/rspec_tracer/configuration.rb
57
- - lib/rspec_tracer/coverage_merger.rb
58
- - lib/rspec_tracer/coverage_reporter.rb
59
- - lib/rspec_tracer/coverage_writer.rb
60
65
  - lib/rspec_tracer/defaults.rb
66
+ - lib/rspec_tracer/engine.rb
61
67
  - lib/rspec_tracer/example.rb
62
68
  - lib/rspec_tracer/filter.rb
63
- - lib/rspec_tracer/html_reporter/Rakefile
64
- - lib/rspec_tracer/html_reporter/assets/javascripts/application.js
65
- - lib/rspec_tracer/html_reporter/assets/javascripts/libraries/jquery.js
66
- - lib/rspec_tracer/html_reporter/assets/javascripts/plugins/datatables.js
67
- - lib/rspec_tracer/html_reporter/assets/stylesheets/application.css
68
- - lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/datatables.css
69
- - lib/rspec_tracer/html_reporter/assets/stylesheets/plugins/jquery-ui.css
70
- - lib/rspec_tracer/html_reporter/assets/stylesheets/print.css
71
- - lib/rspec_tracer/html_reporter/assets/stylesheets/reset.css
72
- - lib/rspec_tracer/html_reporter/public/application.css
73
- - lib/rspec_tracer/html_reporter/public/application.js
74
- - lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc.png
75
- - lib/rspec_tracer/html_reporter/public/datatables/images/sort_asc_disabled.png
76
- - lib/rspec_tracer/html_reporter/public/datatables/images/sort_both.png
77
- - lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc.png
78
- - lib/rspec_tracer/html_reporter/public/datatables/images/sort_desc_disabled.png
79
- - lib/rspec_tracer/html_reporter/public/favicon.png
80
- - lib/rspec_tracer/html_reporter/public/loading.gif
81
- - lib/rspec_tracer/html_reporter/reporter.rb
82
- - lib/rspec_tracer/html_reporter/views/duplicate_examples.erb
83
- - lib/rspec_tracer/html_reporter/views/examples.erb
84
- - lib/rspec_tracer/html_reporter/views/examples_dependency.erb
85
- - lib/rspec_tracer/html_reporter/views/files_dependency.erb
86
- - lib/rspec_tracer/html_reporter/views/flaky_examples.erb
87
- - lib/rspec_tracer/html_reporter/views/layout.erb
69
+ - lib/rspec_tracer/line_stub.rb
88
70
  - lib/rspec_tracer/load_config.rb
89
71
  - lib/rspec_tracer/load_default_config.rb
90
72
  - lib/rspec_tracer/load_global_config.rb
91
73
  - lib/rspec_tracer/load_local_config.rb
92
74
  - lib/rspec_tracer/logger.rb
75
+ - lib/rspec_tracer/rails.rb
76
+ - lib/rspec_tracer/rails/README.md
77
+ - lib/rspec_tracer/rails/i18n_tracking.rb
78
+ - lib/rspec_tracer/rails/notifications.rb
79
+ - lib/rspec_tracer/rails/preset.rb
80
+ - lib/rspec_tracer/rails/railtie.rb
81
+ - lib/rspec_tracer/remote_cache.rb
82
+ - lib/rspec_tracer/remote_cache/README.md
93
83
  - lib/rspec_tracer/remote_cache/Rakefile
94
- - lib/rspec_tracer/remote_cache/aws.rb
95
- - lib/rspec_tracer/remote_cache/cache.rb
96
- - lib/rspec_tracer/remote_cache/repo.rb
84
+ - lib/rspec_tracer/remote_cache/archive.rb
85
+ - lib/rspec_tracer/remote_cache/backend.rb
86
+ - lib/rspec_tracer/remote_cache/git_ancestry.rb
87
+ - lib/rspec_tracer/remote_cache/local_fs_backend.rb
88
+ - lib/rspec_tracer/remote_cache/redis_backend.rb
89
+ - lib/rspec_tracer/remote_cache/s3_backend.rb
90
+ - lib/rspec_tracer/remote_cache/user_tasks.rb
97
91
  - lib/rspec_tracer/remote_cache/validator.rb
98
- - lib/rspec_tracer/report_generator.rb
99
- - lib/rspec_tracer/report_merger.rb
100
- - lib/rspec_tracer/report_writer.rb
101
- - lib/rspec_tracer/reporter.rb
102
- - lib/rspec_tracer/rspec_reporter.rb
103
- - lib/rspec_tracer/rspec_runner.rb
104
- - lib/rspec_tracer/ruby_coverage.rb
105
- - lib/rspec_tracer/runner.rb
92
+ - lib/rspec_tracer/reporters/README.md
93
+ - lib/rspec_tracer/reporters/base.rb
94
+ - lib/rspec_tracer/reporters/coverage_json_reporter.rb
95
+ - lib/rspec_tracer/reporters/html/.gitignore
96
+ - lib/rspec_tracer/reporters/html/.prettierignore
97
+ - lib/rspec_tracer/reporters/html/.prettierrc.json
98
+ - lib/rspec_tracer/reporters/html/README.md
99
+ - lib/rspec_tracer/reporters/html/dist/assets/index.css
100
+ - lib/rspec_tracer/reporters/html/dist/assets/index.js
101
+ - lib/rspec_tracer/reporters/html/dist/index.html
102
+ - lib/rspec_tracer/reporters/html/eslint.config.js
103
+ - lib/rspec_tracer/reporters/html/package-lock.json
104
+ - lib/rspec_tracer/reporters/html/package.json
105
+ - lib/rspec_tracer/reporters/html/src/app.jsx
106
+ - lib/rspec_tracer/reporters/html/src/components/AllExamples.jsx
107
+ - lib/rspec_tracer/reporters/html/src/components/DuplicateExamples.jsx
108
+ - lib/rspec_tracer/reporters/html/src/components/ExamplesDependency.jsx
109
+ - lib/rspec_tracer/reporters/html/src/components/FilesDependency.jsx
110
+ - lib/rspec_tracer/reporters/html/src/components/FlakyExamples.jsx
111
+ - lib/rspec_tracer/reporters/html/src/components/ReportTable.jsx
112
+ - lib/rspec_tracer/reporters/html/src/components/SearchBar.jsx
113
+ - lib/rspec_tracer/reporters/html/src/index.html
114
+ - lib/rspec_tracer/reporters/html/src/main.jsx
115
+ - lib/rspec_tracer/reporters/html/src/styles.css
116
+ - lib/rspec_tracer/reporters/html/vite.config.js
117
+ - lib/rspec_tracer/reporters/html_reporter.rb
118
+ - lib/rspec_tracer/reporters/json_reporter.rb
119
+ - lib/rspec_tracer/reporters/payload_builder.rb
120
+ - lib/rspec_tracer/reporters/registry.rb
121
+ - lib/rspec_tracer/reporters/terminal_reporter.rb
122
+ - lib/rspec_tracer/rspec/README.md
123
+ - lib/rspec_tracer/rspec/installation.rb
124
+ - lib/rspec_tracer/rspec/metadata.rb
125
+ - lib/rspec_tracer/rspec/parallel_tests.rb
126
+ - lib/rspec_tracer/rspec/reporter_hook.rb
127
+ - lib/rspec_tracer/rspec/runner_hook.rb
106
128
  - lib/rspec_tracer/source_file.rb
129
+ - lib/rspec_tracer/storage/README.md
130
+ - lib/rspec_tracer/storage/backend.rb
131
+ - lib/rspec_tracer/storage/json_backend.rb
132
+ - lib/rspec_tracer/storage/lazy_snapshot.rb
133
+ - lib/rspec_tracer/storage/schema.rb
134
+ - lib/rspec_tracer/storage/serializer/json.rb
135
+ - lib/rspec_tracer/storage/serializer/msgpack.rb
136
+ - lib/rspec_tracer/storage/snapshot.rb
137
+ - lib/rspec_tracer/storage/sqlite_backend.rb
107
138
  - lib/rspec_tracer/time_formatter.rb
139
+ - lib/rspec_tracer/tracker/README.md
140
+ - lib/rspec_tracer/tracker/coverage_adapter.rb
141
+ - lib/rspec_tracer/tracker/declared_globs.rb
142
+ - lib/rspec_tracer/tracker/dependency_graph.rb
143
+ - lib/rspec_tracer/tracker/env_matcher.rb
144
+ - lib/rspec_tracer/tracker/env_snapshot.rb
145
+ - lib/rspec_tracer/tracker/example_registry.rb
146
+ - lib/rspec_tracer/tracker/file_digest.rb
147
+ - lib/rspec_tracer/tracker/filter.rb
148
+ - lib/rspec_tracer/tracker/input.rb
149
+ - lib/rspec_tracer/tracker/io_hooks.rb
150
+ - lib/rspec_tracer/tracker/io_hooks/file.rb
151
+ - lib/rspec_tracer/tracker/io_hooks/io.rb
152
+ - lib/rspec_tracer/tracker/io_hooks/json.rb
153
+ - lib/rspec_tracer/tracker/io_hooks/kernel.rb
154
+ - lib/rspec_tracer/tracker/io_hooks/yaml.rb
155
+ - lib/rspec_tracer/tracker/loaded_files_tracker.rb
156
+ - lib/rspec_tracer/tracker/new_file_detector.rb
157
+ - lib/rspec_tracer/tracker/whole_suite_invalidators.rb
108
158
  - lib/rspec_tracer/version.rb
109
159
  homepage: https://github.com/avmnu-sng/rspec-tracer
110
160
  licenses:
111
161
  - MIT
112
162
  metadata:
113
163
  homepage_uri: https://github.com/avmnu-sng/rspec-tracer
114
- source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v1.2.3
164
+ source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v2.0.0.pre.2
115
165
  changelog_uri: https://github.com/avmnu-sng/rspec-tracer/blob/main/CHANGELOG.md
116
166
  bug_tracker_uri: https://github.com/avmnu-sng/rspec-tracer/issues
167
+ rubygems_mfa_required: 'true'
117
168
  rdoc_options: []
118
169
  require_paths:
119
170
  - lib
@@ -1,207 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RSpecTracer
4
- class Cache
5
- attr_reader :all_examples, :duplicate_examples, :interrupted_examples,
6
- :flaky_examples, :failed_examples, :pending_examples, :skipped_examples,
7
- :all_files, :dependency, :examples_coverage, :run_id
8
-
9
- def initialize
10
- @cached = false
11
-
12
- @all_examples = {}
13
- @duplicate_examples = {}
14
- @interrupted_examples = Set.new
15
- @flaky_examples = Set.new
16
- @failed_examples = Set.new
17
- @pending_examples = Set.new
18
- @skipped_examples = Set.new
19
- @all_files = {}
20
- @dependency = Hash.new { |hash, key| hash[key] = Set.new }
21
- @examples_coverage = {}
22
- end
23
-
24
- # Public populate-from-disk surface for ReportMerger. Replaces ten
25
- # separate `cache.send(:load_*_cache, ...)` pokes at the private
26
- # interface with a single contract.
27
- def populate_from_disk(cache_dir, discard_run_reason: true)
28
- load_all_examples_cache(cache_dir, discard_run_reason: discard_run_reason)
29
- load_duplicate_examples_cache(cache_dir)
30
- load_interrupted_examples_cache(cache_dir)
31
- load_flaky_examples_cache(cache_dir)
32
- load_failed_examples_cache(cache_dir)
33
- load_pending_examples_cache(cache_dir)
34
- load_skipped_examples_cache(cache_dir)
35
- load_all_files_cache(cache_dir)
36
- load_dependency_cache(cache_dir)
37
- load_examples_coverage_cache(cache_dir)
38
-
39
- self
40
- end
41
-
42
- def load_cache_for_run
43
- return if @cached
44
-
45
- cache_path = RSpecTracer.cache_path
46
- cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests?
47
- run_id = last_run_id(cache_path)
48
-
49
- return if run_id.nil?
50
-
51
- starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
52
- cache_dir = File.join(cache_path, run_id)
53
-
54
- load_all_examples_cache(cache_dir)
55
- load_duplicate_examples_cache(cache_dir)
56
- load_interrupted_examples_cache(cache_dir)
57
- load_flaky_examples_cache(cache_dir)
58
- load_failed_examples_cache(cache_dir)
59
- load_pending_examples_cache(cache_dir)
60
- load_all_files_cache(cache_dir)
61
- load_dependency_cache(cache_dir)
62
-
63
- ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
64
-
65
- @cached = true
66
-
67
- elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
68
-
69
- RSpecTracer.logger.debug "RSpec tracer loaded cache from #{cache_dir} (took #{elapsed})"
70
- end
71
-
72
- def cached_examples_coverage
73
- return @examples_coverage if @examples_coverage_loaded
74
-
75
- @examples_coverage_loaded = true
76
-
77
- cache_path = RSpecTracer.cache_path
78
- cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests?
79
- run_id = last_run_id(cache_path)
80
-
81
- return @examples_coverage if run_id.nil?
82
-
83
- starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
84
- cache_dir = File.join(cache_path, run_id)
85
- load_examples_coverage_cache(cache_dir)
86
- ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
87
- elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
88
-
89
- RSpecTracer.logger.debug "RSpec tracer loaded cached examples coverage (took #{elapsed})"
90
-
91
- @examples_coverage
92
- end
93
-
94
- private
95
-
96
- def last_run_id(cache_dir)
97
- file_name = File.join(cache_dir, 'last_run.json')
98
-
99
- return unless File.file?(file_name)
100
-
101
- JSON.parse(File.read(file_name, encoding: 'UTF-8'))['run_id']
102
- end
103
-
104
- def load_all_examples_cache(cache_dir, discard_run_reason: true)
105
- file_name = File.join(cache_dir, 'all_examples.json')
106
-
107
- return unless File.file?(file_name)
108
-
109
- @all_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).transform_values do |examples|
110
- examples.transform_keys(&:to_sym)
111
- end
112
-
113
- @all_examples.each_value do |example|
114
- example[:execution_result].transform_keys!(&:to_sym) if example.key?(:execution_result)
115
- example[:run_reason] = nil if discard_run_reason
116
- end
117
- end
118
-
119
- def load_duplicate_examples_cache(cache_dir)
120
- file_name = File.join(cache_dir, 'duplicate_examples.json')
121
-
122
- return unless File.file?(file_name)
123
-
124
- @duplicate_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).transform_values do |examples|
125
- examples.map { |example| example.transform_keys(&:to_sym) }
126
- end
127
- end
128
-
129
- def load_interrupted_examples_cache(cache_dir)
130
- file_name = File.join(cache_dir, 'interrupted_examples.json')
131
-
132
- return unless File.file?(file_name)
133
-
134
- @interrupted_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).to_set
135
- end
136
-
137
- def load_flaky_examples_cache(cache_dir)
138
- file_name = File.join(cache_dir, 'flaky_examples.json')
139
-
140
- return unless File.file?(file_name)
141
-
142
- @flaky_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).to_set
143
- end
144
-
145
- def load_failed_examples_cache(cache_dir)
146
- file_name = File.join(cache_dir, 'failed_examples.json')
147
-
148
- return unless File.file?(file_name)
149
-
150
- @failed_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).to_set
151
- end
152
-
153
- def load_pending_examples_cache(cache_dir)
154
- file_name = File.join(cache_dir, 'pending_examples.json')
155
-
156
- return unless File.file?(file_name)
157
-
158
- @pending_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).to_set
159
- end
160
-
161
- def load_skipped_examples_cache(cache_dir)
162
- file_name = File.join(cache_dir, 'skipped_examples.json')
163
-
164
- return unless File.file?(file_name)
165
-
166
- @skipped_examples = JSON.parse(File.read(file_name, encoding: 'UTF-8')).to_set
167
- end
168
-
169
- def load_all_files_cache(cache_dir)
170
- file_name = File.join(cache_dir, 'all_files.json')
171
-
172
- return unless File.file?(file_name)
173
-
174
- raw = JSON.parse(File.read(file_name, encoding: 'UTF-8')).transform_values do |files|
175
- files.transform_keys(&:to_sym)
176
- end
177
- @all_files = raw.reject { |fname, _| filtered_by_current_filters?(fname) }
178
- end
179
-
180
- def load_dependency_cache(cache_dir)
181
- file_name = File.join(cache_dir, 'dependency.json')
182
-
183
- return unless File.file?(file_name)
184
-
185
- raw = JSON.parse(File.read(file_name, encoding: 'UTF-8')).transform_values(&:to_set)
186
- @dependency = raw.transform_values do |files|
187
- files.reject { |fname| filtered_by_current_filters?(fname) }.to_set
188
- end
189
- end
190
-
191
- # True iff `file_name` matches any currently-configured filter.
192
- # Applied at carry-forward seed time so newly-added filters take
193
- # effect on the very next warm run instead of waiting for a cold
194
- # run.
195
- def filtered_by_current_filters?(file_name)
196
- RSpecTracer.filters.any? { |f| f.match?(file_name: file_name) }
197
- end
198
-
199
- def load_examples_coverage_cache(cache_dir)
200
- file_name = File.join(cache_dir, 'examples_coverage.json')
201
-
202
- return unless File.file?(file_name)
203
-
204
- @examples_coverage = JSON.parse(File.read(file_name, encoding: 'UTF-8'))
205
- end
206
- end
207
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RSpecTracer
4
- class CoverageMerger
5
- attr_reader :coverage
6
-
7
- def initialize
8
- @coverage = {}
9
- end
10
-
11
- def merge(reports_dir)
12
- return if RSpecTracer.simplecov?
13
-
14
- reports_dir.each do |report_dir|
15
- next unless File.directory?(report_dir)
16
-
17
- raw = File.read("#{report_dir}/coverage.json", encoding: 'UTF-8')
18
- cache_coverage = JSON.parse(raw)['RSpecTracer']['coverage']
19
-
20
- cache_coverage.each_pair do |file_name, line_coverage|
21
- unless @coverage.key?(file_name)
22
- @coverage[file_name] = line_coverage
23
-
24
- next
25
- end
26
-
27
- merge_line_coverage(file_name, line_coverage)
28
- end
29
- end
30
- end
31
-
32
- private
33
-
34
- def merge_line_coverage(file_name, line_coverage)
35
- line_coverage.each_with_index do |strength, line_number|
36
- next unless strength && @coverage[file_name][line_number]
37
-
38
- @coverage[file_name][line_number] += strength
39
- end
40
- end
41
- end
42
- end
@@ -1,187 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RSpecTracer
4
- class CoverageReporter
5
- COVERAGE_MODE = {
6
- array: 'array',
7
- hash: 'hash'
8
- }.freeze
9
-
10
- attr_reader :mode, :coverage, :coverage_stat, :examples_coverage
11
-
12
- def initialize
13
- @mode = if !RSpecTracer.simplecov? || ::Coverage.peek_result.first.last.is_a?(Array)
14
- COVERAGE_MODE[:array]
15
- else
16
- COVERAGE_MODE[:hash]
17
- end
18
-
19
- @examples_coverage = Hash.new do |examples, example_id|
20
- examples[example_id] = Hash.new do |files, file_path|
21
- files[file_path] = {}
22
- end
23
- end
24
- end
25
-
26
- def record_coverage
27
- @coverage = peek_coverage
28
- end
29
-
30
- def compute_diff(example_id)
31
- peek_coverage.each_pair do |file_path, current_stats|
32
- unless @coverage.key?(file_path)
33
- missing_file_diff_coverage(example_id, file_path, current_stats)
34
-
35
- next
36
- end
37
-
38
- next if current_stats == @coverage[file_path]
39
-
40
- existing_file_diff_coverage(example_id, file_path, current_stats)
41
- end
42
- end
43
-
44
- def generate_final_examples_coverage
45
- filtered_files = Set.new
46
-
47
- @examples_coverage.each_key do |example_id|
48
- @examples_coverage[example_id].select! do |file_path|
49
- next false if filtered_files.include?(file_path)
50
-
51
- file_name = RSpecTracer::SourceFile.file_name(file_path)
52
-
53
- if RSpecTracer.coverage_filters.any? { |filter| filter.match?(file_name: file_name) }
54
- filtered_files << file_path
55
-
56
- false
57
- else
58
- true
59
- end
60
- end
61
- end
62
- end
63
-
64
- def merge_coverage(missed_coverage)
65
- record_coverage
66
-
67
- missed_coverage.each_pair do |file_path, line_coverage|
68
- line_coverage_dup = if @coverage.key?(file_path)
69
- @coverage[file_path].dup
70
- else
71
- line_stub(file_path)
72
- end
73
-
74
- line_coverage.each_pair do |line_number, strength|
75
- index = line_number.to_i
76
- line_coverage_dup[index] = (line_coverage_dup[index] || 0) + strength
77
- end
78
-
79
- @coverage[file_path] = line_coverage_dup.freeze
80
- end
81
- end
82
-
83
- def generate_final_coverage
84
- return if @coverage_stat
85
-
86
- all_files = final_coverage_files
87
- @coverage = @coverage.slice(*all_files)
88
-
89
- all_files.each do |file_path|
90
- @coverage[file_path] ||= line_stub(file_path).freeze
91
- end
92
- end
93
-
94
- private
95
-
96
- def existing_file_diff_coverage(example_id, file_path, coverage_stats)
97
- coverage_stats.zip(@coverage[file_path])
98
- .each_with_index do |(c_stat, p_stat), line_number|
99
- next if c_stat.nil? || p_stat.nil? || c_stat == p_stat
100
-
101
- @examples_coverage[example_id][file_path][line_number] = c_stat - p_stat
102
- end
103
- end
104
-
105
- def missing_file_diff_coverage(example_id, file_path, coverage_stats)
106
- coverage_stats.each_with_index do |stat, line_number|
107
- next if stat.nil? || stat.zero?
108
-
109
- @examples_coverage[example_id][file_path][line_number] = stat
110
- end
111
- end
112
-
113
- def final_coverage_files
114
- all_files = @coverage.keys.to_set
115
-
116
- if RSpecTracer.coverage_tracked_files
117
- tracked_files = Dir[RSpecTracer.coverage_tracked_files].map do |file_name|
118
- RSpecTracer::SourceFile.file_path(file_name)
119
- end
120
-
121
- all_files |= tracked_files
122
- end
123
-
124
- all_files.select! do |file_path|
125
- file_name = RSpecTracer::SourceFile.file_name(file_path)
126
-
127
- RSpecTracer.coverage_filters.none? { |filter| filter.match?(file_name: file_name) }
128
- end
129
-
130
- all_files.sort
131
- end
132
-
133
- def peek_coverage
134
- data = ::Coverage.peek_result.select do |file_path, _|
135
- file_path.start_with?(RSpecTracer.root)
136
- end
137
-
138
- return data if @mode == COVERAGE_MODE[:array]
139
-
140
- data.transform_values { |stats| stats[:lines] }
141
- end
142
-
143
- def line_stub(file_path)
144
- case RUBY_ENGINE
145
- when 'ruby'
146
- ruby_line_stub(file_path)
147
- when 'jruby'
148
- jruby_line_stub(file_path)
149
- end
150
- end
151
-
152
- def ruby_line_stub(file_path)
153
- lines = File.foreach(file_path).map { nil }
154
- iseqs = [::RubyVM::InstructionSequence.compile_file(file_path)]
155
-
156
- until iseqs.empty?
157
- iseq = iseqs.pop
158
-
159
- iseq.trace_points.each { |line_number, type| lines[line_number - 1] = 0 if type == :line }
160
- iseq.each_child { |child| iseqs << child }
161
- end
162
-
163
- lines
164
- end
165
-
166
- def jruby_line_stub(file_path)
167
- lines = File.foreach(file_path).map { nil }
168
- root_node = ::JRuby.parse(File.read(file_path, encoding: 'UTF-8'))
169
-
170
- visitor = org.jruby.ast.visitor.NodeVisitor.impl do |_name, node|
171
- if node.newline?
172
- if node.respond_to?(:position)
173
- lines[node.position.line] = 0
174
- else
175
- lines[node.line] = 0
176
- end
177
- end
178
-
179
- node.child_nodes.each { |child| child&.accept(visitor) }
180
- end
181
-
182
- root_node.accept(visitor)
183
-
184
- lines
185
- end
186
- end
187
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RSpecTracer
4
- class CoverageWriter
5
- def initialize(file_name, reporter)
6
- @file_name = file_name
7
- @reporter = reporter
8
- end
9
-
10
- def write_report
11
- report = {
12
- RSpecTracer: {
13
- coverage: @reporter.coverage,
14
- timestamp: Time.now.utc.to_i
15
- }
16
- }
17
-
18
- File.write(@file_name, JSON.pretty_generate(report), encoding: 'UTF-8')
19
- end
20
-
21
- def print_stats(elapsed_time)
22
- starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
23
-
24
- total, covered, percent = coverage_stats
25
-
26
- ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
27
- elapsed = RSpecTracer::TimeFormatter.format_time((ending - starting) + elapsed_time)
28
-
29
- RSpecTracer.logger.info <<-STATS.strip.gsub(/\s+/, ' ')
30
- Coverage report generated for RSpecTracer to #{@file_name}.
31
- #{covered} / #{total} LOC (#{percent}%) covered (took #{elapsed})
32
- STATS
33
- end
34
-
35
- private
36
-
37
- def coverage_stats
38
- total_loc = 0
39
- covered_loc = 0
40
- covered_percent = 0.0
41
-
42
- @reporter.coverage.each_pair do |_file_path, line_coverage|
43
- line_coverage.each do |strength|
44
- next if strength.nil?
45
-
46
- total_loc += 1
47
- covered_loc += 1 if strength.positive?
48
- end
49
- end
50
-
51
- return [total_loc, covered_loc, covered_percent] if total_loc.zero?
52
-
53
- covered_percent = (100.0 * covered_loc / total_loc).round(2)
54
-
55
- [total_loc, covered_loc, covered_percent]
56
- end
57
- end
58
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :assets do
4
- desc 'Compiles all assets'
5
- task :precompile do
6
- require 'sprockets'
7
-
8
- assets = Sprockets::Environment.new do |env|
9
- env.append_path 'assets/javascripts'
10
- env.append_path 'assets/stylesheets'
11
- env.js_compressor = :uglifier
12
- env.css_compressor = :yui
13
- end
14
-
15
- assets['application.js'].write_to('public/application.js')
16
- assets['application.css'].write_to('public/application.css')
17
- end
18
- end