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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Differ, '#final_diff' do
6
+ let!(:redis) { redis_object }
7
+
8
+ before do
9
+ redis.rpush('rspeed_previous', { file: './spec/fixtures/1_spec.rb:1', time: 1.1 }.to_json)
10
+ redis.rpush('rspeed_previous', { file: './spec/fixtures/2_spec.rb:2', time: 2.2 }.to_json)
11
+ redis.rpush('rspeed_previous', { file: './spec/fixtures/3_spec.rb:3', time: 3.3 }.to_json)
12
+ redis.rpush('rspeed_previous', { file: './spec/fixtures/4_spec.rb:4', time: 4.4 }.to_json)
13
+
14
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:1', time: 1.1 }.to_json)
15
+ redis.rpush('rspeed', { file: './spec/fixtures/2_spec.rb:2', time: 2.2 }.to_json)
16
+ redis.rpush('rspeed', { file: './spec/fixtures/5_spec.rb:5', time: 5.5 }.to_json)
17
+ redis.rpush('rspeed', { file: './spec/fixtures/6_spec.rb:6', time: 6.6 }.to_json)
18
+ end
19
+
20
+ it 'returns the diff' do
21
+ expect(described_class.final_diff).to eq(
22
+ actual_files: [
23
+ { file: './spec/fixtures/1_spec.rb:1', time: 1.1 },
24
+ { file: './spec/fixtures/2_spec.rb:2', time: 2.2 },
25
+ { file: './spec/fixtures/5_spec.rb:5', time: 5.5 },
26
+ { file: './spec/fixtures/6_spec.rb:6', time: 6.6 },
27
+ ],
28
+
29
+ actual_time: 15.4,
30
+
31
+ added_files: [
32
+ { file: './spec/fixtures/5_spec.rb:5', time: 5.5 },
33
+ { file: './spec/fixtures/6_spec.rb:6', time: 6.6 },
34
+ ],
35
+
36
+ added_time: 12.1,
37
+
38
+ removed_files: [
39
+ { file: './spec/fixtures/3_spec.rb:3', time: 3.3 },
40
+ { file: './spec/fixtures/4_spec.rb:4', time: 4.4 },
41
+ ],
42
+
43
+ removed_time: 7.7
44
+ )
45
+ end
46
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#removed_data' do
4
+ let!(:files) { ['./spec/fixtures/2_spec.rb:4'] }
5
+
6
+ let!(:result) do
7
+ [
8
+ { file: './spec/fixtures/1_spec.rb:4', time: 1.4 },
9
+ { file: './spec/fixtures/1_spec.rb:6', time: 1.6 },
10
+ { file: './spec/fixtures/2_spec.rb:4', time: 2.4 },
11
+ ]
12
+ end
13
+
14
+ it 'returns only removed data' do
15
+ expect(described_class.removed_data(files: files, result: result)).to eq [
16
+ { file: './spec/fixtures/1_spec.rb:4', time: 1.4 },
17
+ { file: './spec/fixtures/1_spec.rb:6', time: 1.6 },
18
+ ]
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#sum_time' do
4
+ context 'when has at least one time with value' do
5
+ let!(:data) { [{ time: 1.4 }, { time: 1.6 }, { time: 2.4 }, { time: nil }] }
6
+
7
+ it 'sums the time key' do
8
+ expect(described_class.sum_time(data: data)).to be(5.4)
9
+ end
10
+ end
11
+
12
+ context 'when all time are nil' do
13
+ let!(:data) { [{ time: nil }, { time: nil }] }
14
+
15
+ it 'returns a question mark' do
16
+ expect(described_class.sum_time(data: data)).to eq('?')
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.app' do
6
+ context 'when env is given' do
7
+ it 'returns the env value' do
8
+ EnvMock.mock(rspeed_app: 'app') do
9
+ expect(described_class.app).to eq('app')
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'when env is not given' do
15
+ it { expect(described_class.app).to be(nil) }
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.db' do
6
+ context 'when key is not setted on env' do
7
+ it { expect(described_class.db).to be(nil) }
8
+ end
9
+
10
+ context 'when key is setted on env' do
11
+ it 'returns env value as integer' do
12
+ EnvMock.mock(rspeed_db: '10') do
13
+ expect(described_class.db).to be(10)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.host' do
6
+ context 'when key is not setted on env' do
7
+ it { expect(described_class.host).to be(nil) }
8
+ end
9
+
10
+ context 'when key is setted on env' do
11
+ it 'returns env value' do
12
+ EnvMock.mock(rspeed_host: 'localhost') do
13
+ expect(described_class.host).to eq('localhost')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.pipe' do
6
+ context 'when pipe env is given' do
7
+ it 'returns the number of the current pipe as integer' do
8
+ EnvMock.mock(rspeed_pipe: '2') do
9
+ expect(described_class.pipe).to be(2)
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'when pipe env is not given' do
15
+ it 'returns 1' do
16
+ expect(described_class.pipe).to be(1)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.pipes' do
6
+ context 'when env is setted' do
7
+ it 'returns the env value' do
8
+ EnvMock.mock(rspeed_pipes: '2') do
9
+ expect(described_class.pipes).to be(2)
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'when env is not setted' do
15
+ it 'returns number 1' do
16
+ expect(described_class.pipes).to be(1)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.port' do
6
+ context 'when key is not setted on env' do
7
+ it { expect(described_class.port).to be(nil) }
8
+ end
9
+
10
+ context 'when key is setted on env' do
11
+ it 'returns env value as integer' do
12
+ EnvMock.mock(rspeed_port: '6379') do
13
+ expect(described_class.port).to be(6379)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.rspeed' do
6
+ context 'when env is given' do
7
+ context 'when true as string' do
8
+ it 'true' do
9
+ EnvMock.mock(rspeed: 'true') do
10
+ expect(described_class.rspeed).to be(true)
11
+ end
12
+ end
13
+ end
14
+
15
+ context 'when true' do
16
+ it 'true' do
17
+ EnvMock.mock(rspeed: true) do
18
+ expect(described_class.rspeed).to be(true)
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'when false as string' do
24
+ it 'false' do
25
+ EnvMock.mock(rspeed: 'false') do
26
+ expect(described_class.rspeed).to be(false)
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'when false' do
32
+ it 'false' do
33
+ EnvMock.mock(rspeed: false) do
34
+ expect(described_class.rspeed).to be(false)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'when env is not given' do
41
+ it { expect(described_class.rspeed).to be(false) }
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.spec_path' do
6
+ context 'when env is given' do
7
+ it 'is returned' do
8
+ EnvMock.mock(rspeed_spec_path: './test/**/*test.rb') do
9
+ expect(described_class.spec_path).to eq('./test/**/*test.rb')
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'when env is not given' do
15
+ it 'returns the default' do
16
+ expect(described_class.spec_path).to eq('./spec/**/*spec.rb')
17
+ end
18
+ end
19
+ end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Observer, '.after' do
6
4
  let!(:now) { Time.local(2020, 1, 1, 0, 0, 1) }
7
5
  let!(:clock) { class_double(RSpec::Core::Time, now: now) }
8
6
  let!(:metadata) { { file_path: 'file_path', line_number: 7, start_at: now - 1 } }
9
7
  let!(:example) { instance_double(RSpec::Core::Example, clock: clock, metadata: metadata) }
10
8
 
11
- before { truncate_file }
9
+ before { truncate_profiles }
12
10
 
13
- it 'appends the time of example on csv file' do
11
+ it 'appends the file and time on pipe profile key' do
14
12
  described_class.after(example)
15
13
 
16
- expect(File.open('rspeed.csv').read).to eq "1.0,file_path:7\n"
14
+ expect(RSpeed::Redis.client.lrange(RSpeed::Variable.profile, 0, -1)).to eq [
15
+ { file: 'file_path:7', time: 1.0 }.to_json,
16
+ ]
17
17
  end
18
18
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Observer, '.after_suite' do
4
+ context 'when all specs is not finished' do
5
+ let!(:redis) { redis_object }
6
+
7
+ before { allow(RSpeed::Redis).to receive(:specs_finished?).and_return(false) }
8
+
9
+ it 'sets true on pipe key to indicates that its finished' do
10
+ described_class.after_suite
11
+
12
+ expect(redis.get('rspeed:pipe_01')).to eq('true')
13
+ end
14
+ end
15
+
16
+ context 'when all specs finished' do
17
+ before do
18
+ allow(RSpeed::Redis).to receive(:specs_finished?).and_return(true)
19
+ allow(RSpeed::Redis).to receive(:version_the_result)
20
+ allow(RSpeed::Splitter).to receive(:consolidate)
21
+ allow(RSpeed::Reporter).to receive(:call)
22
+ allow(RSpeed::Redis).to receive(:clean)
23
+ end
24
+
25
+ it 'consolidates profiles' do
26
+ described_class.after_suite
27
+
28
+ expect(RSpeed::Splitter).to have_received(:consolidate)
29
+ end
30
+
31
+ it 'reports' do
32
+ described_class.after_suite
33
+
34
+ expect(RSpeed::Reporter).to have_received(:call)
35
+ end
36
+
37
+ it 'destroyes pipe finished flag keys' do
38
+ described_class.after_suite
39
+
40
+ expect(RSpeed::Redis).to have_received(:clean)
41
+ end
42
+ end
43
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Observer, '.before' do
6
4
  let!(:now) { Time.local(2020) }
7
5
  let!(:clock) { class_double(RSpec::Core::Time, now: now) }
@@ -1,15 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Observer, '.before_suite' do
6
- before { truncate_file }
4
+ let!(:redis) { redis_object }
5
+
6
+ before { truncate_profiles }
7
+
8
+ after { truncate_profiles }
9
+
10
+ it 'cleans only the current pipe profile' do
11
+ redis.rpush('rspeed:profile_01', { file: '1_spec.rb', time: 1 }.to_json)
12
+ redis.rpush('rspeed:profile_02', { file: '2_spec.rb', time: 2 }.to_json)
13
+
14
+ described_class.before_suite
15
+
16
+ expect(redis.keys).to eq ['rspeed:profile_02']
17
+ end
7
18
 
8
- it 'cleans the csv file' do
9
- File.open('rspeed.csv', 'a') { |file| file.write('content') }
19
+ it 'cleans the pipe flag' do
20
+ redis.set('rspeed:pipe_01', true)
21
+ redis.set('rspeed:pipe_02', true)
10
22
 
11
23
  described_class.before_suite
12
24
 
13
- expect(File.open('rspeed.csv').read).to eq ''
25
+ expect(redis.keys).to eq ['rspeed:pipe_02']
14
26
  end
15
27
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '.clean' do
4
+ it 'destroys all keys that keeps the pipe finished info' do
5
+ redis_object.set('rspeed:pipe_01', true)
6
+ redis_object.set('rspeed:pipe_02', true)
7
+
8
+ described_class.clean
9
+
10
+ expect(redis_object.keys('*')).to eq([])
11
+ end
12
+
13
+ it 'destroys the pipe profiles' do
14
+ redis_object.set('rspeed:profile_01', true)
15
+
16
+ described_class.clean
17
+
18
+ expect(redis_object.keys('*')).to eq([])
19
+ end
20
+ end
@@ -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,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Redis, '#destroy' do
4
+ before do
5
+ redis_object.set('rspeed', '{}')
6
+ redis_object.set('rspeed_1', '{}')
7
+ redis_object.set('rspeed_2', '{}')
8
+ end
9
+
10
+ it 'destroys via wildcard' do
11
+ described_class.destroy(pattern: 'rspeed_*')
12
+
13
+ expect(redis_object.keys('*')).to eq %w[rspeed]
14
+ end
15
+
16
+ it 'destroys via single name' do
17
+ described_class.destroy(pattern: 'rspeed')
18
+
19
+ expect(redis_object.keys('*')).to eq %w[rspeed_1 rspeed_2]
20
+ end
21
+ 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
+ redis_object.set('key', 'value')
8
+
9
+ expect(described_class.get('key')).to eq('value')
10
+ end
11
+ end