class RuboCop::Cop::Style::GlobalStdStream

Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`. `STDOUT/STDERR/STDIN` are constants, and while you can actually reassign (possibly to redirect some stream) constants in Ruby, you'll get an interpreter warning if you do so.

@safety

Autocorrection is unsafe because `STDOUT` and `$stdout` may point to different
objects, for example.

@example

# bad
STDOUT.puts('hello')

hash = { out: STDOUT, key: value }

def m(out = STDOUT)
  out.puts('hello')
end

# good
$stdout.puts('hello')

hash = { out: $stdout, key: value }

def m(out = $stdout)
  out.puts('hello')
end

Constants

MSG
STD_STREAMS

Public Instance Methods

on_const(node) click to toggle source
# File lib/rubocop/cop/style/global_std_stream.rb, line 46
def on_const(node)
  const_name = node.children[1]
  return unless STD_STREAMS.include?(const_name)

  gvar_name = gvar_name(const_name).to_sym
  return if const_to_gvar_assignment?(node.parent, gvar_name)

  add_offense(node, message: message(const_name)) do |corrector|
    corrector.replace(node, gvar_name)
  end
end

Private Instance Methods

gvar_name(const_name) click to toggle source
# File lib/rubocop/cop/style/global_std_stream.rb, line 64
def gvar_name(const_name)
  "$#{const_name.to_s.downcase}"
end
message(const_name) click to toggle source
# File lib/rubocop/cop/style/global_std_stream.rb, line 60
def message(const_name)
  format(MSG, gvar_name: gvar_name(const_name), const_name: const_name)
end