class RuboCop::Cop::Style::FileRead
File.binread(filename)
# good
end
f.read
File.open(filename, ‘rb’) do |f|
File.open(filename, ‘rb’, &:read)
File.open(filename, ‘rb’).read
# bad - binary mode
File.read(filename)
# good
end
f.read
File.open(filename, ‘r’) do |f|
File.open(filename, ‘r’, &:read)
File.open(filename, ‘r’).read
end
f.read
File.open(filename) do |f|
File.open(filename) { |f| f.read }
File.open(filename, &:read)
File.open(filename).read
# bad - text mode
@example
Favor ‘File.(bin)read` convenience methods.
def evidence(node)
def evidence(node) file_open?(node) do |filename, mode_array, block_pass| read_node?(node, block_pass) do |read_node| yield(filename, mode_array.first || 'r', read_node) end end end
def file_open_read?(node)
def file_open_read?(node) return true if send_read?(node) block_read?(node) end
def on_send(node)
def on_send(node) evidence(node) do |filename, mode, read_node| message = format(MSG, read_method: read_method(mode)) add_offense(read_node, message: message) do |corrector| range = range_between(node.loc.selector.begin_pos, read_node.source_range.end_pos) replacement = "#{read_method(mode)}(#{filename.source})" corrector.replace(range, replacement) end end end
def read_method(mode)
def read_method(mode) mode.end_with?('b') ? :binread : :read end
def read_node?(node, block_pass)
def read_node?(node, block_pass) if block_pass.any? yield(node) elsif file_open_read?(node.parent) yield(node.parent) end end