console 1.11.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 149a9d0738e731ea3ef3159cd25a449f663070406dfa232538a5996fb93c9ce9
4
- data.tar.gz: 212772395d4aef7dc7a510d6630e11dfabeb4c8cf2c70f5d272c279a3d2a32ef
3
+ metadata.gz: 43a78b129f0b1f778d063513a3726aaa832390761f3987fb3b1b77286f51af1a
4
+ data.tar.gz: b790c9b840bd37bfcbd6e7f98de70e45bf2d27d049c54b2f9763070edc318a2c
5
5
  SHA512:
6
- metadata.gz: d02021cfb6dbf99651d5f1b8653394dd59f2c830b0a62b8c394b70b275030cd2c066a786a9cb1281df55029f9a69455c00a73a1763785cba3a5ccf8769766654
7
- data.tar.gz: be05f291ccae55c3a6cce6ed2e5e79fa968682d856bcc502693408c69cc85b563017e8505a0459f6cb0d628bbdc57b58efd28146b460e09b45695652e6263145
6
+ metadata.gz: f58e0e37313d0388c439c80a06e3583f57fa96271be8bd1f1e28e3f4a973ba46618143629af6474bc812b8395c51ace42af4de6a5dcc92f281eba9ce1d66d40a
7
+ data.tar.gz: b472be4850adac00472c1abfcadf3f65fc3d1ad4c180d51eb7ef15cf71831757cc411f393b40ca5b71155d9881bb83a445b3fca1ab481e2a2ae93ada1da62158
checksums.yaml.gz.sig ADDED
@@ -0,0 +1 @@
1
+ ���u��i��7k�'��È\��a�W�a�0��]:X<�Qw��J��ˈ�
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -33,6 +35,10 @@ module Console
33
35
  @buffer.last
34
36
  end
35
37
 
38
+ def include?(pattern)
39
+ JSON.dump(@buffer).include?(pattern)
40
+ end
41
+
36
42
  def clear
37
43
  @buffer.clear
38
44
  end
data/lib/console/clock.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,4 +1,5 @@
1
- # frozen_string_literals: true
1
+ # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,8 +29,8 @@ module Console
27
29
  def to_h
28
30
  end
29
31
 
30
- def as_json
31
- to_h
32
+ def to_json(*arguments)
33
+ JSON.generate([self.class, to_h], *arguments)
32
34
  end
33
35
 
34
36
  def format(buffer, terminal)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -26,13 +28,14 @@ module Console
26
28
  def self.for(*arguments, **options)
27
29
  # Extract out the command environment:
28
30
  if arguments.first.is_a?(Hash)
29
- self.new(*arguments, **options)
31
+ environment = arguments.shift
32
+ self.new(environment, arguments, options)
30
33
  else
31
- self.new(nil, arguments, **options)
34
+ self.new(nil, arguments, options)
32
35
  end
33
36
  end
34
37
 
35
- def initialize(environment, *arguments, **options)
38
+ def initialize(environment, arguments, options)
36
39
  @environment = environment
37
40
  @arguments = arguments
38
41
  @options = options
@@ -53,7 +56,11 @@ module Console
53
56
  end
54
57
 
55
58
  def to_h
56
- {environment: @environment, arguments: @arguments, options: @options}
59
+ Hash.new.tap do |hash|
60
+ hash[:environment] = @environment if @environment&.any?
61
+ hash[:arguments] = @arguments if @arguments&.any?
62
+ hash[:options] = @options if @options&.any?
63
+ end
57
64
  end
58
65
 
59
66
  def format(output, terminal, verbose)
data/lib/console/event.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -26,11 +28,12 @@ module Console
26
28
  class Filter
27
29
  def self.[] **levels
28
30
  klass = Class.new(self)
31
+ min_level, max_level = levels.values.minmax
29
32
 
30
33
  klass.instance_exec do
31
34
  const_set(:LEVELS, levels)
32
- const_set(:MINIMUM_LEVEL, levels.values.min)
33
- const_set(:MAXIMUM_LEVEL, levels.values.max)
35
+ const_set(:MINIMUM_LEVEL, min_level)
36
+ const_set(:MAXIMUM_LEVEL, max_level)
34
37
 
35
38
  levels.each do |name, level|
36
39
  const_set(name.to_s.upcase, level)
@@ -102,7 +105,7 @@ module Console
102
105
  end
103
106
 
104
107
  def all!
105
- @level = -1
108
+ @level = self.class::MINIMUM_LEVEL - 1
106
109
  end
107
110
 
108
111
  # You can enable and disable logging for classes. This function checks if logging for a given subject is enabled.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -18,12 +20,14 @@
18
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
21
  # THE SOFTWARE.
20
22
 
23
+ require_relative 'output'
21
24
  require_relative 'filter'
22
25
  require_relative 'measure'
23
26
  require_relative 'progress'
24
27
 
25
28
  require_relative 'resolver'
26
29
  require_relative 'terminal/logger'
30
+ require_relative 'serialized/logger'
27
31
 
28
32
  require 'fiber/local'
29
33
 
@@ -35,7 +39,7 @@ module Console
35
39
  # You can also specify CONSOLE_LEVEL=debug or CONSOLE_LEVEL=info in environment.
36
40
  # https://mislav.net/2011/06/ruby-verbose-mode/ has more details about how it all fits together.
37
41
  def self.default_log_level(env = ENV)
38
- if level = (env['CONSOLE_LEVEL'] || env['CONSOLE_LOG_LEVEL'])
42
+ if level = env['CONSOLE_LEVEL']
39
43
  LEVELS[level.to_sym] || level.to_i
40
44
  elsif $DEBUG
41
45
  DEBUG
@@ -51,17 +55,25 @@ module Console
51
55
  !$VERBOSE.nil? || env['CONSOLE_VERBOSE']
52
56
  end
53
57
 
54
- def self.default_logger(output, verbose: self.verbose?, level: self.default_log_level)
55
- terminal = Terminal::Logger.new(output, verbose: verbose)
58
+ def self.default_logger(output = $stderr, env = ENV, **options)
59
+ if options[:verbose].nil?
60
+ options[:verbose] = self.verbose?(env)
61
+ end
62
+
63
+ if options[:level].nil?
64
+ options[:level] = self.default_log_level(env)
65
+ end
66
+
67
+ output = Output.new(output, env, **options)
68
+ logger = self.new(output, **options)
56
69
 
57
- logger = self.new(terminal, verbose: verbose, level: level)
58
70
  Resolver.default_resolver(logger)
59
71
 
60
72
  return logger
61
73
  end
62
74
 
63
75
  def self.local
64
- self.default_logger($stderr)
76
+ self.default_logger
65
77
  end
66
78
 
67
79
  DEFAULT_LEVEL = 1
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative 'xterm'
24
+ require_relative 'json'
25
+
26
+ module Console
27
+ module Output
28
+ module Default
29
+ def self.new(output, **options)
30
+ output ||= $stderr
31
+
32
+ if output.tty?
33
+ XTerm.new(output, **options)
34
+ else
35
+ JSON.new(output, **options)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative '../serialized/logger'
24
+
25
+ module Console
26
+ module Output
27
+ module JSON
28
+ def self.new(output, **options)
29
+ Serialized::Logger.new(output, format: ::JSON, **options)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative '../serialized/logger'
24
+
25
+ module Console
26
+ module Output
27
+ class Sensitive
28
+ def initialize(output, **options)
29
+ @output = output
30
+ end
31
+
32
+ REDACT = /
33
+ phone
34
+ | email
35
+ | full_?name
36
+ | first_?name
37
+ | last_?name
38
+
39
+ | device_name
40
+ | user_agent
41
+
42
+ | zip
43
+ | address
44
+ | location
45
+ | latitude
46
+ | longitude
47
+
48
+ | ip
49
+ | gps
50
+
51
+ | sex
52
+ | gender
53
+
54
+ | token
55
+ | password
56
+ /xi
57
+
58
+ def redact?(text)
59
+ text.match?(REDACT)
60
+ end
61
+
62
+ def redact_hash(arguments, filter)
63
+ arguments.transform_values do |value|
64
+ redact(value, filter)
65
+ end
66
+ end
67
+
68
+ def redact_array(array, filter)
69
+ array.map do |value|
70
+ redact(value, filter)
71
+ end
72
+ end
73
+
74
+ def redact(argument, filter)
75
+ case argument
76
+ when String
77
+ if filter
78
+ filter.call(argument)
79
+ elsif redact?(argument)
80
+ "[REDACTED]"
81
+ else
82
+ argument
83
+ end
84
+ when Array
85
+ redact_array(argument, filter)
86
+ when Hash
87
+ redact_hash(argument, filter)
88
+ else
89
+ redact(argument.to_s, filter)
90
+ end
91
+ end
92
+
93
+ class Filter
94
+ def initialize(substitutions)
95
+ @substitutions = substitutions
96
+ @pattern = Regexp.union(substitutions.keys)
97
+ end
98
+
99
+ def call(text)
100
+ text.gsub(@pattern, @substitutions)
101
+ end
102
+ end
103
+
104
+ def call(subject = nil, *arguments, sensitive: true, **options, &block)
105
+ if sensitive
106
+ if sensitive.respond_to?(:call)
107
+ filter = sensitive
108
+ elsif sensitive.is_a?(Hash)
109
+ filter = Filter.new(sensitive)
110
+ end
111
+
112
+ subject = redact(subject, filter)
113
+ arguments = redact_array(arguments, filter)
114
+ end
115
+
116
+ @output.call(subject, *arguments, **options)
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative '../terminal/logger'
24
+
25
+ module Console
26
+ module Output
27
+ module Text
28
+ def self.new(output, **options)
29
+ Terminal::Logger.new(output, format: Terminal::Text, **options)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative '../terminal/logger'
24
+
25
+ module Console
26
+ module Output
27
+ module XTerm
28
+ def self.new(output, **options)
29
+ Terminal::Logger.new(output, format: Terminal::XTerm, **options)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require_relative 'output/default'
24
+ require_relative 'output/json'
25
+ require_relative 'output/text'
26
+ require_relative 'output/xterm'
27
+
28
+ module Console
29
+ module Output
30
+ def self.new(output = nil, env = ENV, **options)
31
+ if names = env['CONSOLE_OUTPUT']
32
+ names = names.split(',').reverse
33
+
34
+ names.inject(output) do |output, name|
35
+ Output.const_get(name).new(output, **options)
36
+ end
37
+ else
38
+ return Output::Default.new(output, **options)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -26,6 +28,8 @@ module Console
26
28
  #
27
29
  # e.g. `CONSOLE_WARN=Acorn,Banana CONSOLE_DEBUG=Cat` will set the log level for the classes Acorn and Banana to `warn` and Cat to `debug`. This overrides the default log level.
28
30
  #
31
+ # You can enable all log levels for a given class by using `CONSOLE_ON=MyClass`. Similarly you can disable all logging using `CONSOLE_OFF=MyClass`.
32
+ #
29
33
  # @parameter logger [Logger] A logger instance to set the logging levels on.
30
34
  # @parameter env [Hash] The environment to read levels from.
31
35
  #
@@ -33,23 +37,42 @@ module Console
33
37
  # @returns [Resolver] If there were custom logging levels, then the created resolver is returned.
34
38
  def self.default_resolver(logger, env = ENV)
35
39
  # Find all CONSOLE_<LEVEL> variables from environment:
36
- levels = Logger::LEVELS
40
+ levels = logger.class::LEVELS
37
41
  .map{|label, level| [level, env["CONSOLE_#{label.upcase}"]&.split(',')]}
38
42
  .to_h
39
43
  .compact
40
44
 
45
+ off_klasses = env['CONSOLE_OFF']&.split(',')
46
+ on_klasses = env['CONSOLE_ON']&.split(',')
47
+
48
+ resolver = nil
49
+
41
50
  # If we have any levels, then create a class resolver, and each time a class is resolved, set the log level for that class to the specified level:
42
- if levels.any?
43
- resolver = Resolver.new
51
+ if on_klasses&.any?
52
+ resolver ||= Resolver.new
53
+
54
+ resolver.bind(on_klasses) do |klass|
55
+ logger.enable(klass, logger.class::MINIMUM_LEVEL - 1)
56
+ end
57
+ end
58
+
59
+ if off_klasses&.any?
60
+ resolver ||= Resolver.new
44
61
 
45
- levels.each do |level, names|
46
- resolver.bind(names) do |klass|
47
- logger.enable(klass, level)
48
- end
62
+ resolver.bind(off_klasses) do |klass|
63
+ logger.disable(klass)
49
64
  end
65
+ end
66
+
67
+ levels.each do |level, names|
68
+ resolver ||= Resolver.new
50
69
 
51
- return resolver
70
+ resolver.bind(names) do |klass|
71
+ logger.enable(klass, level)
72
+ end
52
73
  end
74
+
75
+ return resolver
53
76
  end
54
77
 
55
78
  def initialize
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,10 +29,11 @@ require 'json'
27
29
  module Console
28
30
  module Serialized
29
31
  class Logger
30
- def initialize(io = $stderr, format: JSON)
32
+ def initialize(io = $stderr, format: JSON, verbose: false, **options)
31
33
  @io = io
32
34
  @start = Time.now
33
35
  @format = format
36
+ @verbose = verbose
34
37
  end
35
38
 
36
39
  attr :io
@@ -38,6 +41,11 @@ module Console
38
41
  attr :format
39
42
 
40
43
  def verbose!(value = true)
44
+ @verbose = true
45
+ end
46
+
47
+ def dump(record)
48
+ @format.dump(record)
41
49
  end
42
50
 
43
51
  def call(subject = nil, *arguments, severity: UNKNOWN, **options, &block)
@@ -53,25 +61,58 @@ module Console
53
61
  record[:subject] = subject
54
62
  end
55
63
 
56
- if arguments.any?
57
- record[:arguments] = arguments
58
- end
59
-
60
- if options.any?
61
- record[:options] = options
62
- end
64
+ message = arguments
63
65
 
64
66
  if block_given?
65
67
  if block.arity.zero?
66
- record[:message] = yield
68
+ message << yield
67
69
  else
68
70
  buffer = StringIO.new
69
71
  yield buffer
70
- record[:message] = buffer.string
72
+ message << buffer.string
71
73
  end
72
74
  end
73
75
 
74
- @io.puts(@format.dump(record))
76
+ if message.size == 1
77
+ record[:message] = message.first
78
+ elsif message.any?
79
+ record[:message] = message
80
+ end
81
+
82
+ if exception = find_exception(message)
83
+ record[:error] = {
84
+ kind: exception.class,
85
+ message: exception.message,
86
+ stack: format_stack(exception)
87
+ }
88
+ end
89
+
90
+ record.update(options)
91
+
92
+ @io.puts(self.dump(record))
93
+ end
94
+
95
+ private
96
+
97
+ def find_exception(message)
98
+ message.find{|part| part.is_a?(Exception)}
99
+ end
100
+
101
+ def format_stack(exception)
102
+ buffer = StringIO.new
103
+ format_backtrace(exception, buffer)
104
+ return buffer.string
105
+ end
106
+
107
+ def format_backtrace(exception, buffer)
108
+ buffer.puts exception.backtrace
109
+
110
+ if exception = exception.cause
111
+ buffer.puts
112
+ buffer.puts "Caused by: #{exception.class} #{exception.message}"
113
+
114
+ format_backtrace(exception, buffer)
115
+ end
75
116
  end
76
117
  end
77
118
  end
data/lib/console/split.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
3
4
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -55,11 +57,11 @@ module Console
55
57
  end
56
58
 
57
59
  class Logger
58
- def initialize(io = $stderr, verbose: nil, start_at: Terminal.start_at!, **options)
60
+ def initialize(io = $stderr, verbose: nil, start_at: Terminal.start_at!, format: nil, **options)
59
61
  @io = io
60
62
  @start_at = start_at
61
63
 
62
- @terminal = Terminal.for(io)
64
+ @terminal = format.nil? ? Terminal.for(io) : format.new(io)
63
65
 
64
66
  if verbose.nil?
65
67
  @verbose = !@terminal.colors?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -19,5 +21,5 @@
19
21
  # THE SOFTWARE.
20
22
 
21
23
  module Console
22
- VERSION = "1.11.1"
24
+ VERSION = "1.14.0"
23
25
  end
data/lib/console.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #
3
4
  # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
5
  #
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,14 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: console
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.1
4
+ version: 1.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2021-04-10 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
14
+ ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
15
+ MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
16
+ aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
17
+ AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
18
+ xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
19
+ eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
20
+ L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
21
+ 9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
22
+ E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
23
+ rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
24
+ w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
25
+ 8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
26
+ BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
27
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
28
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
29
+ CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
30
+ 9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
31
+ vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
32
+ x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
33
+ bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
34
+ Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
35
+ y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
36
+ RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
37
+ HiLJ8VOFx6w=
38
+ -----END CERTIFICATE-----
39
+ date: 2021-11-19 00:00:00.000000000 Z
12
40
  dependencies:
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: fiber-local
@@ -115,6 +143,12 @@ files:
115
143
  - lib/console/filter.rb
116
144
  - lib/console/logger.rb
117
145
  - lib/console/measure.rb
146
+ - lib/console/output.rb
147
+ - lib/console/output/default.rb
148
+ - lib/console/output/json.rb
149
+ - lib/console/output/sensitive.rb
150
+ - lib/console/output/text.rb
151
+ - lib/console/output/xterm.rb
118
152
  - lib/console/progress.rb
119
153
  - lib/console/resolver.rb
120
154
  - lib/console/serialized/logger.rb
@@ -143,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
177
  - !ruby/object:Gem::Version
144
178
  version: '0'
145
179
  requirements: []
146
- rubygems_version: 3.2.3
180
+ rubygems_version: 3.2.29
147
181
  signing_key:
148
182
  specification_version: 4
149
183
  summary: Beautiful logging for Ruby.
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ H�.������� �Y��Ʒ�~m�:�M�.�̄��@hu|��֊���{�#�2#�