rspeed 0.2.0 → 0.5.2

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +10 -7
  4. data/lib/generators/rspeed/install_generator.rb +1 -1
  5. data/lib/rspeed.rb +8 -7
  6. data/lib/rspeed/env.rb +39 -0
  7. data/lib/rspeed/extension.rb +3 -2
  8. data/lib/rspeed/logger.rb +11 -0
  9. data/lib/rspeed/observer.rb +21 -6
  10. data/lib/rspeed/redis.rb +64 -0
  11. data/lib/rspeed/runner.rb +5 -16
  12. data/lib/rspeed/splitter.rb +66 -71
  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/observer/after_spec.rb +5 -5
  29. data/spec/models/rspeed/observer/after_suite_spec.rb +57 -0
  30. data/spec/models/rspeed/observer/before_spec.rb +0 -2
  31. data/spec/models/rspeed/observer/before_suite_spec.rb +17 -6
  32. data/spec/models/rspeed/redis/clean_spec.rb +20 -0
  33. data/spec/models/rspeed/redis/client_spec.rb +7 -0
  34. data/spec/models/rspeed/redis/destroy_spec.rb +29 -0
  35. data/spec/models/rspeed/redis/get_spec.rb +9 -0
  36. data/spec/models/rspeed/redis/keys_spec.rb +29 -0
  37. data/spec/models/rspeed/redis/result_spec.rb +13 -0
  38. data/spec/models/rspeed/redis/set_spec.rb +9 -0
  39. data/spec/models/rspeed/redis/specs_finished_spec.rb +19 -0
  40. data/spec/models/rspeed/redis/specs_initiated_spec.rb +13 -0
  41. data/spec/models/rspeed/runner/run_spec.rb +77 -0
  42. data/spec/models/rspeed/splitter/actual_examples_spec.rb +26 -0
  43. data/spec/models/rspeed/splitter/append_question_spec.rb +37 -0
  44. data/spec/models/rspeed/splitter/append_spec.rb +9 -27
  45. data/spec/models/rspeed/splitter/diff_spec.rb +15 -14
  46. data/spec/models/rspeed/splitter/first_pipe_spec.rb +2 -4
  47. data/spec/models/rspeed/splitter/get_spec.rb +6 -22
  48. data/spec/models/rspeed/splitter/need_warm_question_spec.rb +37 -0
  49. data/spec/models/rspeed/splitter/pipe_files_spec.rb +26 -0
  50. data/spec/models/rspeed/splitter/rename_spec.rb +13 -6
  51. data/spec/models/rspeed/splitter/split_spec.rb +70 -34
  52. data/spec/models/rspeed/variable/append_name_spec.rb +19 -0
  53. data/spec/models/rspeed/variable/default_partner_spec.rb +5 -0
  54. data/spec/models/rspeed/variable/key_spec.rb +15 -0
  55. data/spec/models/rspeed/variable/pipe_name_spec.rb +15 -0
  56. data/spec/models/rspeed/variable/pipe_profile_spec.rb +15 -0
  57. data/spec/models/rspeed/variable/pipes_pattern_spec.rb +5 -0
  58. data/spec/models/rspeed/variable/profile_pattern_spec.rb +5 -0
  59. data/spec/models/rspeed/variable/result_spec.rb +19 -0
  60. data/spec/spec_helper.rb +27 -0
  61. data/spec/support/common.rb +13 -0
  62. data/spec/support/coverage.rb +14 -0
  63. data/spec/support/env_mock.rb +3 -0
  64. data/spec/support/fakeredis.rb +3 -0
  65. metadata +146 -20
  66. data/spec/models/rspeed/splitter/destroy_spec.rb +0 -33
  67. data/spec/models/rspeed/splitter/keys_spec.rb +0 -33
  68. data/spec/models/rspeed/splitter/last_pipe_spec.rb +0 -21
  69. data/spec/models/rspeed/splitter/pipe_spec.rb +0 -21
  70. data/spec/models/rspeed/splitter/pipes_spec.rb +0 -27
  71. data/spec/models/rspeed/splitter/result_spec.rb +0 -19
  72. data/spec/models/rspeed/splitter/save_spec.rb +0 -55
  73. data/spec/rails_helper.rb +0 -43
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Variable
5
+ module_function
6
+
7
+ DEFAULT_PATTERN = 'rspeed_*'
8
+ PIPES_PATTERN = 'rspeed_pipe_*'
9
+ PROFILE_PATTERN = 'rspeed_profile_*'
10
+
11
+ def append_name(value, suffix = nil)
12
+ [value, RSpeed::Env.name, suffix].compact.join('_')
13
+ end
14
+
15
+ def key(number)
16
+ append_name('rspeed', number).to_sym
17
+ end
18
+
19
+ def result
20
+ append_name('rspeed')
21
+ end
22
+
23
+ def pipe_name
24
+ append_name('rspeed_pipe', RSpeed::Env.pipe)
25
+ end
26
+
27
+ def profile
28
+ append_name('rspeed_profile', RSpeed::Env.pipe)
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
- VERSION = '0.2.0'
4
+ VERSION = '0.5.2'
5
5
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV['RAILS_ENV'] ||= 'test'
4
+
5
+ require 'support/coverage'
6
+
7
+ require 'pry-byebug'
8
+ require 'rspeed'
9
+ require 'support/common'
10
+ require 'support/fakeredis'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'fixture_1' do
4
+ it { sleep 0.1 }
5
+
6
+ it { sleep 0.2 }
7
+
8
+ it { sleep 0.3 }
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'fixture_2' do
4
+ it { sleep 2 }
5
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'empty' do
4
+ end
@@ -0,0 +1 @@
1
+ 10,./spec/fixtures/new_spec.rb.csv:1010,./spec/fixtures/new_spec.rb.csv:10
@@ -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,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.name' do
6
+ context 'when env is given' do
7
+ it 'returns the env value' do
8
+ EnvMock.mock(rspeed_name: 'name') do
9
+ expect(described_class.name).to eq('name')
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'when env is not given' do
15
+ it { expect(described_class.name).to be(nil) }
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,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.result_key' do
6
+ context 'when key is not setted on env' do
7
+ it 'returns default value' do
8
+ expect(described_class.result_key).to eq 'rspeed'
9
+ end
10
+ end
11
+
12
+ context 'when key is setted on env' do
13
+ it 'returns env value' do
14
+ EnvMock.mock(respeed_result_key: 'result_customer') do
15
+ expect(described_class.result_key).to eq 'result_customer'
16
+ end
17
+ end
18
+ end
19
+ 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
@@ -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 { clean_csv_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,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Observer, '.after_suite' do
4
+ let!(:splitter) { instance_double('RSpeed::Splitter') }
5
+
6
+ before do
7
+ allow(RSpeed::Splitter).to receive(:new).and_return(splitter)
8
+ allow(splitter).to receive(:append)
9
+ end
10
+
11
+ context 'when append? returns false' do
12
+ before do
13
+ allow(splitter).to receive(:append?).and_return(false)
14
+ allow(splitter).to receive(:rename)
15
+ end
16
+
17
+ it 'does not append the time result' do
18
+ described_class.after_suite
19
+
20
+ expect(splitter).not_to have_received(:append)
21
+ end
22
+ end
23
+
24
+ context 'when all specs is not finished' do
25
+ before do
26
+ allow(splitter).to receive(:append?)
27
+ allow(RSpeed::Redis).to receive(:specs_finished?).and_return(false)
28
+ end
29
+
30
+ it 'sets true on pipe key to indicates that its finished' do
31
+ described_class.after_suite
32
+
33
+ expect(RSpeed::Redis.get('rspeed_pipe_1')).to eq('true')
34
+ end
35
+ end
36
+
37
+ context 'when all specs finished' do
38
+ before do
39
+ allow(splitter).to receive(:append?)
40
+ allow(RSpeed::Redis).to receive(:specs_finished?).and_return(true)
41
+ allow(splitter).to receive(:rename)
42
+ allow(RSpeed::Redis).to receive(:clean)
43
+ end
44
+
45
+ it 'consolidates profiles' do
46
+ described_class.after_suite
47
+
48
+ expect(splitter).to have_received(:rename)
49
+ end
50
+
51
+ it 'destroyes pipe finished flag keys' do
52
+ described_class.after_suite
53
+
54
+ expect(RSpeed::Redis).to have_received(:clean)
55
+ end
56
+ end
57
+ 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,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_helper'
4
-
5
3
  RSpec.describe RSpeed::Observer, '.before_suite' do
6
- before { clean_csv_file }
4
+ let!(:redis) { redis_object }
5
+
6
+ before { truncate_profiles }
7
+ after { truncate_profiles }
8
+
9
+ it 'cleans only the current pipe profile' do
10
+ redis.lpush('rspeed_profile_1', { file: '1_spec.rb', time: 1 }.to_json)
11
+ redis.lpush('rspeed_profile_2', { file: '2_spec.rb', time: 2 }.to_json)
12
+
13
+ described_class.before_suite
14
+
15
+ expect(redis.keys).to eq ['rspeed_profile_2']
16
+ end
7
17
 
8
- it 'cleans the csv file' do
9
- File.open('rspeed.csv', 'a') { |file| file.write('content') }
18
+ it 'cleans the pipe flag' do
19
+ redis.set('rspeed_pipe_1', true)
20
+ redis.set('rspeed_pipe_2', true)
10
21
 
11
22
  described_class.before_suite
12
23
 
13
- expect(File.open('rspeed.csv').read).to eq ''
24
+ expect(redis.keys).to eq ['rspeed_pipe_2']
14
25
  end
15
26
  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
+ described_class.set('rspeed_pipe_1', true)
6
+ described_class.set('rspeed_pipe_2', true)
7
+
8
+ described_class.clean
9
+
10
+ expect(described_class.keys('*')).to eq([])
11
+ end
12
+
13
+ it 'destroys the pipe profiles' do
14
+ described_class.set('rspeed_profile_1', true)
15
+
16
+ described_class.clean
17
+
18
+ expect(described_class.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,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