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
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