lib/cli/ui.rb in cli-ui-2.2.3 vs lib/cli/ui.rb in cli-ui-2.3.0
- old
+ new
@@ -1,6 +1,7 @@
# typed: true
+# frozen_string_literal: true
unless defined?(T)
require('cli/ui/sorbet_runtime_stub')
end
@@ -14,10 +15,11 @@
autoload :Frame, 'cli/ui/frame'
autoload :OS, 'cli/ui/os'
autoload :Printer, 'cli/ui/printer'
autoload :Progress, 'cli/ui/progress'
autoload :Prompt, 'cli/ui/prompt'
+ autoload :Table, 'cli/ui/table'
autoload :Terminal, 'cli/ui/terminal'
autoload :Truncater, 'cli/ui/truncater'
autoload :Formatter, 'cli/ui/formatter'
autoload :Spinner, 'cli/ui/spinner'
autoload :Widgets, 'cli/ui/widgets'
@@ -143,14 +145,15 @@
#
# ==== Attributes
#
# * +input+ - input to format
# * +truncate_to+ - number of characters to truncate the string to (or nil)
+ # * +enable_color+ - should color be used? default to true unless output is redirected.
#
- sig { params(input: String, truncate_to: T.nilable(Integer)).returns(String) }
- def resolve_text(input, truncate_to: nil)
- formatted = CLI::UI::Formatter.new(input).format
+ sig { params(input: String, truncate_to: T.nilable(Integer), enable_color: T::Boolean).returns(String) }
+ def resolve_text(input, truncate_to: nil, enable_color: enable_color?)
+ formatted = CLI::UI::Formatter.new(input).format(enable_color: enable_color)
return formatted unless truncate_to
CLI::UI::Truncater.call(formatted, truncate_to)
end
@@ -229,29 +232,32 @@
color: T.nilable(Colorable),
failure_text: T.nilable(String),
success_text: T.nilable(String),
timing: T.any(T::Boolean, Numeric),
frame_style: FrameStylable,
+ to: IOLike,
block: T.nilable(T.proc.returns(T.type_parameter(:T))),
).returns(T.nilable(T.type_parameter(:T)))
end
def frame(
text,
color: Frame::DEFAULT_FRAME_COLOR,
failure_text: nil,
success_text: nil,
timing: block_given?,
frame_style: Frame.frame_style,
+ to: $stdout,
&block
)
CLI::UI::Frame.open(
text,
color: color,
failure_text: failure_text,
success_text: success_text,
timing: timing,
frame_style: frame_style,
+ to: to,
&block
)
end
# Convenience Method for +CLI::UI::Spinner.spin+
@@ -260,15 +266,19 @@
#
# * +args+ - arguments for +Spinner.open+
# * +block+ - block for +Spinner.open+
#
sig do
- params(title: String, auto_debrief: T::Boolean, block: T.proc.params(task: Spinner::SpinGroup::Task).void)
- .returns(T::Boolean)
+ params(
+ title: String,
+ auto_debrief: T::Boolean,
+ to: IOLike,
+ block: T.proc.params(task: Spinner::SpinGroup::Task).void,
+ ).returns(T::Boolean)
end
- def spinner(title, auto_debrief: true, &block)
- CLI::UI::Spinner.spin(title, auto_debrief: auto_debrief, &block)
+ def spinner(title, auto_debrief: true, to: $stdout, &block)
+ CLI::UI::Spinner.spin(title, auto_debrief: auto_debrief, to: to, &block)
end
# Convenience Method to override frame color using +CLI::UI::Frame.with_frame_color+
#
# ==== Attributes
@@ -327,30 +337,50 @@
yield
ensure
Thread.current[:no_cliui_frame_inset] = prev
end
- # Check whether colour is enabled in Formatter output. By default, colour
- # is enabled when STDOUT is a TTY; that is, when output has not been
- # redirected to another program or to a file.
+ # Check whether colour is enabled in Formatter, Frame, and Spinner output.
+ # By default, colour is enabled when STDOUT is a TTY; that is, when output
+ # has not been directed to another program or to a file.
#
sig { returns(T::Boolean) }
def enable_color?
@enable_color
end
- # Turn colour output in Formatter on or off.
+ # Turn colour in Formatter, Frame, and Spinner output on or off.
#
# ==== Attributes
#
# * +bool+ - true or false; enable or disable colour.
#
sig { params(bool: T::Boolean).void }
def enable_color=(bool)
@enable_color = !!bool
end
+ # Check whether cursor control is enabled in Formatter, Frame, and Spinner output.
+ # By default, cursor control is enabled when STDOUT is a TTY; that is, when output
+ # has not been directed to another program or to a file.
+ #
+ sig { returns(T::Boolean) }
+ def enable_cursor?
+ @enable_cursor
+ end
+
+ # Turn cursor control in Formatter, Frame, and Spinner output on or off.
+ #
+ # ==== Attributes
+ #
+ # * +bool+ - true or false; enable or disable cursor control.
+ #
+ sig { params(bool: T::Boolean).void }
+ def enable_cursor=(bool)
+ @enable_cursor = !!bool
+ end
+
# Set the default frame style.
# Convenience method for setting the default frame style with +CLI::UI::Frame.frame_style=+
#
# Raises ArgumentError if +frame_style+ is not valid
#
@@ -373,9 +403,12 @@
"\x1b]8;;#{url}\x1b\\#{text}\x1b]8;;\x1b\\"
end
end
self.enable_color = $stdout.tty?
+
+ # Shopify's CI system supports color, but not cursor control
+ self.enable_cursor = T.must($stdout.tty? && ENV['CI'].nil? && ENV['JOURNAL_STREAM'].nil?)
end
end
require 'cli/ui/stdout_router'