lavin 0.1.0 → 0.2.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
- checksums.yaml.gz.sig +0 -0
- data/lib/lavin/client.rb +3 -2
- data/lib/lavin/hook.rb +29 -0
- data/lib/lavin/http_client.rb +1 -1
- data/lib/lavin/runner.rb +1 -1
- data/lib/lavin/statistics.rb +45 -5
- data/lib/lavin/stats.rb +23 -3
- data/lib/lavin/step.rb +7 -4
- data/lib/lavin/version.rb +1 -1
- data/lib/lavin/worker.rb +8 -6
- data.tar.gz.sig +1 -1
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3a7216c049391b24ccad2eb6c6d6424114761a11b1b4aa15824c5c58ca2bf19
|
4
|
+
data.tar.gz: 3ec27a41fdc255d3eafb3a168c39ad8b744b28ab5e436d38d8eaf9f94aa22f23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6689ccce7532d8438013a8e3af32052f5b8df828169a026270f03d16a9078f11677b36f2a6c8989ec27cd8bfa3248d4bb1a9bbd2ddc35cccd4d8f1df143e182
|
7
|
+
data.tar.gz: 4b2b728d3d5c775471c3ffdcf52c7b2a475d6c7e76d6aae4288b1e1154747e6f81bc802bf3f04f951aa1dec02de690671f110e01db8baed5c5442717f93f2b85
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/lavin/client.rb
CHANGED
@@ -17,7 +17,7 @@ module Lavin
|
|
17
17
|
}.freeze
|
18
18
|
|
19
19
|
attr_reader :internet, :base_url
|
20
|
-
attr_accessor :request_count, :cookie
|
20
|
+
attr_accessor :request_count, :cookie, :report_statistics
|
21
21
|
|
22
22
|
def initialize(base_url = nil)
|
23
23
|
raise NoCurrentAsyncTaskError unless Async::Task.current?
|
@@ -26,6 +26,7 @@ module Lavin
|
|
26
26
|
@base_url = base_url
|
27
27
|
@request_count = 0
|
28
28
|
@cookie = nil
|
29
|
+
@report_statistics = true
|
29
30
|
end
|
30
31
|
|
31
32
|
def close
|
@@ -41,7 +42,7 @@ module Lavin
|
|
41
42
|
|
42
43
|
status, headers, body = process(response)
|
43
44
|
|
44
|
-
Statistics.register_request(method:, url:, status:, duration:)
|
45
|
+
Statistics.register_request(method:, url:, status:, duration:) if report_statistics
|
45
46
|
|
46
47
|
{status:, headers:, body: body}
|
47
48
|
end
|
data/lib/lavin/hook.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
|
4
|
+
module Lavin
|
5
|
+
class Hook
|
6
|
+
attr_reader :user, :block
|
7
|
+
|
8
|
+
def initialize(user:, &block)
|
9
|
+
@user = user
|
10
|
+
@block = block
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(context: nil)
|
14
|
+
call(context:)
|
15
|
+
Runner.yield
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(context:)
|
19
|
+
report_statistics = context.client.report_statistics
|
20
|
+
context.client.report_statistics = false
|
21
|
+
context.instance_exec(&block)
|
22
|
+
rescue => error
|
23
|
+
puts "Caught an error - #{error.class}: #{error.message}"
|
24
|
+
puts error.backtrace
|
25
|
+
ensure
|
26
|
+
context.client.report_statistics = report_statistics
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/lavin/http_client.rb
CHANGED
data/lib/lavin/runner.rb
CHANGED
data/lib/lavin/statistics.rb
CHANGED
@@ -28,6 +28,10 @@ module Lavin
|
|
28
28
|
data[:total_requests]
|
29
29
|
end
|
30
30
|
|
31
|
+
def total_steps
|
32
|
+
data[:step_summary][:count]
|
33
|
+
end
|
34
|
+
|
31
35
|
def duration
|
32
36
|
return data[:duration] if data[:duration]
|
33
37
|
|
@@ -42,8 +46,13 @@ module Lavin
|
|
42
46
|
data[:requests][key] << result
|
43
47
|
end
|
44
48
|
|
45
|
-
def register_step
|
46
|
-
|
49
|
+
def register_step(user:, step_name:, failure: nil)
|
50
|
+
data[:step_summary][:count] += 1
|
51
|
+
data[:step_summary][:success] += 1 unless failure
|
52
|
+
data[:step_summary][:failure] += 1 if failure
|
53
|
+
key = [user, step_name]
|
54
|
+
data[:steps][key][:success] += 1 unless failure
|
55
|
+
data[:steps][key][:failure] += 1 if failure
|
47
56
|
end
|
48
57
|
|
49
58
|
def stats
|
@@ -68,7 +77,7 @@ module Lavin
|
|
68
77
|
statuses: statuses.tally,
|
69
78
|
avg_duration: avg_duration,
|
70
79
|
min_duration: min_duration,
|
71
|
-
max_duration: max_duration
|
80
|
+
max_duration: max_duration
|
72
81
|
}
|
73
82
|
end
|
74
83
|
|
@@ -76,6 +85,8 @@ module Lavin
|
|
76
85
|
duration: duration,
|
77
86
|
total_requests: total_requests,
|
78
87
|
rate: duration ? format("%.2f", total_requests / duration) : 0,
|
88
|
+
step_summary: data[:step_summary],
|
89
|
+
steps: data[:steps],
|
79
90
|
requests: requests
|
80
91
|
).tap do |stats|
|
81
92
|
# FIXME remove!
|
@@ -88,6 +99,14 @@ module Lavin
|
|
88
99
|
|
89
100
|
show_summary(values)
|
90
101
|
|
102
|
+
show_steps(values) do |(user, step), hash|
|
103
|
+
format(
|
104
|
+
"%-24<user_step>s %8<success>d %8<failure>d",
|
105
|
+
user_step: "#{user}.#{step}",
|
106
|
+
**hash
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
91
110
|
show_table(values) do |request_values|
|
92
111
|
format(
|
93
112
|
"%-6<method>s %-100<url>s %6<requests>d %12<avg_duration>fs %12<min_duration>fs %12<max_duration>fs",
|
@@ -116,7 +135,12 @@ module Lavin
|
|
116
135
|
start: nil,
|
117
136
|
duration: nil,
|
118
137
|
total_requests: 0,
|
119
|
-
|
138
|
+
step_summary: {
|
139
|
+
count: 0,
|
140
|
+
success: 0,
|
141
|
+
failure: 0
|
142
|
+
},
|
143
|
+
steps: Hash.new { |h, k| h[k] = {success: 0, failure: 0} },
|
120
144
|
requests: Hash.new { |h, k| h[k] = [] }
|
121
145
|
}
|
122
146
|
end
|
@@ -127,11 +151,27 @@ module Lavin
|
|
127
151
|
Lavin results:
|
128
152
|
Test ran for #{values.duration}s
|
129
153
|
Total number of requests: #{values.total_requests}
|
130
|
-
Rate: #{format("%.2f", values.total_requests/values.duration)} rps
|
154
|
+
Rate: #{format("%.2f", values.total_requests / values.duration)} rps
|
155
|
+
|
156
|
+
Total number of steps: #{values.total_steps}
|
157
|
+
Step success rate: #{format("%.2f %%", 100 * values.successful_steps.to_f / values.total_steps)}
|
131
158
|
|
132
159
|
RESULT
|
133
160
|
end
|
134
161
|
|
162
|
+
def show_steps(values)
|
163
|
+
puts format(
|
164
|
+
"%-24<user_step>s %8<success>s %8<failure>s",
|
165
|
+
user_step: "Steps",
|
166
|
+
success: "Success",
|
167
|
+
failure: "Failure"
|
168
|
+
)
|
169
|
+
divider = "-" * 42
|
170
|
+
puts divider
|
171
|
+
values.each_step { |step_values| puts yield step_values }
|
172
|
+
puts "#{divider}\n\n"
|
173
|
+
end
|
174
|
+
|
135
175
|
def show_table(values)
|
136
176
|
puts format(
|
137
177
|
"%-6<method>s %-100<url>s %-6<requests>s %12<avg_duration>s %12<min_duration>s %12<max_duration>s",
|
data/lib/lavin/stats.rb
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
module Lavin
|
4
4
|
class Stats
|
5
|
-
attr_reader :duration, :total_requests, :rate, :requests
|
5
|
+
attr_reader :duration, :total_requests, :rate, :requests, :step_summary, :steps
|
6
6
|
|
7
|
-
def initialize(duration:, total_requests:, rate:, requests: [])
|
7
|
+
def initialize(duration:, total_requests:, rate:, requests: [], step_summary: {}, steps: [])
|
8
8
|
@duration = duration
|
9
9
|
@total_requests = total_requests
|
10
10
|
@rate = rate
|
11
11
|
@requests = requests
|
12
|
+
@step_summary = step_summary
|
13
|
+
@steps = steps
|
12
14
|
end
|
13
15
|
|
14
16
|
def empty?
|
@@ -20,10 +22,28 @@ module Lavin
|
|
20
22
|
duration:,
|
21
23
|
total_requests:,
|
22
24
|
rate:,
|
23
|
-
requests
|
25
|
+
requests:,
|
26
|
+
step_summary:,
|
27
|
+
steps:
|
24
28
|
}
|
25
29
|
end
|
26
30
|
|
31
|
+
def total_steps
|
32
|
+
@step_summary[:count]
|
33
|
+
end
|
34
|
+
|
35
|
+
def successful_steps
|
36
|
+
@step_summary[:success]
|
37
|
+
end
|
38
|
+
|
39
|
+
def failed_steps
|
40
|
+
@step_summary[:failure]
|
41
|
+
end
|
42
|
+
|
43
|
+
def each_step(&block)
|
44
|
+
steps.each(&block)
|
45
|
+
end
|
46
|
+
|
27
47
|
def each_request(&block)
|
28
48
|
requests.each(&block)
|
29
49
|
end
|
data/lib/lavin/step.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
#
|
2
3
|
|
3
4
|
module Lavin
|
4
5
|
class Step
|
5
|
-
attr_reader :user, :block, :repeat
|
6
|
+
attr_reader :name, :user, :block, :repeat
|
6
7
|
|
7
|
-
def initialize(repeat: 1, &block)
|
8
|
+
def initialize(name:, user:, repeat: 1, &block)
|
9
|
+
@name = name
|
10
|
+
@user = user
|
8
11
|
@repeat = repeat
|
9
12
|
@block = block
|
10
13
|
end
|
@@ -18,11 +21,11 @@ module Lavin
|
|
18
21
|
|
19
22
|
def call(context:)
|
20
23
|
context.instance_exec(&block)
|
21
|
-
|
24
|
+
Statistics.register_step(user: user.name, step_name: name)
|
22
25
|
rescue => error
|
23
26
|
puts "Caught an error - #{error.class}: #{error.message}"
|
24
27
|
puts error.backtrace
|
25
|
-
|
28
|
+
Statistics.register_step(user: user.name, step_name: name, failure: error.message)
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
data/lib/lavin/version.rb
CHANGED
data/lib/lavin/worker.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'lavin/step'
|
4
|
+
require 'lavin/hook'
|
4
5
|
|
5
6
|
module Lavin
|
6
7
|
module Worker
|
@@ -8,21 +9,22 @@ module Lavin
|
|
8
9
|
def before(&block)
|
9
10
|
return @before unless block
|
10
11
|
|
11
|
-
@before = block
|
12
|
+
@before = Hook.new(user: self, &block)
|
12
13
|
end
|
13
14
|
|
14
15
|
def after(&block)
|
15
16
|
return @after unless block
|
16
17
|
|
17
|
-
@after = block
|
18
|
+
@after = Hook.new(user: self, &block)
|
18
19
|
end
|
19
20
|
|
20
21
|
def steps
|
21
22
|
@steps ||= []
|
22
23
|
end
|
23
24
|
|
24
|
-
def step(**options, &block)
|
25
|
-
|
25
|
+
def step(name: nil, **options, &block)
|
26
|
+
name ||= "Step##{steps.size + 1}"
|
27
|
+
steps << Step.new(user: self, name:, **options, &block)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -38,11 +40,11 @@ module Lavin
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def run
|
41
|
-
self.class.before.
|
43
|
+
self.class.before.run(context: self).then { Runner.yield } if self.class.before
|
42
44
|
|
43
45
|
run_step until finished?
|
44
46
|
|
45
|
-
self.class.after.
|
47
|
+
self.class.after.run(context: self).then { Runner.yield } if self.class.after
|
46
48
|
end
|
47
49
|
|
48
50
|
private
|
data.tar.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
�r�)ꮠo���%e�[n�a��/&�m�˧*�#�RG�1���2�[L{@u��E��/ıi�����k�D�3{�<f��o�jNo�*/�C��Q���� ��Һ���y�'��;�UC��Ф�)���4}q�M�����G��G~��R<�`)�+����n��{�=U~��r̒ ���MW��l�.Y=��Q�i��5*S���R��bwC��!��C�J����~0D?�B쬗��r����
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lavin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sammy Henningsson
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
DVzXaUnsmwP+jQ1PkDa5q8ibBzMd2c6Hmm87UDqPxZtML0bF9SjrpbyLMjwtXaMA
|
30
30
|
WDPp0ajpdUZ9GPHsrVNYXiOfQIqcmlmpYVsH1o7vuneUIcIDMrnMDChh
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2022-10-
|
32
|
+
date: 2022-10-31 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: async
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- lib/lavin.rb
|
114
114
|
- lib/lavin/client.rb
|
115
115
|
- lib/lavin/error.rb
|
116
|
+
- lib/lavin/hook.rb
|
116
117
|
- lib/lavin/http_client.rb
|
117
118
|
- lib/lavin/runner.rb
|
118
119
|
- lib/lavin/statistics.rb
|
metadata.gz.sig
CHANGED
Binary file
|