capybara-screenshot-diff 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +29 -0
  3. data/capybara-screenshot-diff.gemspec +7 -4
  4. data/gems.rb +8 -2
  5. data/lib/capybara/screenshot/diff/browser_helpers.rb +29 -28
  6. data/lib/capybara/screenshot/diff/cucumber.rb +11 -0
  7. data/lib/capybara/screenshot/diff/difference.rb +63 -0
  8. data/lib/capybara/screenshot/diff/drivers/base_driver.rb +42 -0
  9. data/lib/capybara/screenshot/diff/drivers/chunky_png_driver.rb +188 -260
  10. data/lib/capybara/screenshot/diff/drivers/utils.rb +16 -0
  11. data/lib/capybara/screenshot/diff/drivers/vips_driver.rb +53 -103
  12. data/lib/capybara/screenshot/diff/drivers.rb +16 -0
  13. data/lib/capybara/screenshot/diff/image_compare.rb +125 -154
  14. data/lib/capybara/screenshot/diff/os.rb +1 -1
  15. data/lib/capybara/screenshot/diff/screenshot_matcher.rb +128 -0
  16. data/lib/capybara/screenshot/diff/screenshoter.rb +137 -0
  17. data/lib/capybara/screenshot/diff/stabilization.rb +0 -184
  18. data/lib/capybara/screenshot/diff/stable_screenshoter.rb +106 -0
  19. data/lib/capybara/screenshot/diff/test_methods.rb +51 -90
  20. data/lib/capybara/screenshot/diff/vcs.rb +44 -22
  21. data/lib/capybara/screenshot/diff/version.rb +1 -1
  22. data/lib/capybara/screenshot/diff.rb +13 -17
  23. data/sig/capybara/screenshot/diff/diff.rbs +28 -0
  24. data/sig/capybara/screenshot/diff/difference.rbs +33 -0
  25. data/sig/capybara/screenshot/diff/drivers/base_driver.rbs +63 -0
  26. data/sig/capybara/screenshot/diff/drivers/browser_helpers.rbs +36 -0
  27. data/sig/capybara/screenshot/diff/drivers/chunky_png_driver.rbs +89 -0
  28. data/sig/capybara/screenshot/diff/drivers/utils.rbs +13 -0
  29. data/sig/capybara/screenshot/diff/drivers/vips_driver.rbs +25 -0
  30. data/sig/capybara/screenshot/diff/image_compare.rbs +93 -0
  31. data/sig/capybara/screenshot/diff/os.rbs +11 -0
  32. data/sig/capybara/screenshot/diff/region.rbs +43 -0
  33. data/sig/capybara/screenshot/diff/screenshot_matcher.rbs +60 -0
  34. data/sig/capybara/screenshot/diff/screenshoter.rbs +48 -0
  35. data/sig/capybara/screenshot/diff/stable_screenshoter.rbs +29 -0
  36. data/sig/capybara/screenshot/diff/test_methods.rbs +39 -0
  37. data/sig/capybara/screenshot/diff/vcs.rbs +17 -0
  38. metadata +36 -27
  39. data/.gitattributes +0 -4
  40. data/.github/dependabot.yml +0 -8
  41. data/.github/workflows/lint.yml +0 -25
  42. data/.github/workflows/test.yml +0 -138
  43. data/.gitignore +0 -14
  44. data/.standard.yml +0 -12
  45. data/CONTRIBUTING.md +0 -24
  46. data/Dockerfile +0 -59
  47. data/README.md +0 -567
  48. data/bin/bundle +0 -114
  49. data/bin/console +0 -15
  50. data/bin/install-vips +0 -11
  51. data/bin/rake +0 -27
  52. data/bin/setup +0 -8
  53. data/bin/standardrb +0 -29
  54. data/gemfiles/rails60_gems.rb +0 -8
  55. data/gemfiles/rails61_gems.rb +0 -7
  56. data/gemfiles/rails70_gems.rb +0 -7
  57. data/tmp/.keep +0 -0
data/.standard.yml DELETED
@@ -1,12 +0,0 @@
1
- fix: true # default: false
2
- parallel: true # default: false
3
- format: progress # default: Standard::Formatter
4
- ruby_version: 2.7 # default: RUBY_VERSION
5
- default_ignores: false # default: true
6
-
7
- ignore: # default: []
8
- - 'bin/**/*'
9
- - 'gemfiles/vendor/**/*'
10
- - 'gemfiles/**/*':
11
- - Security/Eval
12
- - 'vendor/**/*'
data/CONTRIBUTING.md DELETED
@@ -1,24 +0,0 @@
1
- Contributing
2
- ============
3
-
4
- Bug reports and pull requests are welcome on GitHub at https://github.com/donv/capybara-screenshot-diff.
5
- This project is intended to be a safe, welcoming space for collaboration, and contributors are expected
6
- to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
7
-
8
- ## Testing
9
-
10
- Run the tests before committing using Rake
11
-
12
- rake
13
-
14
- ### Matrix testing
15
-
16
- Run the tests for a matrix of configurations of Ruby implementations and Rails versions
17
-
18
- ./matrix_text.rb
19
-
20
- ## Merging to master
21
-
22
- Before merging to `master`,
23
- please have a member of the project review your changes,
24
- and make sure the tests are green.
data/Dockerfile DELETED
@@ -1,59 +0,0 @@
1
- # Usage:
2
- #
3
- # $ docker build . -t csd
4
- # $ docker run -v $(pwd):/app -ti csd rake test
5
-
6
- FROM jetthoughts/cimg-ruby:3.1-chrome
7
-
8
- RUN \
9
- # Install dependencies
10
- sudo apt-get update && \
11
- DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \
12
- automake \
13
- build-essential \
14
- curl \
15
- fftw3-dev \
16
- gettext \
17
- gobject-introspection \
18
- gtk-doc-tools \
19
- libexif-dev \
20
- libfftw3-dev \
21
- libgif-dev \
22
- libglib2.0-dev \
23
- libgsf-1-dev \
24
- libgtk2.0-dev \
25
- libmagickwand-dev \
26
- libmatio-dev \
27
- libopenexr-dev \
28
- libopenslide-dev \
29
- liborc-0.4-dev \
30
- libpango1.0-dev \
31
- libpoppler-glib-dev \
32
- librsvg2-dev \
33
- libtiff5-dev \
34
- libwebp-dev \
35
- libxml2-dev \
36
- swig
37
-
38
-
39
- WORKDIR /app
40
- RUN sudo chmod a+w -R /app
41
-
42
- ADD ./bin/install-vips /app/bin/
43
- RUN sudo /app/bin/install-vips
44
-
45
- ADD ./lib/capybara/screenshot/diff/version.rb /app/lib/capybara/screenshot/diff/
46
- ADD ./capybara-screenshot-diff.gemspec /app/
47
- ADD ./gems.rb /app/
48
- ADD ./Rakefile /app/
49
-
50
- RUN bundle install
51
-
52
- RUN \
53
- # Clean up
54
- sudo apt-get remove -y curl automake build-essential && \
55
- sudo apt-get autoremove -y && \
56
- sudo apt-get autoclean && \
57
- sudo apt-get clean && \
58
- sudo rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
59
-
data/README.md DELETED
@@ -1,567 +0,0 @@
1
- [![Test](https://github.com/donv/capybara-screenshot-diff/actions/workflows/test.yml/badge.svg)](https://github.com/donv/capybara-screenshot-diff/actions/workflows/test.yml)
2
-
3
- # Capybara::Screenshot::Diff
4
-
5
- Ever wondered what your project looked like two years ago? To answer that, you
6
- start taking screen shots during your tests. Capybara provides the
7
- `save_screenshot` method for this. Very good.
8
-
9
- Ever introduced a graphical change unintended? Never want it to happen again?
10
- Then this gem is for you! Use this gem to detect changes in your pages by
11
- taking screen shots and comparing them to the previous revision.
12
-
13
- ## Installation
14
-
15
- Add these lines to your application's Gemfile:
16
-
17
- ```ruby
18
- gem 'capybara-screenshot-diff'
19
- gem 'oily_png', platform: :ruby
20
- ```
21
-
22
- And then execute:
23
-
24
- $ bundle
25
-
26
- Or install it yourself as:
27
-
28
- $ gem install capybara-screenshot-diff
29
-
30
- ### Requirements
31
-
32
- * [for :vips driver] libvips 8.9 or later, see the [libvips install instructions](https://libvips.github.io/libvips/install.html)
33
-
34
- ## Usage
35
-
36
- ### Minitest
37
-
38
- In your test class, include the `Capybara::Screenshot::Diff` module:
39
-
40
- ```ruby
41
- class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
42
- include Capybara::Screenshot::Diff
43
- # ...
44
- end
45
- ```
46
-
47
- ### RSpec
48
-
49
- ```ruby
50
- describe 'Permissions admin', type: :feature, js: true do
51
-
52
- include Capybara::Screenshot::Diff
53
-
54
- it 'works with permissions' do
55
- visit('/')
56
- screenshot 'home_page'
57
- end
58
-
59
- end
60
- ```
61
- But it's better to include it within your *_helper.rb file so that it can used anywhere in your feature specs.
62
- ```ruby
63
- # spec/feature_helper.rb
64
- require 'capybara/screenshot/diff'
65
-
66
- RSpec.configure do |config|
67
- config.include Capybara::Screenshot::Diff
68
- end
69
- ```
70
-
71
- ### Taking screenshots
72
-
73
- Add `screenshot '<my_feature>'` to your tests. The screenshot will be saved in
74
- the `doc/screenshots` directory.
75
-
76
- Change your existing `save_screenshot` calls to `screenshot`
77
-
78
- ```ruby
79
- test 'my useful feature' do
80
- visit '/'
81
- screenshot 'welcome_index'
82
- click_button 'Useful feature'
83
- screenshot 'feature_index'
84
- click_button 'Perform action'
85
- screenshot 'action_performed'
86
- end
87
- ```
88
-
89
- This will produce a sequence of images like this
90
-
91
- ```
92
- doc
93
- screenshots
94
- action_performed
95
- feature_index
96
- welcome_index
97
- ```
98
-
99
- To store the screen shot history, add the `doc/screenshots` directory to your
100
- version control system (git, svn, etc).
101
-
102
- Screen shots are compared to the previously COMMITTED version of the same screen shot.
103
-
104
- ### Screenshot groups
105
-
106
- Commonly it is useful to group screenshots around a feature, and record them as
107
- a sequence. To do this, add a `screenshot_group` call to the start of your
108
- test.
109
-
110
- ```ruby
111
- test 'my useful feature' do
112
- screenshot_group 'useful_feature'
113
- visit '/'
114
- screenshot 'welcome_index'
115
- click_button 'Useful feature'
116
- screenshot 'feature_index'
117
- click_button 'Perform action'
118
- screenshot 'action_performed'
119
- end
120
- ```
121
-
122
- This will produce a sequence of images like this
123
-
124
- ```
125
- doc
126
- screenshots
127
- useful_feature
128
- 00-welcome_index
129
- 01-feature_index
130
- 02-action_performed
131
- ```
132
-
133
- **All files in the screenshot group directory will be deleted when
134
- `screenshot_group` is called.**
135
-
136
-
137
- #### Screenshot sections
138
-
139
- You can introduce another level above the screenshot group called a
140
- `screenshot_section`. The section name is inserted just before the group name
141
- in the save path. If called in the setup of the test, all screenshots in
142
- that test will get the same prefix:
143
-
144
- ```ruby
145
- setup do
146
- screenshot_section 'my_feature'
147
- end
148
-
149
- test 'my subfeature' do
150
- screenshot_group 'subfeature'
151
- visit '/feature'
152
- click_button 'Interesting button'
153
- screenshot 'subfeature_index'
154
- click_button 'Perform action'
155
- screenshot 'action_performed'
156
- end
157
- ```
158
-
159
- This will produce a sequence of images like this
160
-
161
- ```
162
- doc
163
- screenshots
164
- my_feature
165
- subfeature
166
- 00-subfeature_index
167
- 01-action_performed
168
- ```
169
-
170
-
171
- #### Setting `screenshot_section` and/or `screenshot_group` for all tests
172
-
173
- Setting the `screenshot_section` and/or `screenshot_group` for all tests can be
174
- done in the super class setup:
175
-
176
- ```ruby
177
- class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
178
- setup do
179
- screenshot_section class_name.underscore.sub(/(_feature|_system)?_test$/, '')
180
- screenshot_group name[5..-1]
181
- end
182
- end
183
- ```
184
-
185
- `screenshot_section` and/or `screenshot_group` can still be overridden in each
186
- test.
187
-
188
-
189
- ### Capturing one area instead of the whole page
190
-
191
- You can crop images before comparison to be run, by providing region to crop as `[left, top, right, bottom]` or by css selector like `body .tag`
192
-
193
- ```ruby
194
- test 'the cool' do
195
- visit '/feature'
196
- screenshot 'cool_element', crop: '#my_element'
197
- end
198
- ```
199
-
200
-
201
- ### Multiple Capybara drivers
202
-
203
- Often it is useful to test your app using different browsers. To avoid the
204
- screenshots for different Capybara drivers to overwrite each other, set
205
-
206
- ```ruby
207
- Capybara::Screenshot.add_driver_path = true
208
- ```
209
-
210
- The example above will then save your screenshots like this
211
- (for poltergeist and selenium):
212
-
213
- ```
214
- doc
215
- screenshots
216
- poltergeist
217
- useful_feature
218
- 00-welcome_index
219
- 01-feature_index
220
- 02-action_performed
221
- selenium
222
- useful_feature
223
- 00-welcome_index
224
- 01-feature_index
225
- 02-action_performed
226
- ```
227
-
228
- ### Multiple OSs
229
-
230
- If you run your tests on multiple operating systems, you will most likely find
231
- the screen shots differ. To avoid the screenshots for different OSs to
232
- overwrite each other, set
233
-
234
- ```ruby
235
- Capybara::Screenshot.add_os_path = true
236
- ```
237
-
238
- The example above will then save your screenshots like this
239
- (for Linux and Windows):
240
-
241
- ```
242
- doc
243
- screenshots
244
- linux
245
- useful_feature
246
- 00-welcome_index
247
- 01-feature_index
248
- 02-action_performed
249
- windows
250
- useful_feature
251
- 00-welcome_index
252
- 01-feature_index
253
- 02-action_performed
254
- ```
255
-
256
- If you combine this config with the `add_driver_path` config, the driver will be
257
- put in front of the OS name.
258
-
259
- ### Screen size
260
-
261
- You can specify the desired screen size using
262
-
263
- ```ruby
264
- Capybara::Screenshot.window_size = [1024, 768]
265
- ```
266
-
267
- This will force the screen shots to the given size, and skip taking screen shots
268
- unless the desired window size can be achieved.
269
-
270
- ### Disabling screen shots
271
-
272
- If you want to skip taking screen shots, set
273
-
274
- ```ruby
275
- Capybara::Screenshot.enabled = false
276
- ```
277
-
278
- You can of course set this by an environment variable
279
-
280
- ```ruby
281
- Capybara::Screenshot.enabled = ENV['TAKE_SCREENSHOTS']
282
- ```
283
-
284
- ### Disabling diff
285
-
286
- If you want to skip the assertion for change in the screen shot, set
287
-
288
- ```ruby
289
- Capybara::Screenshot::Diff.enabled = false
290
- ```
291
-
292
- Using an environment variable
293
-
294
- ```ruby
295
- Capybara::Screenshot::Diff.enabled = ENV['COMPARE_SCREENSHOTS']
296
- ```
297
-
298
- ### Screen shot save path
299
-
300
- By default, `Capybara::Screenshot::Diff` saves screenshots to a
301
- `doc/screenshots` folder, relative to either `Rails.root` (if you're in Rails),
302
- or your current directory otherwise.
303
-
304
- If you want to change where screenshots are saved to, then there are two
305
- configuration options that that are relevant.
306
-
307
- The most likely one you'll want to modify is ...
308
-
309
- ```ruby
310
- Capybara::Screenshot.save_path = "other/path"
311
- ```
312
-
313
- The `save_path` option is relative to `Capybara::Screenshot.root`.
314
-
315
- `Capybara::Screenshot.root` defaults to either `Rails.root` (if you're in
316
- Rails) or your current directory. You can change it to something entirely
317
- different if necessary, such as when using an alternative web framework.
318
-
319
- ```ruby
320
- Capybara::Screenshot.root = Hanami.root
321
- ```
322
-
323
- ### Screen shot stability
324
-
325
- To ensure that animations are finished before saving a screen shot, you can add
326
- a stability time limit. If the stability time limit is set, a second screen
327
- shot will be taken and compared to the first. This is repeated until two
328
- subsequent screen shots are identical.
329
-
330
- ```ruby
331
- Capybara::Screenshot.stability_time_limit = 0.1
332
- ```
333
-
334
- This can be overridden on a single screenshot:
335
-
336
- ```ruby
337
- test 'stability_time_limit' do
338
- visit '/'
339
- screenshot 'index', stability_time_limit: 0.5
340
- end
341
- ```
342
-
343
- ### Maximum wait limit
344
-
345
- When the `stability_time_limit` is set, but no stable screenshot can be taken, a timeout occurs.
346
- The timeout occurs after `Capybara.default_max_wait_time`, but can be overridden by an option.
347
-
348
- ```ruby
349
- test 'max wait time' do
350
- visit '/'
351
- screenshot 'index', wait: 20.seconds
352
- end
353
- ```
354
-
355
- ### Hiding the caret for active input elements
356
-
357
- In Chrome the screenshot includes the blinking input cursor. This can make it impossible to get a
358
- stable screenshot. To get around this you can set the `hide caret` option:
359
-
360
- ```ruby
361
- Capybara::Screenshot.hide_caret = true
362
- ```
363
-
364
- This will make the cursor (caret) transparent (invisible), so the blinking does not delay the screen shot.
365
-
366
-
367
- ### Removing focus from the active element
368
-
369
- Another way to avoid the cursor blinking is to set the `blur_active_element` option:
370
-
371
- ```ruby
372
- Capybara::Screenshot.blur_active_element = true
373
- ```
374
-
375
- This will remove the focus from the active element, removing the blinking cursor.
376
-
377
-
378
-
379
- ### Allowed color distance
380
-
381
- Sometimes you want to allow small differences in the images. For example, Chrome renders the same
382
- page slightly differently sometimes. You can set set the color difference threshold for the
383
- comparison using the `color_distance_limit` option to the `screenshot` method:
384
-
385
- ```ruby
386
- test 'color threshold' do
387
- visit '/'
388
- screenshot 'index', color_distance_limit: 30
389
- end
390
- ```
391
-
392
- The difference is calculated as the eucledian distance. You can also set this globally:
393
-
394
- ```ruby
395
- Capybara::Screenshot::Diff.color_distance_limit = 42
396
- ```
397
-
398
-
399
- ### Allowed shift distance
400
-
401
- Sometimes you want to allow small movements in the images. For example, jquer-tablesorter
402
- renders the same table slightly differently sometimes. You can set set the shift distance
403
- threshold for the comparison using the `shift_distance_limit` option to the `screenshot`
404
- method:
405
-
406
- ```ruby
407
- test 'color threshold' do
408
- visit '/'
409
- screenshot 'index', shift_distance_limit: 2
410
- end
411
- ```
412
-
413
- The difference is calculated as maximum distance in either the X or the Y axis.
414
- You can also set this globally:
415
-
416
- ```ruby
417
- Capybara::Screenshot::Diff.shift_distance_limit = 1
418
- ```
419
-
420
- **Note:** For each increase in `shift_distance_limit` more pixels are searched for a matching color value, and
421
- this will impact performance **severely** if a match cannot be found.
422
-
423
- If `shift_distance_limit` is `nil` shift distance is not measured. If `shift_distance_limit` is set,
424
- even to `0`, shift distance is measured and reported on image differences.
425
-
426
- ### Allowed difference size
427
-
428
- You can set set a threshold for the differing area size for the comparison
429
- using the `area_size_limit` option to the `screenshot` method:
430
-
431
- ```ruby
432
- test 'area threshold' do
433
- visit '/'
434
- screenshot 'index', area_size_limit: 17
435
- end
436
- ```
437
-
438
- The difference is calculated as `width * height`. You can also set this globally:
439
-
440
- ```ruby
441
- Capybara::Screenshot::Diff.area_size_limit = 42
442
- ```
443
-
444
-
445
- ### Skipping an area
446
-
447
- Sometimes you have expected change that you want to ignore.
448
- You can use the `skip_area` option with `[left, top, right, bottom]`
449
- or css selector like `'#footer'` or `'.container .skipped_element'` to the `screenshot` method to ignore an area:
450
-
451
- ```ruby
452
- test 'unstable area' do
453
- visit '/'
454
- screenshot 'index', skip_area: [[17, 6, 27, 16], '.container .skipped_element', '#footer']
455
- end
456
- ```
457
-
458
- The arguments are `[left, top, right, bottom]` for the area you want to ignore. You can also set this globally:
459
-
460
- ```ruby
461
- Capybara::Screenshot::Diff.skip_area = [0, 0, 64, 48]
462
- ```
463
-
464
- If you need to ignore multiple areas:
465
-
466
- ```ruby
467
- screenshot 'index', skip_area: [[0, 0, 64, 48], [17, 6, 27, 16], 'css_selector .element']
468
- ```
469
-
470
- ### Available Image Processing Drivers
471
-
472
- There are several image processing supported by this gem.
473
- There are several options to setup active driver: `:auto`, `:chunky_png` and `:vips`.
474
-
475
- * `:auto` - will try to load `:vips` if there is gem `ruby-vips`, in other cases will load `:chunky_png`
476
- * `:chunky_png` and `:vips` will load correspondent driver
477
-
478
- ### Enable VIPS image processing
479
-
480
- [Vips](https://www.rubydoc.info/gems/ruby-vips/Vips/Image) driver provides a faster comparison,
481
- and could be enabled by adding `ruby-vips` to `Gemfile`.
482
-
483
- If need to setup explicitly Vips driver, there are several ways to do this:
484
-
485
- * Globally: `Capybara::Screenshot::Diff.driver = :vips`
486
- * Per screenshot option: `screenshot 'index', driver: :vips`
487
-
488
- With enabled VIPS there are new alternatives to process differences, which easier to find and support.
489
- For example, `shift_distance_limit` is very heavy operation. Instead better to use `median_filter_window_size`.
490
-
491
- #### Tolerance level (vips only)
492
-
493
- You can set a “tolerance” anywhere from 0% to 100%. This is the amount of change that's allowable.
494
- If the screenshot has changed by more than that amount, it'll flag it as a failure.
495
-
496
- This is alternative to "Allowed difference size", only the difference that area calculates including valid pixels.
497
- But "tolerance" compares only different pixels.
498
-
499
- You can use the `tolerance` option to the `screenshot` method to set level:
500
-
501
- ```ruby
502
- test 'unstable area' do
503
- visit '/'
504
- screenshot 'index', tolerance: 0.3
505
- end
506
- ```
507
-
508
- You can also set this globally:
509
-
510
- ```ruby
511
- Capybara::Screenshot::Diff.tolerance = 0.3
512
- ```
513
-
514
- #### Median filter size (vips only)
515
-
516
- This is an alternative to "Allowed shift distance", but much faster.
517
- You can find more about this strategy on [Median Filter](https://en.wikipedia.org/wiki/Median_filter).
518
- Think about this like smoothing of the image, before comparison.
519
-
520
- You can use the `median_filter_window_size` option to the `screenshot` method to set level:
521
-
522
- ```ruby
523
- test 'unstable area' do
524
- visit '/'
525
- screenshot 'index', median_filter_window_size: 2
526
- end
527
- ```
528
-
529
- ### Skipping stack frames in the error output
530
-
531
- If you would like to override the `screenshot` method or for some other reason would like to skip stack
532
- frames when reporting image differences, you can use the `skip_stack_frames` option:
533
-
534
- ```ruby
535
- test 'test visiting the index' do
536
- visit root_path
537
- screenshot :index
538
- end
539
-
540
- private
541
-
542
- def screenshot(name, **options)
543
- super(name, skip_stack_frames: 1, **options)
544
- end
545
- ```
546
-
547
- ## Development
548
-
549
- After checking out the repo, run `bin/setup` to install dependencies.
550
- Then, run `rake test` to run the tests.
551
- You can also run `bin/console` for an interactive prompt that will allow you to experiment.
552
-
553
- To install this gem onto your local machine, run `bundle exec rake install`.
554
-
555
- To release a new version, update the version number in `lib/capybara/screenshot/diff/version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
556
-
557
- ## Contributing
558
-
559
- Bug reports and pull requests are welcome on GitHub at https://github.com/donv/capybara-screenshot-diff.
560
- This project is intended to be a safe, welcoming space for collaboration,
561
- and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
562
-
563
-
564
- ## License
565
-
566
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
567
-