aboutsummaryrefslogtreecommitdiffstats
path: root/ci/custom_cops/lib
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2018-04-19 15:03:28 -0400
committerGitHub <noreply@github.com>2018-04-19 15:03:28 -0400
commit6fec9c27e5563d7c98e123c8d8eb8ef2f0c34b65 (patch)
tree69e4232782e4a499aa018ad3d713ccb57242d043 /ci/custom_cops/lib
parentd72990c63abb940108b9957dcac09fe04e93f3d1 (diff)
parenta1ac18671a90869ef81d02f2eafe8104e4eea34f (diff)
downloadrails-6fec9c27e5563d7c98e123c8d8eb8ef2f0c34b65.tar.gz
rails-6fec9c27e5563d7c98e123c8d8eb8ef2f0c34b65.tar.bz2
rails-6fec9c27e5563d7c98e123c8d8eb8ef2f0c34b65.zip
Merge pull request #32605 from composerinteralia/assert-not
Add RuboCop for `assert_not` over `assert !`
Diffstat (limited to 'ci/custom_cops/lib')
-rw-r--r--ci/custom_cops/lib/custom_cops.rb1
-rw-r--r--ci/custom_cops/lib/custom_cops/assert_not.rb40
2 files changed, 41 insertions, 0 deletions
diff --git a/ci/custom_cops/lib/custom_cops.rb b/ci/custom_cops/lib/custom_cops.rb
index d5d17f8856..157b8247e4 100644
--- a/ci/custom_cops/lib/custom_cops.rb
+++ b/ci/custom_cops/lib/custom_cops.rb
@@ -1,3 +1,4 @@
# frozen_string_literal: true
require_relative "custom_cops/refute_not"
+require_relative "custom_cops/assert_not"
diff --git a/ci/custom_cops/lib/custom_cops/assert_not.rb b/ci/custom_cops/lib/custom_cops/assert_not.rb
new file mode 100644
index 0000000000..e722448e21
--- /dev/null
+++ b/ci/custom_cops/lib/custom_cops/assert_not.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module CustomCops
+ # Enforces the use of `assert_not` over `assert !`.
+ #
+ # @example
+ # # bad
+ # assert !x
+ # assert ! x
+ #
+ # # good
+ # assert_not x
+ #
+ class AssertNot < RuboCop::Cop::Cop
+ MSG = "Prefer `assert_not` over `assert !`"
+
+ def_node_matcher :offensive?, "(send nil? :assert (send ... :!))"
+
+ def on_send(node)
+ add_offense(node) if offensive?(node)
+ end
+
+ def autocorrect(node)
+ expression = node.loc.expression
+
+ ->(corrector) do
+ corrector.replace(
+ expression,
+ corrected_source(expression.source)
+ )
+ end
+ end
+
+ private
+
+ def corrected_source(source)
+ source.gsub(/^assert(\(| ) *! */, "assert_not\\1")
+ end
+ end
+end