spectre-core 1.9.0 → 1.12.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.
@@ -1,3 +1,5 @@
1
+ require_relative '../spectre'
2
+
1
3
  require 'ostruct'
2
4
 
3
5
  module Spectre
@@ -12,7 +14,8 @@ module Spectre
12
14
  end
13
15
 
14
16
  def [] name
15
- raise "Resource with name '#{name}' does not exist" if not @items.key? name
17
+ raise "Resource with name '#{name}' does not exist" unless @items.key? name
18
+
16
19
  @items[name]
17
20
  end
18
21
  end
@@ -26,7 +29,7 @@ module Spectre
26
29
  end
27
30
 
28
31
  Spectre.register do |config|
29
- return if !config.key? 'resource_paths'
32
+ return unless config.key? 'resource_paths'
30
33
 
31
34
  config['resource_paths'].each do |resource_path|
32
35
  resource_files = Dir.glob File.join(resource_path, '**/*')
@@ -41,6 +44,6 @@ module Spectre
41
44
  @@resources.freeze
42
45
  end
43
46
 
44
- Spectre.delegate :resources, to: Resources
47
+ Spectre.delegate :resources, to: self
45
48
  end
46
- end
49
+ end
data/lib/spectre.rb CHANGED
@@ -1,18 +1,44 @@
1
1
  module Spectre
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 9
5
- TINY = 0
4
+ MINOR = 12
5
+ TINY = 1
6
6
  end
7
7
 
8
8
  VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
9
9
 
10
10
 
11
+ class ::Hash
12
+ def deep_merge!(second)
13
+ merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge!(v2, &merger) : v2 }
14
+ self.merge!(second, &merger)
15
+ end
16
+
17
+ def deep_clone
18
+ Marshal.load(Marshal.dump(self))
19
+ end
20
+ end
21
+
22
+ class ::Object
23
+ def to_h
24
+ self.instance_variables.each_with_object({}) do |var, hash|
25
+ hash[var.to_s.delete("@")] = self.instance_variable_get(var)
26
+ end
27
+ end
28
+ end
29
+
30
+
11
31
  ###########################################
12
32
  # Custom Exceptions
13
33
  ###########################################
14
34
 
15
35
 
36
+ class SpectreError < Exception
37
+ def initialize message
38
+ super message
39
+ end
40
+ end
41
+
16
42
  class ExpectationFailure < Exception
17
43
  attr_reader :expectation
18
44
 
@@ -31,25 +57,24 @@ module Spectre
31
57
  # https://www.dan-manges.com/blog/ruby-dsls-instance-eval-with-delegation
32
58
  class DslClass
33
59
  def _evaluate &block
34
- @__bound_self__ = eval 'self', block.binding
60
+ @__bound_self__ = eval('self', block.binding)
35
61
  instance_eval(&block)
36
62
  end
37
63
 
38
- def _execute args, &block
39
- @__bound_self__ = eval 'self', block.binding
40
- instance_exec(args, &block)
64
+ def _execute *args, &block
65
+ @__bound_self__ = eval('self', block.binding)
66
+ instance_exec(*args, &block)
41
67
  end
42
68
 
43
69
  def method_missing method, *args, **kwargs, &block
44
70
  if @__bound_self__.respond_to? method
45
- @__bound_self__.send method, *args, **kwargs, &block
71
+ @__bound_self__.send(method, *args, **kwargs, &block)
46
72
  else
47
- Delegator.redirect method, *args, **kwargs, &block
73
+ Delegator.redirect(method, *args, **kwargs, &block)
48
74
  end
49
75
  end
50
76
  end
51
77
 
52
-
53
78
  class Subject
54
79
  attr_reader :name, :desc, :specs
55
80
 
@@ -65,7 +90,6 @@ module Spectre
65
90
  end
66
91
  end
67
92
 
68
-
69
93
  class Spec
70
94
  attr_reader :name, :subject, :context, :desc, :tags, :data, :block, :file
71
95
 
@@ -85,9 +109,9 @@ module Spectre
85
109
  end
86
110
  end
87
111
 
88
-
89
112
  class RunInfo
90
- attr_accessor :spec, :data, :started, :finished, :error, :failure, :skipped, :log, :properties
113
+ attr_accessor :spec, :data, :started, :finished, :error, :failure, :skipped
114
+ attr_reader :log, :properties
91
115
 
92
116
  def initialize spec, data=nil
93
117
  @spec = spec
@@ -114,7 +138,6 @@ module Spectre
114
138
  end
115
139
  end
116
140
 
117
-
118
141
  class Runner
119
142
  @@current
120
143
 
@@ -151,12 +174,16 @@ module Spectre
151
174
 
152
175
  begin
153
176
  specs.each do |spec|
154
- if spec.data.length > 0
155
- spec.data.each do |data|
156
- Logger.log_spec(spec, data) do
157
- runs << run_spec(spec, data)
177
+ raise SpectreError.new("Multi data definition (`with' parameter) of '#{spec.subject.desc} #{spec.desc}' has to be an `Array'") unless !spec.data.nil? and spec.data.is_a? Array
178
+
179
+ if spec.data.any?
180
+ spec.data
181
+ .map { |x| x.is_a?(Hash) ? OpenStruct.new(x) : x }
182
+ .each do |data|
183
+ Logger.log_spec(spec, data) do
184
+ runs << run_spec(spec, data)
185
+ end
158
186
  end
159
- end
160
187
  else
161
188
  Logger.log_spec(spec) do
162
189
  runs << run_spec(spec)
@@ -189,14 +216,11 @@ module Spectre
189
216
  end
190
217
 
191
218
  run_info.finished = Time.now
192
-
193
219
  rescue ExpectationFailure => e
194
220
  run_info.failure = e
195
-
196
221
  rescue Exception => e
197
222
  run_info.error = e
198
223
  Logger.log_error spec, e
199
-
200
224
  end
201
225
  end
202
226
 
@@ -208,7 +232,7 @@ module Spectre
208
232
  end
209
233
 
210
234
  def run_spec spec, data=nil
211
- run_info = RunInfo.new spec, data
235
+ run_info = RunInfo.new(spec, data)
212
236
 
213
237
  @@current = run_info
214
238
 
@@ -216,31 +240,27 @@ module Spectre
216
240
 
217
241
  begin
218
242
  if spec.context.__before_blocks.count > 0
219
- before_ctx = SpecContext.new spec.subject, 'before'
243
+ before_ctx = SpecContext.new(spec.subject, 'before')
220
244
 
221
245
  Logger.log_context before_ctx do
222
246
  spec.context.__before_blocks.each do |block|
223
- block.call data
247
+ block.call(data)
224
248
  end
225
249
  end
226
250
  end
227
251
 
228
- spec.block.call data
229
-
252
+ spec.block.call(data)
230
253
  rescue ExpectationFailure => e
231
254
  run_info.failure = e
232
-
233
255
  rescue Interrupt
234
256
  run_info.skipped = true
235
257
  Logger.log_skipped spec
236
-
237
258
  rescue Exception => e
238
259
  run_info.error = e
239
260
  Logger.log_error spec, e
240
-
241
261
  ensure
242
262
  if spec.context.__after_blocks.count > 0
243
- after_ctx = SpecContext.new spec.subject, 'after'
263
+ after_ctx = SpecContext.new(spec.subject, 'after')
244
264
 
245
265
  Logger.log_context after_ctx do
246
266
  begin
@@ -249,14 +269,11 @@ module Spectre
249
269
  end
250
270
 
251
271
  run_info.finished = Time.now
252
-
253
272
  rescue ExpectationFailure => e
254
273
  run_info.failure = e
255
-
256
274
  rescue Exception => e
257
275
  run_info.error = e
258
276
  Logger.log_error spec, e
259
-
260
277
  end
261
278
  end
262
279
  end
@@ -290,7 +307,6 @@ module Spectre
290
307
  end
291
308
 
292
309
  def it desc, tags: [], with: [], &block
293
-
294
310
  # Get the file, where the spec is defined.
295
311
  # Nasty, but it works
296
312
  # Maybe there is another way, but this works for now
@@ -344,6 +360,7 @@ module Spectre
344
360
  methods.each do |method_name|
345
361
  define_method(method_name) do |*args, &block|
346
362
  return super(*args, &block) if respond_to? method_name
363
+
347
364
  target.send(method_name, *args, &block)
348
365
  end
349
366
 
@@ -354,8 +371,9 @@ module Spectre
354
371
  end
355
372
 
356
373
  def self.redirect method_name, *args, **kwargs, &block
357
- target = @@mappings[method_name]
358
- raise "No method or variable '#{method_name}' defined" if !target
374
+ target = @@mappings[method_name] || Kernel
375
+ raise SpectreError.new("no variable or method '#{method_name}' found") unless target.respond_to? method_name
376
+
359
377
  target.send(method_name, *args, **kwargs, &block)
360
378
  end
361
379
  end
@@ -373,12 +391,11 @@ module Spectre
373
391
  .map { |x| x.specs }
374
392
  .flatten
375
393
  .select do |spec|
376
- (spec_filter.empty? or spec_filter.any? { |x| spec.name.match('^' + x.gsub('*', '.*') + '$') }) and (tags.empty? or tags.any? { |x| has_tag(spec.tags, x) })
394
+ (spec_filter.empty? or spec_filter.any? { |x| spec.name.match('^' + x.gsub('*', '.*') + '$') }) and (tags.empty? or tags.any? { |x| tag?(spec.tags, x) })
377
395
  end
378
396
  end
379
397
 
380
-
381
- def has_tag tags, tag_exp
398
+ def tag? tags, tag_exp
382
399
  tags = tags.map { |x| x.to_s }
383
400
  all_tags = tag_exp.split '+'
384
401
  included_tags = all_tags.select { |x| !x.start_with? '!' }
@@ -386,17 +403,14 @@ module Spectre
386
403
  included_tags & tags == included_tags and excluded_tags & tags == []
387
404
  end
388
405
 
389
-
390
406
  def delegate *method_names, to: nil
391
407
  Spectre::Delegator.delegate *method_names, to
392
408
  end
393
409
 
394
-
395
410
  def register &block
396
411
  @@modules << block
397
412
  end
398
413
 
399
-
400
414
  def configure config
401
415
  @@modules.each do |block|
402
416
  block.call(config)
@@ -412,7 +426,7 @@ module Spectre
412
426
  def describe desc, &block
413
427
  subject = @@subjects.find { |x| x.desc == desc }
414
428
 
415
- if !subject
429
+ unless subject
416
430
  subject = Subject.new(desc)
417
431
  @@subjects << subject
418
432
  end
@@ -424,11 +438,10 @@ module Spectre
424
438
  def property key, val
425
439
  Spectre::Runner.current.properties[key] = val
426
440
  end
427
-
428
441
  end
429
442
 
430
443
  delegate :describe, :property, to: Spectre
431
444
  end
432
445
 
433
446
 
434
- extend Spectre::Delegator
447
+ extend Spectre::Delegator
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.9.0
4
+ version: 1.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Neubauer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-01 00:00:00.000000000 Z
11
+ date: 2021-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ectoplasm
@@ -24,9 +24,23 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: jsonpath
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
27
41
  description: A DSL and command line tool to describe and run automated tests
28
42
  email:
29
- - me@christianneubauer.de
43
+ - christian.neubauer@ionos.com
30
44
  executables:
31
45
  - spectre
32
46
  extensions: []
@@ -50,15 +64,15 @@ files:
50
64
  - lib/spectre/reporter/console.rb
51
65
  - lib/spectre/reporter/junit.rb
52
66
  - lib/spectre/resources.rb
53
- homepage: https://github.com/cneubauer/spectre-core
67
+ homepage: https://github.com/ionos-spectre/spectre-core
54
68
  licenses:
55
- - MIT
69
+ - GPL-3.0-or-later
56
70
  metadata:
57
71
  allowed_push_host: https://rubygems.org/
58
- homepage_uri: https://github.com/cneubauer/spectre-core
59
- source_code_uri: https://github.com/cneubauer/spectre-core
60
- changelog_uri: https://github.com/cneubauer/spectre-core/blob/master/CHANGELOG.md
61
- post_install_message:
72
+ homepage_uri: https://github.com/ionos-spectre/spectre-core
73
+ source_code_uri: https://github.com/ionos-spectre/spectre-core
74
+ changelog_uri: https://github.com/ionos-spectre/spectre-core/blob/master/CHANGELOG.md
75
+ post_install_message:
62
76
  rdoc_options: []
63
77
  require_paths:
64
78
  - lib
@@ -73,8 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
87
  - !ruby/object:Gem::Version
74
88
  version: '0'
75
89
  requirements: []
76
- rubygems_version: 3.0.8
77
- signing_key:
90
+ rubygems_version: 3.2.3
91
+ signing_key:
78
92
  specification_version: 4
79
93
  summary: Describe and run automated tests
80
94
  test_files: []