rspeed 0.1.0 → 0.5.1

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +11 -7
  4. data/lib/generators/rspeed/install_generator.rb +1 -1
  5. data/lib/rspeed.rb +9 -5
  6. data/lib/rspeed/env.rb +43 -0
  7. data/lib/rspeed/extension.rb +6 -37
  8. data/lib/rspeed/logger.rb +11 -0
  9. data/lib/rspeed/observer.rb +43 -0
  10. data/lib/rspeed/redis.rb +55 -0
  11. data/lib/rspeed/runner.rb +4 -17
  12. data/lib/rspeed/splitter.rb +65 -73
  13. data/lib/rspeed/variable.rb +31 -0
  14. data/lib/rspeed/version.rb +1 -1
  15. data/spec/common_helper.rb +10 -0
  16. data/spec/fixtures/1_spec.rb +9 -0
  17. data/spec/fixtures/2_spec.rb +5 -0
  18. data/spec/fixtures/empty.rb +4 -0
  19. data/spec/fixtures/new_spec.rb.csv +1 -0
  20. data/spec/models/rspeed/env/db_spec.rb +17 -0
  21. data/spec/models/rspeed/env/host_spec.rb +17 -0
  22. data/spec/models/rspeed/env/name_spec.rb +17 -0
  23. data/spec/models/rspeed/env/pipe_spec.rb +19 -0
  24. data/spec/models/rspeed/env/pipes_spec.rb +19 -0
  25. data/spec/models/rspeed/env/port_spec.rb +17 -0
  26. data/spec/models/rspeed/env/result_key_spec.rb +19 -0
  27. data/spec/models/rspeed/env/rspeed_spec.rb +43 -0
  28. data/spec/models/rspeed/env/tmp_spec.rb +19 -0
  29. data/spec/models/rspeed/observer/after_spec.rb +16 -0
  30. data/spec/models/rspeed/observer/after_suite_spec.rb +70 -0
  31. data/spec/models/rspeed/observer/before_spec.rb +15 -0
  32. data/spec/models/rspeed/observer/before_suite_spec.rb +37 -0
  33. data/spec/models/rspeed/redis/clean_spec.rb +12 -0
  34. data/spec/models/rspeed/redis/client_spec.rb +7 -0
  35. data/spec/models/rspeed/redis/destroy_spec.rb +29 -0
  36. data/spec/models/rspeed/redis/get_spec.rb +9 -0
  37. data/spec/models/rspeed/redis/keys_spec.rb +29 -0
  38. data/spec/models/rspeed/redis/result_spec.rb +13 -0
  39. data/spec/models/rspeed/redis/set_spec.rb +9 -0
  40. data/spec/models/rspeed/redis/specs_finished_spec.rb +19 -0
  41. data/spec/models/rspeed/redis/specs_initiated_spec.rb +13 -0
  42. data/spec/models/rspeed/runner/run_spec.rb +47 -0
  43. data/spec/models/rspeed/splitter/actual_examples_spec.rb +26 -0
  44. data/spec/models/rspeed/splitter/append_question_spec.rb +37 -0
  45. data/spec/models/rspeed/splitter/append_spec.rb +6 -3
  46. data/spec/models/rspeed/splitter/diff_spec.rb +15 -14
  47. data/spec/models/rspeed/splitter/first_pipe_spec.rb +2 -4
  48. data/spec/models/rspeed/splitter/get_spec.rb +7 -9
  49. data/spec/models/rspeed/splitter/need_warm_question_spec.rb +37 -0
  50. data/spec/models/rspeed/splitter/pipe_files_spec.rb +26 -0
  51. data/spec/models/rspeed/splitter/rename_spec.rb +3 -5
  52. data/spec/models/rspeed/splitter/split_spec.rb +72 -36
  53. data/spec/models/rspeed/variable/append_name_spec.rb +19 -0
  54. data/spec/models/rspeed/variable/csv_spec.rb +5 -0
  55. data/spec/models/rspeed/variable/default_partner_spec.rb +5 -0
  56. data/spec/models/rspeed/variable/key_spec.rb +15 -0
  57. data/spec/models/rspeed/variable/pipe_name_spec.rb +15 -0
  58. data/spec/models/rspeed/variable/pipes_pattern_spec.rb +5 -0
  59. data/spec/models/rspeed/variable/result_spec.rb +19 -0
  60. data/spec/models/rspeed/variable/tmp_spec.rb +15 -0
  61. data/spec/spec_helper.rb +27 -0
  62. data/spec/support/common.rb +13 -0
  63. data/spec/support/coverage.rb +14 -0
  64. data/spec/support/env_mock.rb +3 -0
  65. data/spec/support/fakeredis.rb +3 -0
  66. metadata +155 -20
  67. data/spec/models/rspeed/splitter/destroy_spec.rb +0 -33
  68. data/spec/models/rspeed/splitter/keys_spec.rb +0 -33
  69. data/spec/models/rspeed/splitter/last_pipe_spec.rb +0 -21
  70. data/spec/models/rspeed/splitter/pipe_spec.rb +0 -21
  71. data/spec/models/rspeed/splitter/pipes_spec.rb +0 -27
  72. data/spec/models/rspeed/splitter/result_spec.rb +0 -19
  73. data/spec/models/rspeed/splitter/save_spec.rb +0 -55
  74. data/spec/rails_helper.rb +0 -24
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.client' do
4
+ it 'returns a redis client' do
5
+ expect(described_class.client.class).to eq(Redis)
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '#destroy' do
4
+ let!(:redis) { described_class }
5
+
6
+ before do
7
+ redis.set('rspeed', '{}')
8
+ redis.set('rspeed_1', '{}')
9
+ redis.set('rspeed_2', '{}')
10
+ end
11
+
12
+ it 'destroys via wildcard' do
13
+ redis.destroy('rspeed_*')
14
+
15
+ expect(redis.keys('*')).to eq %w[rspeed]
16
+ end
17
+
18
+ it 'destroys via single name' do
19
+ redis.destroy('rspeed')
20
+
21
+ expect(redis.keys('*')).to eq %w[rspeed_1 rspeed_2]
22
+ end
23
+
24
+ it 'destroys default partner when no pattern is given' do
25
+ redis.destroy
26
+
27
+ expect(redis.keys('*')).to eq %w[rspeed]
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.set' do
4
+ it 'sets a key on redis' do
5
+ described_class.client.set('key', 'value')
6
+
7
+ expect(described_class.get('key')).to eq('value')
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.keys' do
4
+ subject(:redis) { described_class }
5
+
6
+ context 'with default config' do
7
+ before do
8
+ described_class.set('rspeed_1', 'value_1')
9
+ described_class.set('rspeed_2', 'value_2')
10
+ described_class.set('rspeed_3', 'value_3')
11
+ end
12
+
13
+ it 'shows keys' do
14
+ expect(redis.keys).to eq %w[rspeed_1 rspeed_2 rspeed_3]
15
+ end
16
+ end
17
+
18
+ context 'with custom key' do
19
+ before do
20
+ described_class.set('custom_key_1', 'value_1')
21
+ described_class.set('custom_key_2', 'value_2')
22
+ described_class.set('custom_key_3', 'value_3')
23
+ end
24
+
25
+ it 'shows keys' do
26
+ expect(redis.keys('custom_key_*')).to eq %w[custom_key_1 custom_key_2 custom_key_3]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '#result?' do
4
+ context 'when has no key rspeed on redis' do
5
+ it { expect(described_class.result?).to be(false) }
6
+ end
7
+
8
+ context 'when has key rspeed on redis' do
9
+ before { described_class.set('rspeed', { files: [[1, '1_spec.rb']], number: 0, total: 1 }.to_json) }
10
+
11
+ it { expect(described_class.result?).to be(true) }
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.set' do
4
+ it 'sets a key on redis' do
5
+ described_class.set('key', 'value')
6
+
7
+ expect(described_class.client.get('key')).to eq('value')
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.specs_finished?' do
4
+ before do
5
+ described_class.set('rspeed_pipe_1', '1.0')
6
+
7
+ allow(RSpeed::Env).to receive(:pipes).and_return(2)
8
+ end
9
+
10
+ context 'when the quantity of pipe result is not the same as the quantity of pipes' do
11
+ it { expect(described_class.specs_finished?).to be(false) }
12
+ end
13
+
14
+ context 'when the quantity of pipe result is the same as the quantity of pipes' do
15
+ before { described_class.set('rspeed_pipe_2', '2.0') }
16
+
17
+ it { expect(described_class.specs_finished?).to be(true) }
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.specs_initiated?' do
4
+ context 'when has no pipe flag key' do
5
+ it { expect(described_class.specs_finished?).to be(false) }
6
+ end
7
+
8
+ context 'when has at least one pipe flag key' do
9
+ before { described_class.set('rspeed_pipe_1', '1.0') }
10
+
11
+ it { expect(described_class.specs_finished?).to be(true) }
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Runner, '#run' do
4
+ let!(:shell) { double('shell') }
5
+ let!(:splitter) { instance_double('RSpeed::Splitter') }
6
+
7
+ before do
8
+ allow(shell).to receive(:call)
9
+ allow(RSpeed::Splitter).to receive(:new).and_return(splitter)
10
+ allow(RSpeed::Observer).to receive(:after_suite)
11
+ end
12
+
13
+ context 'when does not need warm' do
14
+ before { allow(splitter).to receive(:need_warm?).and_return(false) }
15
+
16
+ it 'does not run the specs' do
17
+ described_class.run(shell)
18
+
19
+ expect(shell).not_to have_received(:call)
20
+ end
21
+
22
+ it 'executes the after suite to complete the current pipe' do
23
+ described_class.run(shell)
24
+
25
+ expect(RSpeed::Observer).to have_received(:after_suite)
26
+ end
27
+ end
28
+
29
+ context 'when need warm' do
30
+ before do
31
+ allow(splitter).to receive(:need_warm?).and_return(true)
32
+ allow(splitter).to receive(:pipe_files).and_return('spec_1.rb spec_2.rb')
33
+ end
34
+
35
+ it 'run the pipe specs' do
36
+ described_class.run(shell)
37
+
38
+ expect(shell).to have_received(:call).with('bundle exec rspec spec_1.rb spec_2.rb')
39
+ end
40
+
41
+ it 'does not execute the after suite to complete the current pipe' do
42
+ described_class.run(shell)
43
+
44
+ expect(RSpeed::Observer).not_to have_received(:after_suite)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Splitter, '#actual_examples' do
4
+ it 'returns all examples' do
5
+ splitter = described_class.new(specs_path: 'spec/fixtures/**/*_spec.rb')
6
+
7
+ expect(splitter.actual_examples).to eq [
8
+ 'spec/fixtures/1_spec.rb:4',
9
+ 'spec/fixtures/1_spec.rb:6',
10
+ 'spec/fixtures/1_spec.rb:8',
11
+ 'spec/fixtures/2_spec.rb:4',
12
+ ]
13
+ end
14
+
15
+ it 'does not raise when no file match' do
16
+ splitter = described_class.new(specs_path: 'spec/fixtures/**/*_missing.rb')
17
+
18
+ expect(splitter.actual_examples).to eq []
19
+ end
20
+
21
+ it 'does not raise when file is empty' do
22
+ splitter = described_class.new(specs_path: 'spec/fixtures/**/empty.rb')
23
+
24
+ expect(splitter.actual_examples).to eq []
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Splitter, '#append?' do
4
+ subject(:splitter) { described_class.new }
5
+
6
+ context 'when has no result' do
7
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(false) }
8
+
9
+ context 'when is not the first pipe' do
10
+ before { allow(splitter).to receive(:first_pipe?).and_return(false) }
11
+
12
+ it { expect(splitter.append?).to be(false) }
13
+ end
14
+
15
+ context 'when is the first pipe' do
16
+ before { allow(splitter).to receive(:first_pipe?).and_return(true) }
17
+
18
+ it { expect(splitter.append?).to be(true) }
19
+ end
20
+ end
21
+
22
+ context 'when has result' do
23
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(true) }
24
+
25
+ context 'when is not the first pipe' do
26
+ before { allow(splitter).to receive(:first_pipe?).and_return(false) }
27
+
28
+ it { expect(splitter.append?).to be(true) }
29
+ end
30
+
31
+ context 'when is the first pipe' do
32
+ before { allow(splitter).to receive(:first_pipe?).and_return(true) }
33
+
34
+ it { expect(splitter.append?).to be(true) }
35
+ end
36
+ end
37
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '#append' do
6
4
  subject(:splitter) { described_class.new }
7
5
 
@@ -10,11 +8,16 @@ RSpec.describe RSpeed::Splitter, '#append' do
10
8
 
11
9
  expect(splitter.get('rspeed_tmp')).to eq [
12
10
  '{"file":"2_spec.rb","time":2.0}',
13
- '{"file":"1_spec.rb","time":1.0}'
11
+ '{"file":"1_spec.rb","time":1.0}',
14
12
  ]
15
13
  end
16
14
 
17
15
  context 'when files is not given' do
16
+ before do
17
+ truncate_file
18
+ populate_csv_file
19
+ end
20
+
18
21
  it 'read csv and append file and time on rspeed key' do
19
22
  splitter.append
20
23
 
@@ -1,29 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '#diff' do
6
- subject(:splitter) { described_class.new }
4
+ subject(:splitter) { described_class.new(specs_path: './spec/fixtures/*_spec.rb') }
7
5
 
8
6
  let!(:redis) { redis_object }
9
7
 
10
8
  before do
11
- redis.lpush 'rspeed', { file: '1_spec.rb', time: 1 }.to_json
12
- redis.lpush 'rspeed', { file: '2_spec.rb', time: 2 }.to_json
13
- redis.lpush 'rspeed', { file: '3_spec.rb', time: 3 }.to_json
9
+ redis.lpush 'rspeed', { file: './spec/fixtures/1_spec.rb:4', time: '1.4' }.to_json
10
+ redis.lpush 'rspeed', { file: './spec/fixtures/1_spec.rb:6', time: '1.6' }.to_json
11
+ redis.lpush 'rspeed', { file: './spec/fixtures/1_spec.rb:8', time: '1.8' }.to_json
12
+ redis.lpush 'rspeed', { file: './spec/fixtures/2_spec.rb:4', time: '2.4' }.to_json
13
+ redis.lpush 'rspeed', { file: './spec/fixtures/2_spec.rb:666', time: '6' }.to_json
14
+ redis.lpush 'rspeed', { file: './spec/fixtures/x_spec.rb:1', time: 3 }.to_json
14
15
 
15
- allow(Dir).to receive(:[]).with('./spec/**/*_spec.rb').and_return %w[
16
- 2_spec.rb
17
- 3_spec.rb
18
- 4_spec.rb
19
- ]
16
+ File.open('spec/fixtures/new_spec.rb', 'a') { |file| file.write('it') }
20
17
  end
21
18
 
19
+ after { delete_file('spec/fixtures/new_spec.rb') }
20
+
22
21
  it 'removes removed specs and adds new spec and keeps keeped specs based on rspeed key values' do
23
22
  expect(splitter.diff).to eq [
24
- [0, '4_spec.rb'],
25
- [2, '2_spec.rb'],
26
- [3, '3_spec.rb']
23
+ { file: './spec/fixtures/2_spec.rb:4', time: '2.4' },
24
+ { file: './spec/fixtures/1_spec.rb:8', time: '1.8' },
25
+ { file: './spec/fixtures/1_spec.rb:6', time: '1.6' },
26
+ { file: './spec/fixtures/1_spec.rb:4', time: '1.4' },
27
+ { file: './spec/fixtures/new_spec.rb:1', time: 0 },
27
28
  ]
28
29
  end
29
30
  end
@@ -1,18 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '.first_pipe?' do
6
4
  subject(:splitter) { described_class.new }
7
5
 
8
6
  context 'when pipe env is 1' do
9
- before { allow(splitter).to receive(:pipe).and_return 1 }
7
+ before { allow(RSpeed::Env).to receive(:pipe).and_return 1 }
10
8
 
11
9
  it { expect(splitter.first_pipe?).to eq true }
12
10
  end
13
11
 
14
12
  context 'when pipe env is not 1' do
15
- before { allow(splitter).to receive(:pipe).and_return 2 }
13
+ before { allow(RSpeed::Env).to receive(:pipe).and_return 2 }
16
14
 
17
15
  it { expect(splitter.first_pipe?).to eq false }
18
16
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '#get' do
6
4
  subject(:splitter) { described_class.new }
7
5
 
@@ -18,14 +16,14 @@ RSpec.describe RSpeed::Splitter, '#get' do
18
16
  {
19
17
  'files' => [[1, '1_spec.rb'], [2, '2_spec.rb']],
20
18
  'number' => 0,
21
- 'total' => 3
19
+ 'total' => 3,
22
20
  },
23
21
 
24
22
  {
25
23
  'files' => [[3, '3_spec.rb']],
26
24
  'number' => 1,
27
- 'total' => 3
28
- }
25
+ 'total' => 3,
26
+ },
29
27
  ]
30
28
  end
31
29
  end
@@ -40,8 +38,8 @@ RSpec.describe RSpeed::Splitter, '#get' do
40
38
  {
41
39
  'files' => [[1, '1_spec.rb'], [2, '2_spec.rb']],
42
40
  'number' => 0,
43
- 'total' => 3
44
- }
41
+ 'total' => 3,
42
+ },
45
43
  ]
46
44
  end
47
45
  end
@@ -55,7 +53,7 @@ RSpec.describe RSpeed::Splitter, '#get' do
55
53
  it 'executes the right fetch method' do
56
54
  expect(splitter.get('rspeed')).to eq [
57
55
  '{"file":"2_spec.rb","time":2}',
58
- '{"file":"1_spec.rb","time":1}'
56
+ '{"file":"1_spec.rb","time":1}',
59
57
  ]
60
58
  end
61
59
  end
@@ -69,7 +67,7 @@ RSpec.describe RSpeed::Splitter, '#get' do
69
67
  it 'executes the right fetch method' do
70
68
  expect(splitter.get('rspeed_tmp')).to eq [
71
69
  '{"file":"2_spec.rb","time":2}',
72
- '{"file":"1_spec.rb","time":1}'
70
+ '{"file":"1_spec.rb","time":1}',
73
71
  ]
74
72
  end
75
73
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Splitter, '#need_warm?' do
4
+ subject(:splitter) { described_class.new }
5
+
6
+ context 'when has no result' do
7
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(false) }
8
+
9
+ context 'when is not the first pipe' do
10
+ before { allow(splitter).to receive(:first_pipe?).and_return(false) }
11
+
12
+ it { expect(splitter.need_warm?).to be(false) }
13
+ end
14
+
15
+ context 'when is the first pipe' do
16
+ before { allow(splitter).to receive(:first_pipe?).and_return(true) }
17
+
18
+ it { expect(splitter.need_warm?).to be(true) }
19
+ end
20
+ end
21
+
22
+ context 'when has result' do
23
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(true) }
24
+
25
+ context 'when is not the first pipe' do
26
+ before { allow(splitter).to receive(:first_pipe?).and_return(false) }
27
+
28
+ it { expect(splitter.need_warm?).to be(false) }
29
+ end
30
+
31
+ context 'when is the first pipe' do
32
+ before { allow(splitter).to receive(:first_pipe?).and_return(true) }
33
+
34
+ it { expect(splitter.need_warm?).to be(false) }
35
+ end
36
+ end
37
+ end