knapsack_pro 6.0.3 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +375 -28
  3. data/.github/pull_request_template.md +22 -0
  4. data/.gitignore +4 -0
  5. data/CHANGELOG.md +95 -0
  6. data/Gemfile +9 -0
  7. data/README.md +0 -7
  8. data/knapsack_pro.gemspec +2 -1
  9. data/lib/knapsack_pro/adapters/base_adapter.rb +7 -2
  10. data/lib/knapsack_pro/adapters/cucumber_adapter.rb +1 -3
  11. data/lib/knapsack_pro/adapters/rspec_adapter.rb +16 -9
  12. data/lib/knapsack_pro/config/env.rb +1 -9
  13. data/lib/knapsack_pro/extensions/rspec_extension.rb +137 -0
  14. data/lib/knapsack_pro/formatters/time_tracker.rb +10 -26
  15. data/lib/knapsack_pro/formatters/time_tracker_fetcher.rb +8 -0
  16. data/lib/knapsack_pro/presenter.rb +1 -1
  17. data/lib/knapsack_pro/pure/queue/rspec_pure.rb +92 -0
  18. data/lib/knapsack_pro/runners/queue/base_runner.rb +6 -1
  19. data/lib/knapsack_pro/runners/queue/cucumber_runner.rb +6 -6
  20. data/lib/knapsack_pro/runners/queue/minitest_runner.rb +10 -6
  21. data/lib/knapsack_pro/runners/queue/rspec_runner.rb +124 -173
  22. data/lib/knapsack_pro/urls.rb +2 -0
  23. data/lib/knapsack_pro/version.rb +1 -1
  24. data/lib/knapsack_pro.rb +1 -0
  25. data/spec/integration/runners/queue/rspec_runner.rb +80 -0
  26. data/spec/integration/runners/queue/rspec_runner_spec.rb +2232 -0
  27. data/spec/knapsack_pro/adapters/base_adapter_spec.rb +17 -11
  28. data/spec/knapsack_pro/adapters/cucumber_adapter_spec.rb +2 -5
  29. data/spec/knapsack_pro/adapters/rspec_adapter_spec.rb +2 -24
  30. data/spec/knapsack_pro/config/env_spec.rb +1 -35
  31. data/spec/knapsack_pro/formatters/time_tracker_specs.rb +8 -37
  32. data/spec/knapsack_pro/hooks/queue_spec.rb +2 -2
  33. data/spec/knapsack_pro/presenter_spec.rb +1 -1
  34. data/spec/knapsack_pro/pure/queue/rspec_pure_spec.rb +224 -0
  35. data/spec/knapsack_pro/runners/queue/cucumber_runner_spec.rb +16 -16
  36. data/spec/knapsack_pro/runners/queue/minitest_runner_spec.rb +14 -14
  37. data/spec/knapsack_pro_spec.rb +3 -3
  38. data/spec/spec_helper.rb +0 -1
  39. metadata +17 -12
  40. data/lib/knapsack_pro/formatters/rspec_queue_profile_formatter_extension.rb +0 -58
  41. data/lib/knapsack_pro/formatters/rspec_queue_summary_formatter.rb +0 -145
  42. data/spec/knapsack_pro/runners/queue/rspec_runner_spec.rb +0 -536
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '05131444388481496f61779bc12d4bb749111cf798d667d969664b5bd2668e08'
4
- data.tar.gz: 9fb9f32b315e914e4f089ff0946a8204017740a23cf2fede172f4276b29dfcd4
3
+ metadata.gz: 3f27ac674f611af638b9d0ea3dd1d3441a9e680e70296738ff5b93d5d18f9741
4
+ data.tar.gz: 79bdc380a1c882178b4a3cde626de7e2db1d30ae64ae1a301f023a5ff5d71623
5
5
  SHA512:
6
- metadata.gz: 786fc53dbf7b6c068c2135b3f1d29218b17a1d5155db591088a4642442b281e387afa1b8815a9ccd3adfd88da86aded5158a7f5110e09d057a021aa5ef563891
7
- data.tar.gz: f771d87b9dcd3c2dd19cc5058d7a9dc3a56e1a2101cbaeff1210bda562bd0670341ce6f3e2f341f32a1f1e5cd49a165c96cd36999f109a7dad87a3adf7cc25ae
6
+ metadata.gz: 75bf722c575fce515b8a1a79f7e05ad5ed8ce6f69c05f4ff7cff8fdd570e5eb3e170cbf83765c66b2d1a187a5c076235637188ef9e7bd9d3d703fa37d1bf989c
7
+ data.tar.gz: 1a355724b69bd0d62b23dd32b6e995dbdd882d0fcb0299d5cddb42c3b4c0635a588839c7194cfb2af83504d91ba4db192a68cc393a8380713450b44971c682bf
data/.circleci/config.yml CHANGED
@@ -1,45 +1,392 @@
1
- # Ruby CircleCI 2.0 configuration file
2
- #
3
- # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
- #
5
- version: 2
6
- jobs:
7
- build:
8
- parallelism: 1
9
- docker:
10
- # specify the version you desire here
11
- # https://circleci.com/developer/images/image/cimg/ruby
12
- - image: cimg/ruby:3.2.1
13
- environment:
14
- CODECLIMATE_REPO_TOKEN: b6626e682a8e97e0c5978febc92c3526792a2d018b41b8e1b52689da37fb7d92
15
-
16
- working_directory: ~/knapsack_pro-ruby
1
+ version: 2.1
17
2
 
3
+ commands:
4
+ setup_knapsack_pro_ruby:
18
5
  steps:
19
6
  - checkout
20
-
21
- # Download and cache dependencies
22
7
  - restore_cache:
23
8
  keys:
24
- - v2-dependencies-bundler-{{ checksum "knapsack_pro.gemspec" }}
25
- # fallback to using the latest cache if no exact match is found
26
- - v2-dependencies-bundler-
9
+ - v1-bundler-ruby-{{ checksum "knapsack_pro.gemspec" }}
10
+ - v1-bundler-ruby-
11
+ - run:
12
+ command: |
13
+ bundle config set --local path './vendor/bundle'
14
+ bundle install --jobs=4 --retry=3
15
+ - save_cache:
16
+ paths:
17
+ - ./vendor/bundle
18
+ key: v1-bundler-ruby-{{ checksum "knapsack_pro.gemspec" }}
27
19
 
20
+ setup_rails_app_with_knapsack_pro:
21
+ parameters:
22
+ path:
23
+ type: string
24
+ ruby:
25
+ type: string
26
+ rspec:
27
+ type: string
28
+ default: ""
29
+ steps:
28
30
  - run:
29
- name: install ruby dependencies
31
+ working_directory: << parameters.path >>
30
32
  command: |
31
- bundle install --jobs=4 --retry=3 --path vendor/bundle
33
+ git clone --depth 1 --branch $CIRCLE_BRANCH --single-branch git@github.com:KnapsackPro/rails-app-with-knapsack_pro.git ./ || git clone --depth 1 git@github.com:KnapsackPro/rails-app-with-knapsack_pro.git ./
34
+ if [[ "<< parameters.rspec >>" != "" ]]; then
35
+ sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
36
+ echo "Updated RSpec version in Gemfile"
37
+ fi
38
+ - restore_cache:
39
+ keys:
40
+ - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
41
+ - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-
42
+ - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-
43
+ - v1-bundler-rails-
44
+ - run:
45
+ working_directory: << parameters.path >>
46
+ command: |
47
+ bundle config set --local path './vendor/bundle'
48
+ bundle install --jobs=4 --retry=3
49
+ - save_cache:
50
+ paths:
51
+ - << parameters.path >>/vendor/bundle
52
+ key: v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
32
53
 
54
+ jobs:
55
+ unit:
56
+ parallelism: 1
57
+ working_directory: ~/knapsack_pro-ruby
58
+ resource_class: small
59
+ docker:
60
+ - image: cimg/ruby:3.3
61
+ steps:
62
+ - setup_knapsack_pro_ruby
33
63
  - run: gem install rubocop
64
+ - run: rubocop --fail-level A --only Style/FrozenStringLiteralComment,Layout/EmptyLineAfterMagicComment lib/
65
+ - run: bundle exec rspec spec
66
+ - run: bundle exec ruby spec/knapsack_pro/formatters/time_tracker_specs.rb
34
67
 
68
+ integration-rspec:
69
+ parallelism: 1
70
+ working_directory: ~/knapsack_pro-ruby
71
+ resource_class: small
72
+ parameters:
73
+ ruby:
74
+ type: string
75
+ rspec:
76
+ type: string
77
+ docker:
78
+ - image: cimg/ruby:<< parameters.ruby >>
79
+ steps:
80
+ - checkout
81
+ - run:
82
+ command: |
83
+ if [[ "<< parameters.rspec >>" != "" ]]; then
84
+ sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
85
+ echo "Updated RSpec version in Gemfile"
86
+ fi
87
+ - restore_cache:
88
+ keys:
89
+ - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
90
+ - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-
91
+ - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-
92
+ - v1-bundler-gem-
93
+ - run:
94
+ command: |
95
+ bundle config set --local path './vendor/bundle'
96
+ bundle install --jobs=4 --retry=3
35
97
  - save_cache:
36
98
  paths:
37
99
  - ./vendor/bundle
38
- key: v2-dependencies-bundler-{{ checksum "knapsack_pro.gemspec" }}
100
+ key: v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
101
+ - run:
102
+ command: |
103
+ ruby --version
104
+ bundle exec rspec --version
105
+ RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
106
+ [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
107
+ - run: bundle exec rspec spec/integration/runners/queue/rspec_runner_spec.rb
39
108
 
40
- # enforce `frozen_string_literal: true` in the gem files
41
- - run: rubocop -A --only Style/FrozenStringLiteralComment,Layout/EmptyLineAfterMagicComment lib/
109
+ e2e-regular-rspec:
110
+ parallelism: 2
111
+ working_directory: ~/knapsack_pro-ruby
112
+ resource_class: small
113
+ parameters:
114
+ ruby:
115
+ type: string
116
+ rspec:
117
+ type: string
118
+ docker:
119
+ - image: cimg/ruby:<< parameters.ruby >>-browsers
120
+ environment:
121
+ PGHOST: 127.0.0.1
122
+ PGUSER: rails-app-with-knapsack_pro
123
+ RAILS_ENV: test
124
+ RACK_ENV: test
125
+ KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
126
+ KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: $KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC
127
+ EXTRA_TEST_FILES_DELAY: 10
128
+ - image: cimg/postgres:14.7
129
+ environment:
130
+ POSTGRES_DB: rails-app-with-knapsack_pro_test
131
+ POSTGRES_PASSWORD: password
132
+ POSTGRES_USER: rails-app-with-knapsack_pro
133
+ steps:
134
+ - setup_knapsack_pro_ruby
135
+ - setup_rails_app_with_knapsack_pro:
136
+ path: ~/rails-app-with-knapsack_pro
137
+ ruby: << parameters.ruby >>
138
+ rspec: << parameters.rspec >>
139
+ - run: dockerize -wait tcp://localhost:5432 -timeout 1m
140
+ - run:
141
+ working_directory: ~/rails-app-with-knapsack_pro
142
+ command: |
143
+ ruby --version
144
+ bundle exec rspec --version
145
+ RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
146
+ [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
147
+ - run:
148
+ working_directory: ~/rails-app-with-knapsack_pro
149
+ command: bin/rails db:setup
150
+ - run:
151
+ working_directory: ~/rails-app-with-knapsack_pro
152
+ command: |
153
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
154
+ bundle exec rake knapsack_pro:rspec
155
+ - run:
156
+ working_directory: ~/rails-app-with-knapsack_pro
157
+ command: |
158
+ # fallback ||
159
+ export KNAPSACK_PRO_ENDPOINT=https://api-fake.knapsackpro.com
160
+ export KNAPSACK_PRO_MAX_REQUEST_RETRIES=1
161
+ bundle exec rake knapsack_pro:rspec
162
+ - run:
163
+ working_directory: ~/rails-app-with-knapsack_pro
164
+ command: |
165
+ # split by test examples ||
166
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular--split"
167
+ export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
168
+ bundle exec rake knapsack_pro:rspec
169
+ - run:
170
+ working_directory: ~/rails-app-with-knapsack_pro
171
+ command: |
172
+ # split custom files by test examples ||
173
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular--split-custom-files"
174
+ export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
175
+ export KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN="spec/features/calculator_spec.rb"
176
+ bundle exec rake knapsack_pro:rspec
42
177
 
43
- - run: bundle exec rspec spec
178
+ e2e-queue-rspec:
179
+ parameters:
180
+ ruby:
181
+ type: string
182
+ rspec:
183
+ type: string
184
+ parallelism: 2
185
+ working_directory: ~/knapsack_pro-ruby
186
+ resource_class: small
187
+ docker:
188
+ - image: cimg/ruby:<< parameters.ruby >>-browsers
189
+ environment:
190
+ PGHOST: 127.0.0.1
191
+ PGUSER: rails-app-with-knapsack_pro
192
+ RAILS_ENV: test
193
+ RACK_ENV: test
194
+ KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
195
+ KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: $KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC
196
+ EXTRA_TEST_FILES_DELAY: 10
197
+ - image: cimg/postgres:14.7
198
+ environment:
199
+ POSTGRES_DB: rails-app-with-knapsack_pro_test
200
+ POSTGRES_PASSWORD: password
201
+ POSTGRES_USER: rails-app-with-knapsack_pro
202
+ steps:
203
+ - setup_knapsack_pro_ruby
204
+ - setup_rails_app_with_knapsack_pro:
205
+ path: ~/rails-app-with-knapsack_pro
206
+ ruby: << parameters.ruby >>
207
+ rspec: << parameters.rspec >>
208
+ - run: dockerize -wait tcp://localhost:5432 -timeout 1m
209
+ - run:
210
+ working_directory: ~/rails-app-with-knapsack_pro
211
+ command: |
212
+ ruby --version
213
+ bundle exec rspec --version
214
+ RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
215
+ [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
216
+ - run:
217
+ working_directory: ~/rails-app-with-knapsack_pro
218
+ command: bin/rails db:setup
219
+ - run:
220
+ working_directory: ~/rails-app-with-knapsack_pro
221
+ command: |
222
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
223
+ bundle exec rake knapsack_pro:queue:rspec
224
+ - run:
225
+ working_directory: ~/rails-app-with-knapsack_pro
226
+ command: |
227
+ # run 0 tests as queue is consumed ||
228
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
229
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=false
230
+ bundle exec rake knapsack_pro:queue:rspec
231
+ - run:
232
+ working_directory: ~/rails-app-with-knapsack_pro
233
+ command: |
234
+ # retry the same split ||
235
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
236
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
237
+ bundle exec rake knapsack_pro:queue:rspec
238
+ - run:
239
+ working_directory: ~/rails-app-with-knapsack_pro
240
+ command: |
241
+ # fallback ||
242
+ export KNAPSACK_PRO_ENDPOINT=https://api-fake.knapsackpro.com
243
+ export KNAPSACK_PRO_MAX_REQUEST_RETRIES=1
244
+ bundle exec rake knapsack_pro:queue:rspec
245
+ - run:
246
+ working_directory: ~/rails-app-with-knapsack_pro
247
+ command: |
248
+ # split by test examples ||
249
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--split"
250
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
251
+ export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
252
+ bundle exec rake knapsack_pro:queue:rspec
253
+ - run:
254
+ working_directory: ~/rails-app-with-knapsack_pro
255
+ command: |
256
+ # turnip ||
257
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
258
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
259
+ export KNAPSACK_PRO_TEST_DIR=turnip
260
+ export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
261
+ bundle exec rake "knapsack_pro:queue:rspec[-r turnip/rspec]"
262
+ - run:
263
+ working_directory: ~/rails-app-with-knapsack_pro
264
+ command: |
265
+ # turnip retry ||
266
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
267
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
268
+ export KNAPSACK_PRO_TEST_DIR=turnip
269
+ export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
270
+ bundle exec rake "knapsack_pro:queue:rspec[-r turnip/rspec]"
44
271
 
45
- - run: bundle exec ruby spec/knapsack_pro/formatters/time_tracker_specs.rb
272
+ e2e-regular-minitest:
273
+ parallelism: 2
274
+ working_directory: ~/knapsack_pro-ruby
275
+ resource_class: small
276
+ parameters:
277
+ ruby:
278
+ type: string
279
+ docker:
280
+ - image: cimg/ruby:<< parameters.ruby >>-browsers
281
+ environment:
282
+ PGHOST: 127.0.0.1
283
+ PGUSER: rails-app-with-knapsack_pro
284
+ RAILS_ENV: test
285
+ RACK_ENV: test
286
+ KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
287
+ KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST: $KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST
288
+ EXTRA_TEST_FILES_DELAY: 10
289
+ - image: cimg/postgres:14.7
290
+ environment:
291
+ POSTGRES_DB: rails-app-with-knapsack_pro_test
292
+ POSTGRES_PASSWORD: password
293
+ POSTGRES_USER: rails-app-with-knapsack_pro
294
+ steps:
295
+ - setup_knapsack_pro_ruby
296
+ - setup_rails_app_with_knapsack_pro:
297
+ path: ~/rails-app-with-knapsack_pro
298
+ ruby: << parameters.ruby >>
299
+ - run: dockerize -wait tcp://localhost:5432 -timeout 1m
300
+ - run:
301
+ working_directory: ~/rails-app-with-knapsack_pro
302
+ command: ruby --version
303
+ - run:
304
+ working_directory: ~/rails-app-with-knapsack_pro
305
+ command: bin/rails db:setup
306
+ - run:
307
+ working_directory: ~/rails-app-with-knapsack_pro
308
+ command: |
309
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
310
+ bundle exec rake knapsack_pro:minitest[--verbose]
311
+
312
+ e2e-queue-minitest:
313
+ parameters:
314
+ ruby:
315
+ type: string
316
+ parallelism: 2
317
+ working_directory: ~/knapsack_pro-ruby
318
+ resource_class: small
319
+ docker:
320
+ - image: cimg/ruby:<< parameters.ruby >>-browsers
321
+ environment:
322
+ PGHOST: 127.0.0.1
323
+ PGUSER: rails-app-with-knapsack_pro
324
+ RAILS_ENV: test
325
+ RACK_ENV: test
326
+ KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
327
+ KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST: $KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST
328
+ EXTRA_TEST_FILES_DELAY: 10
329
+ - image: cimg/postgres:14.7
330
+ environment:
331
+ POSTGRES_DB: rails-app-with-knapsack_pro_test
332
+ POSTGRES_PASSWORD: password
333
+ POSTGRES_USER: rails-app-with-knapsack_pro
334
+ steps:
335
+ - setup_knapsack_pro_ruby
336
+ - setup_rails_app_with_knapsack_pro:
337
+ path: ~/rails-app-with-knapsack_pro
338
+ ruby: << parameters.ruby >>
339
+ - run: dockerize -wait tcp://localhost:5432 -timeout 1m
340
+ - run:
341
+ working_directory: ~/rails-app-with-knapsack_pro
342
+ command: ruby --version
343
+ - run:
344
+ working_directory: ~/rails-app-with-knapsack_pro
345
+ command: bin/rails db:setup
346
+ - run:
347
+ working_directory: ~/rails-app-with-knapsack_pro
348
+ command: |
349
+ # minitest ||
350
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--minitest"
351
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
352
+ bundle exec rake knapsack_pro:queue:minitest[--verbose]
353
+ - run:
354
+ working_directory: ~/rails-app-with-knapsack_pro
355
+ command: |
356
+ # minitest retry ||
357
+ export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--minitest"
358
+ export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
359
+ bundle exec rake knapsack_pro:queue:minitest[--verbose]
360
+
361
+ workflows:
362
+ tests:
363
+ jobs:
364
+ - unit
365
+ - integration-rspec:
366
+ name: integration__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
367
+ matrix:
368
+ parameters:
369
+ ruby: ["3.0", "3.1", "3.2", "3.3"]
370
+ rspec: ["3.10.2", "3.11.0", "3.12.2"]
371
+ - e2e-regular-rspec:
372
+ name: e2e-regular__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
373
+ matrix:
374
+ parameters:
375
+ ruby: ["3.0", "3.1", "3.2", "3.3"]
376
+ rspec: ["3.10.2", "3.11.0", "3.12.2"]
377
+ - e2e-queue-rspec:
378
+ name: e2e-queue__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
379
+ matrix:
380
+ parameters:
381
+ ruby: ["3.0", "3.1", "3.2", "3.3"]
382
+ rspec: ["3.10.2", "3.11.0", "3.12.2"]
383
+ - e2e-regular-minitest:
384
+ name: e2e-regular__ruby-<< matrix.ruby >>__minitest
385
+ matrix:
386
+ parameters:
387
+ ruby: ["3.0", "3.1", "3.2", "3.3"]
388
+ - e2e-queue-minitest:
389
+ name: e2e-queue__ruby-<< matrix.ruby >>__minitest
390
+ matrix:
391
+ parameters:
392
+ ruby: ["3.0", "3.1", "3.2", "3.3"]
@@ -0,0 +1,22 @@
1
+ # Story
2
+
3
+ TODO: link to the internal story
4
+
5
+ ## Related
6
+
7
+ TODO: links to related PRs or issues
8
+
9
+ # Description
10
+
11
+ TODO
12
+
13
+ # Changes
14
+
15
+ TODO: changes introduced by this PR
16
+
17
+ # Checklist reminder
18
+
19
+ - [ ] You follow the architecture outlined below for RSpec in Queue Mode, which is a work in progress (feel free to propose changes):
20
+ - Pure: `lib/knapsack_pro/pure/queue/rspec_pure.rb` contains pure functions that are unit tested.
21
+ - Extension: `lib/knapsack_pro/extensions/rspec_extension.rb` encapsulates calls to RSpec internals and is integration and e2e tested.
22
+ - Runner: `lib/knapsack_pro/runners/queue/rspec_runner.rb` invokes the pure code and the extension to produce side effects, which are integration and e2e tested.
data/.gitignore CHANGED
@@ -34,3 +34,7 @@ Gemfile.lock
34
34
 
35
35
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
36
  .rvmrc
37
+
38
+ # dynamically generated specs
39
+ spec/knapsack_pro/formatters/time_tracker*_spec.rb
40
+ spec_integration/
data/CHANGELOG.md CHANGED
@@ -1,5 +1,100 @@
1
1
  # Changelog
2
2
 
3
+ ### 7.0.0
4
+
5
+ * __(breaking change)__ RSpec in Queue Mode:
6
+ * The default for `KNAPSACK_PRO_LOG_LEVEL` is `info` instead of `debug`.
7
+ * The RSpec `before(:suite)` and `after(:suite)` hooks changed:
8
+
9
+ __Before:__<br>
10
+ The `before(:suite)` and `after(:suite)` hooks were executed multiple times. Each time for a batch of tests fetched from Knapsack Pro Queue API.
11
+
12
+ __After:__<br>
13
+ The `before(:suite)` and `after(:suite)` hooks are executed only once: `before(:suite)` is executed before starting tests, `after(:suite)` is executed after all tests are completed. (It is what you would expect from RSpec).
14
+
15
+ * The `KnapsackPro::Hooks::Queue.after_queue` hook change:
16
+
17
+ __Before:__<br>
18
+ The `KnapsackPro::Hooks::Queue.after_queue` hook is executed outside of the `after(:suite)` hook.
19
+
20
+ __After:__<br>
21
+ The `KnapsackPro::Hooks::Queue.after_queue` hook is executed __inside__ of the `after(:suite)` hook.
22
+
23
+ * Recommended RSpec changes in your project:
24
+ * Remove the following code if you use Queue Mode and the `rspec_junit_formatter` gem to generate JUnit XML or JSON reports:
25
+
26
+ ```ruby
27
+ # REMOVE THE FOLLOWING CODE
28
+
29
+ # spec_helper.rb or rails_helper.rb
30
+ TMP_REPORT = "tmp/rspec_#{ENV['KNAPSACK_PRO_CI_NODE_INDEX']}.xml"
31
+ FINAL_REPORT = "tmp/final_rspec_#{ENV['KNAPSACK_PRO_CI_NODE_INDEX']}.xml"
32
+
33
+ KnapsackPro::Hooks::Queue.after_subset_queue do |queue_id, subset_queue_id|
34
+ if File.exist?(TMP_REPORT)
35
+ FileUtils.mv(TMP_REPORT, FINAL_REPORT)
36
+ end
37
+ end
38
+ ```
39
+
40
+ Learn more about [using Knapsack Pro with RSpec formatters](https://docs.knapsackpro.com/ruby/rspec/#formatters-rspec_junit_formatter-json) and [using Knapsack Pro with CircleCI](https://docs.knapsackpro.com/ruby/circleci/) in the docs.
41
+
42
+ * Replace the following code if you are using Queue Mode and the `percy-capybara` gem on a version older than 4:
43
+
44
+ Before:
45
+
46
+ ```ruby
47
+ KnapsackPro::Hooks::Queue.before_queue { |queue_id| Percy::Capybara.initialize_build }
48
+ KnapsackPro::Hooks::Queue.after_queue { |queue_id| Percy::Capybara.finalize_build }
49
+ ```
50
+
51
+ After:
52
+
53
+ ```ruby
54
+ # recommended
55
+ before(:suite) { Percy::Capybara.initialize_build }
56
+ after(:suite) { Percy::Capybara.finalize_build }
57
+ ```
58
+
59
+ Learn more about [using Knapsack Pro with Percy](https://docs.knapsackpro.com/ruby/hooks/#percy-capybara) in the docs.
60
+
61
+ * We are no longer modifying the default RSpec formatters in Queue Mode. You can remove the [`KNAPSACK_PRO_MODIFY_DEFAULT_RSPEC_FORMATTERS`](https://docs.knapsackpro.com/ruby/reference/#knapsack_pro_modify_default_rspec_formatters-removed-rspec) environment variable from your CI config if you are using it.
62
+
63
+ * RSpec improvements in Queue Mode:
64
+ * Termination signals (`HUP`, `INT`, `TERM`, `ABRT`, `QUIT`, `USR1`, and `USR2`) are handled earlier: the process will terminate before the next top-level example group (`describe` or `context`) instead of waiting for the next Knapsack Pro batch of tests.
65
+
66
+ * Respect the `--error-exit-code` option. It sets a custom exit code (instead of `1`) when RSpec fails outside an example (e.g. lack of memory, termination signal).
67
+
68
+ ```bash
69
+ bundle exec rake "knapsack_pro:queue:rspec[--error-exit-code 3]"
70
+ ```
71
+
72
+ * Respect the `--failure-exit-code` option. It sets a custom exit code for when any examples fail.
73
+
74
+ ```bash
75
+ bundle exec rake "knapsack_pro:queue:rspec[--failure-exit-code 2]"
76
+ ```
77
+
78
+ * Respect the `--fail-fast` option and show a warning in the Knapsack Pro log.
79
+
80
+ * Ignore the `fail_if_no_examples` option in Queue Mode:
81
+ * A late CI node, started after all tests were executed by other nodes, is expected to receive an empty batch.
82
+ * A batch could contain tests with no examples (e.g. commented out)
83
+
84
+ * Raise an exception if the [deprecated `run_all_when_everything_filtered`](https://docs.knapsackpro.com/ruby/rspec/#some-of-my-test-files-are-not-executed) option is detected.
85
+
86
+ PR with the above changes: https://github.com/KnapsackPro/knapsack_pro-ruby/pull/237
87
+
88
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v6.0.4...v7.0.0
89
+
90
+ ### 6.0.4
91
+
92
+ * fix(minitest): avoid installing `at_exit` (that would result in an empty run of Minitest after Knapsack Pro is finished in Queue Mode)
93
+
94
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/236
95
+
96
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v6.0.3...v6.0.4
97
+
3
98
  ### 6.0.3
4
99
 
5
100
  * fix(Turnip): make sure `.feature` files are recorded
data/Gemfile CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in knapsack.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'rspec_junit_formatter', require: false
8
+ gem 'nokogiri', require: false
9
+ gem 'simplecov', require: false
10
+
11
+ # This line is going to be replaced on CI to test different RSpec versions.
12
+ # gem 'rspec-core', 'x.x.x'
13
+ end
data/README.md CHANGED
@@ -18,9 +18,6 @@
18
18
  <a href="https://rubygems.org/gems/knapsack_pro">
19
19
  <img alt="Gem Version" src="https://badge.fury.io/rb/knapsack_pro.svg" />
20
20
  </a>
21
- <a href="https://codeclimate.com/github/KnapsackPro/knapsack_pro-ruby">
22
- <img alt="Code Climate" src="https://codeclimate.com/github/KnapsackPro/knapsack_pro-ruby/badges/gpa.svg" />
23
- </a>
24
21
  </div>
25
22
 
26
23
  <br />
@@ -45,10 +42,6 @@ The `knapsack_pro` gem supports all CIs and the following test runners:
45
42
  - Spinach
46
43
  - Turnip
47
44
 
48
- ## Requirements
49
-
50
- `>= Ruby 2.1.0`
51
-
52
45
  ## Installation
53
46
 
54
47
  The [Installation Guide](https://docs.knapsackpro.com/knapsack_pro-ruby/guide/?utm_source=github&utm_medium=readme&utm_campaign=knapsack_pro-ruby_gem&utm_content=installation_guide) will ask you a few questions and generate instruction steps for your project:
data/knapsack_pro.gemspec CHANGED
@@ -6,10 +6,11 @@ require 'knapsack_pro/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'knapsack_pro'
8
8
  spec.version = KnapsackPro::VERSION
9
+ spec.required_ruby_version = '>= 2.7.0'
9
10
  spec.authors = ['ArturT']
10
11
  spec.email = ['support@knapsackpro.com']
11
12
  spec.summary = %q{Knapsack Pro splits tests across parallel CI nodes and ensures each parallel job finish work at a similar time.}
12
- spec.description = %q{Run tests in parallel across CI server nodes based on tests execution time. Split tests in a dynamic way to ensure parallel jobs are done at a similar time. Thanks to that your CI build time is as fast as possible. It works with many CI providers.}
13
+ spec.description = %q{Knapsack Pro wraps your current test runner(s) and works with your existing CI infrastructure to parallelize tests optimally. It dynamically splits your tests based on up-to-date test execution data. It's designed from the ground up for CI and supports all of them.}
13
14
  spec.homepage = 'https://knapsackpro.com'
14
15
  spec.license = 'MIT'
15
16
  spec.metadata = {
@@ -60,13 +60,13 @@ module KnapsackPro
60
60
  File.write(self.class.adapter_bind_method_called_file, nil)
61
61
 
62
62
  if KnapsackPro::Config::Env.recording_enabled?
63
- KnapsackPro.logger.debug('Test suite time execution recording enabled.')
63
+ KnapsackPro.logger.debug('Regular Mode enabled.')
64
64
  bind_time_tracker
65
65
  bind_save_report
66
66
  end
67
67
 
68
68
  if KnapsackPro::Config::Env.queue_recording_enabled?
69
- KnapsackPro.logger.debug('Test suite time execution queue recording enabled.')
69
+ KnapsackPro.logger.debug('Queue Mode enabled.')
70
70
  bind_queue_mode
71
71
  end
72
72
  end
@@ -83,8 +83,13 @@ module KnapsackPro
83
83
  raise NotImplementedError
84
84
  end
85
85
 
86
+ def bind_after_queue_hook
87
+ raise NotImplementedError
88
+ end
89
+
86
90
  def bind_queue_mode
87
91
  bind_before_queue_hook
92
+ bind_after_queue_hook
88
93
  bind_time_tracker
89
94
  end
90
95
  end
@@ -65,9 +65,7 @@ module KnapsackPro
65
65
  end
66
66
  end
67
67
 
68
- def bind_queue_mode
69
- super
70
-
68
+ def bind_after_queue_hook
71
69
  ::Kernel.at_exit do
72
70
  KnapsackPro::Hooks::Queue.call_after_subset_queue
73
71
  KnapsackPro::Report.save_subset_queue_to_file