Class: RuboCop::Cop::Rails::RootPathnameMethods

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/rails/root_pathname_methods.rb

Overview

Use ‘Rails.root` IO methods instead of passing it to `File`.

‘Rails.root` is an instance of `Pathname` so we can apply many IO methods directly.

This cop works best when used together with ‘Style/FileRead`, `Style/FileWrite` and `Rails/RootJoinChain`.

Examples:

# bad
File.open(Rails.root.join('db', 'schema.rb'))
File.open(Rails.root.join('db', 'schema.rb'), 'w')
File.read(Rails.root.join('db', 'schema.rb'))
File.binread(Rails.root.join('db', 'schema.rb'))
File.write(Rails.root.join('db', 'schema.rb'), content)
File.binwrite(Rails.root.join('db', 'schema.rb'), content)

# good
Rails.root.join('db', 'schema.rb').open
Rails.root.join('db', 'schema.rb').open('w')
Rails.root.join('db', 'schema.rb').read
Rails.root.join('db', 'schema.rb').binread
Rails.root.join('db', 'schema.rb').write(content)
Rails.root.join('db', 'schema.rb').binwrite(content)

Constant Summary collapse

MSG =
'`%<rails_root>s` is a `Pathname` so you can just append `#%<method>s`.'
DIR_METHODS =
%i[children delete each_child empty? entries exist? glob mkdir open rmdir unlink].to_set.freeze
FILE_METHODS =
%i[
  atime
  basename
  binread
  binwrite
  birthtime
  blockdev?
  chardev?
  chmod
  chown
  ctime
  delete
  directory?
  dirname
  empty?
  executable?
  executable_real?
  exist?
  expand_path
  extname
  file?
  fnmatch
  fnmatch?
  ftype
  grpowned?
  join
  lchmod
  lchown
  lstat
  mtime
  open
  owned?
  pipe?
  read
  readable?
  readable_real?
  readlines
  readlink
  realdirpath
  realpath
  rename
  setgid?
  setuid?
  size
  size?
  socket?
  split
  stat
  sticky?
  symlink?
  sysopen
  truncate
  unlink
  utime
  world_readable?
  world_writable?
  writable?
  writable_real?
  write
  zero?
].to_set.freeze
FILE_TEST_METHODS =
%i[
  blockdev?
  chardev?
  directory?
  empty?
  executable?
  executable_real?
  exist?
  file?
  grpowned?
  owned?
  pipe?
  readable?
  readable_real?
  setgid?
  setuid?
  size
  size?
  socket?
  sticky?
  symlink?
  world_readable?
  world_writable?
  writable?
  writable_real?
  zero?
].to_set.freeze
FILE_UTILS_METHODS =
%i[chmod chown mkdir mkpath rmdir rmtree].to_set.freeze
RESTRICT_ON_SEND =
(DIR_METHODS + FILE_METHODS + FILE_TEST_METHODS + FILE_UTILS_METHODS).to_set.freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/rubocop/cop/rails/root_pathname_methods.rb', line 163

def on_send(node)
  evidence(node) do |method, path, args, rails_root|
    add_offense(node, message: format(MSG, method: method, rails_root: rails_root.source)) do |corrector|
      replacement = if dir_glob?(node)
                      build_path_glob_replacement(path, method)
                    else
                      build_path_replacement(path, method, args)
                    end

      corrector.replace(node, replacement)
    end
  end
end

#rails_root?(node) ⇒ Object



159
160
161
# File 'lib/rubocop/cop/rails/root_pathname_methods.rb', line 159

def_node_matcher :rails_root?, <<~PATTERN
  (send (const {nil? cbase} :Rails) {:root :public_path})
PATTERN