spectre-core 1.12.4 → 1.14.1
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 +125 -103
- data/lib/spectre/assertion.rb +88 -70
- data/lib/spectre/async.rb +31 -0
- data/lib/spectre/bag.rb +1 -1
- data/lib/spectre/curl.rb +4 -6
- data/lib/spectre/helpers.rb +4 -0
- data/lib/spectre/http/keystone.rb +0 -2
- data/lib/spectre/http.rb +23 -9
- data/lib/spectre/logger/console.rb +1 -1
- data/lib/spectre/logger/file.rb +19 -19
- data/lib/spectre/logger.rb +37 -10
- data/lib/spectre/mixin.rb +3 -3
- data/lib/spectre/reporter/console.rb +19 -22
- data/lib/spectre.rb +78 -61
- metadata +8 -9
- data/lib/spectre/reporter/junit.rb +0 -102
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ec3e298c4efb325f628370a3855a110136cba4a9d7f870db90d95a5b39c9e8a
|
4
|
+
data.tar.gz: fde6391319206d2f8d603b02be31f0f5bb72d424fcb25541b9be0597670ce49a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fdb065d1ce08d8c4e78e164bc1caad26ed03d50f4cf6199398699859cb9a81a00260b6e3af785de4a7852aa45da1ae61a2977b0b92bbb5c0c832e6079178cce
|
7
|
+
data.tar.gz: ce6b95998d3e3145876bc1d7bb8fe06ce941f1327a6a283557e9944447ffba888c3012124c474d0321f5e9eb91914b53fbdd285255f947db34dd783e084446b5
|
data/exe/spectre
CHANGED
@@ -16,6 +16,7 @@ end
|
|
16
16
|
|
17
17
|
|
18
18
|
DEFAULT_CONFIG = {
|
19
|
+
'project' => nil,
|
19
20
|
'config_file' => './spectre.yml',
|
20
21
|
'environment' => 'default',
|
21
22
|
'specs' => [],
|
@@ -26,8 +27,8 @@ DEFAULT_CONFIG = {
|
|
26
27
|
'Spectre::Reporter::Console',
|
27
28
|
],
|
28
29
|
'loggers' => [
|
29
|
-
'Spectre::
|
30
|
-
'Spectre::
|
30
|
+
'Spectre::Logging::Console',
|
31
|
+
'Spectre::Logging::File',
|
31
32
|
],
|
32
33
|
'log_file' => './logs/spectre_<date>.log',
|
33
34
|
'log_format' => {
|
@@ -54,7 +55,6 @@ DEFAULT_CONFIG = {
|
|
54
55
|
'modules' => [
|
55
56
|
'spectre/helpers',
|
56
57
|
'spectre/reporter/console',
|
57
|
-
'spectre/reporter/junit',
|
58
58
|
'spectre/logger/console',
|
59
59
|
'spectre/logger/file',
|
60
60
|
'spectre/assertion',
|
@@ -66,6 +66,7 @@ DEFAULT_CONFIG = {
|
|
66
66
|
'spectre/http/basic_auth',
|
67
67
|
'spectre/http/keystone',
|
68
68
|
'spectre/resources',
|
69
|
+
'spectre/async',
|
69
70
|
],
|
70
71
|
'include' => [
|
71
72
|
|
@@ -79,20 +80,24 @@ DEFAULT_CONFIG = {
|
|
79
80
|
cmd_options = {}
|
80
81
|
property_overrides = {}
|
81
82
|
|
82
|
-
|
83
|
-
opts.banner = %{Spectre #{Spectre::VERSION}
|
83
|
+
$COMMAND = ['spectre'].concat(ARGV.clone).join(' ')
|
84
84
|
|
85
|
-
|
85
|
+
OptionParser.new do |opts|
|
86
|
+
opts.banner = <<~BANNER
|
87
|
+
Spectre #{Spectre::VERSION}
|
86
88
|
|
87
|
-
|
88
|
-
list List specs
|
89
|
-
run Run specs (default)
|
90
|
-
show Print current environment settings
|
91
|
-
dump Dumps the given environment in YAML format to console
|
92
|
-
cleanup Will remove all generated files (e.g. logs and reports)
|
93
|
-
init Initializes a new spectre project
|
89
|
+
Usage: spectre [command] [options]
|
94
90
|
|
95
|
-
|
91
|
+
Commands:
|
92
|
+
list List specs
|
93
|
+
run Run specs (default)
|
94
|
+
show Print current environment settings
|
95
|
+
dump Dumps the given environment in YAML format to console
|
96
|
+
cleanup Will remove all generated files (e.g. logs and reports)
|
97
|
+
init Initializes a new spectre project
|
98
|
+
|
99
|
+
Specific options:
|
100
|
+
BANNER
|
96
101
|
|
97
102
|
opts.on('-s SPEC,SPEC', '--specs SPEC,SPEC', Array, 'The specs to run') do |specs|
|
98
103
|
cmd_options['specs'] = specs
|
@@ -130,11 +135,17 @@ Specific options:}
|
|
130
135
|
cmd_options['out_path'] = File.absolute_path(path)
|
131
136
|
end
|
132
137
|
|
133
|
-
opts.on('-r NAME', '--reporters NAME', Array, "A list of reporters to use") do |reporters|
|
138
|
+
opts.on('-r NAME,NAME', '--reporters NAME,NAME', Array, "A list of reporters to use") do |reporters|
|
134
139
|
cmd_options['reporters'] = reporters
|
135
140
|
end
|
136
141
|
|
137
|
-
opts.on('-
|
142
|
+
opts.on('-m MODULE,MODULE', '--modules MODULE,MODULE', Array, "Load the given modules") do |modules|
|
143
|
+
modules.each do |mod|
|
144
|
+
require mod
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
opts.on('-d', '--debug', "Run in debug mode. Do not use in production!") do
|
138
149
|
cmd_options['debug'] = true
|
139
150
|
end
|
140
151
|
|
@@ -159,9 +170,9 @@ Specific options:}
|
|
159
170
|
end
|
160
171
|
end
|
161
172
|
|
162
|
-
opts.separator "\
|
173
|
+
opts.separator "\n Common options:"
|
163
174
|
|
164
|
-
opts.on_tail('--version', 'Print current installed version') do
|
175
|
+
opts.on_tail('-v', '--version', 'Print current installed version') do
|
165
176
|
puts Spectre::VERSION
|
166
177
|
exit
|
167
178
|
end
|
@@ -199,13 +210,19 @@ if File.exists? config_file
|
|
199
210
|
Dir.chdir File.dirname(config_file)
|
200
211
|
end
|
201
212
|
|
213
|
+
# Set config options, which are only allowed to be overriden by command options
|
214
|
+
cfg['debug'] = DEFAULT_CONFIG['debug']
|
215
|
+
|
216
|
+
# Set project name
|
217
|
+
cfg['project'] = File.basename(Dir.pwd) unless cfg['project']
|
218
|
+
|
202
219
|
cfg.deep_merge! cmd_options
|
203
220
|
|
221
|
+
|
204
222
|
###########################################
|
205
223
|
# Load Environment
|
206
224
|
###########################################
|
207
225
|
|
208
|
-
|
209
226
|
envs = {}
|
210
227
|
read_env_files = {}
|
211
228
|
cfg['env_patterns'].each do |pattern|
|
@@ -250,128 +267,131 @@ require_relative '../lib/spectre/environment' unless cfg['exclude'].include? 'sp
|
|
250
267
|
Spectre.configure(cfg)
|
251
268
|
|
252
269
|
|
253
|
-
|
254
|
-
|
255
|
-
###########################################
|
270
|
+
# Load specs only, when listing or running specs
|
271
|
+
if ['list', 'run'].include? action
|
256
272
|
|
273
|
+
###########################################
|
274
|
+
# Load Specs
|
275
|
+
###########################################
|
257
276
|
|
258
|
-
|
259
|
-
|
260
|
-
|
277
|
+
|
278
|
+
cfg['spec_patterns'].each do |pattern|
|
279
|
+
Dir.glob(pattern).each do|f|
|
280
|
+
require_relative File.join(Dir.pwd, f)
|
281
|
+
end
|
261
282
|
end
|
262
|
-
end
|
263
283
|
|
264
284
|
|
265
|
-
###########################################
|
266
|
-
# List specs
|
267
|
-
###########################################
|
285
|
+
###########################################
|
286
|
+
# List specs
|
287
|
+
###########################################
|
268
288
|
|
269
289
|
|
270
|
-
if 'list' == action
|
271
|
-
|
272
|
-
|
290
|
+
if 'list' == action
|
291
|
+
colors = [:blue, :magenta, :yellow, :green]
|
292
|
+
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
273
293
|
|
274
|
-
|
294
|
+
exit 1 unless specs.any?
|
275
295
|
|
276
|
-
|
296
|
+
counter = 0
|
297
|
+
|
298
|
+
specs.group_by { |x| x.subject }.each do |subject, spec_group|
|
299
|
+
spec_group.each do |spec|
|
300
|
+
tags = spec.tags.map { |x| '#' + x.to_s }.join ' '
|
301
|
+
desc = subject.desc
|
302
|
+
desc += ' - ' + spec.context.__desc + ' -' if spec.context.__desc
|
303
|
+
desc += ' ' + spec.desc
|
304
|
+
puts "[#{spec.name}]".send(colors[counter % colors.length]) + " #{desc} #{tags.cyan}"
|
305
|
+
end
|
277
306
|
|
278
|
-
|
279
|
-
spec_group.each do |spec|
|
280
|
-
tags = spec.tags.map { |x| '#' + x.to_s }.join ' '
|
281
|
-
desc = subject.desc
|
282
|
-
desc += ' - ' + spec.context.__desc + ' -' if spec.context.__desc
|
283
|
-
desc += ' ' + spec.desc
|
284
|
-
puts "[#{spec.name}]".send(colors[counter % colors.length]) + " #{desc} #{tags.cyan}"
|
307
|
+
counter += 1
|
285
308
|
end
|
286
309
|
|
287
|
-
|
310
|
+
exit 0
|
288
311
|
end
|
289
312
|
|
290
|
-
exit 0
|
291
|
-
end
|
292
|
-
|
293
313
|
|
294
|
-
###########################################
|
295
|
-
# Run
|
296
|
-
###########################################
|
314
|
+
###########################################
|
315
|
+
# Run
|
316
|
+
###########################################
|
297
317
|
|
298
318
|
|
299
|
-
if 'run' == action
|
300
|
-
|
301
|
-
|
319
|
+
if 'run' == action
|
320
|
+
# Initialize logger
|
321
|
+
now = Time.now
|
302
322
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
})
|
323
|
+
cfg['log_file'] = cfg['log_file'].frmt({
|
324
|
+
shortdate: now.strftime('%Y-%m-%d'),
|
325
|
+
date: now.strftime('%Y-%m-%d_%H%M%S'),
|
326
|
+
timestamp: now.strftime('%s'),
|
327
|
+
subject: 'spectre',
|
328
|
+
})
|
310
329
|
|
311
|
-
|
312
|
-
|
330
|
+
log_dir = File.dirname(cfg['log_file'])
|
331
|
+
FileUtils.makedirs(log_dir)
|
313
332
|
|
314
|
-
|
333
|
+
# Load Modules
|
315
334
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
335
|
+
cfg['modules']
|
336
|
+
.concat(cfg['include'])
|
337
|
+
.select { |mod| !cfg['exclude'].include? mod }
|
338
|
+
.each do |mod|
|
339
|
+
begin
|
340
|
+
mod_file = mod + '.rb'
|
341
|
+
spectre_lib_mod = File.join(File.dirname(__dir__), 'lib', mod_file)
|
323
342
|
|
324
|
-
|
325
|
-
|
343
|
+
if File.exists? mod_file
|
344
|
+
require_relative mod_file
|
326
345
|
|
327
|
-
|
328
|
-
|
346
|
+
elsif File.exists? spectre_lib_mod
|
347
|
+
require_relative spectre_lib_mod
|
329
348
|
|
330
|
-
|
331
|
-
|
349
|
+
else
|
350
|
+
require mod
|
351
|
+
end
|
352
|
+
rescue LoadError => e
|
353
|
+
puts "Unable to load module #{mod}. Check if the module exists or remove it from your spectre config:\n#{e.message}"
|
354
|
+
exit 1
|
332
355
|
end
|
333
|
-
rescue LoadError => e
|
334
|
-
puts "Unable to load module #{mod}. Check if the module exists or remove it from your spectre config:\n#{e.message}"
|
335
|
-
exit 1
|
336
356
|
end
|
337
|
-
end
|
338
357
|
|
339
|
-
|
358
|
+
# Load mixins
|
340
359
|
|
341
|
-
|
342
|
-
|
343
|
-
|
360
|
+
cfg['mixin_patterns'].each do |pattern|
|
361
|
+
Dir.glob(pattern).each do|f|
|
362
|
+
require_relative File.join(Dir.pwd, f)
|
363
|
+
end
|
344
364
|
end
|
345
|
-
end
|
346
365
|
|
347
|
-
|
366
|
+
Spectre.configure(cfg)
|
348
367
|
|
349
|
-
|
368
|
+
Spectre::Logging.debug! if cfg['debug']
|
350
369
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
370
|
+
cfg['loggers'].each do |logger_name|
|
371
|
+
logger = Kernel.const_get(logger_name).new(cfg)
|
372
|
+
Spectre::Logging.add(logger)
|
373
|
+
end if cfg['loggers']
|
355
374
|
|
356
|
-
|
375
|
+
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
357
376
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
377
|
+
unless specs.any?
|
378
|
+
puts "No specs found in #{Dir.pwd}"
|
379
|
+
exit 1
|
380
|
+
end
|
362
381
|
|
363
|
-
|
382
|
+
run_infos = Spectre::Runner.new.run(specs)
|
364
383
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
384
|
+
cfg['reporters'].each do |reporter|
|
385
|
+
reporter = Kernel.const_get(reporter).new(cfg)
|
386
|
+
reporter.report(run_infos)
|
387
|
+
end
|
369
388
|
|
370
|
-
|
389
|
+
errors = run_infos.select { |x| nil != x.error or nil != x.failure }
|
371
390
|
|
372
|
-
|
391
|
+
exit 0 if cfg['ignore_failure'] or not errors.any?
|
373
392
|
|
374
|
-
|
393
|
+
exit 1
|
394
|
+
end
|
375
395
|
end
|
376
396
|
|
377
397
|
|
@@ -418,10 +438,12 @@ if 'cleanup' == action
|
|
418
438
|
|
419
439
|
Dir.glob(log_file_pattern).each do |log_file|
|
420
440
|
File.delete(log_file)
|
441
|
+
puts "#{log_file} deleted"
|
421
442
|
end
|
422
443
|
|
423
444
|
Dir.glob(File.join cfg['out_path'], '/*').each do |out_file|
|
424
445
|
File.delete(out_file)
|
446
|
+
puts "#{out_file} deleted"
|
425
447
|
end
|
426
448
|
end
|
427
449
|
|
@@ -504,7 +526,7 @@ SAMPLE_SPEC = %[describe '<subject>' do
|
|
504
526
|
end
|
505
527
|
|
506
528
|
expect 'a message to exist' do
|
507
|
-
response.json.message.
|
529
|
+
response.json.message.should_not_be_empty
|
508
530
|
end
|
509
531
|
end
|
510
532
|
end
|