spectre-core 1.12.2 → 1.13.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/exe/spectre +77 -36
- data/lib/spectre/assertion.rb +39 -39
- data/lib/spectre/async.rb +31 -0
- data/lib/spectre/bag.rb +1 -1
- data/lib/spectre/curl.rb +9 -8
- data/lib/spectre/helpers.rb +4 -0
- data/lib/spectre/http/keystone.rb +0 -2
- data/lib/spectre/http.rb +25 -6
- data/lib/spectre/logger/console.rb +9 -3
- data/lib/spectre/logger/file.rb +26 -20
- data/lib/spectre/logger.rb +39 -12
- data/lib/spectre/mixin.rb +3 -3
- data/lib/spectre/reporter/console.rb +20 -23
- data/lib/spectre/reporter/html.rb +1167 -0
- data/lib/spectre/reporter/junit.rb +26 -21
- data/lib/spectre/reporter/vstest.rb +167 -0
- data/lib/spectre.rb +88 -58
- data/resources/OpenSans-Regular.ttf +0 -0
- data/resources/fa-regular-400.ttf +0 -0
- data/resources/fa-solid-900.ttf +0 -0
- data/resources/spectre_icon.svg +106 -0
- data/resources/vue.global.prod.js +1 -0
- metadata +17 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd2c5dd03f2ded27246d351696a749bf0f0fbb06ff87ecc27363873202ecb1ac
|
4
|
+
data.tar.gz: a17d75c2581c6f64f58664b78c68449936610f8fa9c6c313dc73011da59094c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 941692c923f0437410ad99376a1df249c81dd970c527445e9a4e3721554e35e2f6d10cca4f23293894df212f7bd5dc4b36ab1610b3351919a88dc9a6fdd8cd18
|
7
|
+
data.tar.gz: 7245b35708dc29ee1c0d2ec60ec10cbd39125f7302aa3e84962037e2e30824793290b59f70c51e8a7892d79780747697f8635c90b48e3ba4d2276015538bb8b3
|
data/exe/spectre
CHANGED
@@ -9,8 +9,14 @@ require 'ectoplasm'
|
|
9
9
|
|
10
10
|
require_relative '../lib/spectre'
|
11
11
|
|
12
|
+
def load_yaml file_path
|
13
|
+
yaml = File.read(file_path)
|
14
|
+
YAML.safe_load(yaml, aliases: true)
|
15
|
+
end
|
16
|
+
|
12
17
|
|
13
18
|
DEFAULT_CONFIG = {
|
19
|
+
'project' => nil,
|
14
20
|
'config_file' => './spectre.yml',
|
15
21
|
'environment' => 'default',
|
16
22
|
'specs' => [],
|
@@ -21,8 +27,8 @@ DEFAULT_CONFIG = {
|
|
21
27
|
'Spectre::Reporter::Console',
|
22
28
|
],
|
23
29
|
'loggers' => [
|
24
|
-
'Spectre::
|
25
|
-
'Spectre::
|
30
|
+
'Spectre::Logging::Console',
|
31
|
+
'Spectre::Logging::File',
|
26
32
|
],
|
27
33
|
'log_file' => './logs/spectre_<date>.log',
|
28
34
|
'log_format' => {
|
@@ -50,6 +56,8 @@ DEFAULT_CONFIG = {
|
|
50
56
|
'spectre/helpers',
|
51
57
|
'spectre/reporter/console',
|
52
58
|
'spectre/reporter/junit',
|
59
|
+
'spectre/reporter/vstest',
|
60
|
+
'spectre/reporter/html',
|
53
61
|
'spectre/logger/console',
|
54
62
|
'spectre/logger/file',
|
55
63
|
'spectre/assertion',
|
@@ -61,6 +69,7 @@ DEFAULT_CONFIG = {
|
|
61
69
|
'spectre/http/basic_auth',
|
62
70
|
'spectre/http/keystone',
|
63
71
|
'spectre/resources',
|
72
|
+
'spectre/async',
|
64
73
|
],
|
65
74
|
'include' => [
|
66
75
|
|
@@ -72,20 +81,24 @@ DEFAULT_CONFIG = {
|
|
72
81
|
|
73
82
|
|
74
83
|
cmd_options = {}
|
84
|
+
property_overrides = {}
|
85
|
+
|
86
|
+
$COMMAND = ['spectre'].concat(ARGV.clone).join(' ')
|
75
87
|
|
76
|
-
|
88
|
+
OptionParser.new do |opts|
|
77
89
|
opts.banner = %{Spectre #{Spectre::VERSION}
|
78
90
|
|
79
|
-
Usage: spectre [command] [options]
|
91
|
+
Usage: spectre [command] [options]
|
80
92
|
|
81
|
-
Commands:
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
93
|
+
Commands:
|
94
|
+
list List specs
|
95
|
+
run Run specs (default)
|
96
|
+
show Print current environment settings
|
97
|
+
dump Dumps the given environment in YAML format to console
|
98
|
+
cleanup Will remove all generated files (e.g. logs and reports)
|
99
|
+
init Initializes a new spectre project
|
87
100
|
|
88
|
-
Specific options:}
|
101
|
+
Specific options:}
|
89
102
|
|
90
103
|
opts.on('-s SPEC,SPEC', '--specs SPEC,SPEC', Array, 'The specs to run') do |specs|
|
91
104
|
cmd_options['specs'] = specs
|
@@ -132,17 +145,24 @@ Specific options:}
|
|
132
145
|
end
|
133
146
|
|
134
147
|
opts.on('-p KEY=VAL', '--property KEY=VAL', "Override config option. Use `spectre show` to get list of available options") do |option|
|
135
|
-
key, val = option.split
|
136
|
-
val = val.split
|
137
|
-
val = ['true', '1'].include? val if [true, false].include?
|
148
|
+
key, val = option.split('=')
|
149
|
+
val = val.split(',') if DEFAULT_CONFIG[key].is_a? Array
|
150
|
+
val = ['true', '1'].include? val if [true, false].include?(DEFAULT_CONFIG[key])
|
138
151
|
val = val.to_i if DEFAULT_CONFIG[key].is_a? Integer
|
139
|
-
cmd_options[key] = val
|
140
152
|
|
141
|
-
|
142
|
-
|
143
|
-
|
153
|
+
opt_path = key.split('.')
|
154
|
+
|
155
|
+
curr_opt = property_overrides
|
156
|
+
|
157
|
+
opt_path.each_with_index do |part, i|
|
158
|
+
if i == opt_path.count-1
|
159
|
+
curr_opt[part] = val
|
160
|
+
break
|
161
|
+
end
|
162
|
+
|
163
|
+
curr_opt[part] = {} unless curr_opt.key?(part)
|
164
|
+
curr_opt = curr_opt[part]
|
144
165
|
end
|
145
|
-
curr_opt = val
|
146
166
|
end
|
147
167
|
|
148
168
|
opts.separator "\nCommon options:"
|
@@ -173,20 +193,21 @@ cfg.deep_merge! DEFAULT_CONFIG
|
|
173
193
|
global_config_file = File.join File.expand_path('~'), '.spectre'
|
174
194
|
|
175
195
|
if File.exists? global_config_file
|
176
|
-
global_options =
|
196
|
+
global_options = load_yaml(global_config_file)
|
177
197
|
cfg.deep_merge! global_options if global_options
|
178
198
|
end
|
179
199
|
|
180
200
|
config_file = cmd_options['config_file'] || cfg['config_file']
|
181
201
|
|
182
202
|
if File.exists? config_file
|
183
|
-
file_options =
|
203
|
+
file_options = load_yaml(config_file)
|
184
204
|
cfg.deep_merge! file_options
|
185
205
|
Dir.chdir File.dirname(config_file)
|
186
206
|
end
|
187
207
|
|
188
|
-
cfg.
|
208
|
+
cfg['project'] = File.basename(Dir.pwd) unless cfg['project']
|
189
209
|
|
210
|
+
cfg.deep_merge! cmd_options
|
190
211
|
|
191
212
|
###########################################
|
192
213
|
# Load Environment
|
@@ -197,7 +218,7 @@ envs = {}
|
|
197
218
|
read_env_files = {}
|
198
219
|
cfg['env_patterns'].each do |pattern|
|
199
220
|
Dir.glob(pattern).each do|f|
|
200
|
-
spec_env =
|
221
|
+
spec_env = load_yaml(f) || {}
|
201
222
|
|
202
223
|
name = spec_env['name'] || 'default'
|
203
224
|
|
@@ -215,7 +236,7 @@ end
|
|
215
236
|
# Merge partial environment configs with existing environments
|
216
237
|
cfg['env_partial_patterns'].each do |pattern|
|
217
238
|
Dir.glob(pattern).each do|f|
|
218
|
-
partial_env =
|
239
|
+
partial_env = load_yaml(f)
|
219
240
|
name = partial_env.delete('name') || 'default'
|
220
241
|
next unless envs.key? name
|
221
242
|
|
@@ -224,7 +245,10 @@ cfg['env_partial_patterns'].each do |pattern|
|
|
224
245
|
end
|
225
246
|
|
226
247
|
env = envs[cfg['environment']]
|
227
|
-
cfg.
|
248
|
+
cfg.deep_merge! env if env
|
249
|
+
|
250
|
+
# Merge property overrides after environment load to give it higher priority
|
251
|
+
cfg.deep_merge! property_overrides
|
228
252
|
|
229
253
|
|
230
254
|
String.colored! if cfg['colored']
|
@@ -284,16 +308,15 @@ if 'run' == action
|
|
284
308
|
# Initialize logger
|
285
309
|
now = Time.now
|
286
310
|
|
287
|
-
cfg['log_file'] = cfg['log_file'].frmt(
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
})
|
311
|
+
cfg['log_file'] = cfg['log_file'].frmt({
|
312
|
+
shortdate: now.strftime('%Y-%m-%d'),
|
313
|
+
date: now.strftime('%Y-%m-%d_%H%M%S'),
|
314
|
+
timestamp: now.strftime('%s'),
|
315
|
+
subject: 'spectre',
|
316
|
+
})
|
294
317
|
|
295
|
-
log_dir = File.dirname
|
296
|
-
FileUtils.makedirs
|
318
|
+
log_dir = File.dirname(cfg['log_file'])
|
319
|
+
FileUtils.makedirs(log_dir)
|
297
320
|
|
298
321
|
# Load Modules
|
299
322
|
|
@@ -330,11 +353,11 @@ if 'run' == action
|
|
330
353
|
|
331
354
|
Spectre.configure(cfg)
|
332
355
|
|
333
|
-
Spectre::
|
356
|
+
Spectre::Logging.debug! if cfg['debug']
|
334
357
|
|
335
358
|
cfg['loggers'].each do |logger_name|
|
336
359
|
logger = Kernel.const_get(logger_name).new(cfg)
|
337
|
-
Spectre::
|
360
|
+
Spectre::Logging.add(logger)
|
338
361
|
end if cfg['loggers']
|
339
362
|
|
340
363
|
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
@@ -392,6 +415,24 @@ if 'dump' == action
|
|
392
415
|
end
|
393
416
|
|
394
417
|
|
418
|
+
###########################################
|
419
|
+
# Cleanup
|
420
|
+
###########################################
|
421
|
+
|
422
|
+
|
423
|
+
if 'cleanup' == action
|
424
|
+
log_file_pattern = cfg['log_file'].gsub('<date>', '*')
|
425
|
+
|
426
|
+
Dir.glob(log_file_pattern).each do |log_file|
|
427
|
+
File.delete(log_file)
|
428
|
+
end
|
429
|
+
|
430
|
+
Dir.glob(File.join cfg['out_path'], '/*').each do |out_file|
|
431
|
+
File.delete(out_file)
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
|
395
436
|
###########################################
|
396
437
|
# Init
|
397
438
|
###########################################
|
data/lib/spectre/assertion.rb
CHANGED
@@ -8,23 +8,23 @@ module Spectre
|
|
8
8
|
module Assertion
|
9
9
|
class ::Object
|
10
10
|
def should_be(val)
|
11
|
-
raise AssertionFailure.new("
|
11
|
+
raise AssertionFailure.new("'#{self.to_s.trim}' should be '#{val.to_s.trim}'", val, self) unless self.to_s == val.to_s
|
12
12
|
end
|
13
13
|
|
14
14
|
def should_be_empty
|
15
|
-
raise AssertionFailure.new("
|
15
|
+
raise AssertionFailure.new("'#{self.to_s.trim}' should be empty", nil, self) unless self.nil?
|
16
16
|
end
|
17
17
|
|
18
18
|
def should_not_be(val)
|
19
|
-
raise AssertionFailure.new("
|
19
|
+
raise AssertionFailure.new("'#{self.to_s.trim}' should not be '#{val.to_s.trim}'", val, self) unless self.to_s != val.to_s
|
20
20
|
end
|
21
21
|
|
22
22
|
def should_not_exist
|
23
|
-
raise AssertionFailure.new("
|
23
|
+
raise AssertionFailure.new("'#{self.to_s.trim}' should not exist, but it does", val, self) unless self.to_s != nil
|
24
24
|
end
|
25
25
|
|
26
26
|
def should_not_be_empty
|
27
|
-
raise AssertionFailure.new('
|
27
|
+
raise AssertionFailure.new('empty value', 'nothing', self) unless self != nil
|
28
28
|
end
|
29
29
|
|
30
30
|
def or other
|
@@ -38,7 +38,7 @@ module Spectre
|
|
38
38
|
|
39
39
|
class ::NilClass
|
40
40
|
def should_be(val)
|
41
|
-
raise AssertionFailure.new("
|
41
|
+
raise AssertionFailure.new("Value is empty, but it should be '#{val.to_s.trim}'", val, nil) unless val == nil
|
42
42
|
end
|
43
43
|
|
44
44
|
def should_be_empty
|
@@ -52,7 +52,7 @@ module Spectre
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def should_not_be_empty
|
55
|
-
raise AssertionFailure.new('
|
55
|
+
raise AssertionFailure.new('Value is empty', 'nil')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -66,21 +66,21 @@ module Spectre
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def should_be_empty
|
69
|
-
raise AssertionFailure.new('
|
69
|
+
raise AssertionFailure.new('Object should be empty', nil, self) unless self.empty?
|
70
70
|
end
|
71
71
|
|
72
72
|
def should_not_be_empty
|
73
|
-
raise AssertionFailure.new('
|
73
|
+
raise AssertionFailure.new('Object should not be empty', nil, self) if self.empty?
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
class ::OpenStruct
|
78
78
|
def should_be_empty
|
79
|
-
raise AssertionFailure.new('
|
79
|
+
raise AssertionFailure.new('Object should be empty', nil, self) unless self.to_h.empty?
|
80
80
|
end
|
81
81
|
|
82
82
|
def should_not_be_empty
|
83
|
-
raise AssertionFailure.new('
|
83
|
+
raise AssertionFailure.new('Object should not be empty', nil, self) if self.to_h.empty?
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -93,7 +93,7 @@ module Spectre
|
|
93
93
|
val = OpenStruct.new(val)
|
94
94
|
end
|
95
95
|
|
96
|
-
raise AssertionFailure.new("
|
96
|
+
raise AssertionFailure.new("[#{list.join(', ').trim}] should contain '#{val.to_s.trim}'", val, list) unless list.include? val
|
97
97
|
end
|
98
98
|
|
99
99
|
def should_not_contain(val)
|
@@ -104,37 +104,37 @@ module Spectre
|
|
104
104
|
val = OpenStruct.new(val)
|
105
105
|
end
|
106
106
|
|
107
|
-
raise AssertionFailure.new("
|
107
|
+
raise AssertionFailure.new("[#{list.join(', ').trim}] should not contain '#{val.to_s.trim}'", val, list) if list.include? val
|
108
108
|
end
|
109
109
|
|
110
110
|
def should_be_empty
|
111
|
-
raise AssertionFailure.new('
|
111
|
+
raise AssertionFailure.new('List is not empty', self) unless self.empty?
|
112
112
|
end
|
113
113
|
|
114
114
|
def should_not_be_empty
|
115
|
-
raise AssertionFailure.new('
|
115
|
+
raise AssertionFailure.new('List is empty', self) if self.empty?
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
119
|
class ::String
|
120
120
|
def should_be(val)
|
121
|
-
raise AssertionFailure.new("
|
121
|
+
raise AssertionFailure.new("'#{self.trim}' should be '#{val.to_s.trim}'", val, self) unless self == val
|
122
122
|
end
|
123
123
|
|
124
124
|
def should_be_empty
|
125
|
-
raise AssertionFailure.new("
|
125
|
+
raise AssertionFailure.new("'#{self.trim}' should be empty", nil, self) unless self.empty?
|
126
126
|
end
|
127
127
|
|
128
128
|
def should_not_be(val)
|
129
|
-
raise AssertionFailure.new("
|
129
|
+
raise AssertionFailure.new("'#{self.trim}' should not be '#{val.to_s.trim}'", val, self) unless self != val
|
130
130
|
end
|
131
131
|
|
132
132
|
def should_not_be_empty
|
133
|
-
raise AssertionFailure.new('
|
133
|
+
raise AssertionFailure.new('Text should not be empty', 'nothing', self) unless not self.empty?
|
134
134
|
end
|
135
135
|
|
136
136
|
def should_contain(value)
|
137
|
-
raise AssertionFailure.new("
|
137
|
+
raise AssertionFailure.new("Value is nil") if value.nil?
|
138
138
|
|
139
139
|
predicate = proc { |x| self.include? x.to_s }
|
140
140
|
evaluation = SingleEvaluation.new(value)
|
@@ -142,19 +142,19 @@ module Spectre
|
|
142
142
|
|
143
143
|
return if success
|
144
144
|
|
145
|
-
raise AssertionFailure.new("
|
145
|
+
raise AssertionFailure.new("'#{self.to_s.trim}' should contain #{evaluation.to_s}", evaluation, self)
|
146
146
|
end
|
147
147
|
|
148
148
|
def should_not_contain(val)
|
149
|
-
raise AssertionFailure.new("
|
149
|
+
raise AssertionFailure.new("'#{self.trim}' should not contain '#{val.trim}'", val, self) if self.include? val
|
150
150
|
end
|
151
151
|
|
152
152
|
def should_match(regex)
|
153
|
-
raise AssertionFailure.new("
|
153
|
+
raise AssertionFailure.new("'#{self.trim}' should match '#{val}'", regex, self) unless self.match(regex)
|
154
154
|
end
|
155
155
|
|
156
156
|
def should_not_match(regex)
|
157
|
-
raise AssertionFailure.new("
|
157
|
+
raise AssertionFailure.new("'#{self.trim}' should not match '#{val}'", regex, self) if self.match(regex)
|
158
158
|
end
|
159
159
|
|
160
160
|
alias :| :or
|
@@ -194,10 +194,6 @@ module Spectre
|
|
194
194
|
end
|
195
195
|
|
196
196
|
class OrEvaluation < Evaluation
|
197
|
-
def initialize value, other
|
198
|
-
super(value, other)
|
199
|
-
end
|
200
|
-
|
201
197
|
def call predicate
|
202
198
|
eval_assertion(predicate, @value) or eval_assertion(predicate, @other)
|
203
199
|
end
|
@@ -208,10 +204,6 @@ module Spectre
|
|
208
204
|
end
|
209
205
|
|
210
206
|
class AndEvaluation < Evaluation
|
211
|
-
def initialize value, other
|
212
|
-
super(value, other)
|
213
|
-
end
|
214
|
-
|
215
207
|
def call predicate
|
216
208
|
eval_assertion(predicate, @value) and eval_assertion(predicate, @other)
|
217
209
|
end
|
@@ -236,18 +228,26 @@ module Spectre
|
|
236
228
|
@@success = nil
|
237
229
|
|
238
230
|
def expect desc
|
231
|
+
status = 'unknown'
|
232
|
+
|
239
233
|
begin
|
240
|
-
|
234
|
+
Logging.log_process("expect #{desc}")
|
241
235
|
yield
|
242
|
-
|
236
|
+
Logging.log_status(desc, Logging::Status::OK)
|
237
|
+
status = 'ok'
|
243
238
|
rescue Interrupt => e
|
239
|
+
status = 'skipped'
|
244
240
|
raise e
|
245
241
|
rescue AssertionFailure => e
|
246
|
-
|
242
|
+
Logging.log_status(desc, Logging::Status::FAILED)
|
243
|
+
status = 'failed'
|
247
244
|
raise AssertionFailure.new(e.message, e.expected, e.actual, desc), cause: nil
|
248
245
|
rescue Exception => e
|
249
|
-
|
250
|
-
|
246
|
+
Logging.log_status(desc, Logging::Status::ERROR)
|
247
|
+
status = 'error'
|
248
|
+
raise AssertionFailure.new("An unexpected error occurred during expectation: #{e.message}", nil, nil, desc), cause: e
|
249
|
+
ensure
|
250
|
+
Spectre::Runner.current.expectations.append([desc, status])
|
251
251
|
end
|
252
252
|
end
|
253
253
|
|
@@ -256,7 +256,7 @@ module Spectre
|
|
256
256
|
prefix += " '#{desc}'" if desc
|
257
257
|
|
258
258
|
begin
|
259
|
-
|
259
|
+
Logging.log_info(prefix) if desc
|
260
260
|
yield
|
261
261
|
@@success = true
|
262
262
|
@@logger.info("#{prefix} finished with success")
|
@@ -281,7 +281,7 @@ module Spectre
|
|
281
281
|
end
|
282
282
|
|
283
283
|
Spectre.register do |config|
|
284
|
-
@@logger = ::
|
284
|
+
@@logger = Spectre::Logging::ModuleLogger.new(config, 'spectre/assertion')
|
285
285
|
@@debug = config['debug']
|
286
286
|
end
|
287
287
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../spectre'
|
2
|
+
|
3
|
+
Thread.abort_on_exception = true
|
4
|
+
|
5
|
+
module Spectre
|
6
|
+
module Async
|
7
|
+
class << self
|
8
|
+
@@threads = {}
|
9
|
+
|
10
|
+
def async name='default', &block
|
11
|
+
unless @@threads.key? name
|
12
|
+
@@threads[name] = []
|
13
|
+
end
|
14
|
+
|
15
|
+
@@threads[name] << Thread.new(&block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def await name='default'
|
19
|
+
return unless @@threads.key? name
|
20
|
+
|
21
|
+
threads = @@threads[name].map { |x| x.join() }
|
22
|
+
|
23
|
+
@@threads.delete(name)
|
24
|
+
|
25
|
+
threads.map { |x| x.value }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Spectre.delegate :async, :await, to: self
|
30
|
+
end
|
31
|
+
end
|
data/lib/spectre/bag.rb
CHANGED
data/lib/spectre/curl.rb
CHANGED
@@ -301,13 +301,16 @@ module Spectre::Curl
|
|
301
301
|
|
302
302
|
req_log = "[>] #{req_id} #{req['method']} #{uri}\n"
|
303
303
|
req_log += header_to_s(req['headers'])
|
304
|
-
|
304
|
+
|
305
|
+
if req[:body] != nil and not req[:body].empty?
|
306
|
+
req_log += try_format_json(req['body'], pretty: true)
|
307
|
+
end
|
305
308
|
|
306
309
|
@@logger.info(req_log)
|
307
310
|
|
308
311
|
start_time = Time.now
|
309
312
|
|
310
|
-
|
313
|
+
_, stdout, stderr, wait_thr = Open3.popen3(sys_cmd)
|
311
314
|
|
312
315
|
end_time = Time.now
|
313
316
|
|
@@ -329,7 +332,7 @@ module Spectre::Curl
|
|
329
332
|
|
330
333
|
exit_code = wait_thr.value.exitstatus
|
331
334
|
|
332
|
-
raise Exception.new "An error
|
335
|
+
raise Exception.new "An error occurred while executing curl:\n#{debug_log.lines.map { |x| not x.empty? }}" unless exit_code == 0
|
333
336
|
|
334
337
|
# Parse protocol, version, status code and status message from response
|
335
338
|
match = /^(?<protocol>[A-Za-z0-9]+)\/(?<version>\d+\.?\d*) (?<code>\d+) (?<message>.*)/.match result
|
@@ -356,8 +359,8 @@ module Spectre::Curl
|
|
356
359
|
end
|
357
360
|
|
358
361
|
res_log = "[<] #{req_id} #{res[:code]} #{res[:message]} (#{end_time - start_time}s)\n"
|
359
|
-
res_headers.each do |
|
360
|
-
res_log += "#{
|
362
|
+
res_headers.each do |http_header|
|
363
|
+
res_log += "#{http_header[0].to_s.ljust(30, '.')}: #{http_header[1].to_s}\n"
|
361
364
|
end
|
362
365
|
|
363
366
|
if res[:body] != nil and not res[:body].empty?
|
@@ -377,11 +380,9 @@ module Spectre::Curl
|
|
377
380
|
Spectre.register do |config|
|
378
381
|
@@debug = config['debug']
|
379
382
|
|
380
|
-
@@logger = ::
|
381
|
-
@@logger.level = @@debug ? Logger::DEBUG : Logger::INFO
|
383
|
+
@@logger = Spectre::Logging::ModuleLogger.new(config, 'spectre/curl')
|
382
384
|
|
383
385
|
@@secure_keys = config['secure_keys'] || []
|
384
|
-
|
385
386
|
@@curl_path = config['curl_path'] || 'curl'
|
386
387
|
|
387
388
|
if config.key? 'http'
|
data/lib/spectre/helpers.rb
CHANGED
data/lib/spectre/http.rb
CHANGED
@@ -27,9 +27,6 @@ module Spectre
|
|
27
27
|
@@modules = []
|
28
28
|
|
29
29
|
class HttpError < Exception
|
30
|
-
def initialize message
|
31
|
-
super message
|
32
|
-
end
|
33
30
|
end
|
34
31
|
|
35
32
|
class SpectreHttpRequest < Spectre::DslClass
|
@@ -112,6 +109,10 @@ module Spectre
|
|
112
109
|
@__req['use_ssl'] = true
|
113
110
|
end
|
114
111
|
|
112
|
+
def no_log!
|
113
|
+
@__req['no_log'] = true
|
114
|
+
end
|
115
|
+
|
115
116
|
def to_s
|
116
117
|
@__req.to_s
|
117
118
|
end
|
@@ -230,6 +231,10 @@ module Spectre
|
|
230
231
|
# do nothing
|
231
232
|
end
|
232
233
|
|
234
|
+
if str.length > 1000
|
235
|
+
str = str[0...1000] + "\n[...]"
|
236
|
+
end
|
237
|
+
|
233
238
|
str
|
234
239
|
end
|
235
240
|
|
@@ -314,7 +319,14 @@ module Spectre
|
|
314
319
|
|
315
320
|
req_log = "[>] #{req_id} #{req['method']} #{uri}\n"
|
316
321
|
req_log += header_to_s(net_req)
|
317
|
-
|
322
|
+
|
323
|
+
unless req['body'].nil? or req['body'].empty?
|
324
|
+
unless req['no_log']
|
325
|
+
req_log += try_format_json(req['body'], pretty: true)
|
326
|
+
else
|
327
|
+
req_log += '[...]'
|
328
|
+
end
|
329
|
+
end
|
318
330
|
|
319
331
|
@@logger.info(req_log)
|
320
332
|
|
@@ -345,7 +357,14 @@ module Spectre
|
|
345
357
|
|
346
358
|
res_log = "[<] #{req_id} #{net_res.code} #{net_res.message} (#{end_time - start_time}s)\n"
|
347
359
|
res_log += header_to_s(net_res)
|
348
|
-
|
360
|
+
|
361
|
+
unless net_res.body.nil? or net_res.body.empty?
|
362
|
+
unless req['no_log']
|
363
|
+
res_log += try_format_json(net_res.body, pretty: true)
|
364
|
+
else
|
365
|
+
res_log += '[...]'
|
366
|
+
end
|
367
|
+
end
|
349
368
|
|
350
369
|
@@logger.info(res_log)
|
351
370
|
|
@@ -361,7 +380,7 @@ module Spectre
|
|
361
380
|
end
|
362
381
|
|
363
382
|
Spectre.register do |config|
|
364
|
-
@@logger = ::
|
383
|
+
@@logger = Spectre::Logging::ModuleLogger.new(config, 'spectre/http')
|
365
384
|
@@secure_keys = config['secure_keys'] || []
|
366
385
|
@@debug = config['debug']
|
367
386
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'ectoplasm'
|
2
2
|
|
3
3
|
module Spectre
|
4
|
-
module
|
4
|
+
module Logging
|
5
5
|
class Console
|
6
6
|
def initialize config
|
7
7
|
raise 'No log format section in config for console logger' unless config.key? 'log_format' and config['log_format'].key? 'console'
|
@@ -113,8 +113,14 @@ module Spectre
|
|
113
113
|
print_line('', txt)
|
114
114
|
end
|
115
115
|
|
116
|
-
def log_skipped _spec
|
117
|
-
|
116
|
+
def log_skipped _spec, message=nil
|
117
|
+
txt = Status::SKIPPED
|
118
|
+
|
119
|
+
unless message.nil?
|
120
|
+
txt += ' - ' + message
|
121
|
+
end
|
122
|
+
|
123
|
+
print_line('', txt.grey)
|
118
124
|
end
|
119
125
|
|
120
126
|
private
|