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