spectre-core 1.13.0 → 1.14.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 +116 -101
- data/lib/spectre/assertion.rb +50 -42
- data/lib/spectre/http.rb +2 -7
- data/lib/spectre.rb +1 -1
- metadata +4 -12
- data/lib/spectre/reporter/html.rb +0 -1167
- data/lib/spectre/reporter/junit.rb +0 -105
- data/lib/spectre/reporter/vstest.rb +0 -167
- 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 +0 -106
- data/resources/vue.global.prod.js +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4bf64674e85ed8358b24a20cb06d453531cb4af450c1670dee4712bcc51fd18
|
4
|
+
data.tar.gz: 8647deb255849902fc577c846e14c3e03636dde92619915b1d216d78eef9c73c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab929ce12105b08fb0e0f3180040233c2f748ec6037e71c3b59281083a8a9156b152cb07c0713e56e8d723d2c836671f37a505c6497fae48d7717eeca6008f34
|
7
|
+
data.tar.gz: acc709c87e6f5d5132f5a5ad01c4478b893479e847a5f38c2edc8fc793d411390bde9173edde3e2712e95258de5056f24511b5a2a67c51378fe39f78f4721e29
|
data/exe/spectre
CHANGED
@@ -55,9 +55,6 @@ DEFAULT_CONFIG = {
|
|
55
55
|
'modules' => [
|
56
56
|
'spectre/helpers',
|
57
57
|
'spectre/reporter/console',
|
58
|
-
'spectre/reporter/junit',
|
59
|
-
'spectre/reporter/vstest',
|
60
|
-
'spectre/reporter/html',
|
61
58
|
'spectre/logger/console',
|
62
59
|
'spectre/logger/file',
|
63
60
|
'spectre/assertion',
|
@@ -86,19 +83,21 @@ property_overrides = {}
|
|
86
83
|
$COMMAND = ['spectre'].concat(ARGV.clone).join(' ')
|
87
84
|
|
88
85
|
OptionParser.new do |opts|
|
89
|
-
opts.banner =
|
86
|
+
opts.banner = <<~BANNER
|
87
|
+
Spectre #{Spectre::VERSION}
|
90
88
|
|
91
|
-
|
89
|
+
Usage: spectre [command] [options]
|
92
90
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|
100
98
|
|
101
|
-
|
99
|
+
Specific options:
|
100
|
+
BANNER
|
102
101
|
|
103
102
|
opts.on('-s SPEC,SPEC', '--specs SPEC,SPEC', Array, 'The specs to run') do |specs|
|
104
103
|
cmd_options['specs'] = specs
|
@@ -136,11 +135,17 @@ OptionParser.new do |opts|
|
|
136
135
|
cmd_options['out_path'] = File.absolute_path(path)
|
137
136
|
end
|
138
137
|
|
139
|
-
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|
|
140
139
|
cmd_options['reporters'] = reporters
|
141
140
|
end
|
142
141
|
|
143
|
-
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
|
144
149
|
cmd_options['debug'] = true
|
145
150
|
end
|
146
151
|
|
@@ -165,9 +170,9 @@ OptionParser.new do |opts|
|
|
165
170
|
end
|
166
171
|
end
|
167
172
|
|
168
|
-
opts.separator "\
|
173
|
+
opts.separator "\n Common options:"
|
169
174
|
|
170
|
-
opts.on_tail('--version', 'Print current installed version') do
|
175
|
+
opts.on_tail('-v', '--version', 'Print current installed version') do
|
171
176
|
puts Spectre::VERSION
|
172
177
|
exit
|
173
178
|
end
|
@@ -205,15 +210,19 @@ if File.exists? config_file
|
|
205
210
|
Dir.chdir File.dirname(config_file)
|
206
211
|
end
|
207
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
|
208
217
|
cfg['project'] = File.basename(Dir.pwd) unless cfg['project']
|
209
218
|
|
210
219
|
cfg.deep_merge! cmd_options
|
211
220
|
|
221
|
+
|
212
222
|
###########################################
|
213
223
|
# Load Environment
|
214
224
|
###########################################
|
215
225
|
|
216
|
-
|
217
226
|
envs = {}
|
218
227
|
read_env_files = {}
|
219
228
|
cfg['env_patterns'].each do |pattern|
|
@@ -258,127 +267,131 @@ require_relative '../lib/spectre/environment' unless cfg['exclude'].include? 'sp
|
|
258
267
|
Spectre.configure(cfg)
|
259
268
|
|
260
269
|
|
261
|
-
|
262
|
-
|
263
|
-
###########################################
|
270
|
+
# Load specs only, when listing or running specs
|
271
|
+
if ['list', 'run'].include? action
|
264
272
|
|
273
|
+
###########################################
|
274
|
+
# Load Specs
|
275
|
+
###########################################
|
265
276
|
|
266
|
-
|
267
|
-
|
268
|
-
|
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
|
269
282
|
end
|
270
|
-
end
|
271
283
|
|
272
284
|
|
273
|
-
###########################################
|
274
|
-
# List specs
|
275
|
-
###########################################
|
285
|
+
###########################################
|
286
|
+
# List specs
|
287
|
+
###########################################
|
288
|
+
|
276
289
|
|
290
|
+
if 'list' == action
|
291
|
+
colors = [:blue, :magenta, :yellow, :green]
|
292
|
+
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
277
293
|
|
278
|
-
|
279
|
-
colors = [:blue, :magenta, :yellow, :green]
|
280
|
-
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
294
|
+
exit 1 unless specs.any?
|
281
295
|
|
282
|
-
|
296
|
+
counter = 0
|
283
297
|
|
284
|
-
|
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
|
285
306
|
|
286
|
-
|
287
|
-
spec_group.each do |spec|
|
288
|
-
tags = spec.tags.map { |x| '#' + x.to_s }.join ' '
|
289
|
-
desc = subject.desc
|
290
|
-
desc += ' - ' + spec.context.__desc + ' -' if spec.context.__desc
|
291
|
-
desc += ' ' + spec.desc
|
292
|
-
puts "[#{spec.name}]".send(colors[counter % colors.length]) + " #{desc} #{tags.cyan}"
|
307
|
+
counter += 1
|
293
308
|
end
|
294
309
|
|
295
|
-
|
310
|
+
exit 0
|
296
311
|
end
|
297
312
|
|
298
|
-
exit 0
|
299
|
-
end
|
300
313
|
|
314
|
+
###########################################
|
315
|
+
# Run
|
316
|
+
###########################################
|
301
317
|
|
302
|
-
###########################################
|
303
|
-
# Run
|
304
|
-
###########################################
|
305
318
|
|
319
|
+
if 'run' == action
|
320
|
+
# Initialize logger
|
321
|
+
now = Time.now
|
306
322
|
|
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
|
-
|
313
|
-
date: now.strftime('%Y-%m-%d_%H%M%S'),
|
314
|
-
timestamp: now.strftime('%s'),
|
315
|
-
subject: 'spectre',
|
316
|
-
})
|
330
|
+
log_dir = File.dirname(cfg['log_file'])
|
331
|
+
FileUtils.makedirs(log_dir)
|
317
332
|
|
318
|
-
|
319
|
-
FileUtils.makedirs(log_dir)
|
333
|
+
# Load Modules
|
320
334
|
|
321
|
-
|
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)
|
322
342
|
|
323
|
-
|
324
|
-
|
325
|
-
.select { |mod| !cfg['exclude'].include? mod }
|
326
|
-
.each do |mod|
|
327
|
-
begin
|
328
|
-
mod_file = mod + '.rb'
|
329
|
-
spectre_lib_mod = File.join(File.dirname(__dir__), 'lib', mod_file)
|
343
|
+
if File.exists? mod_file
|
344
|
+
require_relative mod_file
|
330
345
|
|
331
|
-
|
332
|
-
|
346
|
+
elsif File.exists? spectre_lib_mod
|
347
|
+
require_relative spectre_lib_mod
|
333
348
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
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
|
339
355
|
end
|
340
|
-
rescue LoadError => e
|
341
|
-
puts "Unable to load module #{mod}. Check if the module exists or remove it from your spectre config:\n#{e.message}"
|
342
|
-
exit 1
|
343
356
|
end
|
344
|
-
end
|
345
357
|
|
346
|
-
|
358
|
+
# Load mixins
|
347
359
|
|
348
|
-
|
349
|
-
|
350
|
-
|
360
|
+
cfg['mixin_patterns'].each do |pattern|
|
361
|
+
Dir.glob(pattern).each do|f|
|
362
|
+
require_relative File.join(Dir.pwd, f)
|
363
|
+
end
|
351
364
|
end
|
352
|
-
end
|
353
365
|
|
354
|
-
|
366
|
+
Spectre.configure(cfg)
|
355
367
|
|
356
|
-
|
368
|
+
Spectre::Logging.debug! if cfg['debug']
|
357
369
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
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']
|
362
374
|
|
363
|
-
|
375
|
+
specs = Spectre.specs(cfg['specs'], cfg['tags'])
|
364
376
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
377
|
+
unless specs.any?
|
378
|
+
puts "No specs found in #{Dir.pwd}"
|
379
|
+
exit 1
|
380
|
+
end
|
369
381
|
|
370
|
-
|
382
|
+
run_infos = Spectre::Runner.new.run(specs)
|
371
383
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
384
|
+
cfg['reporters'].each do |reporter|
|
385
|
+
reporter = Kernel.const_get(reporter).new(cfg)
|
386
|
+
reporter.report(run_infos)
|
387
|
+
end
|
376
388
|
|
377
|
-
|
389
|
+
errors = run_infos.select { |x| nil != x.error or nil != x.failure }
|
378
390
|
|
379
|
-
|
391
|
+
exit 0 if cfg['ignore_failure'] or not errors.any?
|
380
392
|
|
381
|
-
|
393
|
+
exit 1
|
394
|
+
end
|
382
395
|
end
|
383
396
|
|
384
397
|
|
@@ -425,10 +438,12 @@ if 'cleanup' == action
|
|
425
438
|
|
426
439
|
Dir.glob(log_file_pattern).each do |log_file|
|
427
440
|
File.delete(log_file)
|
441
|
+
puts "#{log_file} deleted"
|
428
442
|
end
|
429
443
|
|
430
444
|
Dir.glob(File.join cfg['out_path'], '/*').each do |out_file|
|
431
445
|
File.delete(out_file)
|
446
|
+
puts "#{out_file} deleted"
|
432
447
|
end
|
433
448
|
end
|
434
449
|
|
@@ -511,7 +526,7 @@ SAMPLE_SPEC = %[describe '<subject>' do
|
|
511
526
|
end
|
512
527
|
|
513
528
|
expect 'a message to exist' do
|
514
|
-
response.json.message.
|
529
|
+
response.json.message.should_not_be_empty
|
515
530
|
end
|
516
531
|
end
|
517
532
|
end
|
data/lib/spectre/assertion.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../spectre'
|
2
|
+
require_relative '../spectre/helpers'
|
2
3
|
|
3
4
|
require 'ostruct'
|
4
5
|
require_relative 'logger'
|
@@ -7,32 +8,39 @@ require_relative 'logger'
|
|
7
8
|
module Spectre
|
8
9
|
module Assertion
|
9
10
|
class ::Object
|
10
|
-
def should_be(
|
11
|
-
|
11
|
+
def should_be(value)
|
12
|
+
evaluate(value, "#{self} should be #{value}") do |x|
|
13
|
+
self.equal? x
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
def should_be_empty
|
15
|
-
raise AssertionFailure.new("
|
18
|
+
raise AssertionFailure.new("#{self.to_s.trim} should be empty", nil, self) unless self.nil?
|
16
19
|
end
|
17
20
|
|
18
21
|
def should_not_be(val)
|
19
|
-
raise AssertionFailure.new("
|
22
|
+
raise AssertionFailure.new("#{self.to_s.trim} should not be #{val.to_s.trim}", val, self) unless self.to_s != val.to_s
|
20
23
|
end
|
21
24
|
|
22
25
|
def should_not_exist
|
23
|
-
raise AssertionFailure.new("
|
26
|
+
raise AssertionFailure.new("#{self.to_s.trim} should not exist, but it does", val, self) unless self.to_s != nil
|
24
27
|
end
|
25
28
|
|
26
29
|
def should_not_be_empty
|
27
30
|
raise AssertionFailure.new('empty value', 'nothing', self) unless self != nil
|
28
31
|
end
|
29
32
|
|
33
|
+
def evaluate val, message, &block
|
34
|
+
val = Evaluation.new(val) unless val.is_a? Evaluation
|
35
|
+
raise AssertionFailure.new(message, val, self) unless val.run &block
|
36
|
+
end
|
37
|
+
|
30
38
|
def or other
|
31
|
-
OrEvaluation.new
|
39
|
+
OrEvaluation.new(self, other)
|
32
40
|
end
|
33
41
|
|
34
42
|
def and other
|
35
|
-
AndEvaluation.new
|
43
|
+
AndEvaluation.new(self, other)
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
@@ -93,7 +101,9 @@ module Spectre
|
|
93
101
|
val = OpenStruct.new(val)
|
94
102
|
end
|
95
103
|
|
96
|
-
|
104
|
+
evaluate(val, "#{self} should contain #{val.to_s}") do |x|
|
105
|
+
self.include? x
|
106
|
+
end
|
97
107
|
end
|
98
108
|
|
99
109
|
def should_not_contain(val)
|
@@ -134,15 +144,9 @@ module Spectre
|
|
134
144
|
end
|
135
145
|
|
136
146
|
def should_contain(value)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
evaluation = SingleEvaluation.new(value)
|
141
|
-
success = evaluation.call(predicate)
|
142
|
-
|
143
|
-
return if success
|
144
|
-
|
145
|
-
raise AssertionFailure.new("'#{self.to_s.trim}' should contain #{evaluation.to_s}", evaluation, self)
|
147
|
+
evaluate(value, "'#{self.trim}' should contain #{value.to_s}") do |x|
|
148
|
+
self.include? x.to_s
|
149
|
+
end
|
146
150
|
end
|
147
151
|
|
148
152
|
def should_not_contain(val)
|
@@ -162,54 +166,58 @@ module Spectre
|
|
162
166
|
end
|
163
167
|
|
164
168
|
class Evaluation
|
165
|
-
def initialize
|
166
|
-
@
|
167
|
-
@other = other
|
169
|
+
def initialize val
|
170
|
+
@val = val
|
168
171
|
end
|
169
172
|
|
170
|
-
def
|
173
|
+
def run &block
|
174
|
+
evaluate(@val, block)
|
175
|
+
end
|
176
|
+
|
177
|
+
def evaluate(val, predicate)
|
171
178
|
if val.is_a? Evaluation
|
172
|
-
val.
|
179
|
+
val.run &predicate
|
173
180
|
else
|
174
181
|
predicate.call(val)
|
175
182
|
end
|
176
183
|
end
|
177
184
|
|
178
|
-
alias :| :or
|
179
|
-
alias :& :and
|
180
|
-
end
|
181
|
-
|
182
|
-
class SingleEvaluation < Evaluation
|
183
|
-
def initialize value
|
184
|
-
super(value, nil)
|
185
|
-
end
|
186
|
-
|
187
|
-
def call predicate
|
188
|
-
eval_assertion(predicate, @value)
|
189
|
-
end
|
190
|
-
|
191
185
|
def to_s
|
192
|
-
@
|
186
|
+
@val.to_s
|
193
187
|
end
|
194
188
|
end
|
195
189
|
|
196
190
|
class OrEvaluation < Evaluation
|
197
|
-
def
|
198
|
-
|
191
|
+
def initialize val, other
|
192
|
+
@val = val
|
193
|
+
@other = other
|
194
|
+
end
|
195
|
+
|
196
|
+
def run &block
|
197
|
+
res1 = evaluate(@val, block)
|
198
|
+
res2 = evaluate(@other, block)
|
199
|
+
res1 or res2
|
199
200
|
end
|
200
201
|
|
201
202
|
def to_s
|
202
|
-
"(#{@
|
203
|
+
"(#{@val} or #{@other})"
|
203
204
|
end
|
204
205
|
end
|
205
206
|
|
206
207
|
class AndEvaluation < Evaluation
|
207
|
-
def
|
208
|
-
|
208
|
+
def initialize val, other
|
209
|
+
@val = val
|
210
|
+
@other = other
|
211
|
+
end
|
212
|
+
|
213
|
+
def run &block
|
214
|
+
res1 = evaluate(@val, block)
|
215
|
+
res2 = evaluate(@other, block)
|
216
|
+
res1 and res2
|
209
217
|
end
|
210
218
|
|
211
219
|
def to_s
|
212
|
-
"(#{@
|
220
|
+
"(#{@val} and #{@other})"
|
213
221
|
end
|
214
222
|
end
|
215
223
|
|
data/lib/spectre/http.rb
CHANGED
@@ -19,7 +19,7 @@ module Spectre
|
|
19
19
|
'cert' => nil,
|
20
20
|
'headers' => nil,
|
21
21
|
'query' => nil,
|
22
|
-
'content_type' =>
|
22
|
+
'content_type' => nil,
|
23
23
|
'timeout' => 180,
|
24
24
|
'retries' => 0,
|
25
25
|
}
|
@@ -77,8 +77,7 @@ module Spectre
|
|
77
77
|
data = data.to_h if data.is_a? OpenStruct
|
78
78
|
body JSON.pretty_generate(data)
|
79
79
|
|
80
|
-
|
81
|
-
content_type('application/json')
|
80
|
+
content_type('application/json') unless @__req['content_type']
|
82
81
|
end
|
83
82
|
|
84
83
|
def body body_content
|
@@ -231,10 +230,6 @@ module Spectre
|
|
231
230
|
# do nothing
|
232
231
|
end
|
233
232
|
|
234
|
-
if str.length > 1000
|
235
|
-
str = str[0...1000] + "\n[...]"
|
236
|
-
end
|
237
|
-
|
238
233
|
str
|
239
234
|
end
|
240
235
|
|
data/lib/spectre.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spectre-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Neubauer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ectoplasm
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.2.
|
19
|
+
version: 1.2.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.2.
|
26
|
+
version: 1.2.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jsonpath
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,15 +63,7 @@ files:
|
|
63
63
|
- lib/spectre/logger/file.rb
|
64
64
|
- lib/spectre/mixin.rb
|
65
65
|
- lib/spectre/reporter/console.rb
|
66
|
-
- lib/spectre/reporter/html.rb
|
67
|
-
- lib/spectre/reporter/junit.rb
|
68
|
-
- lib/spectre/reporter/vstest.rb
|
69
66
|
- lib/spectre/resources.rb
|
70
|
-
- resources/OpenSans-Regular.ttf
|
71
|
-
- resources/fa-regular-400.ttf
|
72
|
-
- resources/fa-solid-900.ttf
|
73
|
-
- resources/spectre_icon.svg
|
74
|
-
- resources/vue.global.prod.js
|
75
67
|
homepage: https://github.com/ionos-spectre/spectre-core
|
76
68
|
licenses:
|
77
69
|
- GPL-3.0-or-later
|