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,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Variable
5
+ module_function
6
+
7
+ CSV = 'rspeed.csv'
8
+ DEFAULT_PATTERN = 'rspeed_*'
9
+ PIPES_PATTERN = 'rspeed_pipe_*'
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 tmp
24
+ append_name('rspeed_tmp')
25
+ end
26
+
27
+ def pipe_name
28
+ append_name('rspeed_pipe', 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.1.0'
4
+ VERSION = '0.5.1'
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
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Env, '.tmp_key' do
6
+ context 'when key is not setted on env' do
7
+ it 'returns default value' do
8
+ expect(described_class.tmp_key).to eq 'rspeed_tmp'
9
+ end
10
+ end
11
+
12
+ context 'when key is setted on env' do
13
+ it 'returns env value' do
14
+ EnvMock.mock(respeed_tmp_key: 'result_customer') do
15
+ expect(described_class.tmp_key).to eq 'result_customer'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Observer, '.after' do
4
+ let!(:now) { Time.local(2020, 1, 1, 0, 0, 1) }
5
+ let!(:clock) { class_double(RSpec::Core::Time, now: now) }
6
+ let!(:metadata) { { file_path: 'file_path', line_number: 7, start_at: now - 1 } }
7
+ let!(:example) { instance_double(RSpec::Core::Example, clock: clock, metadata: metadata) }
8
+
9
+ before { truncate_file }
10
+
11
+ it 'appends the time of example on csv file' do
12
+ described_class.after(example)
13
+
14
+ expect(File.open('rspeed.csv').read).to eq "1.0,file_path:7\n"
15
+ end
16
+ end
@@ -0,0 +1,70 @@
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 true' do
12
+ before do
13
+ allow(splitter).to receive(:append?).and_return(true)
14
+ allow(splitter).to receive(:rename)
15
+ end
16
+
17
+ it 'appends the time result on tmp key' do
18
+ described_class.after_suite
19
+
20
+ expect(splitter).to have_received(:append)
21
+ end
22
+ end
23
+
24
+ context 'when append? returns false' do
25
+ before do
26
+ allow(splitter).to receive(:append?).and_return(false)
27
+ allow(splitter).to receive(:rename)
28
+ end
29
+
30
+ it 'does not append the time result on tmp key' do
31
+ described_class.after_suite
32
+
33
+ expect(splitter).not_to have_received(:append)
34
+ end
35
+ end
36
+
37
+ context 'when all specs is not finished' do
38
+ before do
39
+ allow(splitter).to receive(:append?)
40
+ allow(RSpeed::Redis).to receive(:specs_finished?).and_return(false)
41
+ end
42
+
43
+ it 'sets true on pipe key to indicates that its finished' do
44
+ described_class.after_suite
45
+
46
+ expect(RSpeed::Redis.get('rspeed_pipe_1')).to eq('true')
47
+ end
48
+ end
49
+
50
+ context 'when all specs finished' do
51
+ before do
52
+ allow(splitter).to receive(:append?)
53
+ allow(RSpeed::Redis).to receive(:specs_finished?).and_return(true)
54
+ allow(splitter).to receive(:rename)
55
+ allow(RSpeed::Redis).to receive(:clean)
56
+ end
57
+
58
+ it 'renames the tmp data to the permanent key result' do
59
+ described_class.after_suite
60
+
61
+ expect(splitter).to have_received(:rename)
62
+ end
63
+
64
+ it 'destroyes pipe finished flag keys' do
65
+ described_class.after_suite
66
+
67
+ expect(RSpeed::Redis).to have_received(:clean)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Observer, '.before' do
4
+ let!(:now) { Time.local(2020) }
5
+ let!(:clock) { class_double(RSpec::Core::Time, now: now) }
6
+ let!(:example) { instance_double(RSpec::Core::Example, clock: clock) }
7
+
8
+ it 'saves the current time' do
9
+ allow(example).to receive(:update_inherited_metadata)
10
+
11
+ described_class.before(example)
12
+
13
+ expect(example).to have_received(:update_inherited_metadata).with(start_at: now)
14
+ end
15
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Observer, '.before_suite' do
4
+ before { truncate_file }
5
+
6
+ it 'cleans the csv file' do
7
+ File.open('rspeed.csv', 'a') { |file| file.write('content') }
8
+
9
+ described_class.before_suite
10
+
11
+ expect(File.open('rspeed.csv').read).to eq ''
12
+ end
13
+
14
+ context 'when specs are not initiated yet' do
15
+ before { allow(RSpeed::Redis).to receive(:specs_initiated?).and_return(false) }
16
+
17
+ it 'destroyes the tmp result key' do
18
+ RSpeed::Redis.client.lpush(RSpeed::Env.tmp_key, { file: 'file', time: 1.0 }.to_json)
19
+
20
+ described_class.before_suite
21
+
22
+ expect(RSpeed::Splitter.new.get(RSpeed::Variable.tmp)).to eq([])
23
+ end
24
+ end
25
+
26
+ context 'when specs are already initiated' do
27
+ before { allow(RSpeed::Redis).to receive(:specs_initiated?).and_return(true) }
28
+
29
+ it 'does not destroy the tmp result key' do
30
+ RSpeed::Redis.client.lpush(RSpeed::Env.tmp_key, { file: 'file', time: 1.0 }.to_json)
31
+
32
+ described_class.before_suite
33
+
34
+ expect(RSpeed::Splitter.new.get(RSpeed::Variable.tmp)).to eq(['{"file":"file","time":1.0}'])
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
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
+ end