rspeed 0.3.0 → 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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +10 -7
  4. data/lib/generators/rspeed/install_generator.rb +1 -1
  5. data/lib/rspeed.rb +9 -7
  6. data/lib/rspeed/database.rb +11 -0
  7. data/lib/rspeed/differ.rb +55 -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 +21 -6
  12. data/lib/rspeed/redis.rb +72 -0
  13. data/lib/rspeed/runner.rb +4 -15
  14. data/lib/rspeed/splitter.rb +24 -97
  15. data/lib/rspeed/variable.rb +30 -0
  16. data/lib/rspeed/version.rb +1 -1
  17. data/spec/common_helper.rb +10 -0
  18. data/spec/fixtures/1_spec.rb +9 -0
  19. data/spec/fixtures/2_spec.rb +5 -0
  20. data/spec/fixtures/empty.rb +4 -0
  21. data/spec/models/rspeed/database/result_spec.rb +17 -0
  22. data/spec/models/rspeed/differ/actual_data_spec.rb +20 -0
  23. data/spec/models/rspeed/differ/actual_files_spec.rb +20 -0
  24. data/spec/models/rspeed/differ/added_data_spec.rb +19 -0
  25. data/spec/models/rspeed/differ/diff_spec.rb +51 -0
  26. data/spec/models/rspeed/differ/removed_data_spec.rb +20 -0
  27. data/spec/models/rspeed/differ/removed_time_spec.rb +14 -0
  28. data/spec/models/rspeed/env/app_spec.rb +17 -0
  29. data/spec/models/rspeed/env/db_spec.rb +17 -0
  30. data/spec/models/rspeed/env/host_spec.rb +17 -0
  31. data/spec/models/rspeed/env/pipe_spec.rb +19 -0
  32. data/spec/models/rspeed/env/pipes_spec.rb +19 -0
  33. data/spec/models/rspeed/env/port_spec.rb +17 -0
  34. data/spec/models/rspeed/env/rspeed_spec.rb +43 -0
  35. data/spec/models/rspeed/env/spec_path_spec.rb +19 -0
  36. data/spec/models/rspeed/observer/after_spec.rb +5 -5
  37. data/spec/models/rspeed/observer/after_suite_spec.rb +35 -0
  38. data/spec/models/rspeed/observer/before_spec.rb +0 -2
  39. data/spec/models/rspeed/observer/before_suite_spec.rb +18 -6
  40. data/spec/models/rspeed/redis/clean_spec.rb +20 -0
  41. data/spec/models/rspeed/redis/client_spec.rb +7 -0
  42. data/spec/models/rspeed/redis/destroy_spec.rb +21 -0
  43. data/spec/models/rspeed/redis/get_spec.rb +11 -0
  44. data/spec/models/rspeed/redis/keys_spec.rb +13 -0
  45. data/spec/models/rspeed/redis/list_spec.rb +19 -0
  46. data/spec/models/rspeed/redis/profiles_content_spec.rb +19 -0
  47. data/spec/models/rspeed/redis/result_spec.rb +13 -0
  48. data/spec/models/rspeed/redis/set_spec.rb +11 -0
  49. data/spec/models/rspeed/redis/specs_finished_spec.rb +19 -0
  50. data/spec/models/rspeed/redis/specs_initiated_spec.rb +13 -0
  51. data/spec/models/rspeed/runner/run_spec.rb +73 -0
  52. data/spec/models/rspeed/splitter/append_spec.rb +8 -28
  53. data/spec/models/rspeed/splitter/consolidate_spec.rb +23 -0
  54. data/spec/models/rspeed/splitter/first_pipe_spec.rb +4 -8
  55. data/spec/models/rspeed/splitter/need_warm_question_spec.rb +35 -0
  56. data/spec/models/rspeed/splitter/pipe_files_spec.rb +21 -0
  57. data/spec/models/rspeed/splitter/split_spec.rb +32 -34
  58. data/spec/models/rspeed/variable/append_app_name_spec.rb +33 -0
  59. data/spec/models/rspeed/variable/key_spec.rb +15 -0
  60. data/spec/models/rspeed/variable/pipe_spec.rb +23 -0
  61. data/spec/models/rspeed/variable/pipes_pattern_spec.rb +5 -0
  62. data/spec/models/rspeed/variable/profile_pattern_spec.rb +5 -0
  63. data/spec/models/rspeed/variable/profile_spec.rb +23 -0
  64. data/spec/models/rspeed/variable/result_spec.rb +19 -0
  65. data/spec/spec_helper.rb +27 -0
  66. data/spec/support/common.rb +13 -0
  67. data/spec/support/coverage.rb +14 -0
  68. data/spec/support/env_mock.rb +3 -0
  69. data/spec/support/fakeredis.rb +3 -0
  70. metadata +160 -26
  71. data/spec/models/rspeed/splitter/destroy_spec.rb +0 -33
  72. data/spec/models/rspeed/splitter/diff_spec.rb +0 -29
  73. data/spec/models/rspeed/splitter/get_spec.rb +0 -76
  74. data/spec/models/rspeed/splitter/keys_spec.rb +0 -33
  75. data/spec/models/rspeed/splitter/last_pipe_spec.rb +0 -21
  76. data/spec/models/rspeed/splitter/pipe_spec.rb +0 -21
  77. data/spec/models/rspeed/splitter/pipes_spec.rb +0 -27
  78. data/spec/models/rspeed/splitter/rename_spec.rb +0 -18
  79. data/spec/models/rspeed/splitter/result_spec.rb +0 -19
  80. data/spec/models/rspeed/splitter/save_spec.rb +0 -57
  81. data/spec/rails_helper.rb +0 -43
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Variable
5
+ module_function
6
+
7
+ PIPES_PATTERN = 'rspeed:pipe_*'
8
+ PROFILE_PATTERN = 'rspeed:profile_*'
9
+
10
+ def append_app_name(value, plus: nil)
11
+ [value, RSpeed::Env.app, plus].compact.join('_')
12
+ end
13
+
14
+ def key(number)
15
+ append_app_name('rspeed', plus: number).to_sym
16
+ end
17
+
18
+ def result
19
+ append_app_name('rspeed')
20
+ end
21
+
22
+ def pipe
23
+ append_app_name('rspeed:pipe', plus: format('%02d', RSpeed::Env.pipe))
24
+ end
25
+
26
+ def profile
27
+ append_app_name('rspeed:profile', plus: format('%02d', RSpeed::Env.pipe))
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
- VERSION = '0.3.0'
4
+ VERSION = '0.6.0'
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,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
@@ -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 { 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