rspeed 0.5.2 → 0.6.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +3 -3
  4. data/lib/rspeed.rb +1 -0
  5. data/lib/rspeed/database.rb +11 -0
  6. data/lib/rspeed/differ.rb +55 -0
  7. data/lib/rspeed/env.rb +8 -8
  8. data/lib/rspeed/logger.rb +4 -2
  9. data/lib/rspeed/observer.rb +8 -8
  10. data/lib/rspeed/redis.rb +20 -12
  11. data/lib/rspeed/runner.rb +4 -4
  12. data/lib/rspeed/splitter.rb +12 -85
  13. data/lib/rspeed/variable.rb +9 -10
  14. data/lib/rspeed/version.rb +1 -1
  15. data/spec/models/rspeed/database/result_spec.rb +17 -0
  16. data/spec/models/rspeed/differ/actual_data_spec.rb +20 -0
  17. data/spec/models/rspeed/differ/actual_files_spec.rb +20 -0
  18. data/spec/models/rspeed/differ/added_data_spec.rb +19 -0
  19. data/spec/models/rspeed/differ/diff_spec.rb +51 -0
  20. data/spec/models/rspeed/differ/removed_data_spec.rb +20 -0
  21. data/spec/models/rspeed/differ/removed_time_spec.rb +14 -0
  22. data/spec/models/rspeed/env/{name_spec.rb → app_spec.rb} +4 -4
  23. data/spec/models/rspeed/env/spec_path_spec.rb +19 -0
  24. data/spec/models/rspeed/observer/after_suite_spec.rb +6 -28
  25. data/spec/models/rspeed/observer/before_suite_spec.rb +7 -6
  26. data/spec/models/rspeed/redis/clean_spec.rb +5 -5
  27. data/spec/models/rspeed/redis/destroy_spec.rb +7 -15
  28. data/spec/models/rspeed/redis/get_spec.rb +3 -1
  29. data/spec/models/rspeed/redis/keys_spec.rb +6 -22
  30. data/spec/models/rspeed/redis/list_spec.rb +19 -0
  31. data/spec/models/rspeed/redis/profiles_content_spec.rb +19 -0
  32. data/spec/models/rspeed/redis/set_spec.rb +3 -1
  33. data/spec/models/rspeed/redis/specs_finished_spec.rb +2 -2
  34. data/spec/models/rspeed/redis/specs_initiated_spec.rb +1 -1
  35. data/spec/models/rspeed/runner/run_spec.rb +9 -13
  36. data/spec/models/rspeed/splitter/append_spec.rb +1 -3
  37. data/spec/models/rspeed/splitter/consolidate_spec.rb +23 -0
  38. data/spec/models/rspeed/splitter/first_pipe_spec.rb +2 -4
  39. data/spec/models/rspeed/splitter/need_warm_question_spec.rb +8 -10
  40. data/spec/models/rspeed/splitter/pipe_files_spec.rb +3 -8
  41. data/spec/models/rspeed/splitter/split_spec.rb +5 -43
  42. data/spec/models/rspeed/variable/append_app_name_spec.rb +33 -0
  43. data/spec/models/rspeed/variable/key_spec.rb +4 -4
  44. data/spec/models/rspeed/variable/pipe_spec.rb +23 -0
  45. data/spec/models/rspeed/variable/pipes_pattern_spec.rb +1 -1
  46. data/spec/models/rspeed/variable/profile_pattern_spec.rb +1 -1
  47. data/spec/models/rspeed/variable/profile_spec.rb +23 -0
  48. data/spec/models/rspeed/variable/result_spec.rb +5 -5
  49. data/spec/spec_helper.rb +2 -2
  50. metadata +33 -25
  51. data/spec/fixtures/new_spec.rb.csv +0 -1
  52. data/spec/models/rspeed/env/result_key_spec.rb +0 -19
  53. data/spec/models/rspeed/splitter/actual_examples_spec.rb +0 -26
  54. data/spec/models/rspeed/splitter/append_question_spec.rb +0 -37
  55. data/spec/models/rspeed/splitter/diff_spec.rb +0 -30
  56. data/spec/models/rspeed/splitter/get_spec.rb +0 -60
  57. data/spec/models/rspeed/splitter/rename_spec.rb +0 -25
  58. data/spec/models/rspeed/variable/append_name_spec.rb +0 -19
  59. data/spec/models/rspeed/variable/default_partner_spec.rb +0 -5
  60. data/spec/models/rspeed/variable/pipe_name_spec.rb +0 -15
  61. data/spec/models/rspeed/variable/pipe_profile_spec.rb +0 -15
@@ -4,28 +4,27 @@ module RSpeed
4
4
  module Variable
5
5
  module_function
6
6
 
7
- DEFAULT_PATTERN = 'rspeed_*'
8
- PIPES_PATTERN = 'rspeed_pipe_*'
9
- PROFILE_PATTERN = 'rspeed_profile_*'
7
+ PIPES_PATTERN = 'rspeed:pipe_*'
8
+ PROFILE_PATTERN = 'rspeed:profile_*'
10
9
 
11
- def append_name(value, suffix = nil)
12
- [value, RSpeed::Env.name, suffix].compact.join('_')
10
+ def append_app_name(value, plus: nil)
11
+ [value, RSpeed::Env.app, plus].compact.join('_')
13
12
  end
14
13
 
15
14
  def key(number)
16
- append_name('rspeed', number).to_sym
15
+ append_app_name('rspeed', plus: number).to_sym
17
16
  end
18
17
 
19
18
  def result
20
- append_name('rspeed')
19
+ append_app_name('rspeed')
21
20
  end
22
21
 
23
- def pipe_name
24
- append_name('rspeed_pipe', RSpeed::Env.pipe)
22
+ def pipe
23
+ append_app_name('rspeed:pipe', plus: format('%02d', RSpeed::Env.pipe))
25
24
  end
26
25
 
27
26
  def profile
28
- append_name('rspeed_profile', RSpeed::Env.pipe)
27
+ append_app_name('rspeed:profile', plus: format('%02d', RSpeed::Env.pipe))
29
28
  end
30
29
  end
31
30
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
- VERSION = '0.5.2'
4
+ VERSION = '0.6.0'
5
5
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Database, '#result' do
4
+ let!(:redis) { redis_object }
5
+
6
+ before do
7
+ redis.rpush('rspeed', { file: '1_spec.rb', time: 1.0 }.to_json)
8
+ redis.rpush('rspeed', { file: '2_spec.rb', time: 2.0 }.to_json)
9
+ end
10
+
11
+ it 'returns the results data as json' do
12
+ expect(described_class.result).to eq [
13
+ { file: '1_spec.rb', time: 1.0 },
14
+ { file: '2_spec.rb', time: 2.0 },
15
+ ]
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#actual_data' do
4
+ let!(:files) { ['./spec/fixtures/1_spec.rb:4', './spec/fixtures/1_spec.rb:6', './spec/fixtures/new_spec.rb:1'] }
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 consolidated data still existent as spec' do
15
+ expect(described_class.actual_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,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#actual_files' do
4
+ it 'returns all examples' do
5
+ expect(described_class.actual_files(spec_path: './spec/fixtures/**/*_spec.rb')).to eq [
6
+ './spec/fixtures/1_spec.rb:4',
7
+ './spec/fixtures/1_spec.rb:6',
8
+ './spec/fixtures/1_spec.rb:8',
9
+ './spec/fixtures/2_spec.rb:4',
10
+ ]
11
+ end
12
+
13
+ it 'does not raise when no file match' do
14
+ expect(described_class.actual_files(spec_path: './spec/fixtures/**/*_missing.rb')).to eq []
15
+ end
16
+
17
+ it 'does not raise when file is empty' do
18
+ expect(described_class.actual_files(spec_path: './spec/fixtures/**/empty.rb')).to eq []
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#added_data' do
4
+ let!(:files) { ['./spec/fixtures/1_spec.rb:4', './spec/fixtures/1_spec.rb:6', './spec/fixtures/new_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 the added data files with time as zero since we do not know yet' do
15
+ expect(described_class.added_data(files: files, result: result)).to eq [
16
+ { file: './spec/fixtures/new_spec.rb:4', time: 0 },
17
+ ]
18
+ end
19
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'support/env_mock'
4
+
5
+ RSpec.describe RSpeed::Differ, '#diff' do
6
+ let!(:redis) { redis_object }
7
+
8
+ before do
9
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:4', time: '1.4' }.to_json)
10
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:6', time: '1.6' }.to_json)
11
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:8', time: '1.8' }.to_json)
12
+ redis.rpush('rspeed', { file: './spec/fixtures/2_spec.rb:4', time: '2.4' }.to_json)
13
+ redis.rpush('rspeed', { file: './spec/fixtures/x_spec.rb:1', time: 3 }.to_json)
14
+ redis.rpush('rspeed', { file: './spec/fixtures/2_spec.rb:666', time: '6' }.to_json)
15
+
16
+ File.open('spec/fixtures/new_spec.rb', 'a') { |file| file.write('it') }
17
+ end
18
+
19
+ after { delete_file('spec/fixtures/new_spec.rb') }
20
+
21
+ it 'removes removed specs and adds new spec and keeps keeped specs based on rspeed key values' do
22
+ EnvMock.mock(rspeed_spec_path: './spec/fixtures/*_spec.rb') do
23
+ expect(described_class.diff).to eq [
24
+ { file: './spec/fixtures/1_spec.rb:4', time: '1.4' },
25
+ { file: './spec/fixtures/1_spec.rb:6', time: '1.6' },
26
+ { file: './spec/fixtures/1_spec.rb:8', time: '1.8' },
27
+ { file: './spec/fixtures/2_spec.rb:4', time: '2.4' },
28
+ { file: './spec/fixtures/new_spec.rb:1', time: 0 },
29
+ ]
30
+ end
31
+ end
32
+
33
+ context 'when has duplicated example' do
34
+ before do
35
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:4', time: '1.4' }.to_json)
36
+ redis.rpush('rspeed', { file: './spec/fixtures/1_spec.rb:4', time: '1.4' }.to_json)
37
+ end
38
+
39
+ it 'is removed' do
40
+ EnvMock.mock(rspeed_spec_path: './spec/fixtures/*_spec.rb') do
41
+ expect(described_class.diff).to eq [
42
+ { file: './spec/fixtures/1_spec.rb:4', time: '1.4' },
43
+ { file: './spec/fixtures/1_spec.rb:6', time: '1.6' },
44
+ { file: './spec/fixtures/1_spec.rb:8', time: '1.8' },
45
+ { file: './spec/fixtures/2_spec.rb:4', time: '2.4' },
46
+ { file: './spec/fixtures/new_spec.rb:1', time: 0 },
47
+ ]
48
+ end
49
+ end
50
+ end
51
+ 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,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe RSpeed::Differ, '#removed_time' do
4
+ let!(:data) do
5
+ [
6
+ { file: './spec/fixtures/1_spec.rb:4', time: 1.4 },
7
+ { file: './spec/fixtures/1_spec.rb:6', time: 1.6 },
8
+ ]
9
+ end
10
+
11
+ it 'returns the sum of removed examples' do
12
+ expect(described_class.removed_time(data: data)).to be(3.0)
13
+ end
14
+ end
@@ -2,16 +2,16 @@
2
2
 
3
3
  require 'support/env_mock'
4
4
 
5
- RSpec.describe RSpeed::Env, '.name' do
5
+ RSpec.describe RSpeed::Env, '.app' do
6
6
  context 'when env is given' do
7
7
  it 'returns the env value' do
8
- EnvMock.mock(rspeed_name: 'name') do
9
- expect(described_class.name).to eq('name')
8
+ EnvMock.mock(rspeed_app: 'app') do
9
+ expect(described_class.app).to eq('app')
10
10
  end
11
11
  end
12
12
  end
13
13
 
14
14
  context 'when env is not given' do
15
- it { expect(described_class.name).to be(nil) }
15
+ it { expect(described_class.app).to be(nil) }
16
16
  end
17
17
  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,51 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
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
4
  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
5
+ let!(:redis) { redis_object }
6
+
7
+ before { allow(RSpeed::Redis).to receive(:specs_finished?).and_return(false) }
29
8
 
30
9
  it 'sets true on pipe key to indicates that its finished' do
31
10
  described_class.after_suite
32
11
 
33
- expect(RSpeed::Redis.get('rspeed_pipe_1')).to eq('true')
12
+ expect(redis.get('rspeed:pipe_01')).to eq('true')
34
13
  end
35
14
  end
36
15
 
37
16
  context 'when all specs finished' do
38
17
  before do
39
- allow(splitter).to receive(:append?)
40
18
  allow(RSpeed::Redis).to receive(:specs_finished?).and_return(true)
41
- allow(splitter).to receive(:rename)
19
+ allow(RSpeed::Splitter).to receive(:consolidate)
42
20
  allow(RSpeed::Redis).to receive(:clean)
43
21
  end
44
22
 
45
23
  it 'consolidates profiles' do
46
24
  described_class.after_suite
47
25
 
48
- expect(splitter).to have_received(:rename)
26
+ expect(RSpeed::Splitter).to have_received(:consolidate)
49
27
  end
50
28
 
51
29
  it 'destroyes pipe finished flag keys' do
@@ -4,23 +4,24 @@ RSpec.describe RSpeed::Observer, '.before_suite' do
4
4
  let!(:redis) { redis_object }
5
5
 
6
6
  before { truncate_profiles }
7
+
7
8
  after { truncate_profiles }
8
9
 
9
10
  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)
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)
12
13
 
13
14
  described_class.before_suite
14
15
 
15
- expect(redis.keys).to eq ['rspeed_profile_2']
16
+ expect(redis.keys).to eq ['rspeed:profile_02']
16
17
  end
17
18
 
18
19
  it 'cleans the pipe flag' do
19
- redis.set('rspeed_pipe_1', true)
20
- redis.set('rspeed_pipe_2', true)
20
+ redis.set('rspeed:pipe_01', true)
21
+ redis.set('rspeed:pipe_02', true)
21
22
 
22
23
  described_class.before_suite
23
24
 
24
- expect(redis.keys).to eq ['rspeed_pipe_2']
25
+ expect(redis.keys).to eq ['rspeed:pipe_02']
25
26
  end
26
27
  end
@@ -2,19 +2,19 @@
2
2
 
3
3
  RSpec.describe RSpeed::Redis, '.clean' do
4
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)
5
+ redis_object.set('rspeed:pipe_01', true)
6
+ redis_object.set('rspeed:pipe_02', true)
7
7
 
8
8
  described_class.clean
9
9
 
10
- expect(described_class.keys('*')).to eq([])
10
+ expect(redis_object.keys('*')).to eq([])
11
11
  end
12
12
 
13
13
  it 'destroys the pipe profiles' do
14
- described_class.set('rspeed_profile_1', true)
14
+ redis_object.set('rspeed:profile_01', true)
15
15
 
16
16
  described_class.clean
17
17
 
18
- expect(described_class.keys('*')).to eq([])
18
+ expect(redis_object.keys('*')).to eq([])
19
19
  end
20
20
  end
@@ -1,29 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe RSpeed::Redis, '#destroy' do
4
- let!(:redis) { described_class }
5
-
6
4
  before do
7
- redis.set('rspeed', '{}')
8
- redis.set('rspeed_1', '{}')
9
- redis.set('rspeed_2', '{}')
5
+ redis_object.set('rspeed', '{}')
6
+ redis_object.set('rspeed_1', '{}')
7
+ redis_object.set('rspeed_2', '{}')
10
8
  end
11
9
 
12
10
  it 'destroys via wildcard' do
13
- redis.destroy('rspeed_*')
11
+ described_class.destroy(pattern: 'rspeed_*')
14
12
 
15
- expect(redis.keys('*')).to eq %w[rspeed]
13
+ expect(redis_object.keys('*')).to eq %w[rspeed]
16
14
  end
17
15
 
18
16
  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
17
+ described_class.destroy(pattern: 'rspeed')
26
18
 
27
- expect(redis.keys('*')).to eq %w[rspeed]
19
+ expect(redis_object.keys('*')).to eq %w[rspeed_1 rspeed_2]
28
20
  end
29
21
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe RSpeed::Redis, '.set' do
4
+ let!(:redis) { redis_object }
5
+
4
6
  it 'sets a key on redis' do
5
- described_class.client.set('key', 'value')
7
+ redis_object.set('key', 'value')
6
8
 
7
9
  expect(described_class.get('key')).to eq('value')
8
10
  end
@@ -1,29 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
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
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')
16
8
  end
17
9
 
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
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]
28
12
  end
29
13
  end