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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -0
- data/README.md +3 -3
- data/lib/rspeed.rb +1 -0
- data/lib/rspeed/database.rb +11 -0
- data/lib/rspeed/differ.rb +55 -0
- data/lib/rspeed/env.rb +8 -8
- data/lib/rspeed/logger.rb +4 -2
- data/lib/rspeed/observer.rb +8 -8
- data/lib/rspeed/redis.rb +20 -12
- data/lib/rspeed/runner.rb +4 -4
- data/lib/rspeed/splitter.rb +12 -85
- data/lib/rspeed/variable.rb +9 -10
- data/lib/rspeed/version.rb +1 -1
- data/spec/models/rspeed/database/result_spec.rb +17 -0
- data/spec/models/rspeed/differ/actual_data_spec.rb +20 -0
- data/spec/models/rspeed/differ/actual_files_spec.rb +20 -0
- data/spec/models/rspeed/differ/added_data_spec.rb +19 -0
- data/spec/models/rspeed/differ/diff_spec.rb +51 -0
- data/spec/models/rspeed/differ/removed_data_spec.rb +20 -0
- data/spec/models/rspeed/differ/removed_time_spec.rb +14 -0
- data/spec/models/rspeed/env/{name_spec.rb → app_spec.rb} +4 -4
- data/spec/models/rspeed/env/spec_path_spec.rb +19 -0
- data/spec/models/rspeed/observer/after_suite_spec.rb +6 -28
- data/spec/models/rspeed/observer/before_suite_spec.rb +7 -6
- data/spec/models/rspeed/redis/clean_spec.rb +5 -5
- data/spec/models/rspeed/redis/destroy_spec.rb +7 -15
- data/spec/models/rspeed/redis/get_spec.rb +3 -1
- data/spec/models/rspeed/redis/keys_spec.rb +6 -22
- data/spec/models/rspeed/redis/list_spec.rb +19 -0
- data/spec/models/rspeed/redis/profiles_content_spec.rb +19 -0
- data/spec/models/rspeed/redis/set_spec.rb +3 -1
- data/spec/models/rspeed/redis/specs_finished_spec.rb +2 -2
- data/spec/models/rspeed/redis/specs_initiated_spec.rb +1 -1
- data/spec/models/rspeed/runner/run_spec.rb +9 -13
- data/spec/models/rspeed/splitter/append_spec.rb +1 -3
- data/spec/models/rspeed/splitter/consolidate_spec.rb +23 -0
- data/spec/models/rspeed/splitter/first_pipe_spec.rb +2 -4
- data/spec/models/rspeed/splitter/need_warm_question_spec.rb +8 -10
- data/spec/models/rspeed/splitter/pipe_files_spec.rb +3 -8
- data/spec/models/rspeed/splitter/split_spec.rb +5 -43
- data/spec/models/rspeed/variable/append_app_name_spec.rb +33 -0
- data/spec/models/rspeed/variable/key_spec.rb +4 -4
- data/spec/models/rspeed/variable/pipe_spec.rb +23 -0
- data/spec/models/rspeed/variable/pipes_pattern_spec.rb +1 -1
- data/spec/models/rspeed/variable/profile_pattern_spec.rb +1 -1
- data/spec/models/rspeed/variable/profile_spec.rb +23 -0
- data/spec/models/rspeed/variable/result_spec.rb +5 -5
- data/spec/spec_helper.rb +2 -2
- metadata +33 -25
- data/spec/fixtures/new_spec.rb.csv +0 -1
- data/spec/models/rspeed/env/result_key_spec.rb +0 -19
- data/spec/models/rspeed/splitter/actual_examples_spec.rb +0 -26
- data/spec/models/rspeed/splitter/append_question_spec.rb +0 -37
- data/spec/models/rspeed/splitter/diff_spec.rb +0 -30
- data/spec/models/rspeed/splitter/get_spec.rb +0 -60
- data/spec/models/rspeed/splitter/rename_spec.rb +0 -25
- data/spec/models/rspeed/variable/append_name_spec.rb +0 -19
- data/spec/models/rspeed/variable/default_partner_spec.rb +0 -5
- data/spec/models/rspeed/variable/pipe_name_spec.rb +0 -15
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b8a143543e9f44b4c5641d60642968b7cc4a7ec85953b17f6ef62743e66196e
|
4
|
+
data.tar.gz: f8fc781825804fe67084c08b05164ca8a31fc87e458952ba0ca86e567576e669
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
- `
|
29
|
+
- `RSPEED_APP`: You app name to avoid data override
|
30
30
|
- `RSPEED_PIPE`: Current pipe
|
31
31
|
- `RSPEED_PIPES`: Quantity of pipes
|
32
|
-
- `
|
32
|
+
- `RSPEED_SPEC_PATH`: The specs folders path
|
33
33
|
- `RSPEED`: Enables RSpeed
|
34
34
|
|
35
35
|
```sh
|
36
|
-
RSPEED=true
|
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
@@ -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
data/lib/rspeed/observer.rb
CHANGED
@@ -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.
|
14
|
+
RSpeed::Redis.client.rpush(RSpeed::Variable.profile, json)
|
15
15
|
end
|
16
16
|
|
17
|
-
def after_suite
|
18
|
-
RSpeed::Redis.set(RSpeed::Variable.
|
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
|
-
|
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('
|
38
|
+
RSpeed::Logger.log(self, __method__, 'Cleanning current flag and profile.')
|
39
39
|
|
40
|
-
RSpeed::Redis.destroy(RSpeed::Variable.
|
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('
|
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
|
21
|
-
RSpeed::Logger.log(%(
|
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
|
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::
|
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("
|
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("
|
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
|
8
|
-
if RSpeed::Redis.result? ||
|
9
|
-
return shell.call(['bundle exec rspec',
|
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(
|
12
|
+
RSpeed::Logger.log(self, __method__, "Skipped! Only Pipe 1 can warm.")
|
13
13
|
|
14
14
|
RSpeed::Observer.after_suite
|
15
15
|
end
|
data/lib/rspeed/splitter.rb
CHANGED
@@ -1,59 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module RSpeed
|
4
|
-
|
5
|
-
|
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
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
7
|
+
require 'json'
|
27
8
|
|
28
|
-
|
29
|
-
RSpeed::Redis.result? || first_pipe?
|
30
|
-
end
|
9
|
+
require 'rspeed/differ'
|
31
10
|
|
32
11
|
def append(items:, key:)
|
33
|
-
items.each { |item|
|
12
|
+
items.each { |item| RSpeed::Redis.client.rpush(key, item) }
|
34
13
|
end
|
35
14
|
|
36
|
-
def
|
37
|
-
|
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
|
-
|
18
|
+
RSpeed::Redis.destroy(pattern: RSpeed::Variable.result)
|
41
19
|
|
42
|
-
|
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
|
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::
|
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
|
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
|