knapsack_pro 0.44.0 → 0.45.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8d9401540ef36e33e333a330b03807d83a902de
4
- data.tar.gz: 86fe1eeb6c82a2a37ca8c81b0cc7eb465d63ba79
3
+ metadata.gz: 72e3898daf42db4b3cb0c746ad66f00ecda1048d
4
+ data.tar.gz: 5ed151190611d41bb925b93d9648385e5c55cbce
5
5
  SHA512:
6
- metadata.gz: 04e2e06185f9d02bb16c69cdd89e352b5a4e2bdf8c2509ae0f4c22be2381c0e1f4bebcfc29c950df6c6c9ac34fb4bdbbd917da85b90e34ae4cce562b7ea1144f
7
- data.tar.gz: bfd28948e2c3cd157b2ee9f51ca40d822fa5e97af13131c42ee67b29ded3f5d8008a42a91dba0b9bc0b7c80287c221d6973ba55d3b506c9b1e721e0aee71f01f
6
+ metadata.gz: 5eb27e6eb4038c8dd31009a6bee4d46379b68669a79cb6a2e61e7023ed61d390c2cbb13855e221a48f79a1d3c9388c91bc080515e9367a8bc4ef5da648b88a1e
7
+ data.tar.gz: 99c81386ae4c190c2c0d2bc07185b528f5c8be7c9937d419e2ab33f719c16688a1df321303750267723880fd745ab8d6f7c4bf29a15b43faff746b1602de9a8b
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  * TODO
4
4
 
5
+ ### 0.45.0
6
+
7
+ * Add before and after queue hooks
8
+
9
+ https://github.com/KnapsackPro/knapsack_pro-ruby/pull/46
10
+
11
+ https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v0.44.0...v0.45.0
12
+
5
13
  ### 0.44.0
6
14
 
7
15
  * Add ability to set test_dir using an environment variable.
data/README.md CHANGED
@@ -1188,11 +1188,15 @@ Knapsack Pro Queue Mode runs subset of test files from the work queue many times
1188
1188
  ```ruby
1189
1189
  # spec_helper.rb or rails_helper.rb
1190
1190
 
1191
- # executes before Queue Mode starts work
1192
- Percy::Capybara.initialize_build
1191
+ KnapsackPro::Hooks::Queue.before_queue do |queue_id|
1192
+ # executes before Queue Mode starts work
1193
+ Percy::Capybara.initialize_build
1194
+ end
1193
1195
 
1194
- # executes after Queue Mode finishes work
1195
- at_exit { Percy::Capybara.finalize_build }
1196
+ KnapsackPro::Hooks::Queue.after_queue do |queue_id|
1197
+ # executes after Queue Mode finishes work
1198
+ Percy::Capybara.finalize_build
1199
+ end
1196
1200
  ```
1197
1201
 
1198
1202
  #### How to call `before(:suite)` and `after(:suite)` RSpec hooks only once in Queue Mode?
@@ -1202,18 +1206,17 @@ Knapsack Pro Queue Mode runs subset of test files from the work queue many times
1202
1206
  ```ruby
1203
1207
  # spec_helper.rb or rails_helper.rb
1204
1208
 
1205
- RSpec.configure do |config|
1206
- config.before(:suite) do
1207
- unless ENV['KNAPSACK_PRO_RSPEC_BEFORE_SUITE_LOADED']
1208
- ENV['KNAPSACK_PRO_RSPEC_BEFORE_SUITE_LOADED'] = 'true'
1209
-
1210
- # this will be called only once before the tests started on the CI node
1211
- end
1212
- end
1209
+ KnapsackPro::Hooks::Queue.before_queue do |queue_id|
1210
+ # This will be called only once before the tests started on the CI node.
1211
+ # It will be run inside of the RSpec before(:suite) block only once.
1212
+ # It means you will have access to whatever RSpec provides in the context of the before(:suite) block.
1213
+ end
1213
1214
 
1214
- at_exit do
1215
- # this will be called only once at the end when the CI node finished tests
1216
- end
1215
+ KnapsackPro::Hooks::Queue.after_queue do |queue_id|
1216
+ # This will be called only once after test suite is completed.
1217
+ # Note this hook won't be called inside of RSpec after(:suite) block because
1218
+ # we are not able to determine which after(:suite) block will be called as the last one
1219
+ # due to the fact the Knapsack Pro Queue Mode allocates tests in dynamic way.
1217
1220
  end
1218
1221
  ```
1219
1222
 
@@ -19,6 +19,7 @@ module KnapsackPro
19
19
 
20
20
  if KnapsackPro::Config::Env.queue_recording_enabled?
21
21
  KnapsackPro.logger.debug('Test suite time execution queue recording enabled.')
22
+ bind_before_queue_hook
22
23
  bind_time_tracker
23
24
  bind_save_queue_report
24
25
  end
@@ -35,6 +36,10 @@ module KnapsackPro
35
36
  def bind_save_queue_report
36
37
  raise NotImplementedError
37
38
  end
39
+
40
+ def bind_before_queue_hook
41
+ raise NotImplementedError
42
+ end
38
43
  end
39
44
  end
40
45
  end
@@ -57,6 +57,17 @@ module KnapsackPro
57
57
  end
58
58
  end
59
59
  end
60
+
61
+ def bind_before_queue_hook
62
+ ::RSpec.configure do |config|
63
+ config.before(:suite) do
64
+ unless ENV['KNAPSACK_PRO_BEFORE_QUEUE_HOOK_CALLED']
65
+ KnapsackPro::Hooks::Queue.call_before_queue
66
+ ENV['KNAPSACK_PRO_BEFORE_QUEUE_HOOK_CALLED'] = 'true'
67
+ end
68
+ end
69
+ end
70
+ end
60
71
  end
61
72
 
62
73
  # This is added to provide backwards compatibility
@@ -2,16 +2,41 @@ module KnapsackPro
2
2
  module Hooks
3
3
  class Queue
4
4
  class << self
5
- attr_reader :after_subset_queue
5
+ attr_reader :before_queue,
6
+ :after_subset_queue,
7
+ :after_queue
8
+
9
+ def reset_before_queue
10
+ @before_queue = nil
11
+ end
6
12
 
7
13
  def reset_after_subset_queue
8
14
  @after_subset_queue = nil
9
15
  end
10
16
 
17
+ def reset_after_queue
18
+ @after_queue = nil
19
+ end
20
+
21
+ def before_queue(&block)
22
+ @before_queue ||= block
23
+ end
24
+
11
25
  def after_subset_queue(&block)
12
26
  @after_subset_queue ||= block
13
27
  end
14
28
 
29
+ def after_queue(&block)
30
+ @after_queue ||= block
31
+ end
32
+
33
+ def call_before_queue
34
+ return unless before_queue
35
+ before_queue.call(
36
+ KnapsackPro::Config::Env.queue_id
37
+ )
38
+ end
39
+
15
40
  def call_after_subset_queue
16
41
  return unless after_subset_queue
17
42
  after_subset_queue.call(
@@ -19,6 +44,13 @@ module KnapsackPro
19
44
  KnapsackPro::Config::Env.subset_queue_id
20
45
  )
21
46
  end
47
+
48
+ def call_after_queue
49
+ return unless after_queue
50
+ after_queue.call(
51
+ KnapsackPro::Config::Env.queue_id
52
+ )
53
+ end
22
54
  end
23
55
  end
24
56
  end
@@ -35,6 +35,8 @@ module KnapsackPro
35
35
  log_rspec_command(args, all_test_file_paths, :end_of_queue)
36
36
  end
37
37
 
38
+ KnapsackPro::Hooks::Queue.call_after_queue
39
+
38
40
  KnapsackPro::Report.save_node_queue_to_api
39
41
  exit(exitstatus)
40
42
  else
@@ -1,3 +1,3 @@
1
1
  module KnapsackPro
2
- VERSION = '0.44.0'
2
+ VERSION = '0.45.0'
3
3
  end
@@ -48,6 +48,7 @@ describe KnapsackPro::Adapters::BaseAdapter do
48
48
  let(:queue_recording_enabled?) { true }
49
49
 
50
50
  before do
51
+ allow(subject).to receive(:bind_before_queue_hook)
51
52
  allow(subject).to receive(:bind_time_tracker)
52
53
  allow(subject).to receive(:bind_save_queue_report)
53
54
  end
@@ -57,6 +58,7 @@ describe KnapsackPro::Adapters::BaseAdapter do
57
58
  expect(KnapsackPro).to receive(:logger).and_return(logger)
58
59
  expect(logger).to receive(:debug).with('Test suite time execution queue recording enabled.')
59
60
  end
61
+ it { expect(subject).to receive(:bind_before_queue_hook) }
60
62
  it { expect(subject).to receive(:bind_time_tracker) }
61
63
  it { expect(subject).to receive(:bind_save_queue_report) }
62
64
  end
@@ -65,6 +67,7 @@ describe KnapsackPro::Adapters::BaseAdapter do
65
67
  it { expect(subject).not_to receive(:bind_time_tracker) }
66
68
  it { expect(subject).not_to receive(:bind_save_report) }
67
69
  it { expect(subject).not_to receive(:bind_save_queue_report) }
70
+ it { expect(subject).not_to receive(:bind_before_queue_hook) }
68
71
  end
69
72
  end
70
73
 
@@ -91,4 +94,12 @@ describe KnapsackPro::Adapters::BaseAdapter do
91
94
  }.to raise_error(NotImplementedError)
92
95
  end
93
96
  end
97
+
98
+ describe '#bind_before_queue_hook' do
99
+ it do
100
+ expect {
101
+ subject.bind_before_queue_hook
102
+ }.to raise_error(NotImplementedError)
103
+ end
104
+ end
94
105
  end
@@ -123,5 +123,16 @@ describe KnapsackPro::Adapters::RSpecAdapter do
123
123
  subject.bind_save_queue_report
124
124
  end
125
125
  end
126
+
127
+ describe '#bind_before_queue_hook' do
128
+ it do
129
+ expect(config).to receive(:before).with(:suite).and_yield
130
+ expect(::RSpec).to receive(:configure).and_yield(config)
131
+
132
+ expect(KnapsackPro::Hooks::Queue).to receive(:call_before_queue)
133
+
134
+ subject.bind_before_queue_hook
135
+ end
136
+ end
126
137
  end
127
138
  end
@@ -1,4 +1,30 @@
1
1
  describe KnapsackPro::Hooks::Queue do
2
+ describe '.call_before_queue' do
3
+ subject { described_class.call_before_queue }
4
+
5
+ context 'when callback is not set' do
6
+ before do
7
+ described_class.reset_before_queue
8
+ end
9
+
10
+ it { should be_nil }
11
+ end
12
+
13
+ context 'when callback is set' do
14
+ let(:queue_id) { double }
15
+
16
+ before do
17
+ expect(KnapsackPro::Config::Env).to receive(:queue_id).and_return(queue_id)
18
+
19
+ described_class.before_queue do |q_id|
20
+ [:fake_value, q_id]
21
+ end
22
+ end
23
+
24
+ it { should eq [:fake_value, queue_id] }
25
+ end
26
+ end
27
+
2
28
  describe '.call_after_subset_queue' do
3
29
  subject { described_class.call_after_subset_queue }
4
30
 
@@ -26,4 +52,30 @@ describe KnapsackPro::Hooks::Queue do
26
52
  it { should eq [:fake_value, queue_id, subset_queue_id] }
27
53
  end
28
54
  end
55
+
56
+ describe '.call_after_queue' do
57
+ subject { described_class.call_after_queue }
58
+
59
+ context 'when callback is not set' do
60
+ before do
61
+ described_class.reset_after_queue
62
+ end
63
+
64
+ it { should be_nil }
65
+ end
66
+
67
+ context 'when callback is set' do
68
+ let(:queue_id) { double }
69
+
70
+ before do
71
+ expect(KnapsackPro::Config::Env).to receive(:queue_id).and_return(queue_id)
72
+
73
+ described_class.after_queue do |q_id|
74
+ [:fake_value, q_id]
75
+ end
76
+ end
77
+
78
+ it { should eq [:fake_value, queue_id] }
79
+ end
80
+ end
29
81
  end
@@ -111,6 +111,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
111
111
  it do
112
112
  expect(KnapsackPro::Formatters::RSpecQueueSummaryFormatter).to receive(:print_summary)
113
113
  expect(KnapsackPro::Formatters::RSpecQueueProfileFormatterExtension).to receive(:print_summary)
114
+ expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
114
115
  expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
115
116
  expect(described_class).to receive(:exit).with(exitstatus)
116
117
 
@@ -124,6 +125,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
124
125
  it do
125
126
  expect(KnapsackPro::Formatters::RSpecQueueSummaryFormatter).to receive(:print_summary)
126
127
  expect(KnapsackPro::Formatters::RSpecQueueProfileFormatterExtension).to receive(:print_summary)
128
+ expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
127
129
  expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
128
130
  expect(described_class).to receive(:exit).with(exit_code)
129
131
 
@@ -136,6 +138,7 @@ describe KnapsackPro::Runners::Queue::RSpecRunner do
136
138
  let(:test_file_paths) { [] }
137
139
 
138
140
  it do
141
+ expect(KnapsackPro::Hooks::Queue).to receive(:call_after_queue)
139
142
  expect(KnapsackPro::Report).to receive(:save_node_queue_to_api)
140
143
  expect(described_class).to receive(:exit).with(exitstatus)
141
144
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knapsack_pro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.44.0
4
+ version: 0.45.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ArturT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-31 00:00:00.000000000 Z
11
+ date: 2017-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake