class RuboCop::Cop::Rails::SquishedSQLHeredocs
SQL
WHERE post_id = 1
SELECT * FROM posts
execute(<<~SQL.squish, “Post Load”)
SQL
WHERE id = 1
SELECT * FROM table
<<~SQL.squish
SQL
SELECT * FROM posts;
<<-SQL.squish
# good
SQL
WHERE post_id = 1
SELECT * FROM posts
execute(<<~SQL, “Post Load”)
SQL
WHERE id = 1
SELECT * FROM posts
<<-SQL
SQL
SELECT * FROM posts;
<<-SQL
# bad
@example
to be preserved in order to work, thus autocorrection for this cop is not safe.
Some SQL syntax (e.g. PostgreSQL comments and functions) requires newlines
@safety
Checks SQL heredocs to use ‘.squish`.
def message(node)
def message(node) format(MSG, expect: "#{node.source}#{SQUISH}", current: node.source) end
def offense_detected?(node)
def offense_detected?(node) sql_heredoc?(node) && !using_squish?(node) && !singleline_comments_present?(node) end
def on_heredoc(node)
def on_heredoc(node) return unless offense_detected?(node) add_offense(node) do |corrector| corrector.insert_after(node, SQUISH) end end
def singleline_comments_present?(node)
def singleline_comments_present?(node) sql = node.children.map { |c| c.is_a?(String) ? c : c.source }.join('\n') sql.gsub(SQL_IDENTIFIER_MARKERS, '').include?('--') end
def sql_heredoc?(node)
def sql_heredoc?(node) delimiter_string(node) == SQL end
def using_squish?(node)
def using_squish?(node) node.parent&.send_type? && node.parent.method?(:squish) end