spectre-core 2.1.1 → 2.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 903623ea7a511af71aebe1919c91b0b298fed6819310d60a38dc8ad3fd74127d
4
- data.tar.gz: 52e66bd3838d220bd3ab57fc91f81d3eff5c7c9c85c5651611a75e99ed133c44
3
+ metadata.gz: 3e75cee429c0765480965f1e1177c85f5ecf769651332e7167b1be5db8601cda
4
+ data.tar.gz: 6ad3c26cf386b69b57db775bec8fb8e1ae011a8d6abfb21a1aa250fec6198104
5
5
  SHA512:
6
- metadata.gz: 97ac252558b5acbc8ad88995759632f69adf7a5b8dd38e373b1f8cf176a047e89019fd568ebd02d0b6a556e6d210499f25ea3f3d7ff74ccaa00f9796d0619c09
7
- data.tar.gz: e12befe6472a287a0d94755853e123da29066aab9aeaa8e60e5366019776638730e274f9a0e9f4d3fd87023faaa9961b51fbf9ffc5cfb66edc524f68ec54d7ce
6
+ metadata.gz: '09f0c500ce8ed1416a418b75af0716a6f7bd1083abf3b2d402c0adf381c0ce60bf51e8cb8e06f6f26bb5d19c1c3e8d8034361bcc320821f82835d39b427189f5'
7
+ data.tar.gz: 23d0113096cb9b69f78f40b1ae5ad7c6aa9201593fa9ac3e885f95ad14f53a5343673cbd932aca8603904638b3ef10afea6f81a5e55d47167b604836dc5e310a
@@ -88,7 +88,7 @@ module Spectre
88
88
  @var_name = file_content
89
89
  .lines[location.lineno - 1]
90
90
  .strip
91
- .match(/[\s\(]([^\s]+|\[.*\]|{.*})\.(to|not_to)[\s\(]/)
91
+ .match(/[\s(]([^\s]+|\[.*\]|{.*})\.(to|not_to)[\s(]/)
92
92
  .captures
93
93
  .first
94
94
  .strip
@@ -122,7 +122,7 @@ end
122
122
  module Spectre
123
123
  module Helpers
124
124
  class << self
125
- def uuid length = niL
125
+ def uuid length = nil
126
126
  return SecureRandom.hex(length / 2) if length
127
127
 
128
128
  SecureRandom.uuid
@@ -1,3 +1,3 @@
1
1
  module Spectre
2
- VERSION = '2.1.1'.freeze
2
+ VERSION = '2.1.3'.freeze
3
3
  end
data/lib/spectre.rb CHANGED
@@ -258,13 +258,14 @@ module Spectre
258
258
  counter = 0
259
259
 
260
260
  specs
261
- .group_by { |x| x.parent.root }
261
+ .group_by { |x| x.parent.root.name }
262
262
  .each_value do |spec_group|
263
- spec_group.sort_by!(&:name)
264
- spec_group.each do |spec|
265
- spec_id = "[#{spec.name}]".send(@colors[counter % @colors.length])
266
- @out.puts "#{spec_id} #{spec.full_desc} #{spec.tags.map { |x| "##{x}" }.join(' ').cyan}"
267
- end
263
+ spec_group
264
+ .sort
265
+ .each do |spec|
266
+ spec_id = "[#{spec.name}]".send(@colors[counter % @colors.length])
267
+ @out.puts "#{spec_id} #{spec.full_desc} #{spec.tags.map { |x| "##{x}" }.join(' ').cyan}"
268
+ end
268
269
 
269
270
  counter += 1
270
271
  end
@@ -273,15 +274,15 @@ module Spectre
273
274
  ##
274
275
  # Outputs all the specs for all contexts
275
276
  #
276
- def describe contexts, level = 0
277
- contexts.each do |context|
277
+ def describe contexts, level = 0, parent: nil
278
+ contexts.select { |x| x.parent == parent }.each do |context|
278
279
  @out.puts("#{' ' * level}#{context.desc.send(level.positive? ? :magenta : :blue)}")
279
280
 
280
281
  context.specs.each do |spec|
281
282
  @out.puts("#{' ' * (level + 1)}#{spec.desc}")
282
283
  end
283
284
 
284
- describe(context.children, level + 1)
285
+ describe(contexts, level + 1, parent: context)
285
286
  end
286
287
  end
287
288
 
@@ -802,7 +803,6 @@ module Spectre
802
803
  DEFAULT_ASYNC_NAME = 'default'
803
804
 
804
805
  @@current = nil
805
- @@location_cache = {}
806
806
  @@skip_count = 0
807
807
 
808
808
  ##
@@ -1071,10 +1071,7 @@ module Spectre
1071
1071
  def await name = DEFAULT_ASYNC_NAME
1072
1072
  return unless @threads.key? name
1073
1073
 
1074
- threads = @threads[name].map(&:join)
1075
-
1076
- @threads.delete(name)
1077
-
1074
+ threads = @threads.delete(name)
1078
1075
  threads.map(&:join)
1079
1076
  end
1080
1077
 
@@ -1185,6 +1182,19 @@ module Spectre
1185
1182
  @full_desc = "#{@parent.full_desc} #{@desc}"
1186
1183
  end
1187
1184
 
1185
+ def <=>(other)
1186
+ # Split on dash: text part and numeric part
1187
+ self_parts = @name.split('-')
1188
+ other_parts = other.name.split('-')
1189
+
1190
+ text_compare = self_parts[0] <=> other_parts[0]
1191
+
1192
+ # If the text parts are already different, we can return here
1193
+ return text_compare unless text_compare.zero?
1194
+
1195
+ self_parts[1].to_i <=> other_parts[1].to_i
1196
+ end
1197
+
1188
1198
  ##
1189
1199
  # Creates a new +RunContext+ and executes the spec,
1190
1200
  # +before+ and +after+ blocks
@@ -1217,13 +1227,13 @@ module Spectre
1217
1227
  class DefinitionContext
1218
1228
  include Delegate
1219
1229
 
1220
- attr_reader :id, :name, :desc, :parent, :full_desc, :children, :specs, :file
1230
+ attr_reader :id, :name, :desc, :parent, :full_desc, :specs, :file
1221
1231
 
1222
- def initialize desc, file, parent = nil
1232
+ def initialize desc, file, engine, parent = nil
1233
+ @engine = engine
1223
1234
  @parent = parent
1224
1235
  @desc = desc
1225
1236
  @file = file
1226
- @children = []
1227
1237
  @specs = []
1228
1238
 
1229
1239
  @setups = []
@@ -1236,6 +1246,8 @@ module Spectre
1236
1246
  @name = @parent.name + '-' + @name unless @parent.nil?
1237
1247
 
1238
1248
  @full_desc = @parent.nil? ? @desc : "#{@parent.full_desc} #{@desc}"
1249
+
1250
+ @engine.contexts << self
1239
1251
  end
1240
1252
 
1241
1253
  ##
@@ -1245,13 +1257,6 @@ module Spectre
1245
1257
  @parent ? @parent.root : self
1246
1258
  end
1247
1259
 
1248
- ##
1249
- # A flattened list of all specs including those of child contexts.
1250
- #
1251
- def all_specs
1252
- @specs + @children.map(&:all_specs).flatten
1253
- end
1254
-
1255
1260
  ##
1256
1261
  # Creates a new sub context with the given block.
1257
1262
  #
@@ -1261,8 +1266,7 @@ module Spectre
1261
1266
  .gsub(/:in .*/, '')
1262
1267
  .gsub(Dir.pwd, '.')
1263
1268
 
1264
- context = DefinitionContext.new(desc, file, self)
1265
- @children << context
1269
+ context = DefinitionContext.new(desc, file, @engine, self)
1266
1270
  context.instance_eval(&)
1267
1271
  end
1268
1272
 
@@ -1313,8 +1317,14 @@ module Spectre
1313
1317
 
1314
1318
  with ||= [nil]
1315
1319
 
1316
- with.each_with_index do |data, _index|
1317
- spec_index = root.all_specs.count + 1
1320
+ initial_index = @engine
1321
+ .contexts
1322
+ .select { |x| x.root.name == root.name }
1323
+ .flat_map(&:specs)
1324
+ .count + 1
1325
+
1326
+ with.each_with_index do |data, index|
1327
+ spec_index = initial_index + index
1318
1328
  name = "#{root.name}-#{spec_index}"
1319
1329
 
1320
1330
  spec = Specification.new(self, name, desc, tags, data, file, block)
@@ -1324,23 +1334,23 @@ module Spectre
1324
1334
  end
1325
1335
 
1326
1336
  # :nodoc:
1327
- def run engine, specs
1337
+ def run specs
1328
1338
  runs = []
1329
1339
 
1330
- return runs unless all_specs.any? { |x| specs.include? x }
1331
-
1332
1340
  selected = @specs.select { |x| specs.include? x }
1333
1341
 
1334
- engine.formatter.scope(@desc, self) do
1342
+ return runs if selected.empty?
1343
+
1344
+ @engine.formatter.scope(@desc, self) do
1335
1345
  if selected.any?
1336
1346
  setup_bag = nil
1337
1347
 
1338
1348
  if @setups.any?
1339
- setup_run = RunContext.new(engine, self, :setup) do |run_context|
1349
+ setup_run = RunContext.new(@engine, self, :setup) do |run_context|
1340
1350
  @setups.each do |block|
1341
- engine.formatter.scope('setup', :setup) do
1342
- engine.logger.correlate do
1343
- engine.logger.debug("setup \"#{@desc}\"")
1351
+ @engine.formatter.scope('setup', :setup) do
1352
+ @engine.logger.correlate do
1353
+ @engine.logger.debug("setup \"#{@desc}\"")
1344
1354
  run_context.execute(nil, &block)
1345
1355
  end
1346
1356
  end
@@ -1355,18 +1365,18 @@ module Spectre
1355
1365
  # Only run specs if setup was successful
1356
1366
  if runs.all? { |x| x.status == :success }
1357
1367
  runs += selected.map do |spec|
1358
- engine.logger.correlate do
1359
- spec.run(engine, @befores, @afters, setup_bag)
1368
+ @engine.logger.correlate do
1369
+ spec.run(@engine, @befores, @afters, setup_bag)
1360
1370
  end
1361
1371
  end
1362
1372
  end
1363
1373
 
1364
1374
  if @teardowns.any?
1365
- runs << RunContext.new(engine, self, :teardown, setup_bag) do |run_context|
1375
+ runs << RunContext.new(@engine, self, :teardown, setup_bag) do |run_context|
1366
1376
  @teardowns.each do |block|
1367
- engine.formatter.scope('teardown', :teardown) do
1368
- engine.logger.correlate do
1369
- engine.logger.debug("teardown \"#{@desc}\"")
1377
+ @engine.formatter.scope('teardown', :teardown) do
1378
+ @engine.logger.correlate do
1379
+ @engine.logger.debug("teardown \"#{@desc}\"")
1370
1380
  run_context.execute(nil, &block)
1371
1381
  end
1372
1382
  end
@@ -1375,9 +1385,12 @@ module Spectre
1375
1385
  end
1376
1386
  end
1377
1387
 
1378
- @children.each do |context|
1379
- engine.logger.correlate do
1380
- runs += context.run(engine, specs)
1388
+ @engine
1389
+ .contexts
1390
+ .select { |x| x.parent == self }
1391
+ .each do |context|
1392
+ @engine.logger.correlate do
1393
+ runs += context.run(specs)
1381
1394
  end
1382
1395
  end
1383
1396
  end
@@ -1554,9 +1567,11 @@ module Spectre
1554
1567
  resource_files = Dir.glob File.join(resource_path, '**/*')
1555
1568
 
1556
1569
  resource_files.each do |file|
1557
- file.slice! resource_path
1558
- file = file[1..]
1559
- @resources[file] = File.expand_path File.join(resource_path, file)
1570
+ relative_file = file
1571
+ .delete_prefix(resource_path)
1572
+ .delete_prefix('/')
1573
+
1574
+ @resources[relative_file] = File.expand_path(file)
1560
1575
  end
1561
1576
  end
1562
1577
 
@@ -1601,8 +1616,7 @@ module Spectre
1601
1616
  tag_filter = config['tags'] || []
1602
1617
 
1603
1618
  @contexts
1604
- .map(&:all_specs)
1605
- .flatten
1619
+ .flat_map(&:specs)
1606
1620
  .select do |spec|
1607
1621
  (spec_filter.empty? and tag_filter.empty?) or
1608
1622
  spec_filter.any? { |x| spec.name.match?("^#{x.gsub('*', '.*')}$") } or
@@ -1624,10 +1638,9 @@ module Spectre
1624
1638
 
1625
1639
  list
1626
1640
  .group_by { |x| x.parent.root }
1627
- .map do |context, specs|
1628
- context.run(self, specs)
1641
+ .flat_map do |context, specs|
1642
+ context.run(specs)
1629
1643
  end
1630
- .flatten
1631
1644
  rescue Interrupt
1632
1645
  # Do nothing here
1633
1646
  end
@@ -1661,20 +1674,15 @@ module Spectre
1661
1674
  ##
1662
1675
  # Describe a test subject
1663
1676
  #
1664
- def describe(name, &)
1677
+ def describe(desc, &)
1665
1678
  file = caller
1666
1679
  .first
1667
1680
  .gsub(/:in .*/, '')
1668
1681
  .gsub(Dir.pwd, '.')
1669
1682
 
1670
- main_context = @contexts.find { |x| x.desc == name }
1671
-
1672
- if main_context.nil?
1673
- main_context = DefinitionContext.new(name, file)
1674
- @contexts << main_context
1675
- end
1676
-
1677
- main_context.instance_eval(&)
1683
+ DefinitionContext
1684
+ .new(desc, file, self)
1685
+ .instance_eval(&)
1678
1686
  end
1679
1687
 
1680
1688
  ##
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectre-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Neubauer
@@ -13,72 +13,86 @@ dependencies:
13
13
  name: debug
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '1.0'
18
+ version: '0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - "~>"
23
+ - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '1.0'
25
+ version: '0'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: ectoplasm
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '1.4'
32
+ version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '1.4'
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: fiddle
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: logger
42
56
  requirement: !ruby/object:Gem::Requirement
43
57
  requirements:
44
- - - "~>"
58
+ - - ">="
45
59
  - !ruby/object:Gem::Version
46
- version: '1.0'
60
+ version: '0'
47
61
  type: :runtime
48
62
  prerelease: false
49
63
  version_requirements: !ruby/object:Gem::Requirement
50
64
  requirements:
51
- - - "~>"
65
+ - - ">="
52
66
  - !ruby/object:Gem::Version
53
- version: '1.0'
67
+ version: '0'
54
68
  - !ruby/object:Gem::Dependency
55
69
  name: ostruct
56
70
  requirement: !ruby/object:Gem::Requirement
57
71
  requirements:
58
- - - "~>"
72
+ - - ">="
59
73
  - !ruby/object:Gem::Version
60
- version: '0.1'
74
+ version: '0'
61
75
  type: :runtime
62
76
  prerelease: false
63
77
  version_requirements: !ruby/object:Gem::Requirement
64
78
  requirements:
65
- - - "~>"
79
+ - - ">="
66
80
  - !ruby/object:Gem::Version
67
- version: '0.1'
81
+ version: '0'
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: stringio
70
84
  requirement: !ruby/object:Gem::Requirement
71
85
  requirements:
72
- - - "~>"
86
+ - - ">="
73
87
  - !ruby/object:Gem::Version
74
- version: '3.0'
88
+ version: '0'
75
89
  type: :runtime
76
90
  prerelease: false
77
91
  version_requirements: !ruby/object:Gem::Requirement
78
92
  requirements:
79
- - - "~>"
93
+ - - ">="
80
94
  - !ruby/object:Gem::Version
81
- version: '3.0'
95
+ version: '0'
82
96
  description: A DSL and command line tool to describe and run automated tests
83
97
  email:
84
98
  - christian.neubauer@ionos.com