module CLI::UI::StdoutRouter

Constants

NotEnabled
WRITE_WITHOUT_CLI_UI

Attributes

duplicate_output_to[RW]

Public Class Methods

assert_enabled!() click to toggle source
# File lib/cli/ui/stdout_router.rb, line 178
def assert_enabled!
  raise NotEnabled unless enabled?
end
current_id() click to toggle source
# File lib/cli/ui/stdout_router.rb, line 174
def current_id
  Thread.current[:cliui_output_id]
end
disable() click to toggle source
# File lib/cli/ui/stdout_router.rb, line 205
def disable
  return false unless enabled?($stdout) && enabled?($stderr)
  deactivate($stdout)
  deactivate($stderr)
  true
end
enable() click to toggle source
# File lib/cli/ui/stdout_router.rb, line 194
def enable
  return false if enabled?($stdout) || enabled?($stderr)
  activate($stdout, :stdout)
  activate($stderr, :stderr)
  true
end
enabled?(stream = $stdout) click to toggle source
# File lib/cli/ui/stdout_router.rb, line 201
def enabled?(stream = $stdout)
  stream.respond_to?(WRITE_WITHOUT_CLI_UI)
end
ensure_activated() click to toggle source

TODO: remove this

# File lib/cli/ui/stdout_router.rb, line 190
def ensure_activated
  enable unless enabled?
end
with_enabled() { || ... } click to toggle source
# File lib/cli/ui/stdout_router.rb, line 182
def with_enabled
  enable
  yield
ensure
  disable
end
with_id(on_streams:) { |id| ... } click to toggle source
# File lib/cli/ui/stdout_router.rb, line 154
        def with_id(on_streams:)
          unless on_streams.is_a?(Array) && on_streams.all? { |s| s.respond_to?(:write) }
            raise ArgumentError, <<~EOF
            on_streams must be an array of objects that respond to `write`
            These do not respond to write
            #{on_streams.reject { |s| s.respond_to?(:write) }.map.with_index { |s| s.class.to_s }.join("\n")}
            EOF
          end

          require 'securerandom'
          id = format('%05d', rand(10**5))
          Thread.current[:cliui_output_id] = {
            id: id,
            streams: on_streams,
          }
          yield(id)
        ensure
          Thread.current[:cliui_output_id] = nil
        end

Private Class Methods

activate(stream, streamname) click to toggle source
# File lib/cli/ui/stdout_router.rb, line 220
def activate(stream, streamname)
  writer = StdoutRouter::Writer.new(stream, streamname)

  raise if stream.respond_to?(WRITE_WITHOUT_CLI_UI)
  stream.singleton_class.send(:alias_method, WRITE_WITHOUT_CLI_UI, :write)
  stream.define_singleton_method(:write) do |*args|
    writer.write(*args)
  end
end
deactivate(stream) click to toggle source
# File lib/cli/ui/stdout_router.rb, line 214
def deactivate(stream)
  sc = stream.singleton_class
  sc.send(:remove_method, :write)
  sc.send(:alias_method, :write, WRITE_WITHOUT_CLI_UI)
end