class RuboCop::Cop::Rails::SquishedSQLHeredocs

Checks SQL heredocs to use `.squish`. Some SQL syntax (e.g. PostgreSQL comments and functions) requires newlines to be preserved in order to work, thus auto-correction for this cop is not safe.

@example

# bad
<<-SQL
  SELECT * FROM posts;
SQL

<<-SQL
  SELECT * FROM posts
    WHERE id = 1
SQL

execute(<<~SQL, "Post Load")
  SELECT * FROM posts
    WHERE post_id = 1
SQL

# good
<<-SQL.squish
  SELECT * FROM posts;
SQL

<<~SQL.squish
  SELECT * FROM table
    WHERE id = 1
SQL

execute(<<~SQL.squish, "Post Load")
  SELECT * FROM posts
    WHERE post_id = 1
SQL

Constants

MSG
SQL
SQUISH

Public Instance Methods

on_heredoc(node) click to toggle source
# File lib/rubocop/cop/rails/squished_sql_heredocs.rb, line 50
def on_heredoc(node)
  return unless offense_detected?(node)

  add_offense(node) do |corrector|
    corrector.insert_after(node, SQUISH)
  end
end

Private Instance Methods

message(node) click to toggle source
# File lib/rubocop/cop/rails/squished_sql_heredocs.rb, line 72
def message(node)
  format(
    MSG,
    expect: "#{node.source}#{SQUISH}",
    current: node.source
  )
end
offense_detected?(node) click to toggle source
# File lib/rubocop/cop/rails/squished_sql_heredocs.rb, line 60
def offense_detected?(node)
  sql_heredoc?(node) && !using_squish?(node)
end
sql_heredoc?(node) click to toggle source
# File lib/rubocop/cop/rails/squished_sql_heredocs.rb, line 64
def sql_heredoc?(node)
  delimiter_string(node) == SQL
end
using_squish?(node) click to toggle source
# File lib/rubocop/cop/rails/squished_sql_heredocs.rb, line 68
def using_squish?(node)
  node.parent&.send_type? && node.parent&.method?(:squish)
end