rspeed 0.3.0 → 0.6.0

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