rspeed 0.4.0 → 0.7.0

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -0
  3. data/README.md +10 -7
  4. data/lib/generators/rspeed/install_generator.rb +1 -1
  5. data/lib/rspeed.rb +10 -7
  6. data/lib/rspeed/database.rb +19 -0
  7. data/lib/rspeed/differ.rb +71 -0
  8. data/lib/rspeed/env.rb +39 -0
  9. data/lib/rspeed/extension.rb +3 -2
  10. data/lib/rspeed/logger.rb +13 -0
  11. data/lib/rspeed/observer.rb +19 -7
  12. data/lib/rspeed/redis.rb +78 -0
  13. data/lib/rspeed/reporter.rb +38 -0
  14. data/lib/rspeed/runner.rb +4 -15
  15. data/lib/rspeed/splitter.rb +25 -115
  16. data/lib/rspeed/variable.rb +34 -0
  17. data/lib/rspeed/version.rb +1 -1
  18. data/spec/common_helper.rb +10 -0
  19. data/spec/fixtures/empty.rb +4 -0
  20. data/spec/models/rspeed/database/list_spec.rb +15 -0
  21. data/spec/models/rspeed/database/previous_result_spec.rb +17 -0
  22. data/spec/models/rspeed/database/result_spec.rb +17 -0
  23. data/spec/models/rspeed/differ/actual_data_spec.rb +20 -0
  24. data/spec/models/rspeed/differ/actual_files_spec.rb +20 -0
  25. data/spec/models/rspeed/differ/added_data_spec.rb +19 -0
  26. data/spec/models/rspeed/differ/diff_spec.rb +77 -0
  27. data/spec/models/rspeed/differ/final_diff_spec.rb +46 -0
  28. data/spec/models/rspeed/differ/removed_data_spec.rb +20 -0
  29. data/spec/models/rspeed/differ/sum_time_spec.rb +19 -0
  30. data/spec/models/rspeed/env/app_spec.rb +17 -0
  31. data/spec/models/rspeed/env/db_spec.rb +17 -0
  32. data/spec/models/rspeed/env/host_spec.rb +17 -0
  33. data/spec/models/rspeed/env/pipe_spec.rb +19 -0
  34. data/spec/models/rspeed/env/pipes_spec.rb +19 -0
  35. data/spec/models/rspeed/env/port_spec.rb +17 -0
  36. data/spec/models/rspeed/env/rspeed_spec.rb +43 -0
  37. data/spec/models/rspeed/env/spec_path_spec.rb +19 -0
  38. data/spec/models/rspeed/observer/after_spec.rb +5 -5
  39. data/spec/models/rspeed/observer/after_suite_spec.rb +43 -0
  40. data/spec/models/rspeed/observer/before_spec.rb +0 -2
  41. data/spec/models/rspeed/observer/before_suite_spec.rb +18 -6
  42. data/spec/models/rspeed/redis/clean_spec.rb +20 -0
  43. data/spec/models/rspeed/redis/client_spec.rb +7 -0
  44. data/spec/models/rspeed/redis/destroy_spec.rb +21 -0
  45. data/spec/models/rspeed/redis/get_spec.rb +11 -0
  46. data/spec/models/rspeed/redis/keys_spec.rb +13 -0
  47. data/spec/models/rspeed/redis/list_spec.rb +19 -0
  48. data/spec/models/rspeed/redis/profiles_content_spec.rb +19 -0
  49. data/spec/models/rspeed/redis/result_spec.rb +13 -0
  50. data/spec/models/rspeed/redis/set_spec.rb +11 -0
  51. data/spec/models/rspeed/redis/specs_finished_spec.rb +19 -0
  52. data/spec/models/rspeed/redis/specs_initiated_spec.rb +13 -0
  53. data/spec/models/rspeed/redis/version_the_result_spec.rb +21 -0
  54. data/spec/models/rspeed/reporter/call_spec.rb +42 -0
  55. data/spec/models/rspeed/reporter/print_files_spec.rb +27 -0
  56. data/spec/models/rspeed/reporter/print_table_spec.rb +29 -0
  57. data/spec/models/rspeed/runner/run_spec.rb +73 -0
  58. data/spec/models/rspeed/splitter/append_spec.rb +8 -28
  59. data/spec/models/rspeed/splitter/consolidate_spec.rb +23 -0
  60. data/spec/models/rspeed/splitter/first_pipe_spec.rb +4 -8
  61. data/spec/models/rspeed/splitter/need_warm_question_spec.rb +35 -0
  62. data/spec/models/rspeed/splitter/pipe_files_spec.rb +30 -0
  63. data/spec/models/rspeed/splitter/split_spec.rb +85 -45
  64. data/spec/models/rspeed/variable/append_app_name_spec.rb +33 -0
  65. data/spec/models/rspeed/variable/key_spec.rb +15 -0
  66. data/spec/models/rspeed/variable/pipe_spec.rb +23 -0
  67. data/spec/models/rspeed/variable/pipes_pattern_spec.rb +5 -0
  68. data/spec/models/rspeed/variable/previous_result_spec.rb +19 -0
  69. data/spec/models/rspeed/variable/profile_pattern_spec.rb +5 -0
  70. data/spec/models/rspeed/variable/profile_spec.rb +23 -0
  71. data/spec/models/rspeed/variable/result_spec.rb +19 -0
  72. data/spec/spec_helper.rb +27 -0
  73. data/spec/support/common.rb +13 -0
  74. data/spec/support/coverage.rb +14 -0
  75. data/spec/support/env_mock.rb +3 -0
  76. data/spec/support/fakeredis.rb +3 -0
  77. metadata +187 -30
  78. data/spec/fixtures/new_spec.rb.csv +0 -1
  79. data/spec/models/rspeed/splitter/actual_examples_spec.rb +0 -22
  80. data/spec/models/rspeed/splitter/destroy_spec.rb +0 -33
  81. data/spec/models/rspeed/splitter/diff_spec.rb +0 -32
  82. data/spec/models/rspeed/splitter/get_spec.rb +0 -76
  83. data/spec/models/rspeed/splitter/keys_spec.rb +0 -33
  84. data/spec/models/rspeed/splitter/last_pipe_spec.rb +0 -21
  85. data/spec/models/rspeed/splitter/pipe_spec.rb +0 -21
  86. data/spec/models/rspeed/splitter/pipes_spec.rb +0 -27
  87. data/spec/models/rspeed/splitter/rename_spec.rb +0 -18
  88. data/spec/models/rspeed/splitter/result_spec.rb +0 -19
  89. data/spec/models/rspeed/splitter/save_spec.rb +0 -57
  90. data/spec/rails_helper.rb +0 -47
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.keys' do
4
+ before do
5
+ redis_object.set('custom_key_1', 'value_1')
6
+ redis_object.set('custom_key_2', 'value_2')
7
+ redis_object.set('custom_key_3', 'value_3')
8
+ end
9
+
10
+ it 'shows keys' do
11
+ expect(described_class.keys(pattern: 'custom_key_*')).to eq %w[custom_key_1 custom_key_2 custom_key_3]
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '#list' do
4
+ let!(:redis) { redis_object }
5
+
6
+ before do
7
+ redis.rpush('key', { file: '1_spec.rb', time: 1.0 }.to_json)
8
+ redis.rpush('key', { file: '2_spec.rb', time: 2.0 }.to_json)
9
+ redis.rpush('key', { file: '3_spec.rb', time: 3.0 }.to_json)
10
+ end
11
+
12
+ it 'list all key entries' do
13
+ expect(described_class.list('key')).to eq [
14
+ '{"file":"1_spec.rb","time":1.0}',
15
+ '{"file":"2_spec.rb","time":2.0}',
16
+ '{"file":"3_spec.rb","time":3.0}',
17
+ ]
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '#profiles_content' do
4
+ let!(:redis) { redis_object }
5
+
6
+ before do
7
+ redis.rpush('rspeed:profile_01', { file: '1_spec.rb', time: 1.0 }.to_json)
8
+ redis.rpush('rspeed:profile_02', { file: '2_spec.rb', time: 2.0 }.to_json)
9
+ redis.rpush('rspeed:profile_03', { file: '3_spec.rb', time: 3.0 }.to_json)
10
+ end
11
+
12
+ it 'returns the content of all profiles keys' do
13
+ expect(described_class.profiles_content).to eq [
14
+ '{"file":"1_spec.rb","time":1.0}',
15
+ '{"file":"2_spec.rb","time":2.0}',
16
+ '{"file":"3_spec.rb","time":3.0}',
17
+ ]
18
+ end
19
+ 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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.set' do
4
+ let!(:redis) { redis_object }
5
+
6
+ it 'sets a key on redis' do
7
+ described_class.set('key', 'value')
8
+
9
+ expect(redis.get('key')).to eq('value')
10
+ end
11
+ 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_01', '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_02', '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_finished?' 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_01', '1.0') }
10
+
11
+ it { expect(described_class.specs_finished?).to be(true) }
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.version_the_result' do
4
+ before { redis_object.rpush(RSpeed::Variable.result, true) }
5
+
6
+ it 'renames the result to a previous result key' do
7
+ described_class.version_the_result
8
+
9
+ expect(redis_object.keys).to eq([RSpeed::Variable.previous_result])
10
+ end
11
+
12
+ context 'when already have a previous result' do
13
+ before { redis_object.rpush(RSpeed::Variable.previous_result, true) }
14
+
15
+ it 'overrides' do
16
+ described_class.version_the_result
17
+
18
+ expect(redis_object.keys).to eq([RSpeed::Variable.previous_result])
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Reporter, '#call' do
4
+ let!(:previous_result) do
5
+ [
6
+ { file: './spec/fixtures/1_spec.rb:1', time: 1.1 },
7
+ { file: './spec/fixtures/2_spec.rb:2', time: 2.2 },
8
+ { file: './spec/fixtures/3_spec.rb:3', time: 3.3 },
9
+ { file: './spec/fixtures/4_spec.rb:4', time: 4.4 },
10
+ ]
11
+ end
12
+
13
+ let!(:result) do
14
+ [
15
+ { file: './spec/fixtures/1_spec.rb:1', time: 1.1 },
16
+ { file: './spec/fixtures/2_spec.rb:2', time: 2.2 },
17
+ { file: './spec/fixtures/5_spec.rb:5', time: 5.5 },
18
+ { file: './spec/fixtures/6_spec.rb:6', time: 6.6 },
19
+ ]
20
+ end
21
+
22
+ before do
23
+ allow(RSpeed::Database).to receive(:previous_result).and_return(previous_result)
24
+ allow(RSpeed::Database).to receive(:result).and_return(result)
25
+ end
26
+
27
+ it 'prints a report' do
28
+ output = <<~HEREDOC
29
+ +--------------+-------+
30
+ | RSpeed |
31
+ +--------------+-------+
32
+ | Global | Value |
33
+ +--------------+-------+
34
+ | Actual Time | 15.4 |
35
+ | Removed Time | 7.7 |
36
+ | Added Time | 12.1 |
37
+ +--------------+-------+
38
+ HEREDOC
39
+
40
+ expect { described_class.call }.to output(output).to_stdout
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Reporter, '#print_files' do
4
+ let!(:items) do
5
+ [
6
+ { file: './spec/fixtures/1_spec.rb:1', time: 1.1 },
7
+ { file: './spec/fixtures/2_spec.rb:2', time: 2.2 },
8
+ { file: './spec/fixtures/3_spec.rb:3', time: 3.3 },
9
+ ]
10
+ end
11
+
12
+ it 'prints the attributes' do
13
+ output = <<~HEREDOC
14
+ +---------+-----------------------------+-----------+
15
+ | RSpeed |
16
+ +---------+-----------------------------+-----------+
17
+ | 3 specs | Pipe 1/1 | Last Time |
18
+ +---------+-----------------------------+-----------+
19
+ | 01 | ./spec/fixtures/1_spec.rb:1 | 1.1 |
20
+ | 02 | ./spec/fixtures/2_spec.rb:2 | 2.2 |
21
+ | 03 | ./spec/fixtures/3_spec.rb:3 | 3.3 |
22
+ +---------+-----------------------------+-----------+
23
+ HEREDOC
24
+
25
+ expect { described_class.print_files(items) }.to output(output).to_stdout
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Reporter, '#print_table' do
4
+ let!(:headings) { %w[Global Value] }
5
+
6
+ let!(:rows) do
7
+ [
8
+ ['Actual Time', 1.0],
9
+ ['Removed Time', 2.0],
10
+ ['Added Time', 3.0],
11
+ ]
12
+ end
13
+
14
+ it 'prints' do
15
+ output = <<~HEREDOC
16
+ +--------------+-------+
17
+ | RSpeed |
18
+ +--------------+-------+
19
+ | Global | Value |
20
+ +--------------+-------+
21
+ | Actual Time | 1.0 |
22
+ | Removed Time | 2.0 |
23
+ | Added Time | 3.0 |
24
+ +--------------+-------+
25
+ HEREDOC
26
+
27
+ expect { described_class.print_table(headings: headings, rows: rows) }.to output(output).to_stdout
28
+ end
29
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Runner, '#run' do
4
+ let!(:shell) { double('shell') }
5
+
6
+ before { allow(shell).to receive(:call) }
7
+
8
+ context 'when has result' do
9
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(true) }
10
+
11
+ context 'when is the first pipe' do
12
+ before do
13
+ allow(RSpeed::Splitter).to receive(:first_pipe?).and_return(true)
14
+ allow(RSpeed::Splitter).to receive(:pipe_files).and_return('spec_1.rb spec_2.rb')
15
+ end
16
+
17
+ it 'runs the pipe specs' do
18
+ described_class.run(shell)
19
+
20
+ expect(shell).to have_received(:call).with('bundle exec rspec spec_1.rb spec_2.rb')
21
+ end
22
+ end
23
+
24
+ context 'when is not the first pipe' do
25
+ before do
26
+ allow(RSpeed::Splitter).to receive(:first_pipe?).and_return(false)
27
+ allow(RSpeed::Splitter).to receive(:pipe_files).and_return('spec_1.rb spec_2.rb')
28
+ end
29
+
30
+ it 'runs the pipe specs' do
31
+ described_class.run(shell)
32
+
33
+ expect(shell).to have_received(:call).with('bundle exec rspec spec_1.rb spec_2.rb')
34
+ end
35
+ end
36
+ end
37
+
38
+ context 'when has no result' do
39
+ before do
40
+ allow(RSpeed::Splitter).to receive(:first_pipe?).and_return(false)
41
+ allow(RSpeed::Splitter).to receive(:pipe_files).and_return('spec_1.rb spec_2.rb')
42
+ end
43
+
44
+ context 'when is the first pipe' do
45
+ before { allow(RSpeed::Splitter).to receive(:first_pipe?).and_return(true) }
46
+
47
+ it 'runs the pipe specs' do
48
+ described_class.run(shell)
49
+
50
+ expect(shell).to have_received(:call).with('bundle exec rspec spec_1.rb spec_2.rb')
51
+ end
52
+ end
53
+
54
+ context 'when is not the first pipe' do
55
+ before do
56
+ allow(RSpeed::Splitter).to receive(:first_pipe?).and_return(false)
57
+ allow(RSpeed::Observer).to receive(:after_suite)
58
+ end
59
+
60
+ it 'does not run the pipe specs' do
61
+ described_class.run(shell)
62
+
63
+ expect(shell).not_to have_received(:call)
64
+ end
65
+
66
+ it 'executes the after suite callback' do
67
+ described_class.run(shell)
68
+
69
+ expect(RSpeed::Observer).to have_received(:after_suite)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,37 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '#append' do
6
- subject(:splitter) { described_class.new }
4
+ let!(:redis) { redis_object }
7
5
 
8
6
  it 'appends file and time on rspeed key' do
9
- splitter.append [[1, '1_spec.rb'], [2, '2_spec.rb']]
7
+ described_class.append(
8
+ items: [{ file: '1_spec.rb', time: 1 }.to_json, { file: '2_spec.rb', time: 2 }.to_json],
9
+ key: 'rspeed'
10
+ )
10
11
 
11
- expect(splitter.get('rspeed_tmp')).to eq [
12
- '{"file":"2_spec.rb","time":2.0}',
13
- '{"file":"1_spec.rb","time":1.0}'
12
+ expect(redis.lrange('rspeed', 0, -1)).to eq [
13
+ '{"file":"1_spec.rb","time":1}',
14
+ '{"file":"2_spec.rb","time":2}',
14
15
  ]
15
16
  end
16
-
17
- context 'when files is not given' do
18
- before do
19
- truncate_file
20
- populate_csv_file
21
- end
22
-
23
- it 'read csv and append file and time on rspeed key' do
24
- splitter.append
25
-
26
- expect(splitter.get('rspeed_tmp')).to eq [
27
- '{"file":"./spec/0_2_spec.rb","time":0.2}',
28
- '{"file":"./spec/0_3_spec.rb","time":0.3}',
29
- '{"file":"./spec/0_4_spec.rb","time":0.4}',
30
- '{"file":"./spec/0_7_spec.rb","time":0.7}',
31
- '{"file":"./spec/1_1_spec.rb","time":1.1}',
32
- '{"file":"./spec/1_5_spec.rb","time":1.5}',
33
- '{"file":"./spec/2_0_spec.rb","time":2.0}',
34
- ]
35
- end
36
- end
37
17
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Splitter, '#consolidate' do
4
+ let!(:redis) { redis_object }
5
+
6
+ before do
7
+ redis.rpush('rspeed', 'rspeed_content')
8
+
9
+ redis.rpush('rspeed:profile_01', { file: '1_spec.rb', time: 1.0 }.to_json)
10
+ redis.rpush('rspeed:profile_02', { file: '2_spec.rb', time: 2.0 }.to_json)
11
+ redis.rpush('rspeed:profile_03', { file: '3_spec.rb', time: 3.0 }.to_json)
12
+ end
13
+
14
+ it 'copies profiles to the result key cleanning the previous result' do
15
+ described_class.consolidate
16
+
17
+ expect(redis.lrange('rspeed', 0, -1)).to eq [
18
+ '{"file":"1_spec.rb","time":1.0}',
19
+ '{"file":"2_spec.rb","time":2.0}',
20
+ '{"file":"3_spec.rb","time":3.0}',
21
+ ]
22
+ end
23
+ end
@@ -1,19 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Splitter, '.first_pipe?' do
6
- subject(:splitter) { described_class.new }
7
-
8
4
  context 'when pipe env is 1' do
9
- before { allow(splitter).to receive(:pipe).and_return 1 }
5
+ before { allow(RSpeed::Env).to receive(:pipe).and_return 1 }
10
6
 
11
- it { expect(splitter.first_pipe?).to eq true }
7
+ it { expect(described_class.first_pipe?).to eq true }
12
8
  end
13
9
 
14
10
  context 'when pipe env is not 1' do
15
- before { allow(splitter).to receive(:pipe).and_return 2 }
11
+ before { allow(RSpeed::Env).to receive(:pipe).and_return 2 }
16
12
 
17
- it { expect(splitter.first_pipe?).to eq false }
13
+ it { expect(described_class.first_pipe?).to eq false }
18
14
  end
19
15
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Splitter, '#need_warm?' do
4
+ context 'when has no result' do
5
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(false) }
6
+
7
+ context 'when is not the first pipe' do
8
+ before { allow(described_class).to receive(:first_pipe?).and_return(false) }
9
+
10
+ it { expect(described_class.need_warm?).to be(false) }
11
+ end
12
+
13
+ context 'when is the first pipe' do
14
+ before { allow(described_class).to receive(:first_pipe?).and_return(true) }
15
+
16
+ it { expect(described_class.need_warm?).to be(true) }
17
+ end
18
+ end
19
+
20
+ context 'when has result' do
21
+ before { allow(RSpeed::Redis).to receive(:result?).and_return(true) }
22
+
23
+ context 'when is not the first pipe' do
24
+ before { allow(described_class).to receive(:first_pipe?).and_return(false) }
25
+
26
+ it { expect(described_class.need_warm?).to be(false) }
27
+ end
28
+
29
+ context 'when is the first pipe' do
30
+ before { allow(described_class).to receive(:first_pipe?).and_return(true) }
31
+
32
+ it { expect(described_class.need_warm?).to be(false) }
33
+ end
34
+ end
35
+ end