rspec-tracer 0.7.0 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,12 @@
1
1
  ![](./readme_files/rspec_tracer.png)
2
2
 
3
- RSpec Tracer is a **specs dependency analysis tool** and a **test skipper for RSpec**.
4
- It maintains a list of files for each test, enabling itself to skip tests in the
5
- subsequent runs if none of the dependent files are changed.
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/eabce2757839c08d8f8d/maintainability)](https://codeclimate.com/github/avmnu-sng/rspec-tracer/maintainability)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/eabce2757839c08d8f8d/test_coverage)](https://codeclimate.com/github/avmnu-sng/rspec-tracer/test_coverage)
5
+ [![Gem Version](https://badge.fury.io/rb/rspec-tracer.svg)](https://badge.fury.io/rb/rspec-tracer)
6
+
7
+ RSpec Tracer is a **specs dependency analyzer**, **flaky tests detector**, **tests accelerator**,
8
+ and **coverage reporter** tool. It maintains a list of files for each test, enabling
9
+ itself to skip tests in the subsequent runs if none of the dependent files are changed.
6
10
 
7
11
  It uses [Ruby's built-in coverage library](https://ruby-doc.org/stdlib/libdoc/coverage/rdoc/Coverage.html)
8
12
  to keep track of the coverage for each test. For each test executed, the coverage
@@ -18,45 +22,23 @@ Knowing the examples and files dependency gives us a better insight into the cod
18
22
  and we have **a clear idea of what to test for when making any changes**. With this data,
19
23
  we can also analyze the coupling between different components and much more.
20
24
 
21
- ## Note
25
+ RSpec Tracer requires **Ruby 2.5+** and **rspec-core >= 3.6.0**. To use with **Rails 5+**,
26
+ make sure to use **rspec-rails >= 4.0.0**. If you are using SimpleCov, it is
27
+ recommended to use **simplecov >= 0.12.0**. To use RSpec Tracer **cache on CI**, you
28
+ need to have an **S3 bucket** and **[AWS CLI](https://aws.amazon.com/cli/)**
29
+ installed.
22
30
 
23
- You should take some time and go through the **[document](./RSPEC_TRACER.md)** describing
24
- the **intention** and implementation details of **managing dependency**, **managing flaky tests**,
25
- **skipping tests**, and **caching on CI**. You must go through the README file before
26
- integrating the gem into your project to better understand what is happening.
31
+ ### You should take some time and go through the **[document](./RSPEC_TRACER.md)** describing the **intention** and implementation details of **managing dependency**, **managing flaky tests**, **skipping tests**, and **caching on CI**.
27
32
 
28
33
  ## Table of Contents
29
34
 
30
35
  * [Demo](#demo)
31
- * [Installation](#installation)
32
- * [Compatibility](#compatibility)
33
- * [Additional Tools](#additional-tools)
34
36
  * [Getting Started](#getting-started)
35
- * [Environment Variables](#environment-variables)
36
- * [BUNDLE_PATH](#bundle_path)
37
- * [CI](#ci)
38
- * [LOCAL_AWS](#local_aws)
39
- * [RSPEC_TRACER_NO_SKIP](#rspec_tracer_no_skip)
40
- * [RSPEC_TRACER_S3_URI](#rspec_tracer_s3_uri)
41
- * [RSPEC_TRACER_UPLOAD_LOCAL_CACHE](#rspec_tracer_upload_local_cache)
42
- * [RSPEC_TRACER_VERBOSE](#rspec_tracer_verbose)
43
- * [TEST_SUITES](#test_suites)
44
- * [TEST_SUITE_ID](#test_suite_id)
45
- * [Sample Reports](#sample-reports)
46
- * [Examples](#examples)
47
- * [Flaky Examples](#flaky-examples)
48
- * [Examples Dependency](#examples-dependency)
49
- * [Files Dependency](#files-dependency)
50
- * [Configuring RSpec Tracer](#configuring-rspec-tracer)
37
+ * [Configuring CI Caching](#configuring-ci-caching)
38
+ * [Advanced Configuration](#advanced-configuration)
51
39
  * [Filters](#filters)
52
- * [Defining Custom Filteres](#defining-custom-filteres)
53
- * [String Filter](#string-filter)
54
- * [Regex Filter](#regex-filter)
55
- * [Block Filter](#block-filter)
56
- * [Array Filter](#array-filter)
57
- * [Contributing](#contributing)
58
- * [License](#license)
59
- * [Code of Conduct](#code-of-conduct)
40
+ * [Environment Variables](#environment-variables)
41
+ * [When Should You Not Use RSpec Tracer](#when-should-you-not-use-rspec-tracer)
60
42
 
61
43
  ## Demo
62
44
 
@@ -66,317 +48,406 @@ integrating the gem into your project to better understand what is happening.
66
48
  **Next Run**
67
49
  ![](./readme_files/next_run.gif)
68
50
 
51
+ You get the following three reports:
69
52
 
70
- ## Installation
53
+ ### All Examples Report
71
54
 
72
- Add this line to your `Gemfile` and `bundle install`:
73
- ```ruby
74
- gem 'rspec-tracer', '~> 0.6', group: :test, require: false
75
- ```
55
+ These reports provide basic test information:
76
56
 
77
- And, add the followings to your `.gitignore`:
78
- ```
79
- /rspec_tracer_cache/
80
- /rspec_tracer_coverage/
81
- /rspec_tracer_report/
82
- ```
57
+ **First Run**
83
58
 
84
- ### Compatibility
59
+ ![](./readme_files/examples_report_first_run.png)
85
60
 
86
- RSpec Tracer requires **Ruby 2.5+** and **rspec-core >= 3.6.0**. To use with **Rails 5+**,
87
- make sure to use **rspec-rails >= 4.0.0**. If you are using SimpleCov, it is
88
- recommended to use **simplecov >= 0.12.0**.
61
+ **Next Run**
89
62
 
90
- ### Additional Tools
63
+ ![](./readme_files/examples_report_next_run.png)
91
64
 
92
- To use RSpec Tracer on CI, you need to have an **S3 bucket** and
93
- **[AWS CLI](https://aws.amazon.com/cli/)** installed.
65
+ ### Flaky Examples Report
94
66
 
95
- ## Getting Started
67
+ These reports provide flaky tests information. Assuming **the following two tests
68
+ failed in the first run.**
96
69
 
97
- 1. **Load and Start RSpec Tracer**
70
+ **Next Run**
98
71
 
99
- - **With SimpleCov**
72
+ ![](./readme_files/flaky_examples_report_first_run.png)
100
73
 
101
- If you are using `SimpleCov`, load RSpec Tracer right after the SimpleCov load
102
- and launch:
74
+ **Another Run**
103
75
 
104
- ```ruby
105
- require 'simplecov'
106
- SimpleCov.start
76
+ ![](./readme_files/flaky_examples_report_next_run.png)
107
77
 
108
- # Load RSpec Tracer
109
- require 'rspec_tracer'
110
- RSpecTracer.start
111
- ```
78
+ ### Examples Dependency Report
112
79
 
113
- Currently using RSpec Tracer with SimpleCov has the following two limitations:
114
- - SimpleCov **won't be able to provide branch coverage report** even when enabled.
115
- - RSpec Tracer **nullifies the `SimpleCov.at_exit`** callback.
80
+ These reports show a list of dependent files for each test.
116
81
 
117
- - **Without SimpleCov**
82
+ ![](./readme_files/examples_dependency_report.png)
118
83
 
119
- Load and launch RSpec Tracer at the very top of `spec_helper.rb` (or `rails_helper.rb`,
120
- `test/test_helper.rb`). Note that `RSpecTracer.start` must be issued **before loading
121
- any of the application code.**
84
+ ### Files Dependency Report
122
85
 
123
- ```ruby
124
- # Load RSpec Tracer
125
- require 'rspec_tracer'
126
- RSpecTracer.start
127
- ```
86
+ These reports provide information on the total number of tests that will run after changing this particular file.
128
87
 
129
- 2. To enable RSpec Tracer to share cache between different builds on CI, update the
130
- Rakefile in your project to have the following:
88
+ ![](./readme_files/files_dependency_report.png)
131
89
 
132
- ```ruby
133
- spec = Gem::Specification.find_by_name('rspec-tracer')
134
90
 
135
- load "#{spec.gem_dir}/lib/rspec_tracer/remote_cache/Rakefile"
136
- ```
137
- 3. Before running tests, download the remote cache using the following rake task:
91
+ ## Getting Started
138
92
 
139
- ```sh
140
- bundle exec rake rspec_tracer:remote_cache:download
93
+ 1. Add this line to your `Gemfile` and `bundle install`:
94
+ ```ruby
95
+ gem 'rspec-tracer', '~> 0.9', group: :test, require: false
141
96
  ```
142
- 4. Run the tests with RSpec using `bundle exec rspec`.
143
- 5. After running tests, upload the local cache using the following rake task:
144
97
 
145
- ```sh
146
- bundle exec rake rspec_tracer:remote_cache:upload
98
+ And, add the followings to your `.gitignore`:
147
99
  ```
148
- 6. After running your tests, open `rspec_tracer_report/index.html` in the
149
- browser of your choice.
150
-
151
- ## Environment Variables
152
-
153
- To get better control on execution, you can use the following environment variables
154
- whenever required.
155
-
156
- ### BUNDLE_PATH
157
-
158
- Since the bundler uses a vendor directory inside the project, it might cause slowness
159
- depending on the vendor size. You can configure the bundle path outside of the project
160
- using `BUNDLE_PATH` environment variable, for example, `BUNDLE_PATH=$HOME/vendor/bundle`.
161
- Make sure to cache this directory in the CI configuration.
162
-
163
- ### CI
164
-
165
- Mostly all the CI have `CI=true`. If not, you should explicitly set it to `true`.
166
-
167
- ### LOCAL_AWS
168
-
169
- In case you want to test out the caching feature in the local development environment.
170
- You can install [localstack](https://github.com/localstack/localstack) and
171
- [awscli-local](https://github.com/localstack/awscli-local) and then invoke the
172
- rake tasks with `LOCAL_AWS=true`.
173
-
174
- ### RSPEC_TRACER_NO_SKIP
175
-
176
- The default value is `false.` If set to `true`, the RSpec Tracer will not skip
177
- any tests. Note that it will continue to maintain cache files and generate reports.
178
-
179
- ```ruby
180
- RSPEC_TRACER_NO_SKIP=true bundle exec rspec
181
- ```
182
-
183
- ### RSPEC_TRACER_S3_URI
184
-
185
- You should provide the S3 bucket path to store the cache files.
186
-
187
- ```ruby
188
- export RSPEC_TRACER_S3_URI=s3://ci-artifacts-bucket/rspec-tracer-cache
189
- ```
100
+ /rspec_tracer_cache/
101
+ /rspec_tracer_coverage/
102
+ /rspec_tracer_report/
103
+ ```
104
+ 2. Load and launch RSpec Tracer at the very top of `spec_helper.rb` (or `rails_helper.rb`,
105
+ `test/test_helper.rb`). Note that `RSpecTracer.start` must be issued **before loading
106
+ any of the application code.**
190
107
 
191
- ### RSPEC_TRACER_UPLOAD_LOCAL_CACHE
108
+ ```ruby
109
+ # Load RSpec Tracer
110
+ require 'rspec_tracer'
111
+ RSpecTracer.start
112
+ ```
192
113
 
193
- By default, RSpec Tracer does not upload local cache files. You can set this
194
- environment variable to `true` to upload the local cache to S3.
114
+ **If you are using SimpleCov**, load RSpec Tracer right after the SimpleCov load
115
+ and launch:
195
116
 
196
- ### RSPEC_TRACER_VERBOSE
117
+ ```ruby
118
+ require 'simplecov'
119
+ SimpleCov.start
197
120
 
198
- To print the intermediate steps and time taken, use this environment variable:
121
+ # Load RSpec Tracer
122
+ require 'rspec_tracer'
123
+ RSpecTracer.start
124
+ ```
199
125
 
200
- ```sh
201
- export RSPEC_TRACER_VERBOSE=true
202
- ```
126
+ If you use RSpec Tracer with SimpleCov, then **SimpleCov would not report branch
127
+ coverage results even when enabled**.
203
128
 
204
- ### TEST_SUITES
129
+ 3. After running your tests, open `rspec_tracer_report/index.html` in the browser
130
+ of your choice.
205
131
 
206
- Set this environment variable when using test suite id. It determines the total
207
- number of different test suites you are running.
132
+ ## Configuring CI Caching
208
133
 
134
+ To enable RSpec Tracer to share cache between different builds on CI, update the
135
+ Rakefile in your project to have the following:
209
136
  ```ruby
210
- export TEST_SUITES=8
211
- ```
212
-
213
- ### TEST_SUITE_ID
137
+ spec = Gem::Specification.find_by_name('rspec-tracer')
214
138
 
215
- If you have a large set of tests to run, it is recommended to run them in
216
- separate groups. This way, RSpec Tracer is not overwhelmed with loading massive
217
- cached data in the memory. Also, it generates and uses cache for specific test suites
218
- and not merge them.
219
-
220
- ```ruby
221
- TEST_SUITE_ID=1 bundle exec rspec spec/models
222
- TEST_SUITE_ID=2 bundle exec rspec spec/helpers
139
+ load "#{spec.gem_dir}/lib/rspec_tracer/remote_cache/Rakefile"
223
140
  ```
224
141
 
225
- If you run parallel builds on the CI, you should specify the test suite ID and
226
- the total number of test suites when downloading the cache files.
227
-
142
+ Before running tests, download the remote cache using the following rake task:
228
143
  ```sh
229
- $ TEST_SUITES=5 TEST_SUITE_ID=1 bundle exec rake rspec_tracer:remote_cache:download
144
+ bundle exec rake rspec_tracer:remote_cache:download
230
145
  ```
231
146
 
232
- In this case, the appropriate cache should have all the cache files available on
233
- the S3 for each test suite, not just for the current one. Also, while uploading,
234
- make sure to provide the test suite id.
235
-
147
+ After running tests, upload the local cache using the following rake task:
236
148
  ```sh
237
- $ TEST_SUITE_ID=1 bundle exec rake rspec_tracer:remote_cache:upload
149
+ bundle exec rake rspec_tracer:remote_cache:upload
238
150
  ```
239
151
 
240
- ## Sample Reports
241
-
242
- You get the following three reports:
243
-
244
- ### Examples
245
-
246
- These reports provide basic test information:
247
-
248
- **First Run**
249
-
250
- ![](./readme_files/examples_report_first_run.png)
251
-
252
- **Next Run**
253
-
254
- ![](./readme_files/examples_report_next_run.png)
152
+ You must set the following two environment variables:
255
153
 
256
- ### Flaky Examples
154
+ - **`GIT_BRANCH`** is the git branch name you are running the CI build on.
155
+ - **`RSPEC_TRACER_S3_URI`** is the S3 bucket path to store the cache files.
156
+ ```sh
157
+ export RSPEC_TRACER_S3_URI=s3://ci-artifacts-bucket/rspec-tracer-cache
158
+ ```
257
159
 
258
- These reports provide flaky tests information. Assuming **the following two tests
259
- failed in the first run.**
160
+ ## Advanced Configuration
260
161
 
261
- **Next Run**
162
+ Configuration settings can be applied in three formats, which are completely equivalent:
262
163
 
263
- ![](./readme_files/flaky_examples_report_first_run.png)
164
+ - The most common way is to configure it directly in your start block:
165
+ ```ruby
166
+ RSpecTracer.start do
167
+ config_option 'foo'
168
+ end
169
+ ```
170
+ - You can also set all configuration options directly:
171
+ ```ruby
172
+ RSpecTracer.config_option 'foo'
173
+ ```
264
174
 
265
- **Another Run**
175
+ - If you do not want to start tracer immediately after launch or want to add
176
+ additional configuration later on in a concise way, use:
177
+ ```ruby
178
+ RSpecTracer.configure do
179
+ config_option 'foo'
180
+ end
181
+ ```
266
182
 
267
- ![](./readme_files/flaky_examples_report_next_run.png)
183
+ The available configuration options are:
268
184
 
269
- ### Examples Dependency
185
+ - **`root dir`** to set the project root. The default value is the current working
186
+ directory.
187
+ - **`add_filter filter`** to apply [filters](#filters) on the source files to
188
+ exclude them from the dependent files list.
189
+ - **`filters.clear`** to remove the default configured dependent files filters.
190
+ - **`add_coverage_filter filter`** to apply [filters](#filters) on the source files
191
+ to exclude them from the coverage report.
192
+ - **`coverage_filters.clear`** to remove the default configured coverage files filters.
193
+ - **`coverage_track_files glob`** to include files in the given glob pattern in
194
+ the coverage report if these files are not already present.
270
195
 
271
- These reports show a list of dependent files for each test.
196
+ ```ruby
197
+ RSpecTracer.start do
198
+ # Configure project root
199
+ root '/tmp/my_project'
272
200
 
273
- ![](./readme_files/examples_dependency_report.png)
201
+ # Clear existing filters
202
+ filters.clear
203
+ # Add dependent files filter
204
+ add_filter %r{^/tasks/}
274
205
 
275
- ### Files Dependency
206
+ # Clear existing coverage filters
207
+ coverage_filters.clear
208
+ # Add coverage files filter
209
+ add_coverage_filter %w[/features/ /spec/ /tests/]
276
210
 
277
- These reports provide information on the total number of tests that will run after changing this particular file.
211
+ # Define glob to track files in the coverage report
212
+ coverage_track_files '{app,lib}/**/*.rb'
213
+ end
214
+ ```
278
215
 
279
- ![](./readme_files/files_dependency_report.png)
216
+ You can configure the RSpec Tracer reports directories using the following environment
217
+ variables:
218
+
219
+ - **`RSPEC_TRACER_CACHE_DIR`** to update the default cache directory (`rspec_tracer_cache`).
220
+ ```sh
221
+ export RSPEC_TRACER_CACHE_DIR=/tmp/rspec_tracer_cache
222
+ ```
223
+ - **`RSPEC_TRACER_COVERAGE_DIR`** to update the default coverage directory (`rspec_tracer_coverage`).
224
+ ```sh
225
+ export RSPEC_TRACER_CACHE_DIR=/tmp/rspec_tracer_coverage
226
+ ```
227
+ - **`RSPEC_TRACER_REPORT_DIR`** to update the default html reports directory (`rspec_tracer_report`).
228
+ ```sh
229
+ export RSPEC_TRACER_CACHE_DIR=/tmp/rspec_tracer_report
230
+ ```
231
+
232
+ These settings are available through environment variables because the rake tasks
233
+ to download and upload the cache files need to use the same directories.
280
234
 
281
- ## Configuring RSpec Tracer
235
+ ## Filters
282
236
 
283
- Configuration settings can be applied in three formats, which are completely equivalent:
237
+ By default, RSpec Tracer ignores all the files outside of the project root directory -
238
+ otherwise you would end up with the source files in the gems you are using in the
239
+ project. It also applies the following filters:
240
+ ```ruby
241
+ RSpecTracer.configure do
242
+ add_filter '/vendor/bundle/'
243
+
244
+ add_coverage_filter %w[
245
+ /autotest/
246
+ /features/
247
+ /spec/
248
+ /test/
249
+ /vendor/bundle/
250
+ ].freeze
251
+ end
252
+ ```
284
253
 
285
- - The most common way is to configure it directly in your start block:
254
+ ### Defining Custom Filteres
286
255
 
287
- ```ruby
288
- RSpecTracer.start do
289
- config_option 'foo'
256
+ You can currently define a filter using either a String or Regexp (that will then
257
+ be Regexp-matched against each source file's name relative to the project root),
258
+ a block or by passing in your own Filter class.
259
+
260
+ - **String Filter**: The string filter matches files that have the given string
261
+ in their name. For example, the following string filter will remove all files that
262
+ have `"/helpers/"` in their name.
263
+ ```ruby
264
+ RSpecTracer.start do
265
+ add_filter '/helpers/'
266
+ end
267
+ ```
268
+
269
+ - **Regex Filter**: The regex filter removes all files that have a successful name
270
+ match against the given regex expression. This simple regex filter will remove
271
+ all files that start with `%r{^/helper/}` in their name:
272
+ ```ruby
273
+ RSpecTracer.start do
274
+ add_filter %r{^/helpers/}
275
+ end
276
+ ```
277
+
278
+ - **Block Filter**: Block filters receive a `Hash` object and expect your block
279
+ to return either **true** (if the file is to be removed from the result) or **false**
280
+ (if the result should be kept). In the below example, the filter will remove all
281
+ files that match `"/helpers/"` in their path.
282
+ ```ruby
283
+ RSpecTracer.start do
284
+ add_filter do |source_file|
285
+ source_file[:file_path].include?('/helpers/')
290
286
  end
291
- ```
292
- - You can also set all configuration options directly:
293
-
294
- ```ruby
295
- RSpecTracer.config_option 'foo'
296
- ```
297
-
298
- - If you do not want to start tracer immediately after launch or want to add
299
- additional configuration later on in a concise way, use:
287
+ end
288
+ ```
300
289
 
301
- ```ruby
302
- RSpecTracer.configure do
303
- config_option 'foo'
304
- end
305
- ```
290
+ You can also use `source_file[:name]` to define the return value of the block
291
+ filter for the given source file.
306
292
 
307
- ## Filters
293
+ - **Array Filter**: You can pass in an array containing any of the other filter types:
294
+ ```ruby
295
+ RSpecTracer.start do
296
+ add_filter ['/helpers/', %r{^/utils/}]
297
+ end
298
+ ```
308
299
 
309
- RSpec Tracer supports two types of filters:
300
+ ## Environment Variables
310
301
 
311
- - To exclude selected files from the dependency list of tests:
302
+ To get better control on execution, you can use the following environment variables
303
+ whenever required.
312
304
 
313
- ```ruby
314
- RSpecTracer.start do
315
- add_filter %r{^/helpers/}
316
- end
317
- ```
318
- - To exclude selected files from the coverage data. You should only use this
319
- when not using SimpleCov.
305
+ - **`LOCAL_AWS (default: false)`:** In case you want to test out the caching feature in the local
306
+ development environment. You can install [localstack](https://github.com/localstack/localstack)
307
+ and [awscli-local](https://github.com/localstack/awscli-local) and then invoke the
308
+ rake tasks with `LOCAL_AWS=true`.
320
309
 
321
- ```ruby
322
- RSpecTracer.start do
323
- add_coverage_filter %r{^/tasks/}
324
- end
325
- ```
310
+ - **`RSPEC_TRACER_NO_SKIP (default: false)`:** Use this environment variables to
311
+ not skip any tests. Note that it will continue to maintain cache files and generate
312
+ reports.
326
313
 
327
- By default, a filter is applied that removes all files OUTSIDE of your project's
328
- root directory - otherwise you'd end up with the source files in the gems you are
329
- using as tests dependency.
314
+ - **`RSPEC_TRACER_UPLOAD_LOCAL_CACHE (default: false)`:** By default, RSpec Tracer
315
+ does not upload local cache files. You can set this environment variable to `true`
316
+ to upload the local cache to S3.
330
317
 
331
- ### Defining Custom Filteres
318
+ - **`RSPEC_TRACER_VERBOSE (default: false)`:** To print the intermediate steps
319
+ and time taken, use this environment variable.
332
320
 
333
- You can currently define a filter using either a String or Regexp (that will then
334
- be Regexp-matched against each source file's path), a block or by passing in your
335
- own Filter class.
321
+ - **`TEST_SUITES`:** Set this environment variable when running parallel builds
322
+ in the CI. It determines the total number of different test suites you are running.
323
+ ```sh
324
+ export TEST_SUITES=8
325
+ ```
336
326
 
337
- #### String Filter
327
+ - **`TEST_SUITE_ID`:** If you have a large set of tests to run, it is recommended
328
+ to run them in separate groups. This way, RSpec Tracer is not overwhelmed with
329
+ loading massive cached data in the memory. Also, it generates and uses cache for
330
+ specific test suites and not merge them.
331
+ ```sh
332
+ TEST_SUITE_ID=1 bundle exec rspec spec/models
333
+ TEST_SUITE_ID=2 bundle exec rspec spec/helpers
334
+ ```
338
335
 
339
- ```ruby
340
- RSpecTracer.start do
341
- add_filter '/helpers/'
342
- end
343
- ```
336
+ ## When Should You Not Use RSpec Tracer
344
337
 
345
- This simple string filter will remove all files that match "/helpers/" in their path.
338
+ To uniquely identify the examples is one of the requirements for the correctness
339
+ of the RSpec Tracer. Sometimes, it would not be possible to do so depending upon
340
+ how we have written the specs. The following attributes determine the uniqueness:
346
341
 
347
- #### Regex Filter
342
+ - The example group
343
+ - The example full description
344
+ - The spec file location, i.e., file name and line number
345
+ - All the shared examples and contexts
348
346
 
347
+ Consider the following `Calculator` module:
349
348
  ```ruby
350
- RSpecTracer.start do
351
- add_filter %r{^/helpers/}
349
+ module Calculator
350
+ module_function
351
+
352
+ def add(a, b) a + b; end
353
+ def sub(a, b) a - b; end
354
+ def mul(a, b) a * b; end
352
355
  end
353
356
  ```
354
357
 
355
- This simple regex filter will remove all files that start with /helper/ in their path.
358
+ And the corresponding spec file `spec/calculator_spec.rb`:
359
+ ```ruby
360
+ RSpec.describe Calculator do
361
+ describe '#add' do
362
+ [
363
+ [1, 2, 3],
364
+ [0, 0, 0],
365
+ [5, 32, 37],
366
+ [-1, -8, -9],
367
+ [10, -10, 0]
368
+ ].each { |a, b, r| it { expect(described_class.add(a, b)).to eq(r) } }
369
+ end
356
370
 
357
- #### Block Filter
371
+ describe '#sub' do
372
+ [
373
+ [1, 2, -1],
374
+ [10, 0, 10],
375
+ [37, 5, 32],
376
+ [-1, -8, 7],
377
+ [10, 10, 0]
378
+ ].each do |a, b, r|
379
+ it 'performs subtraction' do
380
+ expect(described_class.sub(a, b)).to eq(r)
381
+ end
382
+ end
383
+ end
358
384
 
359
- ```ruby
360
- RSpecTracer.start do
361
- add_filter do |source_file|
362
- source_file[:file_path].include?('/helpers/')
385
+ describe '#mul' do
386
+ [
387
+ [1, 2, -2],
388
+ [10, 0, 0],
389
+ [5, 7, 35],
390
+ [-1, -8, 8],
391
+ [10, 10, 100]
392
+ ].each do |a, b, r|
393
+ it "multiplies #{a} and #{b} to #{r}" do
394
+ expect(described_class.mul(a, b)).to eq(r)
395
+ end
396
+ end
363
397
  end
364
398
  end
365
399
  ```
366
400
 
367
- Block filters receive a `Hash` object and expect your block to return either true
368
- (if the file is to be removed from the result) or false (if the result should be kept).
369
- In the above example, the filter will remove all files that match "/helpers/" in their path.
401
+ Running the spec with `bundle exec rspec spec/calculator_spec.rb` generates the
402
+ following output:
403
+ ```
404
+ Calculator
405
+ #mul
406
+ multiplies 5 and 7 to 35
407
+ multiplies 10 and 10 to 100
408
+ multiplies 10 and 0 to 0
409
+ multiplies 1 and 2 to -2 (FAILED - 1)
410
+ multiplies -1 and -8 to 8
411
+ #add
412
+ example at ./spec/calculator_spec.rb:13
413
+ example at ./spec/calculator_spec.rb:13
414
+ example at ./spec/calculator_spec.rb:13
415
+ example at ./spec/calculator_spec.rb:13
416
+ example at ./spec/calculator_spec.rb:13
417
+ #sub
418
+ performs subtraction
419
+ performs subtraction
420
+ performs subtraction
421
+ performs subtraction
422
+ performs subtraction
423
+ ```
370
424
 
371
- #### Array Filter
425
+ In this scenario, RSpec Tracer cannot determine the `Calculator#add` and
426
+ `Calculator#sub` group examples. Also, it will ask you not to use the gem unless
427
+ you have made some changes to your spec files.
372
428
 
373
- ```ruby
374
- RSpecTracer.start do
375
- add_filter ['/helpers/', %r{^/utils/}]
376
- end
377
429
  ```
378
-
379
- You can pass in an array containing any of the other filter types.
430
+ ================================================================================
431
+ IMPORTANT NOTICE -- DO NOT USE RSPEC TRACER
432
+ ================================================================================
433
+ It would be best to make changes so that the RSpec tracer can uniquely
434
+ identify all the examples, and then you can enable the RSpec tracer back.
435
+ ================================================================================
436
+
437
+ RSpec tracer could not uniquely identify the following 10 examples:
438
+ - Example ID: eabd51a899db4f64d5839afe96004f03 (5 examples)
439
+ * Calculator#add (spec/calculator_spec.rb:13)
440
+ * Calculator#add (spec/calculator_spec.rb:13)
441
+ * Calculator#add (spec/calculator_spec.rb:13)
442
+ * Calculator#add (spec/calculator_spec.rb:13)
443
+ * Calculator#add (spec/calculator_spec.rb:13)
444
+ - Example ID: 72171b502c5a42b9aa133f165cf09ec2 (5 examples)
445
+ * Calculator#sub performs subtraction (spec/calculator_spec.rb:24)
446
+ * Calculator#sub performs subtraction (spec/calculator_spec.rb:24)
447
+ * Calculator#sub performs subtraction (spec/calculator_spec.rb:24)
448
+ * Calculator#sub performs subtraction (spec/calculator_spec.rb:24)
449
+ * Calculator#sub performs subtraction (spec/calculator_spec.rb:24)
450
+ ```
380
451
 
381
452
  ## Contributing
382
453