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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19e3b06a0f6189661598a3db76e740b99b5ab658b3e08119fa6f8a74efb74552
4
- data.tar.gz: 813bd8934d23e84bcb0facf56da0bf53c4017d5af03337989a42ffff2dac679d
3
+ metadata.gz: 5b8a143543e9f44b4c5641d60642968b7cc4a7ec85953b17f6ef62743e66196e
4
+ data.tar.gz: f8fc781825804fe67084c08b05164ca8a31fc87e458952ba0ca86e567576e669
5
5
  SHA512:
6
- metadata.gz: '004081032114288e16f23c176ca49c03e85274ed6b91272144643452ec5f2a648c829dae5539c94215897f67482a6f0cf1e5253acabeafc6cdf5a6e2fe2681e9'
7
- data.tar.gz: 2ec7f4991a5702f4bd24000e71eb5426969f0abd3a77cabd521887ad72dac3e3ec5f28f0165193ca806f8e9a9e8fce712ac9923f899c9e8767c8808320400ab4
6
+ metadata.gz: 7b50821b549363010ab566dd5f654a5b2b042e76fd696054b795126b1343ec3a8d73ed1c3a7a08cb63f1eeba38dbbae8922877bb8ec8649bb4601577b75737b0
7
+ data.tar.gz: 0f74bea31bf0c550ce6f89b8f22e8c0fedb59acfebe6cddf1dc4fc4499b74e7e73505b4a24327948f1330d9ff46b16f70de0855b4178a452149b33d2b5396051
data/CHANGELOG.md CHANGED
@@ -1,3 +1,53 @@
1
+ ## master
2
+
3
+ - None;
4
+
5
+ ## v0.6.0
6
+
7
+ #### Break Change
8
+
9
+ - Drops `RSPEED_RESULT_KEY` key in favor of `RSPEED_NAME`;
10
+ - Renames env `RSPEED_NAME` to `RSPEED_APP`;
11
+
12
+ #### News
13
+
14
+ - Adds env `RSPEED_SPEC_PATH` to indicate the spec folders path;
15
+ - Saves pipes and profiles with a zero at the beginning;
16
+ - Makes sure examples is unique;
17
+
18
+ ## v0.5.2
19
+
20
+ #### Fix
21
+
22
+ - Avoid duplicate entries in the consolidated result;
23
+
24
+ #### Update
25
+
26
+ - CSV dependency dropped;
27
+ - Drops tmp key in favor of profile keys fetch;
28
+
29
+ ## v0.5.1
30
+
31
+ #### Fix
32
+
33
+ - Only pipe number 1 will warm up avoiding duplicated spec entries;
34
+
35
+ ## v0.5.0
36
+
37
+ #### Fix
38
+
39
+ - Add env `RSPEED_NAME` to specify the application name and avoid result conflicts between multiple runs;
40
+ - No more depends on pipe sequence to generate ou aggregate the resul;
41
+ - rake `rspeed:install`;
42
+
43
+ #### Update
44
+
45
+ - The result of the pipes are no more saved on Redis. It's now calculated based on result key `rspeed`;
46
+
47
+ ## v0.4.0
48
+
49
+ - Now we make diff to discover removed and added examples;
50
+
1
51
  ## v0.3.0
2
52
 
3
53
  - Removed and added files now is considered on run;
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # RSpeed
2
2
 
3
- [![Build Status](https://github.com/wbotelhos/rspeed/workflows/CI/badge.svg)](https://github.com/wbotelhos/rspeed/actions)
3
+ [![CI](https://github.com/wbotelhos/rspeed/workflows/CI/badge.svg)](https://github.com/wbotelhos/rspeed/actions)
4
4
  [![Gem Version](https://badge.fury.io/rb/rspeed.svg)](https://badge.fury.io/rb/rspeed)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/cc5efe8b06bc1d5e9e8a/maintainability)](https://codeclimate.com/github/wbotelhos/rspeed/maintainability)
6
- [![Patreon](https://img.shields.io/badge/donate-%3C3-brightgreen.svg)](https://www.patreon.com/wbotelhos)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/f312587b4f126bb13e85/maintainability)](https://codeclimate.com/github/wbotelhos/rspeed/maintainability)
6
+ [![Coverage](https://codecov.io/gh/wbotelhos/rspeed/branch/main/graph/badge.svg)](https://codecov.io/gh/wbotelhos/rspeed)
7
+ [![Sponsor](https://img.shields.io/badge/sponsor-%3C3-green)](https://www.patreon.com/wbotelhos)
7
8
 
8
9
  RSpeed splits your specs to you run parallels tests.
9
10
 
@@ -25,19 +26,21 @@ rake rspeed:install
25
26
 
26
27
  ## Usage
27
28
 
28
- - `RSPEED`: Enables RSpeed
29
- - `RSPEED_PIPES`: Quantity of pipes
29
+ - `RSPEED_APP`: You app name to avoid data override
30
30
  - `RSPEED_PIPE`: Current pipe
31
+ - `RSPEED_PIPES`: Quantity of pipes
32
+ - `RSPEED_SPEC_PATH`: The specs folders path
33
+ - `RSPEED`: Enables RSpeed
31
34
 
32
35
  ```sh
33
- RSPEED=true RSPEED_PIPES=3 RSPEED_PIPE=1 bundle exec rake rspeed:run
36
+ RSPEED=true RSPEED_APP=blog RSPEED_PIPE=1 RSPEED_PIPES=3 bundle exec rake rspeed:run
34
37
  ```
35
38
 
36
39
  ## How it Works
37
40
 
38
41
  ### First run
39
42
 
40
- 1. Since we has no statistics on the first time, we run all specs and collect it;
43
+ 1. Since we have no statistics on the first time, we run all specs and collect it;
41
44
 
42
45
  ```json
43
46
  { "file": "./spec/models/1_spec.rb", "time": 0.01 }
@@ -6,7 +6,7 @@ module RSpeed
6
6
 
7
7
  desc 'Creates RSpeed task'
8
8
 
9
- def copy_initializer
9
+ def create_initializer
10
10
  copy_file 'lib/tasks/rspeed.rake', 'lib/tasks/rspeed.rake'
11
11
  end
12
12
  end
data/lib/rspeed.rb CHANGED
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
- require 'csv'
5
- require 'redis'
4
+ require 'rspeed/database'
5
+ require 'rspeed/env'
6
+ require 'rspeed/extension'
7
+ require 'rspeed/logger'
8
+ require 'rspeed/observer'
9
+ require 'rspeed/redis'
10
+ require 'rspeed/runner'
11
+ require 'rspeed/splitter'
12
+ require 'rspeed/variable'
6
13
  end
7
-
8
- require 'rspeed/extension'
9
- require 'rspeed/observer'
10
- require 'rspeed/runner'
11
- require 'rspeed/splitter'
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Database
5
+ module_function
6
+
7
+ def result
8
+ RSpeed::Redis.list(RSpeed::Variable.result).map { |item| JSON.parse(item, symbolize_names: true) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Differ
5
+ module_function
6
+
7
+ def actual_files(spec_path: RSpeed::Env.spec_path)
8
+ [].tap do |data|
9
+ Dir[spec_path].sort.each do |file|
10
+ lines = File.open(file).read.split("\n")
11
+
12
+ lines&.each&.with_index do |item, index|
13
+ data << "#{file}:#{index + 1}" if /^it/.match?(item.gsub(/\s+/, ''))
14
+ end
15
+ end
16
+
17
+ RSpeed::Logger.log(self, __method__, data)
18
+ end
19
+ end
20
+
21
+ def actual_data(files:, result:)
22
+ result
23
+ .select { |item| files.include?(item[:file]) }
24
+ .tap { |data| RSpeed::Logger.log(self, __method__, data) }
25
+ end
26
+
27
+ def added_data(files:, result:)
28
+ (files - result.map { |item| item[:file] })
29
+ .map { |file| { file: file, time: 0 } }
30
+ .tap { |data| RSpeed::Logger.log(self, __method__, data) }
31
+ end
32
+
33
+ def diff
34
+ files = actual_files
35
+ result = RSpeed::Database.result.uniq { |item| item[:file] }
36
+
37
+ removed_data(files: files, result: result) # called just for log purpose
38
+
39
+ (actual_data(files: files, result: result) + added_data(files: files, result: result))
40
+ .tap { |data| RSpeed::Logger.log(self, __method__, data) }
41
+ end
42
+
43
+ def removed_data(files:, result:)
44
+ result
45
+ .reject { |item| files.include?(item[:file]) }
46
+ .tap { |data| RSpeed::Logger.log(self, __method__, data) }
47
+ end
48
+
49
+ def removed_time(data:)
50
+ data
51
+ .sum { |item| item[:time].to_f }
52
+ .tap { |result| RSpeed::Logger.log(self, __method__, result) }
53
+ end
54
+ end
55
+ end
data/lib/rspeed/env.rb ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Env
5
+ module_function
6
+
7
+ def app
8
+ ENV['RSPEED_APP']
9
+ end
10
+
11
+ def db
12
+ ENV['RSPEED_DB']&.to_i
13
+ end
14
+
15
+ def host
16
+ ENV['RSPEED_HOST']
17
+ end
18
+
19
+ def pipe
20
+ ENV.fetch('RSPEED_PIPE', 1).to_i
21
+ end
22
+
23
+ def pipes
24
+ ENV.fetch('RSPEED_PIPES', 1).to_i
25
+ end
26
+
27
+ def port
28
+ ENV['RSPEED_PORT']&.to_i
29
+ end
30
+
31
+ def rspeed
32
+ ENV['RSPEED'] == 'true'
33
+ end
34
+
35
+ def spec_path
36
+ ENV.fetch('RSPEED_SPEC_PATH', './spec/**/*spec.rb')
37
+ end
38
+ end
39
+ end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if ENV['RSPEED'] == 'true'
4
- require 'rspec/rails'
3
+ if RSpeed::Env.rspeed
4
+ require 'rspec'
5
5
 
6
6
  RSpec.configure do |config|
7
7
  config.before(:suite) { RSpeed::Observer.before_suite }
8
8
  config.before { |example| RSpeed::Observer.before(example) }
9
9
  config.after { |example| RSpeed::Observer.after(example) }
10
+ config.after(:suite) { RSpeed::Observer.after_suite }
10
11
  end
11
12
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Logger
5
+ module_function
6
+
7
+ def log(context, method, message)
8
+ clazz = context.ancestors.join('::')
9
+
10
+ puts("[#{clazz}##{method}.#{RSpeed::Env.pipe}] #{message}")
11
+ end
12
+ end
13
+ end
@@ -9,9 +9,21 @@ module RSpeed
9
9
  line_number = example.metadata[:line_number]
10
10
  spent_time = example.clock.now - example.metadata[:start_at]
11
11
 
12
- File.open('rspeed.csv', 'a') do |file|
13
- file.write "#{spent_time},#{file_path}:#{line_number}\n"
14
- end
12
+ json = { file: "#{file_path}:#{line_number}", time: spent_time }.to_json
13
+
14
+ RSpeed::Redis.client.rpush(RSpeed::Variable.profile, json)
15
+ end
16
+
17
+ def after_suite
18
+ RSpeed::Redis.set(RSpeed::Variable.pipe, true)
19
+
20
+ return unless RSpeed::Redis.specs_finished?
21
+
22
+ RSpeed::Splitter.consolidate
23
+
24
+ RSpeed::Redis.clean
25
+
26
+ RSpeed::Logger.log(self, __method__, 'RSpeed finished.')
15
27
  end
16
28
 
17
29
  def before(example)
@@ -19,11 +31,14 @@ module RSpeed
19
31
  end
20
32
 
21
33
  def before_suite
22
- truncate_csv_file
34
+ clean_profile
23
35
  end
24
36
 
25
- def truncate_csv_file
26
- File.open('rspeed.csv', 'w') { |file| file.truncate(0) }
37
+ def clean_profile
38
+ RSpeed::Logger.log(self, __method__, 'Cleanning current flag and profile.')
39
+
40
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.pipe)
41
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.profile)
27
42
  end
28
43
  end
29
44
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpeed
4
+ module Redis
5
+ require 'redis'
6
+
7
+ module_function
8
+
9
+ def clean
10
+ RSpeed::Logger.log(self, __method__, 'Cleaning pipes and profiles.')
11
+
12
+ destroy(pattern: RSpeed::Variable::PIPES_PATTERN)
13
+ destroy(pattern: RSpeed::Variable::PROFILE_PATTERN)
14
+ end
15
+
16
+ def client
17
+ @client ||= ::Redis.new(db: RSpeed::Env.db, host: RSpeed::Env.host, port: RSpeed::Env.port)
18
+ end
19
+
20
+ def destroy(pattern:)
21
+ RSpeed::Logger.log(self, __method__, %(Destroying pattern "#{pattern}".))
22
+
23
+ keys(pattern: pattern).each { |key| client.del(key) }
24
+ end
25
+
26
+ def get(key)
27
+ client.get(key)
28
+ end
29
+
30
+ def keys(pattern:)
31
+ cursor = 0
32
+ result = []
33
+
34
+ loop do
35
+ cursor, results = client.scan(cursor, match: pattern)
36
+ result += results
37
+
38
+ break if cursor.to_i.zero?
39
+ end
40
+
41
+ result
42
+ end
43
+
44
+ def list(key)
45
+ client.lrange(key, 0, -1)
46
+ end
47
+
48
+ def profiles_content(pattern: 'rspeed:profile_*')
49
+ client.keys(pattern).map { |key| list(key) }.flatten
50
+ end
51
+
52
+ def result?
53
+ keys(pattern: RSpeed::Variable.result).any?
54
+ end
55
+
56
+ def set(key, value)
57
+ client.set(key, value)
58
+ end
59
+
60
+ def specs_finished?
61
+ (RSpeed::Redis.keys(pattern: RSpeed::Variable::PIPES_PATTERN).size == RSpeed::Env.pipes).tap do |boo|
62
+ RSpeed::Logger.log(self, __method__, "Specs #{boo ? 'finished.' : 'not fineshed yet.'}")
63
+ end
64
+ end
65
+
66
+ def specs_initiated?
67
+ RSpeed::Redis.keys(pattern: RSpeed::Variable::PIPES_PATTERN).any?.tap do |boo|
68
+ RSpeed::Logger.log(self, __method__, "Specs #{boo ? 'initialized.' : 'not initialized yet.'}")
69
+ end
70
+ end
71
+ end
72
+ end
data/lib/rspeed/runner.rb CHANGED
@@ -5,24 +5,13 @@ module RSpeed
5
5
  module_function
6
6
 
7
7
  def run(shell)
8
- splitter = ::RSpeed::Splitter.new
9
-
10
- if splitter.first_pipe?
11
- # splitter.destroy "rspeed_*"
12
- splitter.destroy 'rspeed_tmp'
8
+ if RSpeed::Redis.result? || RSpeed::Splitter.first_pipe?
9
+ return shell.call(['bundle exec rspec', RSpeed::Splitter.pipe_files].compact.join(' '))
13
10
  end
14
11
 
15
- if splitter.result?
16
- splitter.save if splitter.first_pipe?
17
-
18
- files = splitter.get("rspeed_#{splitter.pipe}")[0]['files'].map { |item| item['file'] }.join(' ')
19
- end
20
-
21
- shell.call ['bundle exec rspec', files].compact.join(' ')
22
-
23
- splitter.append
12
+ RSpeed::Logger.log(self, __method__, "Skipped! Only Pipe 1 can warm.")
24
13
 
25
- splitter.rename if splitter.last_pipe?
14
+ RSpeed::Observer.after_suite
26
15
  end
27
16
  end
28
17
  end
@@ -1,85 +1,54 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module RSpeed
3
- class Splitter
4
- DEFAULT_PATTERN = 'rspeed_*'
4
+ module Splitter
5
+ module_function
5
6
 
6
- def append(files = file_data)
7
- files.each do |time, file|
8
- redis.lpush('rspeed_tmp', { file: file, time: time.to_f }.to_json)
9
- end
10
- end
7
+ require 'json'
11
8
 
12
- def destroy(pattern = DEFAULT_PATTERN)
13
- keys(pattern).each { |key| redis.del key }
14
- end
9
+ require 'rspeed/differ'
15
10
 
16
- def diff
17
- actual_data + added_data
11
+ def append(items:, key:)
12
+ items.each { |item| RSpeed::Redis.client.rpush(key, item) }
18
13
  end
19
14
 
20
- def first_pipe?
21
- pipe == 1
22
- end
15
+ def consolidate
16
+ RSpeed::Logger.log(self, __method__, 'Consolidating profiles.')
23
17
 
24
- def get(pattern)
25
- @get ||= begin
26
- return redis.lrange(pattern, 0, -1) if %w[rspeed rspeed_tmp].include?(pattern)
18
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.result)
27
19
 
28
- keys(pattern).map { |key| JSON.parse(redis.get(key)) }
29
- end
20
+ append(items: RSpeed::Redis.profiles_content, key: RSpeed::Variable.result)
30
21
  end
31
22
 
32
- def keys(pattern = DEFAULT_PATTERN)
33
- cursor = 0
34
- result = []
35
-
36
- loop do
37
- cursor, results = redis.scan(cursor, match: pattern)
38
- result += results
39
-
40
- break if cursor.to_i.zero?
41
- end
42
-
43
- result
23
+ def first_pipe?
24
+ RSpeed::Env.pipe == 1
44
25
  end
45
26
 
46
- def last_pipe?
47
- pipe == pipes
27
+ def need_warm?
28
+ first_pipe? && !RSpeed::Redis.result?
48
29
  end
49
30
 
50
- def pipe
51
- ENV.fetch('RSPEED_PIPE') { 1 }.to_i
52
- end
31
+ def pipe_files
32
+ return unless RSpeed::Redis.result?
53
33
 
54
- def pipes
55
- result? ? ENV.fetch('RSPEED_PIPES') { 1 }.to_i : 1
56
- end
57
-
58
- def rename
59
- redis.rename('rspeed_tmp', 'rspeed')
60
- end
34
+ splitted = split(data: RSpeed::Differ.diff)
61
35
 
62
- def result?
63
- !keys('rspeed').empty?
36
+ splitted[RSpeed::Variable.key(RSpeed::Env.pipe)][:files].map { |item| item[:file] }.join(' ')
64
37
  end
65
38
 
66
- def save(data = diff)
67
- split(data).each { |key, value| redis.set(key, value.to_json) }
68
- end
69
-
70
- def split(data)
39
+ def split(data:)
71
40
  json = {}
72
41
 
73
- pipes.times do |index|
74
- json["rspeed_#{index + 1}".to_sym] ||= []
75
- json["rspeed_#{index + 1}".to_sym] = { total: 0, files: [], number: index + 1 }
42
+ RSpeed::Env.pipes.times do |index|
43
+ json[RSpeed::Variable.key(index + 1)] ||= []
44
+ json[RSpeed::Variable.key(index + 1)] = { total: 0, files: [], number: index + 1 }
76
45
  end
77
46
 
78
47
  sorted_data = data.sort_by { |item| item[:time] }.reverse
79
48
 
80
49
  sorted_data.each do |record|
81
50
  selected_pipe_data = json.min_by { |pipe| pipe[1][:total] }
82
- selected_pipe = json["rspeed_#{selected_pipe_data[1][:number]}".to_sym]
51
+ selected_pipe = json[RSpeed::Variable.key(selected_pipe_data[1][:number])]
83
52
  time = record[:time].to_f
84
53
 
85
54
  selected_pipe[:total] += time
@@ -88,47 +57,5 @@ module RSpeed
88
57
 
89
58
  json
90
59
  end
91
-
92
- private
93
-
94
- def actual_data
95
- rspeed_data.select { |item| actual_files.include?(item[:file]) }
96
- end
97
-
98
- def actual_files
99
- @actual_files ||= Dir['./spec/**/*_spec.rb']
100
- end
101
-
102
- def added_data
103
- added_specs.map { |item| { file: item, time: 0 } }
104
- end
105
-
106
- def added_specs
107
- actual_files - old_files
108
- end
109
-
110
- def file_data
111
- CSV.read('rspeed.csv')
112
- end
113
-
114
- def old_files
115
- rspeed_data.map { |item| item[:file] }
116
- end
117
-
118
- def redis
119
- @redis ||= ::Redis.new(db: ENV['RSPEED_DB'], host: ENV['RSPEED_HOST'], port: ENV.fetch('RSPEED_PORT') { 6379 })
120
- end
121
-
122
- def removed_specs
123
- old_files - actual_files
124
- end
125
-
126
- def removed_time
127
- removed_specs.map { |item| item[0].to_f }.sum
128
- end
129
-
130
- def rspeed_data
131
- @rspeed_data ||= get('rspeed').map { |item| JSON.parse(item, symbolize_names: true) }
132
- end
133
60
  end
134
61
  end