sus 0.20.3 → 0.21.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a47f7f10111ec9ad45da1d73eced17433ac9cd5c3a7ccf5ab89e5b0d035b9715
4
- data.tar.gz: 34d46a116559b3b41d991910fed083903f2074b18c5887ab0c84dc72a4a28707
3
+ metadata.gz: 8653cb936d27d9e33250698daac7861a3235699ae90e6263a6d79d33dd24b4bd
4
+ data.tar.gz: '0516931df8c4f34c61ab56cd75d65e29adc414e8d39797d79e8ba273af356e6e'
5
5
  SHA512:
6
- metadata.gz: c348795bf5c272968060506cd0db933724b4210a36bad55d60088371ee70731aabd66aa6bd07a5c9df4bc9e6a9a59c094e28f7415b9175ba379486f23ccf07d8
7
- data.tar.gz: 920a983053b676658d1aafab0fcce16b178203e69c5d949f70426ed874d00ed2026fe30da2b97e0a36b904433206c3d0bd299f6d541564d2dc9610550825fbeb
6
+ metadata.gz: 8c8a8fd1d650280a873af340909fc55bfe3a3fa6fc510fb55dfc42a696a58beee78450d88d11340785d084e94c9a5bfedb85751f9f13cc0d61697cb7bfb2738c
7
+ data.tar.gz: ebb26520158d23db914fc931afd6e001e2839fcaeff3f20b6734ab2f0a0c7d644a61f1f74f84ccf3af2f7e302954aa1244d792320e25dcc5f30e7e866b3e38a6
checksums.yaml.gz.sig CHANGED
Binary file
data/bin/sus-host CHANGED
@@ -15,12 +15,14 @@ count = Etc.nprocessors
15
15
 
16
16
  $stdout.sync = true
17
17
 
18
+ require_relative '../lib/sus/output/structured'
19
+
18
20
  input = $stdin.dup
19
21
  $stdin.reopen(File::NULL)
20
22
  output = $stdout.dup
21
23
  $stdout.reopen($stderr)
22
24
 
23
- def failure_messages_for(assertions)
25
+ def messages_for(assertions)
24
26
  messages = []
25
27
 
26
28
  assertions.each_failure do |failure|
@@ -63,17 +65,19 @@ while line = input.gets
63
65
  output.puts JSON.generate({started: job.identity})
64
66
  end
65
67
 
66
- assertions = Sus::Assertions.new(measure: true)
68
+ structured_output = Sus::Output::Structured.buffered(output, job.identity)
69
+
70
+ assertions = Sus::Assertions.new(output: structured_output, measure: true)
67
71
  job.call(assertions)
68
72
  results.push(assertions)
69
73
 
70
74
  guard.synchronize do
71
75
  if assertions.passed?
72
- output.puts JSON.generate({passed: job.identity, duration: assertions.clock.ms})
76
+ output.puts JSON.generate({passed: job.identity, messages: messages_for(assertions), duration: assertions.clock.ms})
73
77
  elsif assertions.errored?
74
- output.puts JSON.generate({errored: job.identity, messages: failure_messages_for(assertions), duration: assertions.clock.ms})
78
+ output.puts JSON.generate({errored: job.identity, messages: messages_for(assertions), duration: assertions.clock.ms})
75
79
  else
76
- output.puts JSON.generate({failed: job.identity, messages: failure_messages_for(assertions), duration: assertions.clock.ms})
80
+ output.puts JSON.generate({failed: job.identity, messages: messages_for(assertions), duration: assertions.clock.ms})
77
81
  end
78
82
  end
79
83
  end
@@ -187,13 +187,13 @@ module Sus
187
187
  @passed << assert
188
188
 
189
189
  if !@orientation || @verbose
190
- @output.puts(:indent, *pass_prefix, message || "assertion passed", backtrace)
190
+ @output.assert(condition, @orientation, message || "assertion passed", backtrace)
191
191
  end
192
192
  else
193
193
  @failed << assert
194
194
 
195
195
  if @orientation || @verbose
196
- @output.puts(:indent, *fail_prefix, message || "assertion failed", backtrace)
196
+ @output.assert(condition, @orientation, message || "assertion failed", backtrace)
197
197
  end
198
198
  end
199
199
  end
@@ -222,12 +222,21 @@ module Sus
222
222
  end
223
223
 
224
224
  def skip(reason)
225
- @output.puts(:indent, :skipped, skip_prefix, reason)
225
+ @output.skip(reason, @identity&.scoped)
226
+
226
227
  @skipped << self
227
228
  end
228
229
 
229
- def inform(message)
230
- @output.puts(:indent, :inform, inform_prefix, message)
230
+ def inform(message = nil)
231
+ if message.nil? and block_given?
232
+ begin
233
+ message = yield
234
+ rescue => error
235
+ message = error.full_message
236
+ end
237
+ end
238
+
239
+ @output.inform(message, @identity&.scoped)
231
240
  end
232
241
 
233
242
  # Add deferred assertions.
@@ -275,15 +284,8 @@ module Sus
275
284
 
276
285
  @errored << Error.new(identity, error)
277
286
 
278
- lines = error.message.split(/\r?\n/)
279
-
280
- @output.puts(:indent, *error_prefix, error.class, ": ", lines.shift)
281
-
282
- lines.each do |line|
283
- @output.puts(:indent, line)
284
- end
285
-
286
- @output.write(Output::Backtrace.for(error, @identity))
287
+ # TODO consider passing `identity`.
288
+ @output.error(error, @identity)
287
289
  end
288
290
 
289
291
  def nested(target, identity: nil, isolated: false, distinct: false, inverted: false, **options)
@@ -402,36 +404,5 @@ module Sus
402
404
  # @output.puts
403
405
  # end
404
406
  end
405
-
406
- PASSED_PREFIX = [:passed, "✓ "].freeze
407
- FAILED_PREFIX = [:failed, "✗ "].freeze
408
-
409
- def pass_prefix
410
- if @orientation
411
- PASSED_PREFIX
412
- else
413
- FAILED_PREFIX
414
- end
415
- end
416
-
417
- def fail_prefix
418
- if @orientation
419
- FAILED_PREFIX
420
- else
421
- PASSED_PREFIX
422
- end
423
- end
424
-
425
- def inform_prefix
426
- "ℹ "
427
- end
428
-
429
- def skip_prefix
430
- "⏸ "
431
- end
432
-
433
- def error_prefix
434
- [:errored, "⚠ "]
435
- end
436
407
  end
437
408
  end
data/lib/sus/it.rb CHANGED
@@ -45,13 +45,9 @@ module Sus
45
45
  end
46
46
 
47
47
  def handle_skip(instance, assertions)
48
- reason = catch(:skip) do
48
+ catch(:skip) do
49
49
  return instance.call
50
50
  end
51
-
52
- assertions.skip(reason)
53
-
54
- return nil
55
51
  end
56
52
  end
57
53
 
@@ -62,7 +58,10 @@ module Sus
62
58
  end
63
59
 
64
60
  class Base
61
+ # Skip the current test with a reason.
62
+ # @parameter reason [String] The reason for skipping the test.
65
63
  def skip(reason)
64
+ @__assertions__.skip(reason)
66
65
  throw :skip, reason
67
66
  end
68
67
  end
@@ -75,6 +75,26 @@ module Sus
75
75
  @chunks << [:puts, *arguments]
76
76
  @tee&.puts(*arguments)
77
77
  end
78
+
79
+ def assert(*arguments)
80
+ @chunks << [:assert, *arguments]
81
+ @tee&.assert(*arguments)
82
+ end
83
+
84
+ def skip(*arguments)
85
+ @chunks << [:skip, *arguments]
86
+ @tee&.skip(*arguments)
87
+ end
88
+
89
+ def error(*arguments)
90
+ @chunks << [:error, *arguments]
91
+ @tee&.error(*arguments)
92
+ end
93
+
94
+ def inform(*arguments)
95
+ @chunks << [:inform, *arguments]
96
+ @tee&.inform(*arguments)
97
+ end
78
98
  end
79
99
  end
80
100
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2023, by Samuel Williams.
5
+
6
+ module Sus
7
+ # Styled output output.
8
+ module Output
9
+ module Messages
10
+ PASSED_PREFIX = [:passed, "✓ "].freeze
11
+ FAILED_PREFIX = [:failed, "✗ "].freeze
12
+
13
+ def pass_prefix(orientation)
14
+ if orientation
15
+ PASSED_PREFIX
16
+ else
17
+ FAILED_PREFIX
18
+ end
19
+ end
20
+
21
+ def fail_prefix(orientation)
22
+ if orientation
23
+ FAILED_PREFIX
24
+ else
25
+ PASSED_PREFIX
26
+ end
27
+ end
28
+
29
+ # If the orientation is true, and the test passed, then it is a successful outcome.
30
+ # If the orientation is false, and the test failed, then it is a successful outcome.
31
+ # Otherwise, it is a failed outcome.
32
+ #
33
+ # @parameter condition [Boolean] The result of the test.
34
+ # @parameter orientation [Boolean] The orientation of the assertions.
35
+ # @parameter message [String] The message to display.
36
+ # @parameter backtrace [Array] The backtrace to display.
37
+ def assert(condition, orientation, message, backtrace)
38
+ if condition
39
+ self.puts(:indent, *pass_prefix(orientation), message, backtrace)
40
+ else
41
+ self.puts(:indent, *fail_prefix(orientation), message, backtrace)
42
+ end
43
+ end
44
+
45
+ def skip_prefix
46
+ "⏸ "
47
+ end
48
+
49
+ def skip(reason, identity)
50
+ self.puts(:indent, :skipped, skip_prefix, reason)
51
+ end
52
+
53
+ def error_prefix
54
+ [:errored, "⚠ "]
55
+ end
56
+
57
+ def error(error, identity)
58
+ lines = error.message.split(/\r?\n/)
59
+
60
+ self.puts(:indent, *error_prefix, error.class, ": ", lines.shift)
61
+
62
+ lines.each do |line|
63
+ self.puts(:indent, line)
64
+ end
65
+
66
+ self.write(Output::Backtrace.for(error, identity))
67
+ end
68
+
69
+ def inform_prefix
70
+ "ℹ "
71
+ end
72
+
73
+ def inform(message, identity)
74
+ self.puts(:indent, :inform, inform_prefix, message)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -3,13 +3,14 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2021-2022, by Samuel Williams.
5
5
 
6
- require 'io/console'
7
- require 'stringio'
6
+ require_relative 'messages'
8
7
 
9
8
  module Sus
10
9
  # Styled output output.
11
10
  module Output
12
11
  class Null
12
+ include Messages
13
+
13
14
  def initialize
14
15
  end
15
16
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2023, by Samuel Williams.
5
+
6
+ require_relative 'null'
7
+
8
+ module Sus
9
+ # Styled output output.
10
+ module Output
11
+ class Structured < Null
12
+ def self.buffered(...)
13
+ Buffered.new(self.new(...))
14
+ end
15
+
16
+ def initialize(io, identity = nil)
17
+ @io = io
18
+ @identity = identity
19
+ end
20
+
21
+ def skip(reason, identity)
22
+ inform(reason.to_s, identity)
23
+ end
24
+
25
+ def inform(message, identity)
26
+ unless message.is_a?(String)
27
+ message = message.inspect
28
+ end
29
+
30
+ @io.puts(JSON.generate({
31
+ inform: @identity,
32
+ message: {
33
+ text: message,
34
+ location: identity&.to_location,
35
+ }
36
+ }))
37
+
38
+ @io.flush
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,13 +3,14 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2021-2022, by Samuel Williams.
5
5
 
6
- require 'io/console'
6
+ require_relative 'messages'
7
7
  require_relative 'buffered'
8
8
 
9
9
  module Sus
10
- # Styled io io.
11
10
  module Output
12
11
  class Text
12
+ include Messages
13
+
13
14
  def initialize(io)
14
15
  @io = io
15
16
 
data/lib/sus/tree.rb CHANGED
@@ -20,7 +20,7 @@ module Sus
20
20
 
21
21
  def to_json(options = nil)
22
22
  traverse do |context|
23
- [context.identity, context.description, context.leaf?]
23
+ [context.identity.to_s, context.description.to_s, context.leaf?]
24
24
  end.to_json(options)
25
25
  end
26
26
  end
data/lib/sus/version.rb CHANGED
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2021-2022, by Samuel Williams.
5
5
 
6
6
  module Sus
7
- VERSION = "0.20.3"
7
+ VERSION = "0.21.1"
8
8
  end
data.tar.gz.sig CHANGED
@@ -1,4 +1 @@
1
- y&\�m�>Q`k҄���Rn����!���C�ʈ`�+\H귝��ې�zMH�<�����@Fe��&Y@��M��� >a[i�3��m
2
- +�σ�+�1hz1�������\
3
- ��bfb�e���:��٘+�Q��5�f,���s�����`ֳD���V����d���>�q�w`8k��ndF�Р��7��i�a{�Q';O��bc��p�� 7��Υod��
4
- C��G���pY�/,��j�i��A�#R\H���NX��_'��,]�a7�_���O�1������;⺊�z��4E�����{g]���Z;h�!�v�
1
+ #�<kFK��Z{��MXV{����"}�f�W��i���w�~t��EB-o��зv��������^O%.�ztlx.)�=�˲F�3'��"��������Z��<@���"�(u��슥Xa�m4W�v��g��҂ǍfbT�9�'���&9d��%)��zԎl9��;��{�(g��
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.3
4
+ version: 0.21.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -38,7 +38,7 @@ cert_chain:
38
38
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
39
39
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
40
40
  -----END CERTIFICATE-----
41
- date: 2023-03-01 00:00:00.000000000 Z
41
+ date: 2023-06-14 00:00:00.000000000 Z
42
42
  dependencies:
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: bake-test
@@ -125,9 +125,11 @@ files:
125
125
  - lib/sus/output/bar.rb
126
126
  - lib/sus/output/buffered.rb
127
127
  - lib/sus/output/lines.rb
128
+ - lib/sus/output/messages.rb
128
129
  - lib/sus/output/null.rb
129
130
  - lib/sus/output/progress.rb
130
131
  - lib/sus/output/status.rb
132
+ - lib/sus/output/structured.rb
131
133
  - lib/sus/output/text.rb
132
134
  - lib/sus/output/xterm.rb
133
135
  - lib/sus/raise_exception.rb
metadata.gz.sig CHANGED
Binary file