rspeed 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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