spectre-core 1.10.0 → 1.12.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76697e95cde1f8359db1f305ba1d15869bd53903d49a0575fa1ee6f2cda7bf98
4
- data.tar.gz: 72562ba547d8f8ff68e880d8f196bd31c7da8f1fd5639231bb56aa838830879a
3
+ metadata.gz: b85338c15a8c29d520ed02d2e6816a64c579b6edd654f3d047fbeddb4a5c0ea3
4
+ data.tar.gz: 7be4646412f7dd3a971b21269215cddff5398cc12a50cd42dcd78a6bb70bf012
5
5
  SHA512:
6
- metadata.gz: e1ce860bd80ee58af11d506ad9e297f9a432a6f71f62b7702574c5dd52af0f6a6de7fa8bd2e35c167e387e063f86f97a77f51e0541399a866133c0a3524b22a9
7
- data.tar.gz: eebfbac67335a7663f407a26094336ee9815a02ebe74789b82254a45ca6539ccc036f289a3eed37cfc581b8e178986f70cbdf5d3c1af49a657ebce4c9ce7246b
6
+ metadata.gz: 043d7b2bda42acf5687f09ce9468c8b3ce01566c5a61d3d1c753b9d61a126898b883f00b67be67d6d61600a85143475e8b041b31fdf42f02dee5aca48260037c
7
+ data.tar.gz: 890154e9fabf2664d50289f5eeb212cd9ea508a967341d9b27a2ad5dd329600542a168352274d4a0ca09dbe9aa91f3bc22e6c855d36a80e1219ccac9132dd047
data/exe/spectre CHANGED
@@ -10,14 +10,6 @@ require 'ectoplasm'
10
10
  require_relative '../lib/spectre'
11
11
 
12
12
 
13
- class ::Hash
14
- def deep_merge!(second)
15
- merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge!(v2, &merger) : v2 }
16
- self.merge!(second, &merger)
17
- end
18
- end
19
-
20
-
21
13
  DEFAULT_CONFIG = {
22
14
  'config_file' => './spectre.yml',
23
15
  'environment' => 'default',
@@ -44,7 +36,7 @@ DEFAULT_CONFIG = {
44
36
  'separator' => '-- <desc>',
45
37
  'start_group' => "-- Start '<desc>'",
46
38
  'end_group' => "-- End '<desc>'",
47
- }
39
+ },
48
40
  },
49
41
  'debug' => false,
50
42
  'out_path' => './reports',
@@ -75,7 +67,7 @@ DEFAULT_CONFIG = {
75
67
  ],
76
68
  'exclude' => [
77
69
 
78
- ]
70
+ ],
79
71
  }
80
72
 
81
73
 
@@ -148,10 +140,9 @@ Specific options:}
148
140
 
149
141
  curr_opt = cmd_options
150
142
  (key.split '.').each do |k|
151
- curr_opt[k] = {} if not curr_opt.key? k
143
+ curr_opt[k] = {} unless curr_opt.key? k
152
144
  end
153
145
  curr_opt = val
154
-
155
146
  end
156
147
 
157
148
  opts.separator "\nCommon options:"
@@ -226,7 +217,7 @@ cfg['env_partial_patterns'].each do |pattern|
226
217
  Dir.glob(pattern).each do|f|
227
218
  partial_env = YAML.load_file(f)
228
219
  name = partial_env.delete('name') || 'default'
229
- next if not envs.key? name
220
+ next unless envs.key? name
230
221
 
231
222
  envs[name].deep_merge! partial_env
232
223
  end
@@ -238,6 +229,10 @@ cfg.merge! env if env
238
229
 
239
230
  String.colored! if cfg['colored']
240
231
 
232
+ # Load environment exlicitly before loading specs to make it available in spec definition
233
+ require_relative '../lib/spectre/environment' unless cfg['exclude'].include? 'spectre/environment'
234
+ Spectre.configure(cfg)
235
+
241
236
 
242
237
  ###########################################
243
238
  # Load Specs
@@ -256,11 +251,11 @@ end
256
251
  ###########################################
257
252
 
258
253
 
259
- if action == 'list'
254
+ if 'list' == action
260
255
  colors = [:blue, :magenta, :yellow, :green]
261
256
  specs = Spectre.specs(cfg['specs'], cfg['tags'])
262
257
 
263
- exit 1 if specs.length == 0
258
+ exit 1 unless specs.any?
264
259
 
265
260
  counter = 0
266
261
 
@@ -285,42 +280,52 @@ end
285
280
  ###########################################
286
281
 
287
282
 
288
- if action == 'run'
283
+ if 'run' == action
289
284
  # Initialize logger
290
285
  now = Time.now
291
286
 
292
- cfg['log_file'] = cfg['log_file'].frmt({
293
- shortdate: now.strftime('%Y-%m-%d'),
294
- date: now.strftime('%Y-%m-%d_%H%M%S'),
295
- timestamp: now.strftime('%s'),
296
- subject: 'spectre',
297
- })
287
+ cfg['log_file'] = cfg['log_file'].frmt(
288
+ {
289
+ shortdate: now.strftime('%Y-%m-%d'),
290
+ date: now.strftime('%Y-%m-%d_%H%M%S'),
291
+ timestamp: now.strftime('%s'),
292
+ subject: 'spectre',
293
+ })
298
294
 
299
295
  log_dir = File.dirname cfg['log_file']
300
- FileUtils.makedirs log_dir if !Dir.exists? log_dir
296
+ FileUtils.makedirs log_dir unless Dir.exists? log_dir
301
297
 
302
298
  # Load Modules
299
+
303
300
  cfg['modules']
304
301
  .concat(cfg['include'])
305
302
  .select { |mod| !cfg['exclude'].include? mod }
306
303
  .each do |mod|
307
- begin
308
- spectre_lib_mod = File.join('../lib', mod)
309
-
310
- if File.exists? mod
311
- require_relative mod
304
+ begin
305
+ mod_file = mod + '.rb'
306
+ spectre_lib_mod = File.join(File.dirname(__dir__), 'lib', mod_file)
312
307
 
313
- elsif File.exists? spectre_lib_mod
314
- require_relative spectre_lib_mod
308
+ if File.exists? mod_file
309
+ require_relative mod_file
315
310
 
316
- else
317
- require mod
318
- end
311
+ elsif File.exists? spectre_lib_mod
312
+ require_relative spectre_lib_mod
319
313
 
320
- rescue LoadError => e
321
- puts "Unable to load module #{mod}. Check if the module exists or remove it from your spectre config:\n#{e.message}"
322
- exit 1
314
+ else
315
+ require mod
323
316
  end
317
+ rescue LoadError => e
318
+ puts "Unable to load module #{mod}. Check if the module exists or remove it from your spectre config:\n#{e.message}"
319
+ exit 1
320
+ end
321
+ end
322
+
323
+ # Load mixins
324
+
325
+ cfg['mixin_patterns'].each do |pattern|
326
+ Dir.glob(pattern).each do|f|
327
+ require_relative File.join(Dir.pwd, f)
328
+ end
324
329
  end
325
330
 
326
331
  Spectre.configure(cfg)
@@ -334,7 +339,7 @@ if action == 'run'
334
339
 
335
340
  specs = Spectre.specs(cfg['specs'], cfg['tags'])
336
341
 
337
- if specs.length == 0
342
+ unless specs.any?
338
343
  puts "No specs found in #{Dir.pwd}"
339
344
  exit 1
340
345
  end
@@ -346,9 +351,9 @@ if action == 'run'
346
351
  reporter.report(run_infos)
347
352
  end
348
353
 
349
- errors = run_infos.select { |x| x.error != nil or x.failure != nil }
354
+ errors = run_infos.select { |x| nil != x.error or nil != x.failure }
350
355
 
351
- exit 0 if cfg['ignore_failure'] or errors.count == 0
356
+ exit 0 if cfg['ignore_failure'] or not errors.any?
352
357
 
353
358
  exit 1
354
359
  end
@@ -359,8 +364,8 @@ end
359
364
  ###########################################
360
365
 
361
366
 
362
- if action == 'envs'
363
- exit 1 if envs.length == 0
367
+ if 'envs' == action
368
+ exit 1 unless envs.any?
364
369
  puts envs.pretty
365
370
  exit 0
366
371
  end
@@ -371,7 +376,7 @@ end
371
376
  ###########################################
372
377
 
373
378
 
374
- if action == 'show'
379
+ if 'show' == action
375
380
  puts cfg.pretty
376
381
  exit 0
377
382
  end
@@ -382,7 +387,7 @@ end
382
387
  ###########################################
383
388
 
384
389
 
385
- if action == 'dump'
390
+ if 'dump' == action
386
391
  puts YAML.dump(cfg)
387
392
  end
388
393
 
@@ -487,7 +492,7 @@ gem 'spectre-core', '>= #{Spectre::VERSION}'
487
492
  # gem 'spectre-git', '>= 0.1.0'
488
493
  ]
489
494
 
490
- if action == 'init'
495
+ if 'init' == action
491
496
  DEFAULT_FILES = [
492
497
  ['./environments/default.env.yml', DEFAULT_ENV_CFG],
493
498
  ['./environments/default.env.secret.yml', DEFAULT_ENV_SECRET_CFG],
@@ -502,10 +507,10 @@ if action == 'init'
502
507
  end
503
508
 
504
509
  DEFAULT_FILES.each do |file, content|
505
- if not File.exists? file
510
+ unless File.exists? file
506
511
  File.write(file, content)
507
512
  end
508
513
  end
509
514
 
510
515
  exit 0
511
- end
516
+ end
@@ -1,3 +1,5 @@
1
+ require_relative '../spectre'
2
+
1
3
  require 'ostruct'
2
4
  require_relative 'logger'
3
5
 
@@ -10,7 +12,7 @@ module Spectre
10
12
  end
11
13
 
12
14
  def should_be_empty
13
- raise AssertionFailure.new("The value '#{self.to_s.trim}' should be empty", nil, self) unless self == nil
15
+ raise AssertionFailure.new("The value '#{self.to_s.trim}' should be empty", nil, self) unless self.nil?
14
16
  end
15
17
 
16
18
  def should_not_be(val)
@@ -22,7 +24,7 @@ module Spectre
22
24
  end
23
25
 
24
26
  def should_not_be_empty
25
- raise AssertionFailure.new('The value should not be empty', 'nothing', self) unless self != nil
27
+ raise AssertionFailure.new('The value is empty', 'nothing', self) unless self != nil
26
28
  end
27
29
 
28
30
  def or other
@@ -34,7 +36,6 @@ module Spectre
34
36
  end
35
37
  end
36
38
 
37
-
38
39
  class ::NilClass
39
40
  def should_be(val)
40
41
  raise AssertionFailure.new("There is nothing, but the value should be '#{val.to_s.trim}'", val, nil) unless val == nil
@@ -51,11 +52,10 @@ module Spectre
51
52
  end
52
53
 
53
54
  def should_not_be_empty
54
- raise AssertionFailure.new('not empty', 'nil')
55
+ raise AssertionFailure.new('The list is empty', 'nil')
55
56
  end
56
57
  end
57
58
 
58
-
59
59
  class ::Hash
60
60
  def should_contain(other)
61
61
  raise AssertionFailure.new(other, self) unless self.merge(other) == self
@@ -64,8 +64,25 @@ module Spectre
64
64
  def should_not_contain(other)
65
65
  raise AssertionFailure.new(other, self) unless self.merge(other) != self
66
66
  end
67
+
68
+ def should_be_empty
69
+ raise AssertionFailure.new('The object should be empty', nil, self) unless self.empty?
70
+ end
71
+
72
+ def should_not_be_empty
73
+ raise AssertionFailure.new('The object should not be empty', nil, self) if self.empty?
74
+ end
67
75
  end
68
76
 
77
+ class ::OpenStruct
78
+ def should_be_empty
79
+ raise AssertionFailure.new('The object should be empty', nil, self) unless self.to_h.empty?
80
+ end
81
+
82
+ def should_not_be_empty
83
+ raise AssertionFailure.new('The object should not be empty', nil, self) if self.to_h.empty?
84
+ end
85
+ end
69
86
 
70
87
  class ::Array
71
88
  def should_contain(val)
@@ -91,15 +108,14 @@ module Spectre
91
108
  end
92
109
 
93
110
  def should_be_empty
94
- raise AssertionFailure.new('empty list', self) unless self.length == 0
111
+ raise AssertionFailure.new('The list is not empty', self) unless self.empty?
95
112
  end
96
113
 
97
114
  def should_not_be_empty
98
- raise AssertionFailure.new('no empty list', self) unless self.length > 0
115
+ raise AssertionFailure.new('The list is empty', self) if self.empty?
99
116
  end
100
117
  end
101
118
 
102
-
103
119
  class ::String
104
120
  def should_be(val)
105
121
  raise AssertionFailure.new("The text '#{self.trim}' should be '#{val.to_s.trim}'", val, self) unless self == val
@@ -118,7 +134,7 @@ module Spectre
118
134
  end
119
135
 
120
136
  def should_contain(value)
121
- raise AssertionFailure.new("`value' must not be nil") if value.nil?
137
+ raise AssertionFailure.new("The value is nil") if value.nil?
122
138
 
123
139
  predicate = proc { |x| self.include? x.to_s }
124
140
  evaluation = SingleEvaluation.new(value)
@@ -145,7 +161,6 @@ module Spectre
145
161
  alias :& :and
146
162
  end
147
163
 
148
-
149
164
  class Evaluation
150
165
  def initialize value, other
151
166
  @value = value
@@ -164,7 +179,6 @@ module Spectre
164
179
  alias :& :and
165
180
  end
166
181
 
167
-
168
182
  class SingleEvaluation < Evaluation
169
183
  def initialize value
170
184
  super(value, nil)
@@ -179,7 +193,6 @@ module Spectre
179
193
  end
180
194
  end
181
195
 
182
-
183
196
  class OrEvaluation < Evaluation
184
197
  def initialize value, other
185
198
  super(value, other)
@@ -194,7 +207,6 @@ module Spectre
194
207
  end
195
208
  end
196
209
 
197
-
198
210
  class AndEvaluation < Evaluation
199
211
  def initialize value, other
200
212
  super(value, other)
@@ -209,7 +221,6 @@ module Spectre
209
221
  end
210
222
  end
211
223
 
212
-
213
224
  class AssertionFailure < ExpectationFailure
214
225
  attr_reader :expected, :actual
215
226
 
@@ -229,14 +240,11 @@ module Spectre
229
240
  Logger.log_process("expect #{desc}")
230
241
  yield
231
242
  Logger.log_status(desc, Logger::Status::OK)
232
-
233
243
  rescue Interrupt => e
234
244
  raise e
235
-
236
245
  rescue AssertionFailure => e
237
246
  Logger.log_status(desc, Logger::Status::FAILED)
238
247
  raise AssertionFailure.new(e.message, e.expected, e.actual, desc), cause: nil
239
-
240
248
  rescue Exception => e
241
249
  Logger.log_status(desc, Logger::Status::ERROR)
242
250
  raise AssertionFailure.new("An unexpected error occured during expectation: #{e.message}", nil, nil, desc), cause: e
@@ -244,15 +252,21 @@ module Spectre
244
252
  end
245
253
 
246
254
  def observe desc = nil
255
+ prefix = 'observing'
256
+ prefix += " '#{desc}'" if desc
257
+
247
258
  begin
248
- Logger.log_info("observing #{desc}") if desc
259
+ Logger.log_info(prefix) if desc
249
260
  yield
250
261
  @@success = true
251
-
262
+ @@logger.info("#{prefix} finished with success")
252
263
  rescue Interrupt => e
253
264
  raise e
254
-
255
265
  rescue Exception => e
266
+ error_message = "#{prefix} finished with failure: #{e.message}"
267
+ error_message += "\n" + e.backtrace.join("\n") if @@debug
268
+
269
+ @@logger.info(error_message)
256
270
  @@success = false
257
271
  end
258
272
  end
@@ -266,6 +280,11 @@ module Spectre
266
280
  end
267
281
  end
268
282
 
283
+ Spectre.register do |config|
284
+ @@logger = ::Logger.new(config['log_file'], progname: 'spectre/assertion')
285
+ @@debug = config['debug']
286
+ end
287
+
269
288
  Spectre.delegate :expect, :observe, :success?, :fail_with, to: self
270
289
  end
271
290
  end
data/lib/spectre/bag.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require_relative '../spectre'
2
+
1
3
  require 'ostruct'
2
4
 
3
5
  module Spectre
@@ -14,6 +16,6 @@ module Spectre
14
16
  @@bag = OpenStruct.new
15
17
  end
16
18
 
17
- Spectre.delegate :bag, to: Bag
19
+ Spectre.delegate :bag, to: self
18
20
  end
19
- end
21
+ end
data/lib/spectre/curl.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require_relative '../spectre'
2
+
1
3
  require 'open3'
2
4
  require 'ostruct'
3
5
 
@@ -21,17 +23,17 @@ module Spectre::Curl
21
23
  end
22
24
 
23
25
  def header name, value
24
- @__req['headers'] = [] if not @__req['headers']
26
+ @__req['headers'] = [] unless @__req['headers']
25
27
  @__req['headers'].append [name, value.to_s.strip]
26
28
  end
27
29
 
28
30
  def param name, value
29
- @__req['query'] = [] if not @__req['query']
31
+ @__req['query'] = [] unless @__req['query']
30
32
  @__req['query'].append [name, value.to_s.strip]
31
33
  end
32
34
 
33
35
  def content_type media_type
34
- @__req['headers'] = [] if not @__req['headers']
36
+ @__req['headers'] = [] unless @__req['headers']
35
37
  @__req['headers'].append ['Content-Type', media_type]
36
38
  end
37
39
 
@@ -111,7 +113,7 @@ module Spectre::Curl
111
113
  end
112
114
 
113
115
  def json
114
- return nil if not @res[:body]
116
+ return nil unless @res[:body]
115
117
 
116
118
  if @data == nil
117
119
  begin
@@ -161,28 +163,31 @@ module Spectre::Curl
161
163
 
162
164
  if @@http_cfg.key? name
163
165
  req.merge! @@http_cfg[name]
164
- raise "No `base_url' set for HTTP client '#{name}'. Check your HTTP config in your environment." if !req['base_url']
166
+ raise "No `base_url' set for HTTP client '#{name}'. Check your HTTP config in your environment." unless req['base_url']
165
167
  else
166
168
  req['base_url'] = name
167
169
  end
168
170
 
169
- SpectreHttpRequest.new(req).instance_eval(&block) if block_given?
171
+ SpectreHttpRequest.new(req)._evaluate(&block) if block_given?
170
172
 
171
173
  invoke(req)
172
174
  end
173
175
 
174
176
  def curl_request
175
177
  raise 'No request has been invoked yet' unless @@request
178
+
176
179
  @@request
177
180
  end
178
181
 
179
182
  def curl_response
180
183
  raise 'There is no response. No request has been invoked yet.' unless @@response
184
+
181
185
  @@response
182
186
  end
183
187
 
184
188
  def register mod
185
189
  raise 'Module must not be nil' unless mod
190
+
186
191
  @@modules << mod
187
192
  end
188
193
 
@@ -192,7 +197,8 @@ module Spectre::Curl
192
197
  return str unless str or str.empty?
193
198
 
194
199
  begin
195
- json = JSON.parse str
200
+ json = JSON.parse(str)
201
+ json.obfuscate!(@@secure_keys) unless @@debug
196
202
 
197
203
  if pretty
198
204
  str = JSON.pretty_generate(json)
@@ -206,6 +212,25 @@ module Spectre::Curl
206
212
  str
207
213
  end
208
214
 
215
+ def secure? key
216
+ @@secure_keys.any? { |x| key.to_s.downcase.include? x.downcase }
217
+ end
218
+
219
+ def header_to_s headers
220
+ s = ''
221
+
222
+ return s unless headers
223
+
224
+ headers.each do |header|
225
+ key = header[0].to_s
226
+ value = header[1].to_s
227
+ value = '*****' if secure?(key) and not @@debug
228
+ s += "#{key.ljust(30, '.')}: #{value}\n"
229
+ end
230
+
231
+ s
232
+ end
233
+
209
234
  def invoke req
210
235
  cmd = [@@curl_path]
211
236
 
@@ -217,12 +242,12 @@ module Spectre::Curl
217
242
 
218
243
  uri = req['base_url']
219
244
 
220
- if not uri.match /http(?:s)?:\/\//
245
+ unless uri.match /http(?:s)?:\/\//
221
246
  uri = scheme + '://' + uri
222
247
  end
223
248
 
224
249
  if req['path']
225
- uri += '/' if !uri.end_with? '/'
250
+ uri += '/' unless uri.end_with? '/'
226
251
  uri += req['path']
227
252
  end
228
253
 
@@ -230,11 +255,11 @@ module Spectre::Curl
230
255
  uri += '?'
231
256
  uri += req['query']
232
257
  .map { |x| x.join '='}
233
- .join '&'
258
+ .join('&')
234
259
  end
235
260
 
236
- cmd.append '"' + uri + '"'
237
- cmd.append '-X', req['method'] unless req['method'] == 'GET' or (req['body'] and req['method'] == 'POST')
261
+ cmd.append('"' + uri + '"')
262
+ cmd.append('-X', req['method']) unless req['method'] == 'GET' or (req['body'] and req['method'] == 'POST')
238
263
 
239
264
  # Call all registered modules
240
265
  @@modules.each do |mod|
@@ -243,43 +268,42 @@ module Spectre::Curl
243
268
 
244
269
  # Add headers to curl command
245
270
  req['headers'].each do |header|
246
- cmd.append '-H', '"' + header.join(':') + '"'
271
+ cmd.append('-H', '"' + header.join(':') + '"')
247
272
  end if req['headers']
248
273
 
249
274
  # Add request body
250
275
  if req['body'] != nil and not req['body'].empty?
251
276
  req_body = try_format_json(req['body']).gsub(/"/, '\\"')
252
- cmd.append '-d', '"' + req_body + '"'
277
+ cmd.append('-d', '"' + req_body + '"')
253
278
  elsif ['POST', 'PUT', 'PATCH'].include? req['method'].upcase
254
- cmd.append '-d', '"\n"'
279
+ cmd.append('-d', '"\n"')
255
280
  end
256
281
 
257
282
  # Add certificate path if one if given
258
283
  if req['cert']
259
284
  raise "Certificate '#{req['cert']}' does not exist" unless File.exists? req['cert']
260
- cmd.append '--cacert', req['cert']
285
+
286
+ cmd.append('--cacert', req['cert'])
261
287
  elsif req['use_ssl'] or uri.start_with? 'https'
262
- cmd.append '-k'
288
+ cmd.append('-k')
263
289
  end
264
290
 
265
- cmd.append '-i'
266
- cmd.append '-v'
291
+ cmd.append('-i')
292
+ cmd.append('-v')
267
293
 
268
- @@request = OpenStruct.new req
294
+ @@request = OpenStruct.new(req)
269
295
 
270
- sys_cmd = cmd.join ' '
296
+ sys_cmd = cmd.join(' ')
271
297
 
272
- @@logger.debug sys_cmd
298
+ @@logger.debug(sys_cmd)
273
299
 
274
300
  req_id = SecureRandom.uuid()[0..5]
275
301
 
276
302
  req_log = "[>] #{req_id} #{req['method']} #{uri}\n"
277
- req['headers'].each do |header|
278
- req_log += "#{header[0].to_s.ljust(30, '.')}: #{header[1].to_s}\n"
279
- end if req['headers']
280
- req_log += req['body'] if req['body'] != nil and not req['body'].empty?
303
+ req_log += header_to_s(req['headers'])
304
+ req_log += try_format_json(req['body'], pretty: true)
281
305
 
282
- @@logger.info req_log
306
+ @@logger.info(req_log)
283
307
 
284
308
  start_time = Time.now
285
309
 
@@ -295,9 +319,9 @@ module Spectre::Curl
295
319
 
296
320
  # debug_log.lines.each { |x| @@logger.debug x unless x.empty? }
297
321
 
298
- raise "Unable to request #{uri}. Please check if this service is reachable." unless output
322
+ raise "Unable to request #{uri}. Please check if this URL is correctly configured and reachable." unless output
299
323
 
300
- @@logger.debug "[<] #{req_id} stdout:\n#{output}"
324
+ @@logger.debug("[<] #{req_id} stdout:\n#{output}")
301
325
 
302
326
  header, body = output.split /\r?\n\r?\n/
303
327
 
@@ -323,7 +347,7 @@ module Spectre::Curl
323
347
  code: match[:code].to_i,
324
348
  message: match[:message],
325
349
  headers: Hash[res_headers],
326
- body: body
350
+ body: body,
327
351
  }
328
352
 
329
353
  # Call all registered modules
@@ -342,7 +366,7 @@ module Spectre::Curl
342
366
 
343
367
  @@logger.info res_log
344
368
 
345
- @@response = SpectreHttpResponse.new res
369
+ @@response = SpectreHttpResponse.new(res)
346
370
 
347
371
  raise "Response did not indicate success: #{@@response.code} #{@@response.message}" if req['ensure_success'] and not @@response.success?
348
372
 
@@ -351,7 +375,12 @@ module Spectre::Curl
351
375
  end
352
376
 
353
377
  Spectre.register do |config|
354
- @@logger = ::Logger.new config['log_file'], progname: 'spectre/curl'
378
+ @@debug = config['debug']
379
+
380
+ @@logger = ::Logger.new(config['log_file'], progname: 'spectre/curl')
381
+ @@logger.level = @@debug ? Logger::DEBUG : Logger::INFO
382
+
383
+ @@secure_keys = config['secure_keys'] || []
355
384
 
356
385
  @@curl_path = config['curl_path'] || 'curl'
357
386
 
@@ -365,4 +394,4 @@ module Spectre::Curl
365
394
  end
366
395
 
367
396
  Spectre.delegate :curl, :curl_response, :curl_request, to: self
368
- end
397
+ end
@@ -1,3 +1,5 @@
1
+ require_relative '../spectre'
2
+
1
3
  module Spectre
2
4
  module Diagnostic
3
5
  module Stopwatch
@@ -21,9 +23,17 @@ module Spectre
21
23
  def duration
22
24
  @@end_time - @@start_time
23
25
  end
26
+
27
+ def started_at
28
+ @@start_time
29
+ end
30
+
31
+ def finished_at
32
+ @@end_time
33
+ end
24
34
  end
25
35
 
26
- Spectre.delegate :start_watch, :stop_watch, :duration, :measure, to: Stopwatch
36
+ Spectre.delegate :start_watch, :stop_watch, :duration, :measure, to: self
27
37
  end
28
38
  end
29
- end
39
+ end