console 1.28.1 → 1.29.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c1e55ddfff39c11445d128d77669db8d27047b5bb52451c0dcd41986b9efe99
4
- data.tar.gz: 314cd06dc220bc184899c393d68ef8e0387e92bbeb39522b2ec9ab11b408cb01
3
+ metadata.gz: 1fa166f5900ef3a9c90b337ce6dd57faa99527fd9746a47aa61bb7f7535e606d
4
+ data.tar.gz: c6d7d06fdd475006e000c3da6d65fdcd3a5c58e10c90afa8b380f795d45a16d1
5
5
  SHA512:
6
- metadata.gz: e2b5c3d3d01818a45f7680e07417c5c6bb805caa81c5a598d7a4c83fa77363cdbf241eb5f00327ff835c130ebe53994f34c923c50304c972d01b714fba638263
7
- data.tar.gz: 6cc85f8a898133e9af736f89b0d12cda37fdc46f2467131e89b6784842a8cdff9757f0981cf18c7ae0cbf1b21d005aaf4f7b9f647c891ec96b790833446c4fcd
6
+ metadata.gz: 620b134d260d72d3b69a57e455584d556d611aa8a441fbd7624722b1cfaf3541015335717b82da8ea2aa0682f94e2898c9f28c4162fa5b5842297035f81bd5c0
7
+ data.tar.gz: be9318b5f775a9bd33f5c8951ffae4b921dbe0618f209080645a3eb12dcd096ef092d94f1239564e03497961ebbfbbb926d43294b8b524a94486e6b62a835b1a
checksums.yaml.gz.sig CHANGED
Binary file
@@ -4,6 +4,7 @@
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
6
  require_relative "filter"
7
+ require_relative "output/failure"
7
8
 
8
9
  module Console
9
10
  # A general sink which captures all events into a buffer.
@@ -58,7 +59,7 @@ module Console
58
59
  @verbose
59
60
  end
60
61
 
61
- def call(subject = nil, *arguments, severity: UNKNOWN, event: nil, **options, &block)
62
+ def call(subject = nil, *arguments, severity: UNKNOWN, event: nil, **options, &block)
62
63
  record = {
63
64
  time: ::Time.now.iso8601,
64
65
  severity: severity,
@@ -28,9 +28,9 @@ module Console
28
28
  def self.log(subject, exception, **options)
29
29
  Console.error(subject, **self.for(exception).to_hash, **options)
30
30
  end
31
-
31
+
32
32
  attr_reader :exception
33
-
33
+
34
34
  def initialize(exception, root = Dir.getwd)
35
35
  @exception = exception
36
36
  @root = root
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright 2024, by Samuel Williams.
5
+
6
+ require_relative "logger"
7
+
8
+ module Console
9
+ # The public logger interface.
10
+ module Interface
11
+ # Get the current logger instance.
12
+ def logger
13
+ Logger.instance
14
+ end
15
+
16
+ # Set the current logger instance.
17
+ #
18
+ # The current logger instance is assigned per-fiber.
19
+ def logger= instance
20
+ Logger.instance= instance
21
+ end
22
+
23
+ # Emit a debug log message.
24
+ def debug(...)
25
+ Logger.instance.debug(...)
26
+ end
27
+
28
+ # Emit an informational log message.
29
+ def info(...)
30
+ Logger.instance.info(...)
31
+ end
32
+
33
+ # Emit a warning log message.
34
+ def warn(...)
35
+ Logger.instance.warn(...)
36
+ end
37
+
38
+ # Emit an error log message.
39
+ def error(...)
40
+ Logger.instance.error(...)
41
+ end
42
+
43
+ # Emit a fatal log message.
44
+ def fatal(...)
45
+ Logger.instance.fatal(...)
46
+ end
47
+
48
+ # Emit a log message with arbitrary arguments and options.
49
+ def call(...)
50
+ Logger.instance.call(...)
51
+ end
52
+ end
53
+ end
@@ -6,6 +6,8 @@
6
6
  # Copyright, 2021, by Robert Schulze.
7
7
 
8
8
  require_relative "output"
9
+ require_relative "output/failure"
10
+
9
11
  require_relative "filter"
10
12
  require_relative "event"
11
13
  require_relative "resolver"
@@ -47,6 +49,7 @@ module Console
47
49
  end
48
50
 
49
51
  output = Output.new(output, env, **options)
52
+
50
53
  logger = self.new(output, **options)
51
54
 
52
55
  Resolver.default_resolver(logger)
@@ -61,6 +64,9 @@ module Console
61
64
  DEFAULT_LEVEL = 1
62
65
 
63
66
  def initialize(output, **options)
67
+ # This is the expected default behaviour, but it may be nice to have a way to override it.
68
+ output = Output::Failure.new(output, **options)
69
+
64
70
  super(output, **options)
65
71
  end
66
72
 
@@ -69,20 +75,5 @@ module Console
69
75
 
70
76
  Progress.new(subject, total, **options)
71
77
  end
72
-
73
- def error(subject, *arguments, **options, &block)
74
- # This is a special case where we want to create a failure event from an exception.
75
- # It's common to see `Console.error(self, exception)` in code.
76
- if arguments.first.is_a?(Exception)
77
- exception = arguments.shift
78
- options[:event] = Event::Failure.for(exception)
79
- end
80
-
81
- super
82
- end
83
-
84
- def failure(subject, exception, **options)
85
- error(subject, event: Event::Failure.for(exception), **options)
86
- end
87
78
  end
88
79
  end
@@ -5,6 +5,7 @@
5
5
 
6
6
  require_relative "terminal"
7
7
  require_relative "serialized"
8
+ require_relative "failure"
8
9
 
9
10
  module Console
10
11
  module Output
@@ -13,10 +14,12 @@ module Console
13
14
  output ||= $stderr
14
15
 
15
16
  if output.tty?
16
- Terminal.new(output, **options)
17
+ output = Terminal.new(output, **options)
17
18
  else
18
- Serialized.new(output, **options)
19
+ output = Serialized.new(output, **options)
19
20
  end
21
+
22
+ return output
20
23
  end
21
24
  end
22
25
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2021-2024, by Samuel Williams.
5
+
6
+ require_relative "wrapper"
7
+ require_relative "../event/failure"
8
+
9
+ module Console
10
+ module Output
11
+ # A wrapper for outputting failure messages, which can include exceptions.
12
+ class Failure < Wrapper
13
+ def initialize(output, **options)
14
+ super(output, **options)
15
+ end
16
+
17
+ # The exception must be either the last argument or passed as an option.
18
+ def call(subject = nil, *arguments, exception: nil, **options, &block)
19
+ if exception.nil?
20
+ last = arguments.last
21
+ if last.is_a?(Exception)
22
+ options[:event] = Event::Failure.for(last)
23
+ end
24
+ else
25
+ options[:event] = Event::Failure.for(exception)
26
+ end
27
+
28
+ super(subject, *arguments, **options)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -9,6 +9,10 @@ module Console
9
9
  def initialize(...)
10
10
  end
11
11
 
12
+ def last_output
13
+ self
14
+ end
15
+
12
16
  def call(...)
13
17
  # Do nothing.
14
18
  end
@@ -10,11 +10,16 @@ require "fiber/annotation"
10
10
  module Console
11
11
  module Output
12
12
  class Serialized
13
- def initialize(output, format: Format.default, **options)
14
- @io = output
13
+ def initialize(io, format: Format.default, **options)
14
+ @io = io
15
15
  @format = format
16
16
  end
17
17
 
18
+ # This a final output that then writes to an IO object.
19
+ def last_output
20
+ self
21
+ end
22
+
18
23
  attr :io
19
24
  attr :format
20
25
 
@@ -78,6 +78,11 @@ module Console
78
78
  self.register_formatters
79
79
  end
80
80
 
81
+ # This a final output that then writes to an IO object.
82
+ def last_output
83
+ self
84
+ end
85
+
81
86
  attr :io
82
87
 
83
88
  attr_accessor :verbose
@@ -10,6 +10,12 @@ module Console
10
10
  @delegate = delegate
11
11
  end
12
12
 
13
+ attr :delegate
14
+
15
+ def last_output
16
+ @delegate.last_output
17
+ end
18
+
13
19
  def verbose!(value = true)
14
20
  @delegate.verbose!(value)
15
21
  end
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
6
  module Console
7
- VERSION = "1.28.1"
7
+ VERSION = "1.29.0"
8
8
  end
data/lib/console/warn.rb CHANGED
@@ -3,35 +3,31 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
+ require_relative "logger"
7
+
6
8
  module Console
7
9
  # Whether the current fiber is emitting a warning.
8
10
  Fiber.attr_accessor :console_warn
9
11
 
12
+ # Redirect warnings to Console.warn.
10
13
  module Warn
11
- def warn(*arguments, uplevel: nil, **options)
14
+ # Redirect warnings to {Console.warn}.
15
+ def warn(message, **options)
12
16
  fiber = Fiber.current
13
17
 
14
- # We do this to be extra pendantic about avoiding infinite recursion, i.e. if `Console.warn` some how calls `Kernel.warn` again, it would potentially cause infinite recursion. I'm not sure if this is a problem in practice, but I'd rather not find out the hard way...
18
+ # We do this to be extra pendantic about avoiding infinite recursion.
15
19
  return super if fiber.console_warn
16
20
 
17
- if uplevel
18
- options[:backtrace] = caller(uplevel, 1)
19
- end
20
-
21
- if arguments.last.is_a?(Exception)
22
- exception = arguments.pop
21
+ begin
22
+ fiber.console_warn = true
23
+ message.chomp!
23
24
 
24
- Console::Event::Failure.for(exception).emit(*arguments, severity: :warn)
25
- else
26
- begin
27
- fiber.console_warn = true
28
- Console.warn(*arguments, **options)
29
- ensure
30
- fiber.console_warn = false
31
- end
25
+ Console::Logger.instance.warn(message, **options)
26
+ ensure
27
+ fiber.console_warn = false
32
28
  end
33
29
  end
34
30
  end
35
31
 
36
- ::Kernel.prepend(Warn)
32
+ ::Warning.extend(Warn)
37
33
  end
data/lib/console.rb CHANGED
@@ -7,41 +7,8 @@
7
7
  # Copyright, 2021, by Cédric Boutillier.
8
8
 
9
9
  require_relative "console/version"
10
- require_relative "console/logger"
11
- require_relative "console/warn"
10
+ require_relative "console/interface"
12
11
 
13
12
  module Console
14
- class << self
15
- def logger
16
- Logger.instance
17
- end
18
-
19
- def logger= instance
20
- Logger.instance= instance
21
- end
22
-
23
- def debug(...)
24
- Logger.instance.debug(...)
25
- end
26
-
27
- def info(...)
28
- Logger.instance.info(...)
29
- end
30
-
31
- def warn(...)
32
- Logger.instance.warn(...)
33
- end
34
-
35
- def error(...)
36
- Logger.instance.error(...)
37
- end
38
-
39
- def fatal(...)
40
- Logger.instance.fatal(...)
41
- end
42
-
43
- def call(...)
44
- Logger.instance.call(...)
45
- end
46
- end
13
+ Console.extend(Interface)
47
14
  end
data/readme.md CHANGED
@@ -32,6 +32,12 @@ Please see the [project documentation](https://socketry.github.io/console/) for
32
32
 
33
33
  Please see the [project releases](https://socketry.github.io/console/releases/index) for all releases.
34
34
 
35
+ ### v1.29.0
36
+
37
+ - Don't make `Kernel#warn` redirection to `Console.warn` the default behavior, you must `require 'console/warn'` to enable it.
38
+ - Remove deprecated `Console::Logger#failure`.
39
+ - [Consistent Handling of Exceptions](https://socketry.github.io/console/releases/index#consistent-handling-of-exceptions)
40
+
35
41
  ### v1.28.0
36
42
 
37
43
  - Add support for `Kernel#warn` redirection to `Console.warn`.
data/releases.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Releases
2
2
 
3
+ ## v1.29.0
4
+
5
+ - Don't make `Kernel#warn` redirection to `Console.warn` the default behavior, you must `require 'console/warn'` to enable it.
6
+ - Remove deprecated `Console::Logger#failure`.
7
+
8
+ ### Consistent Handling of Exceptions
9
+
10
+ `Console.call` and all wrapper methods will now consistently handle exceptions that are the last positional argument or keyword argument. This means that the following code will work as expected:
11
+
12
+ ``` ruby
13
+ begin
14
+ rescue => error
15
+ # Last positional argument:
16
+ Console.warn(self, "There may be an issue", error)
17
+
18
+ # Keyword argument (preferable):
19
+ Console.error(self, "There is an issue", exception: error)
20
+ end
21
+ ```
22
+
3
23
  ## v1.28.0
4
24
 
5
25
  - Add support for `Kernel#warn` redirection to `Console.warn`.
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: console
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.28.1
4
+ version: 1.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -47,7 +47,7 @@ cert_chain:
47
47
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
48
48
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
49
49
  -----END CERTIFICATE-----
50
- date: 2024-11-05 00:00:00.000000000 Z
50
+ date: 2024-11-06 00:00:00.000000000 Z
51
51
  dependencies:
52
52
  - !ruby/object:Gem::Dependency
53
53
  name: fiber-annotation
@@ -110,9 +110,11 @@ files:
110
110
  - lib/console/filter.rb
111
111
  - lib/console/format.rb
112
112
  - lib/console/format/safe.rb
113
+ - lib/console/interface.rb
113
114
  - lib/console/logger.rb
114
115
  - lib/console/output.rb
115
116
  - lib/console/output/default.rb
117
+ - lib/console/output/failure.rb
116
118
  - lib/console/output/null.rb
117
119
  - lib/console/output/sensitive.rb
118
120
  - lib/console/output/serialized.rb
metadata.gz.sig CHANGED
Binary file