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'