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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a58e610b2982e8a8f81783f5704f0a136c971aa6df1a446cf32ce7a53485120
4
- data.tar.gz: 41c88139eff91637c52cda59b1239ca1833aa0db886677d0a33c51564d500a19
3
+ metadata.gz: 5b8a143543e9f44b4c5641d60642968b7cc4a7ec85953b17f6ef62743e66196e
4
+ data.tar.gz: f8fc781825804fe67084c08b05164ca8a31fc87e458952ba0ca86e567576e669
5
5
  SHA512:
6
- metadata.gz: 67b9c9d9334b315b9392bf7a52965bc1884ab67c96345abf3f037b185010b4de24f9b895cc306567f9cf07737786d7f58edc4ab14f0e45a26acef8acd525ed2f
7
- data.tar.gz: e2771f90d265bbfc5ea3273c82aa467dee40b3f5cbfc40ac0c7501da4577664c28bd11b491a1568907775584490a36e3c4d5c1935cc375aca27ff8713e9b0b00
6
+ metadata.gz: 7b50821b549363010ab566dd5f654a5b2b042e76fd696054b795126b1343ec3a8d73ed1c3a7a08cb63f1eeba38dbbae8922877bb8ec8649bb4601577b75737b0
7
+ data.tar.gz: 0f74bea31bf0c550ce6f89b8f22e8c0fedb59acfebe6cddf1dc4fc4499b74e7e73505b4a24327948f1330d9ff46b16f70de0855b4178a452149b33d2b5396051
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  ## master
2
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
+
3
26
  - CSV dependency dropped;
4
27
  - Drops tmp key in favor of profile keys fetch;
5
28
 
data/README.md CHANGED
@@ -26,14 +26,14 @@ rake rspeed:install
26
26
 
27
27
  ## Usage
28
28
 
29
- - `RSPEED_NAME`: You app name to avoid data override
29
+ - `RSPEED_APP`: You app name to avoid data override
30
30
  - `RSPEED_PIPE`: Current pipe
31
31
  - `RSPEED_PIPES`: Quantity of pipes
32
- - `RSPEED_RESULT_KEY`: The key that keeps the final result of all pipes
32
+ - `RSPEED_SPEC_PATH`: The specs folders path
33
33
  - `RSPEED`: Enables RSpeed
34
34
 
35
35
  ```sh
36
- RSPEED=true RSPEED_NAME=authorizy RSPEED_PIPE=1 RSPEED_PIPES=3 bundle exec rake rspeed:run
36
+ RSPEED=true RSPEED_APP=blog RSPEED_PIPE=1 RSPEED_PIPES=3 bundle exec rake rspeed:run
37
37
  ```
38
38
 
39
39
  ## How it Works
data/lib/rspeed.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
+ require 'rspeed/database'
4
5
  require 'rspeed/env'
5
6
  require 'rspeed/extension'
6
7
  require 'rspeed/logger'
@@ -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 CHANGED
@@ -4,6 +4,10 @@ module RSpeed
4
4
  module Env
5
5
  module_function
6
6
 
7
+ def app
8
+ ENV['RSPEED_APP']
9
+ end
10
+
7
11
  def db
8
12
  ENV['RSPEED_DB']&.to_i
9
13
  end
@@ -12,10 +16,6 @@ module RSpeed
12
16
  ENV['RSPEED_HOST']
13
17
  end
14
18
 
15
- def name
16
- ENV['RSPEED_NAME']
17
- end
18
-
19
19
  def pipe
20
20
  ENV.fetch('RSPEED_PIPE', 1).to_i
21
21
  end
@@ -28,12 +28,12 @@ module RSpeed
28
28
  ENV['RSPEED_PORT']&.to_i
29
29
  end
30
30
 
31
- def result_key
32
- ENV.fetch('RESPEED_RESULT_KEY', RSpeed::Variable.result)
33
- end
34
-
35
31
  def rspeed
36
32
  ENV['RSPEED'] == 'true'
37
33
  end
34
+
35
+ def spec_path
36
+ ENV.fetch('RSPEED_SPEC_PATH', './spec/**/*spec.rb')
37
+ end
38
38
  end
39
39
  end
data/lib/rspeed/logger.rb CHANGED
@@ -4,8 +4,10 @@ module RSpeed
4
4
  module Logger
5
5
  module_function
6
6
 
7
- def log(message)
8
- puts(message)
7
+ def log(context, method, message)
8
+ clazz = context.ancestors.join('::')
9
+
10
+ puts("[#{clazz}##{method}.#{RSpeed::Env.pipe}] #{message}")
9
11
  end
10
12
  end
11
13
  end
@@ -11,19 +11,19 @@ module RSpeed
11
11
 
12
12
  json = { file: "#{file_path}:#{line_number}", time: spent_time }.to_json
13
13
 
14
- RSpeed::Redis.client.lpush(RSpeed::Variable.profile, json)
14
+ RSpeed::Redis.client.rpush(RSpeed::Variable.profile, json)
15
15
  end
16
16
 
17
- def after_suite(splitter = ::RSpeed::Splitter.new)
18
- RSpeed::Redis.set(RSpeed::Variable.pipe_name, true)
17
+ def after_suite
18
+ RSpeed::Redis.set(RSpeed::Variable.pipe, true)
19
19
 
20
20
  return unless RSpeed::Redis.specs_finished?
21
21
 
22
- splitter.rename
22
+ RSpeed::Splitter.consolidate
23
23
 
24
24
  RSpeed::Redis.clean
25
25
 
26
- RSpeed::Logger.log('RSpeed finished.')
26
+ RSpeed::Logger.log(self, __method__, 'RSpeed finished.')
27
27
  end
28
28
 
29
29
  def before(example)
@@ -35,10 +35,10 @@ module RSpeed
35
35
  end
36
36
 
37
37
  def clean_profile
38
- RSpeed::Logger.log('[RSpeed::Observer#clean_profile] Cleanning current flag and profile.')
38
+ RSpeed::Logger.log(self, __method__, 'Cleanning current flag and profile.')
39
39
 
40
- RSpeed::Redis.destroy(RSpeed::Variable.pipe_name)
41
- RSpeed::Redis.destroy(RSpeed::Variable.profile)
40
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.pipe)
41
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.profile)
42
42
  end
43
43
  end
44
44
  end
data/lib/rspeed/redis.rb CHANGED
@@ -7,27 +7,27 @@ module RSpeed
7
7
  module_function
8
8
 
9
9
  def clean
10
- RSpeed::Logger.log('[RSpeed::Redis#clean] Cleaning pipes and profiles.')
10
+ RSpeed::Logger.log(self, __method__, 'Cleaning pipes and profiles.')
11
11
 
12
- destroy(RSpeed::Variable::PIPES_PATTERN)
13
- destroy(RSpeed::Variable::PROFILE_PATTERN)
12
+ destroy(pattern: RSpeed::Variable::PIPES_PATTERN)
13
+ destroy(pattern: RSpeed::Variable::PROFILE_PATTERN)
14
14
  end
15
15
 
16
16
  def client
17
17
  @client ||= ::Redis.new(db: RSpeed::Env.db, host: RSpeed::Env.host, port: RSpeed::Env.port)
18
18
  end
19
19
 
20
- def destroy(pattern = RSpeed::Variable::DEFAULT_PATTERN)
21
- RSpeed::Logger.log(%([RSpeed::Redis#destroy] Destroying pattern "#{pattern}".))
20
+ def destroy(pattern:)
21
+ RSpeed::Logger.log(self, __method__, %(Destroying pattern "#{pattern}".))
22
22
 
23
- keys(pattern).each { |key| client.del(key) }
23
+ keys(pattern: pattern).each { |key| client.del(key) }
24
24
  end
25
25
 
26
26
  def get(key)
27
27
  client.get(key)
28
28
  end
29
29
 
30
- def keys(pattern = RSpeed::Variable::DEFAULT_PATTERN)
30
+ def keys(pattern:)
31
31
  cursor = 0
32
32
  result = []
33
33
 
@@ -41,8 +41,16 @@ module RSpeed
41
41
  result
42
42
  end
43
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
+
44
52
  def result?
45
- keys(RSpeed::Env.result_key).any?
53
+ keys(pattern: RSpeed::Variable.result).any?
46
54
  end
47
55
 
48
56
  def set(key, value)
@@ -50,14 +58,14 @@ module RSpeed
50
58
  end
51
59
 
52
60
  def specs_finished?
53
- (RSpeed::Redis.keys(RSpeed::Variable::PIPES_PATTERN).size == RSpeed::Env.pipes).tap do |boo|
54
- RSpeed::Logger.log("[RSpeed::Redis#specs_finished?] Specs #{boo ? 'finished.' : 'not fineshed yet.'}")
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.'}")
55
63
  end
56
64
  end
57
65
 
58
66
  def specs_initiated?
59
- RSpeed::Redis.keys(RSpeed::Variable::PIPES_PATTERN).any?.tap do |boo|
60
- RSpeed::Logger.log("[RSpeed::Redis#specs_initiated?] Specs #{boo ? 'initialized.' : 'not initialized yet.'}")
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.'}")
61
69
  end
62
70
  end
63
71
  end
data/lib/rspeed/runner.rb CHANGED
@@ -4,12 +4,12 @@ module RSpeed
4
4
  module Runner
5
5
  module_function
6
6
 
7
- def run(shell, splitter: ::RSpeed::Splitter.new)
8
- if RSpeed::Redis.result? || splitter.first_pipe?
9
- return shell.call(['bundle exec rspec', splitter.pipe_files].compact.join(' '))
7
+ def run(shell)
8
+ if RSpeed::Redis.result? || RSpeed::Splitter.first_pipe?
9
+ return shell.call(['bundle exec rspec', RSpeed::Splitter.pipe_files].compact.join(' '))
10
10
  end
11
11
 
12
- RSpeed::Logger.log("Pipe #{RSpeed::Env.pipe} skipped. Only Pipe 1 can warm.")
12
+ RSpeed::Logger.log(self, __method__, "Skipped! Only Pipe 1 can warm.")
13
13
 
14
14
  RSpeed::Observer.after_suite
15
15
  end
@@ -1,59 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpeed
4
- class Splitter
5
- require 'json'
6
-
7
- def initialize(specs_path: './spec/**/*_spec.rb')
8
- @specs_path = specs_path
9
- end
10
-
11
- def actual_examples
12
- @actual_examples ||= begin
13
- [].tap do |examples|
14
- Dir[@specs_path].sort.each do |file|
15
- data = File.open(file).read
16
- lines = data.split("\n")
17
-
18
- lines&.each&.with_index do |item, index|
19
- examples << "#{file}:#{index + 1}" if /^it/.match?(item.gsub(/\s+/, ''))
20
- end
21
- end
4
+ module Splitter
5
+ module_function
22
6
 
23
- stream(:actual_examples, examples)
24
- end
25
- end
26
- end
7
+ require 'json'
27
8
 
28
- def append?
29
- RSpeed::Redis.result? || first_pipe?
30
- end
9
+ require 'rspeed/differ'
31
10
 
32
11
  def append(items:, key:)
33
- items.each { |item| redis.rpush(key, item) }
12
+ items.each { |item| RSpeed::Redis.client.rpush(key, item) }
34
13
  end
35
14
 
36
- def diff
37
- actual_data = rspeed_data.select { |item| actual_examples.include?(item[:file]) }
38
- added_data = added_examples.map { |item| { file: item, time: 0 } }
15
+ def consolidate
16
+ RSpeed::Logger.log(self, __method__, 'Consolidating profiles.')
39
17
 
40
- removed_examples # called just for stream for now
18
+ RSpeed::Redis.destroy(pattern: RSpeed::Variable.result)
41
19
 
42
- actual_data + added_data
20
+ append(items: RSpeed::Redis.profiles_content, key: RSpeed::Variable.result)
43
21
  end
44
22
 
45
23
  def first_pipe?
46
24
  RSpeed::Env.pipe == 1
47
25
  end
48
26
 
49
- def get(pattern)
50
- @get ||= begin
51
- return redis.lrange(pattern, 0, -1) if [RSpeed::Variable.result].include?(pattern)
52
-
53
- RSpeed::Redis.keys(pattern).map { |key| ::JSON.parse(redis.get(key)) }
54
- end
55
- end
56
-
57
27
  def need_warm?
58
28
  first_pipe? && !RSpeed::Redis.result?
59
29
  end
@@ -61,21 +31,12 @@ module RSpeed
61
31
  def pipe_files
62
32
  return unless RSpeed::Redis.result?
63
33
 
64
- split[RSpeed::Variable.key(RSpeed::Env.pipe)][:files].map { |item| item[:file] }.join(' ')
65
- end
66
-
67
- def rename
68
- RSpeed::Logger.log('[RSpeed::Splitter#consolidate] Consolidating profiles.')
34
+ splitted = split(data: RSpeed::Differ.diff)
69
35
 
70
- RSpeed::Redis.destroy(RSpeed::Env.result_key)
71
-
72
- append(
73
- items: RSpeed::Redis.client.keys('rspeed_profile_*').map { |key| redis.lrange(key, 0, -1) },
74
- key: RSpeed::Env.result_key
75
- )
36
+ splitted[RSpeed::Variable.key(RSpeed::Env.pipe)][:files].map { |item| item[:file] }.join(' ')
76
37
  end
77
38
 
78
- def split(data = diff)
39
+ def split(data:)
79
40
  json = {}
80
41
 
81
42
  RSpeed::Env.pipes.times do |index|
@@ -96,39 +57,5 @@ module RSpeed
96
57
 
97
58
  json
98
59
  end
99
-
100
- private
101
-
102
- def added_examples
103
- @added_examples ||= begin
104
- (actual_examples - rspeed_examples).tap { |examples| stream(:added_examples, examples) }
105
- end
106
- end
107
-
108
- def redis
109
- @redis ||= ::RSpeed::Redis.client
110
- end
111
-
112
- def removed_examples
113
- @removed_examples ||= begin
114
- (rspeed_examples - actual_examples).tap { |examples| stream(:removed_examples, examples) }
115
- end
116
- end
117
-
118
- def removed_time
119
- removed_examples.sum { |item| item[0].to_f }
120
- end
121
-
122
- def rspeed_data
123
- @rspeed_data ||= get(RSpeed::Env.result_key).map { |item| JSON.parse(item, symbolize_names: true) }
124
- end
125
-
126
- def rspeed_examples
127
- rspeed_data.map { |item| item[:file] }
128
- end
129
-
130
- def stream(type, data)
131
- RSpeed::Logger.log("PIPE: #{RSpeed::Env.pipe} with #{type}: #{data}")
132
- end
133
60
  end
134
61
  end