rubocop-standard 4.1.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/{LICENSE → LICENSE.txt} +0 -0
 - data/README.md +8 -8
 - data/config/default.yml +12 -310
 - data/config/rails.yml +0 -108
 - metadata +19 -45
 - data/STYLEGUIDE.md +0 -763
 - data/guides/rails-controller-render-shorthand.md +0 -9
 - data/guides/rails-render-inline.md +0 -27
 - data/guides/rails-render-literal.md +0 -8
 - data/lib/rubocop/cop/standard/rails.rb +0 -10
 - data/lib/rubocop/cop/standard/rails/rails_application_record.rb +0 -27
 - data/lib/rubocop/cop/standard/rails/rails_controller_render_action_symbol.rb +0 -43
 - data/lib/rubocop/cop/standard/rails/rails_controller_render_paths_exist.rb +0 -63
 - data/lib/rubocop/cop/standard/rails/rails_controller_render_shorthand.rb +0 -51
 - data/lib/rubocop/cop/standard/rails/rails_render_inline.rb +0 -27
 - data/lib/rubocop/cop/standard/rails/rails_render_object_collection.rb +0 -45
 - data/lib/rubocop/cop/standard/rails/rails_view_render_paths_exist.rb +0 -55
 - data/lib/rubocop/cop/standard/rails/rails_view_render_shorthand.rb +0 -38
 
| 
         @@ -1,27 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Standard/RailsRenderInline
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            tldr; Do not use `render inline:`.
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            ## Rendering plain text
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            ``` ruby
         
     | 
| 
       8 
     | 
    
         
            -
            render inline: "Just plain text" # bad
         
     | 
| 
       9 
     | 
    
         
            -
            ```
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            The `inline:` option is often misused when plain text is being returned. Instead use `render plain: "Just plain text"`.
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
            ## Rendering a dynamic ERB string
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
            String `#{}` interpolation is often misused with `render inline:` instead of using `<%= %>` interpolation. This will lead to a memory leak where an ERB method will be compiled and cached for each invocation of `render inline:`.
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            ``` ruby
         
     | 
| 
       18 
     | 
    
         
            -
            render inline: "Hello #{@name}" # bad
         
     | 
| 
       19 
     | 
    
         
            -
            ```
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
            ## Rendering static ERB strings
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
            ``` ruby
         
     | 
| 
       24 
     | 
    
         
            -
            render inline: "Hello <%= @name %>" # bad
         
     | 
| 
       25 
     | 
    
         
            -
            ```
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            If you are passing a static ERB string to `render inline:`, this string is best moved to a `.erb` template under `app/views`. Template files are able to be precompiled at boot time.
         
     | 
| 
         @@ -1,8 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # Standard/RailsRenderLiteral
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            tldr; `render` MUST be passed a string literal template path.
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            * When used in conjunction with `Standard/RailsViewRenderPathsExist`, linters can ensure the target file exists on disk and would not crash rendering a missing template.
         
     | 
| 
       6 
     | 
    
         
            -
            * Makes it easier for humans to trace callers of a template. Simply search for the full path of the target template to find **all** call sites.
         
     | 
| 
       7 
     | 
    
         
            -
            * This same call site tracing enables automated unused template checking. If no callers are found, the template can be safely removed.
         
     | 
| 
       8 
     | 
    
         
            -
            * Enables render precompilation and inlining optimizations. Target templates can be compiled and inlined on boot time rather than deferring to first render to lazily compile templates.
         
     | 
| 
         @@ -1,10 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_application_record'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_controller_render_action_symbol'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_controller_render_paths_exist'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_controller_render_shorthand'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_render_inline'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_render_object_collection'
         
     | 
| 
       9 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_view_render_paths_exist'
         
     | 
| 
       10 
     | 
    
         
            -
            require 'rubocop/cop/standard/rails/rails_view_render_shorthand'
         
     | 
| 
         @@ -1,27 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsApplicationRecord < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Models should subclass from ApplicationRecord'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :active_record_base_const?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (const (const nil? :ActiveRecord) :Base)
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :application_record_const?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (const nil? :ApplicationRecord)
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def on_class(node)
         
     | 
| 
       20 
     | 
    
         
            -
                      klass, superclass, = *node
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                      add_offense(superclass, location: :expression) if active_record_base_const?(superclass) && !application_record_const?(klass)
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
              end
         
     | 
| 
       27 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,43 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsControllerRenderActionSymbol < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Prefer `render` with string instead of symbol'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :render_sym?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (send nil? :render $(sym _))
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :render_with_options?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def_node_matcher :action_key?, <<-PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
                      (pair (sym {:action :template}) $(sym _))
         
     | 
| 
       21 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       24 
     | 
    
         
            -
                      if (sym_node = render_sym?(node))
         
     | 
| 
       25 
     | 
    
         
            -
                        add_offense(sym_node, location: :expression)
         
     | 
| 
       26 
     | 
    
         
            -
                      elsif (option_pairs = render_with_options?(node))
         
     | 
| 
       27 
     | 
    
         
            -
                        option_pairs.each do |pair|
         
     | 
| 
       28 
     | 
    
         
            -
                          if (sym_node = action_key?(pair))
         
     | 
| 
       29 
     | 
    
         
            -
                            add_offense(sym_node, location: :expression)
         
     | 
| 
       30 
     | 
    
         
            -
                          end
         
     | 
| 
       31 
     | 
    
         
            -
                        end
         
     | 
| 
       32 
     | 
    
         
            -
                      end
         
     | 
| 
       33 
     | 
    
         
            -
                    end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                    def autocorrect(node)
         
     | 
| 
       36 
     | 
    
         
            -
                      lambda do |corrector|
         
     | 
| 
       37 
     | 
    
         
            -
                        corrector.replace(node.source_range, "\"#{node.children[0]}\"")
         
     | 
| 
       38 
     | 
    
         
            -
                      end
         
     | 
| 
       39 
     | 
    
         
            -
                    end
         
     | 
| 
       40 
     | 
    
         
            -
                  end
         
     | 
| 
       41 
     | 
    
         
            -
                end
         
     | 
| 
       42 
     | 
    
         
            -
              end
         
     | 
| 
       43 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,63 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsControllerRenderPathsExist < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    def_node_matcher :render?, <<-PATTERN
         
     | 
| 
       10 
     | 
    
         
            -
                      (send nil? :render $...)
         
     | 
| 
       11 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    def_node_matcher :render_str?, <<-PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
                      (send nil? :render $({str sym} $_) ...)
         
     | 
| 
       15 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                    def_node_matcher :render_options?, <<-PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       19 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                    def_node_matcher :render_key?, <<-PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
                      (pair (sym ${:action :partial :template}) $({str sym} $_))
         
     | 
| 
       23 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       26 
     | 
    
         
            -
                      return unless cop_config['ViewPath']
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                      if (args = render_str?(node))
         
     | 
| 
       29 
     | 
    
         
            -
                        node, path = args
         
     | 
| 
       30 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: 'Template could not be found') unless resolve_template(path.to_s)
         
     | 
| 
       31 
     | 
    
         
            -
                      elsif (pairs = render_options?(node))
         
     | 
| 
       32 
     | 
    
         
            -
                        if (pair = pairs.detect { |p| render_key?(p) })
         
     | 
| 
       33 
     | 
    
         
            -
                          key, node, path = render_key?(pair)
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                          case key
         
     | 
| 
       36 
     | 
    
         
            -
                          when :action, :template
         
     | 
| 
       37 
     | 
    
         
            -
                            add_offense(node, location: :expression, message: 'Template could not be found') unless resolve_template(path.to_s)
         
     | 
| 
       38 
     | 
    
         
            -
                          when :partial
         
     | 
| 
       39 
     | 
    
         
            -
                            add_offense(node, location: :expression, message: 'Partial template could not be found') unless resolve_partial(path.to_s)
         
     | 
| 
       40 
     | 
    
         
            -
                          end
         
     | 
| 
       41 
     | 
    
         
            -
                        end
         
     | 
| 
       42 
     | 
    
         
            -
                      end
         
     | 
| 
       43 
     | 
    
         
            -
                    end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                    def resolve_template(path)
         
     | 
| 
       46 
     | 
    
         
            -
                      cop_config['ViewPath'].each do |view_path|
         
     | 
| 
       47 
     | 
    
         
            -
                        if (m = Dir[File.join(config.path_relative_to_config(view_path), path) + '*'].first)
         
     | 
| 
       48 
     | 
    
         
            -
                          return m
         
     | 
| 
       49 
     | 
    
         
            -
                        end
         
     | 
| 
       50 
     | 
    
         
            -
                      end
         
     | 
| 
       51 
     | 
    
         
            -
                      nil
         
     | 
| 
       52 
     | 
    
         
            -
                    end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                    def resolve_partial(path)
         
     | 
| 
       55 
     | 
    
         
            -
                      parts = path.split(File::SEPARATOR)
         
     | 
| 
       56 
     | 
    
         
            -
                      parts << "_#{parts.pop}"
         
     | 
| 
       57 
     | 
    
         
            -
                      path = parts.join(File::SEPARATOR)
         
     | 
| 
       58 
     | 
    
         
            -
                      resolve_template(path)
         
     | 
| 
       59 
     | 
    
         
            -
                    end
         
     | 
| 
       60 
     | 
    
         
            -
                  end
         
     | 
| 
       61 
     | 
    
         
            -
                end
         
     | 
| 
       62 
     | 
    
         
            -
              end
         
     | 
| 
       63 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,51 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsControllerRenderShorthand < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Prefer `render` template shorthand'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :render_with_options?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :action_key?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (pair (sym {:action :template}) $({str sym} _))
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def_node_matcher :str, <<-PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
                      ({str sym} $_)
         
     | 
| 
       21 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                    def investigate(*)
         
     | 
| 
       24 
     | 
    
         
            -
                      @autocorrect = {}
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                    def autocorrect(node)
         
     | 
| 
       28 
     | 
    
         
            -
                      @autocorrect[node]
         
     | 
| 
       29 
     | 
    
         
            -
                    end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       32 
     | 
    
         
            -
                      return unless (option_pairs = render_with_options?(node))
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                      option_pairs.each do |pair|
         
     | 
| 
       35 
     | 
    
         
            -
                        next unless (value_node = action_key?(pair))
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                        comma = option_pairs.length > 1 ? ', ' : ''
         
     | 
| 
       38 
     | 
    
         
            -
                        corrected_source = node.source
         
     | 
| 
       39 
     | 
    
         
            -
                                               .sub(/#{pair.source}(,\s*)?/, '')
         
     | 
| 
       40 
     | 
    
         
            -
                                               .sub('render ', "render \"#{str(value_node)}\"#{comma}")
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                        @autocorrect[node] = lambda do |corrector|
         
     | 
| 
       43 
     | 
    
         
            -
                          corrector.replace(node.source_range, corrected_source)
         
     | 
| 
       44 
     | 
    
         
            -
                        end
         
     | 
| 
       45 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: "Use `#{corrected_source}` instead")
         
     | 
| 
       46 
     | 
    
         
            -
                      end
         
     | 
| 
       47 
     | 
    
         
            -
                    end
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
              end
         
     | 
| 
       51 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,27 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsRenderInline < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Avoid `render inline:`'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :render_with_options?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :inline_key?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (pair (sym :inline) $_)
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       20 
     | 
    
         
            -
                      return unless (option_pairs = render_with_options?(node))
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                      add_offense(node, location: :expression) if option_pairs.detect { |pair| inline_key?(pair) }
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
              end
         
     | 
| 
       27 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,45 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsRenderObjectCollection < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Avoid `render object:`'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :render_with_options?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (send nil? :render (hash $...) ...)
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :partial_key?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (pair (sym :partial) $_)
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def_node_matcher :object_key?, <<-PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
                      (pair (sym ${:object :collection :spacer_template}) $_)
         
     | 
| 
       21 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       24 
     | 
    
         
            -
                      return unless (option_pairs = render_with_options?(node))
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                      partial_pair = option_pairs.detect { |pair| partial_key?(pair) }
         
     | 
| 
       27 
     | 
    
         
            -
                      object_pair  = option_pairs.detect { |pair| object_key?(pair) }
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                      return unless partial_pair && object_pair
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                      partial_name = partial_key?(partial_pair)
         
     | 
| 
       32 
     | 
    
         
            -
                      object_sym, object_node = object_key?(object_pair)
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                      case object_sym
         
     | 
| 
       35 
     | 
    
         
            -
                      when :object
         
     | 
| 
       36 
     | 
    
         
            -
                        suggestion = ", instead `render partial: #{partial_name.source}, locals: { #{File.basename(partial_name.children[0], '.html.erb')}: #{object_node.source} }`" if partial_name.children[0].is_a?(String)
         
     | 
| 
       37 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: "Avoid `render object:`#{suggestion}")
         
     | 
| 
       38 
     | 
    
         
            -
                      when :collection, :spacer_template
         
     | 
| 
       39 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: 'Avoid `render collection:`')
         
     | 
| 
       40 
     | 
    
         
            -
                      end
         
     | 
| 
       41 
     | 
    
         
            -
                    end
         
     | 
| 
       42 
     | 
    
         
            -
                  end
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
              end
         
     | 
| 
       45 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,55 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsViewRenderPathsExist < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    def_node_matcher :render?, <<-PATTERN
         
     | 
| 
       10 
     | 
    
         
            -
                      (send nil? :render $...)
         
     | 
| 
       11 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    def_node_matcher :render_str?, <<-PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
                      (send nil? :render $(str $_) ...)
         
     | 
| 
       15 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                    def_node_matcher :render_options?, <<-PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       19 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                    def_node_matcher :partial_key?, <<-PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
                      (pair (sym :partial) $(str $_))
         
     | 
| 
       23 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       26 
     | 
    
         
            -
                      return unless cop_config['ViewPath']
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                      if (args = render_str?(node))
         
     | 
| 
       29 
     | 
    
         
            -
                        node, path = args
         
     | 
| 
       30 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: 'Partial template could not be found') unless resolve_partial(path.to_s)
         
     | 
| 
       31 
     | 
    
         
            -
                      elsif (pairs = render_options?(node))
         
     | 
| 
       32 
     | 
    
         
            -
                        if (pair = pairs.detect { |p| partial_key?(p) })
         
     | 
| 
       33 
     | 
    
         
            -
                          node, path = partial_key?(pair)
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                          add_offense(node, location: :expression, message: 'Partial template could not be found') unless resolve_partial(path.to_s)
         
     | 
| 
       36 
     | 
    
         
            -
                        end
         
     | 
| 
       37 
     | 
    
         
            -
                      end
         
     | 
| 
       38 
     | 
    
         
            -
                    end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                    def resolve_partial(path)
         
     | 
| 
       41 
     | 
    
         
            -
                      parts = path.split(File::SEPARATOR)
         
     | 
| 
       42 
     | 
    
         
            -
                      parts << "_#{parts.pop}"
         
     | 
| 
       43 
     | 
    
         
            -
                      path = parts.join(File::SEPARATOR)
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                      cop_config['ViewPath'].each do |view_path|
         
     | 
| 
       46 
     | 
    
         
            -
                        if (m = Dir[File.join(config.path_relative_to_config(view_path), path) + '*'].first)
         
     | 
| 
       47 
     | 
    
         
            -
                          return m
         
     | 
| 
       48 
     | 
    
         
            -
                        end
         
     | 
| 
       49 
     | 
    
         
            -
                      end
         
     | 
| 
       50 
     | 
    
         
            -
                      nil
         
     | 
| 
       51 
     | 
    
         
            -
                    end
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
                end
         
     | 
| 
       54 
     | 
    
         
            -
              end
         
     | 
| 
       55 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,38 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module RuboCop
         
     | 
| 
       6 
     | 
    
         
            -
              module Cop
         
     | 
| 
       7 
     | 
    
         
            -
                module Standard
         
     | 
| 
       8 
     | 
    
         
            -
                  class RailsViewRenderShorthand < Cop
         
     | 
| 
       9 
     | 
    
         
            -
                    MSG = 'Prefer `render` partial shorthand'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                    def_node_matcher :render_with_options?, <<-PATTERN
         
     | 
| 
       12 
     | 
    
         
            -
                      (send nil? :render (hash $...))
         
     | 
| 
       13 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    def_node_matcher :partial_key?, <<-PATTERN
         
     | 
| 
       16 
     | 
    
         
            -
                      (pair (sym :partial) $(str _))
         
     | 
| 
       17 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    def_node_matcher :locals_key?, <<-PATTERN
         
     | 
| 
       20 
     | 
    
         
            -
                      (pair (sym :locals) $_)
         
     | 
| 
       21 
     | 
    
         
            -
                    PATTERN
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                    def on_send(node)
         
     | 
| 
       24 
     | 
    
         
            -
                      return unless (option_pairs = render_with_options?(node))
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                      partial_key = option_pairs.map { |pair| partial_key?(pair) }.compact.first
         
     | 
| 
       27 
     | 
    
         
            -
                      locals_key = option_pairs.map { |pair| locals_key?(pair) }.compact.first
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                      if option_pairs.length == 1 && partial_key
         
     | 
| 
       30 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: "Use `render #{partial_key.source}` instead")
         
     | 
| 
       31 
     | 
    
         
            -
                      elsif option_pairs.length == 2 && partial_key && locals_key
         
     | 
| 
       32 
     | 
    
         
            -
                        add_offense(node, location: :expression, message: "Use `render #{partial_key.source}, #{locals_key.source}` instead")
         
     | 
| 
       33 
     | 
    
         
            -
                      end
         
     | 
| 
       34 
     | 
    
         
            -
                    end
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
              end
         
     | 
| 
       38 
     | 
    
         
            -
            end
         
     |