From 87e90fe31c436018debce08bf9afd27d026e99aa Mon Sep 17 00:00:00 2001 From: Issy Long Date: Sat, 13 Jul 2024 22:13:03 -0400 Subject: [PATCH] rubocop/no_fileutils_rmrf: Discourage `Pathname#rmtree` too - This [seems to be](https://ruby-doc.org/3.3.4/exts/pathname/Pathname.html#method-i-rmtree) equivalent to `FileUtils#rm_r`, so replace it with that. --- .../Homebrew/rubocops/no_fileutils_rmrf.rb | 14 ++++++++++---- .../test/rubocops/no_fileutils_rmrf_spec.rb | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/rubocops/no_fileutils_rmrf.rb b/Library/Homebrew/rubocops/no_fileutils_rmrf.rb index 914d2a79d89f0b..e85aacc2c6b5d3 100644 --- a/Library/Homebrew/rubocops/no_fileutils_rmrf.rb +++ b/Library/Homebrew/rubocops/no_fileutils_rmrf.rb @@ -4,19 +4,24 @@ module RuboCop module Cop module Homebrew - # This cop checks for the use of `FileUtils.rm_f`, `FileUtils.rm_rf`, or `FileUtils.rmtree` - # and recommends the non-`f` versions. + # This cop checks for the use of `FileUtils.rm_f`, `FileUtils.rm_rf`, or `{FileUtils,Pathname}.rmtree` + # and recommends the safer versions. class NoFileutilsRmrf < Base extend AutoCorrector - MSG = "Use `FileUtils.rm`, `FileUtils.rm_r` instead of `FileUtils.rm_rf`, `FileUtils.rm_f`, or `FileUtils.rmtree`." + MSG = "Use `FileUtils.rm` or `FileUtils.rm_r` instead of `FileUtils.rm_rf`, `FileUtils.rm_f`, " \ + "or `{FileUtils,Pathname}.rmtree`." def_node_matcher :fileutils_rm_r_f?, <<~PATTERN (send (const {nil? cbase} :FileUtils) {:rm_rf :rm_f :rmtree} ...) PATTERN + def_node_matcher :pathname_rmtree?, <<~PATTERN + (send (const {nil? cbase} :Pathname) :rmtree ...) + PATTERN + def on_send(node) - return unless fileutils_rm_r_f?(node) + return unless fileutils_rm_r_f?(node) || pathname_rmtree?(node) add_offense(node) do |corrector| new_method = if node.method?(:rm_rf) || node.method?(:rmtree) @@ -24,6 +29,7 @@ def on_send(node) else "rm" end + corrector.replace(node.loc.expression, "FileUtils.#{new_method}(#{node.arguments.first.source})") end end diff --git a/Library/Homebrew/test/rubocops/no_fileutils_rmrf_spec.rb b/Library/Homebrew/test/rubocops/no_fileutils_rmrf_spec.rb index 4eacc958214c01..79fc6776820fce 100644 --- a/Library/Homebrew/test/rubocops/no_fileutils_rmrf_spec.rb +++ b/Library/Homebrew/test/rubocops/no_fileutils_rmrf_spec.rb @@ -60,5 +60,24 @@ FileUtils.rm_r("path/to/directory") RUBY end + + describe "Pathname.rmtree" do + it "registers an offense when using Pathname.rmtree" do + expect_offense(<<~RUBY) + Pathname.rmtree("path/to/directory") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Homebrew/NoFileutilsRmrf: #{RuboCop::Cop::Homebrew::NoFileutilsRmrf::MSG} + RUBY + end + + it "autocorrects" do + corrected = autocorrect_source(<<~RUBY) + Pathname.rmtree("path/to/directory") + RUBY + + expect(corrected).to eq(<<~RUBY) + FileUtils.rm_r("path/to/directory") + RUBY + end + end end end