kronk 1.6.2 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +29 -1
- data/Manifest.txt +6 -1
- data/README.rdoc +74 -28
- data/Rakefile +4 -3
- data/TODO.rdoc +7 -5
- data/bin/kronk +2 -11
- data/lib/kronk/async/em_ext.rb +34 -0
- data/lib/kronk/async/request.rb +73 -0
- data/lib/kronk/async/response.rb +70 -0
- data/lib/kronk/async.rb +118 -0
- data/lib/kronk/cmd.rb +111 -43
- data/lib/kronk/constants.rb +1 -0
- data/lib/kronk/core_ext.rb +1 -1
- data/lib/kronk/data_string.rb +251 -0
- data/lib/kronk/diff/output.rb +132 -100
- data/lib/kronk/diff.rb +20 -24
- data/lib/kronk/path/matcher.rb +8 -4
- data/lib/kronk/path/path_match.rb +48 -4
- data/lib/kronk/path/transaction.rb +74 -53
- data/lib/kronk/path.rb +11 -6
- data/lib/kronk/player/benchmark.rb +11 -12
- data/lib/kronk/player/input_reader.rb +40 -3
- data/lib/kronk/player/request_parser.rb +4 -1
- data/lib/kronk/player/stream.rb +2 -2
- data/lib/kronk/player/suite.rb +16 -9
- data/lib/kronk/player.rb +93 -143
- data/lib/kronk/queue_runner.rb +238 -0
- data/lib/kronk/request.rb +25 -20
- data/lib/kronk/response.rb +39 -10
- data/lib/kronk/test/assertions.rb +2 -2
- data/lib/kronk/test/helper_methods.rb +1 -1
- data/lib/kronk.rb +56 -24
- data/test/test_assertions.rb +4 -4
- data/test/test_cmd.rb +38 -10
- data/test/test_data_string.rb +242 -1
- data/test/test_diff.rb +8 -303
- data/test/test_helper.rb +1 -1
- data/test/test_kronk.rb +21 -28
- data/test/test_path.rb +29 -0
- data/test/test_path_match.rb +47 -2
- data/test/test_path_matcher.rb +42 -1
- data/test/test_player.rb +71 -72
- data/test/test_request.rb +31 -6
- data/test/test_request_parser.rb +7 -1
- data/test/test_response.rb +1 -1
- data/test/test_transaction.rb +78 -30
- metadata +64 -8
- data/lib/kronk/data_renderer.rb +0 -219
@@ -11,9 +11,12 @@
|
|
11
11
|
# {:name => "Tory", :id => "12345"},
|
12
12
|
# ]
|
13
13
|
#
|
14
|
-
# # Select all element names
|
14
|
+
# # Select all element names, delete the one at index 2,
|
15
|
+
# # and move the element with the value "Tory" to the same path but
|
16
|
+
# # with the key renamed to "boo"
|
15
17
|
# Transaction.run data do |t|
|
16
18
|
# t.select "*/name"
|
19
|
+
# t.move "**=Tory" => "%%/boo"
|
17
20
|
# t.delete "2"
|
18
21
|
# end
|
19
22
|
#
|
@@ -21,7 +24,7 @@
|
|
21
24
|
# # {:name => "Jamie"},
|
22
25
|
# # {:name => "Adam"},
|
23
26
|
# # {:name => "Grant"},
|
24
|
-
# # {
|
27
|
+
# # {"boo" => "Tory"},
|
25
28
|
# # ]
|
26
29
|
|
27
30
|
class Kronk::Path::Transaction
|
@@ -36,6 +39,8 @@ class Kronk::Path::Transaction
|
|
36
39
|
end
|
37
40
|
|
38
41
|
|
42
|
+
attr_accessor :actions
|
43
|
+
|
39
44
|
##
|
40
45
|
# Create a new Transaction instance with a the data object to perform
|
41
46
|
# operations on.
|
@@ -43,12 +48,7 @@ class Kronk::Path::Transaction
|
|
43
48
|
def initialize data
|
44
49
|
@data = data
|
45
50
|
@new_data = nil
|
46
|
-
@actions =
|
47
|
-
:select => [],
|
48
|
-
:delete => [],
|
49
|
-
:move => {},
|
50
|
-
:map => {}
|
51
|
-
}
|
51
|
+
@actions = []
|
52
52
|
|
53
53
|
@make_array = {}
|
54
54
|
end
|
@@ -71,10 +71,14 @@ class Kronk::Path::Transaction
|
|
71
71
|
# pass the :keep_indicies => true option.
|
72
72
|
|
73
73
|
def results opts={}
|
74
|
-
new_data
|
75
|
-
|
76
|
-
|
77
|
-
|
74
|
+
new_data = @data
|
75
|
+
prev_type = nil
|
76
|
+
prev_data = nil
|
77
|
+
|
78
|
+
@actions.each do |type, paths|
|
79
|
+
new_data = send("transaction_#{type}", new_data, *paths)
|
80
|
+
end
|
81
|
+
|
78
82
|
remake_arrays new_data, opts[:keep_indicies]
|
79
83
|
end
|
80
84
|
|
@@ -104,9 +108,22 @@ class Kronk::Path::Transaction
|
|
104
108
|
end
|
105
109
|
|
106
110
|
|
111
|
+
def remap_make_arrays new_path, old_path # :nodoc:
|
112
|
+
@make_array[new_path] = true and return if @make_array[old_path]
|
113
|
+
|
114
|
+
@make_array.keys.each do |path|
|
115
|
+
if path[0...old_path.length] == old_path
|
116
|
+
path[0...old_path.length] = new_path
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
107
122
|
def transaction_select data, *data_paths # :nodoc:
|
108
|
-
|
109
|
-
|
123
|
+
return data if data_paths.empty?
|
124
|
+
|
125
|
+
transaction data, data_paths, true do |sdata, cdata, key, path, tpath|
|
126
|
+
sdata[key] = cdata[key]
|
110
127
|
end
|
111
128
|
end
|
112
129
|
|
@@ -118,41 +135,31 @@ class Kronk::Path::Transaction
|
|
118
135
|
end
|
119
136
|
|
120
137
|
|
121
|
-
def transaction_move data,
|
122
|
-
return data if
|
138
|
+
def transaction_move data, *path_pairs # :nodoc:
|
139
|
+
return data if path_pairs.empty?
|
123
140
|
path_val_hash = {}
|
124
141
|
|
125
|
-
|
126
|
-
transaction data,
|
127
|
-
|
128
|
-
|
129
|
-
if @make_array[path]
|
130
|
-
@make_array.delete path
|
131
|
-
@make_array[mapped_path] = true
|
132
|
-
end
|
142
|
+
new_data =
|
143
|
+
transaction data, path_pairs do |sdata, cdata, key, path, tpath|
|
144
|
+
path_val_hash[tpath] = sdata.delete key
|
145
|
+
remap_make_arrays(tpath, path)
|
133
146
|
end
|
134
|
-
end
|
135
147
|
|
136
|
-
force_assign_paths
|
148
|
+
force_assign_paths new_data, path_val_hash
|
137
149
|
end
|
138
150
|
|
139
151
|
|
140
|
-
def transaction_map data,
|
141
|
-
return data if
|
152
|
+
def transaction_map data, *path_pairs # :nodoc:
|
153
|
+
return data if path_pairs.empty?
|
142
154
|
path_val_hash = {}
|
143
155
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
if @make_array[spath]
|
149
|
-
@make_array.delete spath
|
150
|
-
@make_array[mapped_path] = true
|
151
|
-
end
|
152
|
-
end
|
156
|
+
transaction data, path_pairs do |sdata, cdata, key, path, tpath|
|
157
|
+
tpath ||= path
|
158
|
+
path_val_hash[tpath] = sdata.delete key
|
159
|
+
remap_make_arrays(tpath, path)
|
153
160
|
end
|
154
161
|
|
155
|
-
force_assign_paths
|
162
|
+
force_assign_paths data.class.new, path_val_hash
|
156
163
|
end
|
157
164
|
|
158
165
|
|
@@ -160,13 +167,17 @@ class Kronk::Path::Transaction
|
|
160
167
|
data_paths = data_paths.compact
|
161
168
|
return @new_data || data if data_paths.empty?
|
162
169
|
|
163
|
-
@new_data
|
170
|
+
@new_data = create_empty ? Hash.new : data.dup
|
164
171
|
|
165
172
|
if Array === @new_data
|
166
173
|
@new_data = ary_to_hash @new_data
|
167
174
|
end
|
168
175
|
|
169
176
|
data_paths.each do |data_path|
|
177
|
+
# If data_path is an array, the second element is the path where the value
|
178
|
+
# should be mapped to.
|
179
|
+
data_path, target_path = data_path
|
180
|
+
|
170
181
|
Kronk::Path.find data_path, data do |obj, k, path|
|
171
182
|
curr_data = data
|
172
183
|
new_curr_data = @new_data
|
@@ -175,7 +186,8 @@ class Kronk::Path::Transaction
|
|
175
186
|
break unless new_curr_data
|
176
187
|
|
177
188
|
if i == path.length - 1
|
178
|
-
|
189
|
+
tpath = path.make_path target_path if target_path
|
190
|
+
yield new_curr_data, curr_data, key, path, tpath if block_given?
|
179
191
|
|
180
192
|
else
|
181
193
|
if create_empty
|
@@ -202,7 +214,7 @@ class Kronk::Path::Transaction
|
|
202
214
|
|
203
215
|
def force_assign_paths data, path_val_hash # :nodoc:
|
204
216
|
return data if path_val_hash.empty?
|
205
|
-
@new_data
|
217
|
+
@new_data = (data.dup rescue [])
|
206
218
|
|
207
219
|
path_val_hash.each do |path, value|
|
208
220
|
curr_data = data
|
@@ -216,7 +228,7 @@ class Kronk::Path::Transaction
|
|
216
228
|
new_curr_data = ary_to_hash new_curr_data
|
217
229
|
prev_data[prev_key] = new_curr_data if prev_data
|
218
230
|
@new_data = new_curr_data if i == 0
|
219
|
-
@make_array[prev_path] = true
|
231
|
+
@make_array[prev_path] = true if i == 0
|
220
232
|
end
|
221
233
|
|
222
234
|
last = i == path.length - 1
|
@@ -226,7 +238,7 @@ class Kronk::Path::Transaction
|
|
226
238
|
|
227
239
|
# new_curr_data is a hash from here on
|
228
240
|
|
229
|
-
@make_array.delete prev_path unless
|
241
|
+
@make_array.delete prev_path unless is_integer?(key)
|
230
242
|
|
231
243
|
new_curr_data[key] = value and break if last
|
232
244
|
|
@@ -234,7 +246,7 @@ class Kronk::Path::Transaction
|
|
234
246
|
new_curr_data[key] ||= curr_data[key]
|
235
247
|
|
236
248
|
elsif !ary_or_hash?(new_curr_data[key])
|
237
|
-
new_curr_data[key] =
|
249
|
+
new_curr_data[key] = is_integer?(next_key) ? [] : {}
|
238
250
|
end
|
239
251
|
|
240
252
|
@make_array[curr_path] = true if Array === new_curr_data[key]
|
@@ -250,6 +262,11 @@ class Kronk::Path::Transaction
|
|
250
262
|
end
|
251
263
|
|
252
264
|
|
265
|
+
def is_integer? item # :nodoc:
|
266
|
+
item.to_s.to_i.to_s == item.to_s
|
267
|
+
end
|
268
|
+
|
269
|
+
|
253
270
|
def ary_or_hash? obj # :nodoc:
|
254
271
|
Array === obj || Hash === obj
|
255
272
|
end
|
@@ -272,7 +289,7 @@ class Kronk::Path::Transaction
|
|
272
289
|
|
273
290
|
def clear
|
274
291
|
@new_data = nil
|
275
|
-
@actions.
|
292
|
+
@actions.clear
|
276
293
|
@make_array.clear
|
277
294
|
end
|
278
295
|
|
@@ -281,7 +298,11 @@ class Kronk::Path::Transaction
|
|
281
298
|
# Queues path selects for transaction.
|
282
299
|
|
283
300
|
def select *paths
|
284
|
-
@actions[:select
|
301
|
+
if @actions.last && @actions.last[0] == :select
|
302
|
+
@actions.last[1].concat paths
|
303
|
+
else
|
304
|
+
@actions << [:select, paths]
|
305
|
+
end
|
285
306
|
end
|
286
307
|
|
287
308
|
|
@@ -289,7 +310,7 @@ class Kronk::Path::Transaction
|
|
289
310
|
# Queues path deletes for transaction.
|
290
311
|
|
291
312
|
def delete *paths
|
292
|
-
@actions[:delete
|
313
|
+
@actions << [:delete, paths]
|
293
314
|
end
|
294
315
|
|
295
316
|
|
@@ -297,21 +318,21 @@ class Kronk::Path::Transaction
|
|
297
318
|
# Queues path moving for transaction. Moving a path will attempt to
|
298
319
|
# keep the original data structure and only affect the given paths.
|
299
320
|
# Empty hashes or arrays after a move are deleted.
|
300
|
-
# t.move "my/path/1..4/key" => "new_path/%
|
301
|
-
# "other/path/*" => "moved/%
|
321
|
+
# t.move "my/path/1..4/key" => "new_path/%1/key",
|
322
|
+
# "other/path/*" => "moved/%1"
|
302
323
|
|
303
324
|
def move path_maps
|
304
|
-
@actions[:move
|
325
|
+
@actions << [:move, Array(path_maps)]
|
305
326
|
end
|
306
327
|
|
307
328
|
|
308
329
|
##
|
309
330
|
# Queues path mapping for transaction. Mapping a path will only keep the
|
310
331
|
# mapped values, completely replacing the original data structure.
|
311
|
-
# t.
|
312
|
-
#
|
332
|
+
# t.map "my/path/1..4/key" => "new_path/%1/key",
|
333
|
+
# "other/path/*" => "moved/%1"
|
313
334
|
|
314
335
|
def map path_maps
|
315
|
-
@actions[:map
|
336
|
+
@actions << [:map, Array(path_maps)]
|
316
337
|
end
|
317
338
|
end
|
data/lib/kronk/path.rb
CHANGED
@@ -136,16 +136,20 @@ class Kronk
|
|
136
136
|
end
|
137
137
|
|
138
138
|
|
139
|
+
SPECIAL_CHARS = "*?()|/."
|
140
|
+
R_SPECIAL_CHARS = /[\0#{Regexp.escape SPECIAL_CHARS}]/u
|
141
|
+
|
139
142
|
##
|
140
143
|
# Joins an Array into a path String.
|
141
144
|
|
142
145
|
def self.join path_arr, escape=true
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
146
|
+
path_str = path_arr.join("\0")
|
147
|
+
if escape
|
148
|
+
path_str.gsub!(R_SPECIAL_CHARS){|c| c == "\0" ? DCH : "\\#{c}"}
|
149
|
+
else
|
150
|
+
path_str.gsub! "\0", DCH
|
151
|
+
end
|
152
|
+
path_str
|
149
153
|
end
|
150
154
|
|
151
155
|
|
@@ -282,6 +286,7 @@ class Kronk
|
|
282
286
|
end
|
283
287
|
end
|
284
288
|
|
289
|
+
# Make sure we're not trying to access /./thing
|
285
290
|
unless key =~ /^\.?$/ && !value
|
286
291
|
matcher = Matcher.new :key => key,
|
287
292
|
:value => value,
|
@@ -17,10 +17,10 @@ class Kronk
|
|
17
17
|
|
18
18
|
class ResultSet
|
19
19
|
|
20
|
-
attr_reader :byterate, :count, :fastest, :
|
20
|
+
attr_reader :byterate, :count, :fastest, :precision,
|
21
21
|
:slowest, :total_bytes
|
22
22
|
|
23
|
-
def initialize
|
23
|
+
def initialize start_time
|
24
24
|
@times = Hash.new(0)
|
25
25
|
@count = 0
|
26
26
|
@r5XX = 0
|
@@ -38,8 +38,6 @@ class Kronk
|
|
38
38
|
|
39
39
|
@start_time = start_time
|
40
40
|
@total_time = 0
|
41
|
-
|
42
|
-
@hostname = "#{uri.scheme}://#{uri.host}:#{uri.port}" if uri
|
43
41
|
end
|
44
42
|
|
45
43
|
|
@@ -55,7 +53,7 @@ class Kronk
|
|
55
53
|
@slowest = time if !@slowest || @slowest < time
|
56
54
|
@fastest = time if !@fastest || @fastest > time
|
57
55
|
|
58
|
-
log_path resp.uri.
|
56
|
+
log_path resp.uri.to_s, time if resp.uri
|
59
57
|
|
60
58
|
@total_bytes += resp.raw.bytes.count
|
61
59
|
|
@@ -139,14 +137,13 @@ class Kronk
|
|
139
137
|
end
|
140
138
|
|
141
139
|
|
142
|
-
def
|
143
|
-
@paths.to_a.sort{|x,y| y[1] <=> x[1]}[0..9]
|
140
|
+
def slowest_reqs
|
141
|
+
@slowest_reqs ||= @paths.to_a.sort{|x,y| y[1] <=> x[1]}[0..9]
|
144
142
|
end
|
145
143
|
|
146
144
|
|
147
145
|
def to_s
|
148
146
|
out = <<-STR
|
149
|
-
Host: #{@hostname || "<IO>"}
|
150
147
|
Completed: #{@count}
|
151
148
|
400s: #{@r4XX}
|
152
149
|
500s: #{@r5XX}
|
@@ -173,9 +170,11 @@ Request Percentages (ms)
|
|
173
170
|
100% #{self.percentages[100]} (longest request)
|
174
171
|
STR
|
175
172
|
|
176
|
-
|
177
|
-
|
178
|
-
|
173
|
+
unless slowest_reqs.empty?
|
174
|
+
out << "
|
175
|
+
Avg. Slowest Requests (ms, #)
|
176
|
+
#{slowest_reqs.map{|arr| " #{arr[1]} #{arr[0]}"}.join "\n" }"
|
177
|
+
end
|
179
178
|
|
180
179
|
out
|
181
180
|
end
|
@@ -203,7 +202,7 @@ Avg. Slowest Paths (ms, #)
|
|
203
202
|
kronk.responses.each_with_index do |resp, i|
|
204
203
|
mutex.synchronize do
|
205
204
|
@count += 1
|
206
|
-
@results[i] ||= ResultSet.new(
|
205
|
+
@results[i] ||= ResultSet.new(@start_time)
|
207
206
|
@results[i].add_result resp
|
208
207
|
|
209
208
|
puts "#{@count} requests" if @count % @div == 0
|
@@ -12,6 +12,7 @@ class Kronk
|
|
12
12
|
attr_accessor :io, :parser, :buffer
|
13
13
|
|
14
14
|
def initialize string_or_io, parser=nil
|
15
|
+
@io_buf = ""
|
15
16
|
@buffer = []
|
16
17
|
@parser = parser || Kronk::Player::RequestParser
|
17
18
|
@io = string_or_io
|
@@ -25,10 +26,10 @@ class Kronk
|
|
25
26
|
def get_next
|
26
27
|
return if eof?
|
27
28
|
|
28
|
-
@buffer <<
|
29
|
+
@buffer << gets if @buffer.empty?
|
29
30
|
|
30
|
-
until @io.eof?
|
31
|
-
line =
|
31
|
+
until @io.eof? && @io_buf.empty?
|
32
|
+
line = gets
|
32
33
|
next unless line
|
33
34
|
|
34
35
|
if @parser.start_new?(line) || @buffer.empty?
|
@@ -44,6 +45,42 @@ class Kronk
|
|
44
45
|
end
|
45
46
|
|
46
47
|
|
48
|
+
##
|
49
|
+
# Read one line from @io, thread-non-blocking.
|
50
|
+
|
51
|
+
def gets
|
52
|
+
return @io.gets if StringIO === @io
|
53
|
+
|
54
|
+
next_line = io_buf_line
|
55
|
+
return next_line if next_line
|
56
|
+
|
57
|
+
until @io.eof?
|
58
|
+
selected, = select [@io], nil, nil, 0.05
|
59
|
+
|
60
|
+
if selected.nil? || selected.empty?
|
61
|
+
Thread.pass
|
62
|
+
next
|
63
|
+
end
|
64
|
+
|
65
|
+
@io_buf << @io.readpartial(1024)
|
66
|
+
|
67
|
+
next_line = io_buf_line
|
68
|
+
return next_line if next_line
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
##
|
74
|
+
# Get the first line of the io buffer.
|
75
|
+
|
76
|
+
def io_buf_line
|
77
|
+
index = @io_buf.index "\n"
|
78
|
+
return unless index
|
79
|
+
|
80
|
+
@io_buf.slice!(0..index)
|
81
|
+
end
|
82
|
+
|
83
|
+
|
47
84
|
##
|
48
85
|
# Returns true if there is no more input to read from.
|
49
86
|
|
@@ -7,15 +7,18 @@ class Kronk
|
|
7
7
|
class Player::RequestParser
|
8
8
|
|
9
9
|
##
|
10
|
-
# Returns true
|
10
|
+
# Returns true if the line given is the start of a new request.
|
11
11
|
|
12
12
|
def self.start_new? line
|
13
13
|
line =~ Request::REQUEST_LINE_MATCHER
|
14
|
+
# Make sure we have a host ($2) or path ($3 || $4) before proceeding.
|
15
|
+
!!($2 || $3 || $4)
|
14
16
|
end
|
15
17
|
|
16
18
|
|
17
19
|
##
|
18
20
|
# Parse a single http request kronk options hash.
|
21
|
+
# See Kronk::Request.parse for more about request parsing.
|
19
22
|
|
20
23
|
def self.parse string
|
21
24
|
Kronk::Request.parse_to_hash string
|
data/lib/kronk/player/stream.rb
CHANGED
@@ -11,11 +11,11 @@ class Kronk
|
|
11
11
|
# io2 = StringIO.new "this is the rest"
|
12
12
|
#
|
13
13
|
# kronk = Kronk.new
|
14
|
-
# kronk.
|
14
|
+
# kronk.request io1
|
15
15
|
# out.result kronk
|
16
16
|
# #=> "23\r\nthis is the first chunk\r\n"
|
17
17
|
#
|
18
|
-
# kronk.
|
18
|
+
# kronk.request io2
|
19
19
|
# out.result kronk
|
20
20
|
# #=> "16\r\nthis is the rest\r\n"
|
21
21
|
#
|
data/lib/kronk/player/suite.rb
CHANGED
@@ -7,7 +7,9 @@ class Kronk
|
|
7
7
|
|
8
8
|
def start
|
9
9
|
@results = []
|
10
|
-
|
10
|
+
msg = "Started"
|
11
|
+
msg << (Player.async ? " (async)" : " (threaded)")
|
12
|
+
$stdout.puts msg
|
11
13
|
super
|
12
14
|
end
|
13
15
|
|
@@ -17,7 +19,7 @@ class Kronk
|
|
17
19
|
|
18
20
|
@results <<
|
19
21
|
if kronk.diff
|
20
|
-
status = "F" if kronk.diff.
|
22
|
+
status = "F" if kronk.diff.any?
|
21
23
|
text = diff_text kronk if status == "F"
|
22
24
|
time =
|
23
25
|
(kronk.responses[0].time.to_f + kronk.responses[1].time.to_f) / 2
|
@@ -27,7 +29,7 @@ class Kronk
|
|
27
29
|
elsif kronk.response
|
28
30
|
begin
|
29
31
|
# Make sure response is parsable
|
30
|
-
kronk.response.
|
32
|
+
kronk.response.parsed_body if kronk.response.parser
|
31
33
|
rescue => e
|
32
34
|
error e, kronk, mutex
|
33
35
|
return
|
@@ -100,7 +102,8 @@ class Kronk
|
|
100
102
|
|
101
103
|
def resp_text kronk
|
102
104
|
<<-STR
|
103
|
-
Request: #{kronk.response.code} - #{kronk.response.
|
105
|
+
Request: #{kronk.response.code} - #{kronk.response.request.http_method} \
|
106
|
+
#{kronk.response.uri}
|
104
107
|
Options: #{kronk.options.inspect}
|
105
108
|
STR
|
106
109
|
end
|
@@ -108,8 +111,12 @@ class Kronk
|
|
108
111
|
|
109
112
|
def diff_text kronk
|
110
113
|
<<-STR
|
111
|
-
Request: #{kronk.responses[0].code} -
|
112
|
-
|
114
|
+
Request: #{kronk.responses[0].code} - \
|
115
|
+
#{kronk.responses[0].request.http_method} \
|
116
|
+
#{kronk.responses[0].uri}
|
117
|
+
#{kronk.responses[1].code} - \
|
118
|
+
#{kronk.responses[0].request.http_method} \
|
119
|
+
#{kronk.responses[1].uri}
|
113
120
|
Options: #{kronk.options.inspect}
|
114
121
|
Diffs: #{kronk.diff.count}
|
115
122
|
STR
|
@@ -117,12 +124,12 @@ class Kronk
|
|
117
124
|
|
118
125
|
|
119
126
|
def error_text err, kronk=nil
|
120
|
-
str = "#{err.class}: #{err.message}"
|
127
|
+
str = " #{err.class}: #{err.message}"
|
121
128
|
|
122
129
|
if kronk
|
123
|
-
str << "\n Options: #{kronk.options.inspect}\n
|
130
|
+
str << "\n Options: #{kronk.options.inspect}\n"
|
124
131
|
else
|
125
|
-
str << "\n #{err.backtrace}\n
|
132
|
+
str << "\n #{err.backtrace}\n"
|
126
133
|
end
|
127
134
|
|
128
135
|
str
|