app/controllers/search_controller.rb

Summary

Maintainability
F
5 days
Test Coverage

User input in eval
Open

                #{pagination_methods[method_name]}
Severity: Critical
Found in app/controllers/search_controller.rb by brakeman

User input in an eval statement is VERY dangerous, so this will always raise a warning. Brakeman looks for calls to eval, instance_eval, class_eval, and module_eval.

Class has too many lines. [472/100]
Open

class SearchController < ApplicationController
  # Walter McGinnis, 2008-02-07
  # search forms never add anything to db
  # so don't need csrf protection, which is problematic with search forms
  # in kete

This cop checks if the length a class exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

Assignment Branch Condition size for populate_result_sets_for is too high. [129.7/15]
Open

  def populate_result_sets_for(zoom_class)
    # potential elements of query
    # zoom_class and optionally basket
    # search_terms which search both title attribute and all content attribute
    # source_item for things related to item

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Assignment Branch Condition size for search is too high. [107.9/15]
Open

  def search
    @search = Search.new

    # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
    # it is the default if the search_terms parameter is not defined

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Assignment Branch Condition size for terms_to_page_url_redirect is too high. [99.84/15]
Open

  def terms_to_page_url_redirect
    basket_name =
      params[:target_basket].nil? ? \
           params[:urlified_name] : params[:target_basket]

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Assignment Branch Condition size for find_related is too high. [75.05/15]
Open

  def find_related
    # related items are now shown on basket homepage topics, small change to allow linking here
    params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'

    @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Method populate_result_sets_for has a Cognitive Complexity of 53 (exceeds 5 allowed). Consider refactoring.
Open

  def populate_result_sets_for(zoom_class)
    # potential elements of query
    # zoom_class and optionally basket
    # search_terms which search both title attribute and all content attribute
    # source_item for things related to item
Severity: Minor
Found in app/controllers/search_controller.rb - About 1 day to fix

Cognitive Complexity

Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

A method's cognitive complexity is based on a few simple rules:

  • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
  • Code is considered more complex for each "break in the linear flow of the code"
  • Code is considered more complex when "flow breaking structures are nested"

Further reading

Method has too many lines. [65/10]
Open

  def populate_result_sets_for(zoom_class)
    # potential elements of query
    # zoom_class and optionally basket
    # search_terms which search both title attribute and all content attribute
    # source_item for things related to item

This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

File search_controller.rb has 473 lines of code (exceeds 250 allowed). Consider refactoring.
Open

class SearchController < ApplicationController
  # Walter McGinnis, 2008-02-07
  # search forms never add anything to db
  # so don't need csrf protection, which is problematic with search forms
  # in kete
Severity: Minor
Found in app/controllers/search_controller.rb - About 7 hrs to fix

    Method has too many lines. [57/10]
    Open

      def find_related
        # related items are now shown on basket homepage topics, small change to allow linking here
        params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'
    
        @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])

    This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

    Method has too many lines. [57/10]
    Open

      def terms_to_page_url_redirect
        basket_name =
          params[:target_basket].nil? ? \
               params[:urlified_name] : params[:target_basket]
    
    

    This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

    Method has too many lines. [50/10]
    Open

      def search
        @search = Search.new
    
        # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
        # it is the default if the search_terms parameter is not defined

    This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

    Perceived complexity for populate_result_sets_for is too high. [41/7]
    Open

      def populate_result_sets_for(zoom_class)
        # potential elements of query
        # zoom_class and optionally basket
        # search_terms which search both title attribute and all content attribute
        # source_item for things related to item

    This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

    Example:

    def my_method                   # 1
      if cond                       # 1
        case var                    # 2 (0.8 + 4 * 0.2, rounded)
        when 1 then func_one
        when 2 then func_two
        when 3 then func_three
        when 4..10 then func_other
        end
      else                          # 1
        do_something until a && b   # 2
      end                           # ===
    end                             # 7 complexity points

    Cyclomatic complexity for populate_result_sets_for is too high. [36/6]
    Open

      def populate_result_sets_for(zoom_class)
        # potential elements of query
        # zoom_class and optionally basket
        # search_terms which search both title attribute and all content attribute
        # source_item for things related to item

    This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

    An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

    Method search has a Cognitive Complexity of 34 (exceeds 5 allowed). Consider refactoring.
    Open

      def search
        @search = Search.new
    
        # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
        # it is the default if the search_terms parameter is not defined
    Severity: Minor
    Found in app/controllers/search_controller.rb - About 5 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Assignment Branch Condition size for find_index is too high. [43.75/15]
    Open

      def find_index
        @current_basket = Basket.find(params[:current_basket_id])
        @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
        # homepage to be an About basket topic for example
        @current_homepage = @current_basket.index_topic

    This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

    Assignment Branch Condition size for store_results_for_slideshow is too high. [42.74/15]
    Open

      def store_results_for_slideshow
        # if @results_sets is emtpy, then @result_sets[@current_class] is nil so we have
        # to stop here if thats the case, or we get a 500 error calling .size below
        return if @result_sets.nil? || @result_sets[@current_class].nil? || @displaying_error
    
    

    This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

    Method has too many lines. [36/10]
    Open

      def find_index
        @current_basket = Basket.find(params[:current_basket_id])
        @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
        # homepage to be an About basket topic for example
        @current_homepage = @current_basket.index_topic

    This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

    Class SearchController has 33 methods (exceeds 20 allowed). Consider refactoring.
    Open

    class SearchController < ApplicationController
      # Walter McGinnis, 2008-02-07
      # search forms never add anything to db
      # so don't need csrf protection, which is problematic with search forms
      # in kete
    Severity: Minor
    Found in app/controllers/search_controller.rb - About 4 hrs to fix

      Perceived complexity for search is too high. [26/7]
      Open

        def search
          @search = Search.new
      
          # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
          # it is the default if the search_terms parameter is not defined

      This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

      Example:

      def my_method                   # 1
        if cond                       # 1
          case var                    # 2 (0.8 + 4 * 0.2, rounded)
          when 1 then func_one
          when 2 then func_two
          when 3 then func_three
          when 4..10 then func_other
          end
        else                          # 1
          do_something until a && b   # 2
        end                           # ===
      end                             # 7 complexity points

      Cyclomatic complexity for search is too high. [21/6]
      Open

        def search
          @search = Search.new
      
          # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
          # it is the default if the search_terms parameter is not defined

      This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

      An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

      Method find_related has a Cognitive Complexity of 22 (exceeds 5 allowed). Consider refactoring.
      Open

        def find_related
          # related items are now shown on basket homepage topics, small change to allow linking here
          params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'
      
          @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])
      Severity: Minor
      Found in app/controllers/search_controller.rb - About 3 hrs to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Method has too many lines. [21/10]
      Open

        def load_results(from_result_set)
          @results = []
      
          # protect against malformed requests
          # for a start record that is more than the numbers of matching records, return a 404

      This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

      Assignment Branch Condition size for slideshow_page_load is too high. [25.4/15]
      Open

        def slideshow_page_load
          @search_terms = params[:search_terms]
      
          # Make sure the search method knows which search action we're mimicking.
          params[:action] = slideshow.search_params[:search_action]

      This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

      Cyclomatic complexity for find_related is too high. [16/6]
      Open

        def find_related
          # related items are now shown on basket homepage topics, small change to allow linking here
          params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'
      
          @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])

      This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

      An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

      Method find_index has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.
      Open

        def find_index
          @current_basket = Basket.find(params[:current_basket_id])
          @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
          # homepage to be an About basket topic for example
          @current_homepage = @current_basket.index_topic
      Severity: Minor
      Found in app/controllers/search_controller.rb - About 2 hrs to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Perceived complexity for terms_to_page_url_redirect is too high. [16/7]
      Open

        def terms_to_page_url_redirect
          basket_name =
            params[:target_basket].nil? ? \
                 params[:urlified_name] : params[:target_basket]
      
      

      This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

      Example:

      def my_method                   # 1
        if cond                       # 1
          case var                    # 2 (0.8 + 4 * 0.2, rounded)
          when 1 then func_one
          when 2 then func_two
          when 3 then func_three
          when 4..10 then func_other
          end
        else                          # 1
          do_something until a && b   # 2
        end                           # ===
      end                             # 7 complexity points

      Cyclomatic complexity for terms_to_page_url_redirect is too high. [15/6]
      Open

        def terms_to_page_url_redirect
          basket_name =
            params[:target_basket].nil? ? \
                 params[:urlified_name] : params[:target_basket]
      
      

      This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

      An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

      Method populate_result_sets_for has 65 lines of code (exceeds 25 allowed). Consider refactoring.
      Open

        def populate_result_sets_for(zoom_class)
          # potential elements of query
          # zoom_class and optionally basket
          # search_terms which search both title attribute and all content attribute
          # source_item for things related to item
      Severity: Major
      Found in app/controllers/search_controller.rb - About 2 hrs to fix

        Assignment Branch Condition size for to_search_terms_slug is too high. [23.77/15]
        Open

          def to_search_terms_slug(search_terms)
            # This method should return the following:
            #  quotes phrases:       word_after_word
            #  non-quoted phrases:   word+after+word
            # Join both types with +. i.e.

        This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

        Perceived complexity for find_related is too high. [14/7]
        Open

          def find_related
            # related items are now shown on basket homepage topics, small change to allow linking here
            params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'
        
            @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])

        This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

        Example:

        def my_method                   # 1
          if cond                       # 1
            case var                    # 2 (0.8 + 4 * 0.2, rounded)
            when 1 then func_one
            when 2 then func_two
            when 3 then func_three
            when 4..10 then func_other
            end
          else                          # 1
            do_something until a && b   # 2
          end                           # ===
        end                             # 7 complexity points

        Method has too many lines. [17/10]
        Open

          def store_results_for_slideshow
            # if @results_sets is emtpy, then @result_sets[@current_class] is nil so we have
            # to stop here if thats the case, or we get a 500 error calling .size below
            return if @result_sets.nil? || @result_sets[@current_class].nil? || @displaying_error
        
        

        This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

        Method has too many lines. [16/10]
        Open

          def private_search_authorisation
            # Allow all public searches
            return true unless is_a_private_search?
        
            if (@current_basket == @site_basket) && !authorised_basket_names.empty?

        This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

        Method terms_to_page_url_redirect has 57 lines of code (exceeds 25 allowed). Consider refactoring.
        Open

          def terms_to_page_url_redirect
            basket_name =
              params[:target_basket].nil? ? \
                   params[:urlified_name] : params[:target_basket]
        
        
        Severity: Major
        Found in app/controllers/search_controller.rb - About 2 hrs to fix

          Method find_related has 57 lines of code (exceeds 25 allowed). Consider refactoring.
          Open

            def find_related
              # related items are now shown on basket homepage topics, small change to allow linking here
              params[:relate_to_type] = 'Topic' if params[:relate_to_type] == 'IndexPage'
          
              @relate_to_item = params[:relate_to_type].constantize.find(params[:relate_to_item])
          Severity: Major
          Found in app/controllers/search_controller.rb - About 2 hrs to fix

            Method terms_to_page_url_redirect has a Cognitive Complexity of 17 (exceeds 5 allowed). Consider refactoring.
            Open

              def terms_to_page_url_redirect
                basket_name =
                  params[:target_basket].nil? ? \
                       params[:urlified_name] : params[:target_basket]
            
            
            Severity: Minor
            Found in app/controllers/search_controller.rb - About 2 hrs to fix

            Cognitive Complexity

            Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

            A method's cognitive complexity is based on a few simple rules:

            • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
            • Code is considered more complex for each "break in the linear flow of the code"
            • Code is considered more complex when "flow breaking structures are nested"

            Further reading

            Perceived complexity for find_index is too high. [10/7]
            Open

              def find_index
                @current_basket = Basket.find(params[:current_basket_id])
                @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
                # homepage to be an About basket topic for example
                @current_homepage = @current_basket.index_topic

            This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

            Example:

            def my_method                   # 1
              if cond                       # 1
                case var                    # 2 (0.8 + 4 * 0.2, rounded)
                when 1 then func_one
                when 2 then func_two
                when 3 then func_three
                when 4..10 then func_other
                end
              else                          # 1
                do_something until a && b   # 2
              end                           # ===
            end                             # 7 complexity points

            Cyclomatic complexity for find_index is too high. [9/6]
            Open

              def find_index
                @current_basket = Basket.find(params[:current_basket_id])
                @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
                # homepage to be an About basket topic for example
                @current_homepage = @current_basket.index_topic

            This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

            An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

            Method search has 50 lines of code (exceeds 25 allowed). Consider refactoring.
            Open

              def search
                @search = Search.new
            
                # all returns all results for a class, contributor_id, or source_item (i.e. all related items to source)
                # it is the default if the search_terms parameter is not defined
            Severity: Minor
            Found in app/controllers/search_controller.rb - About 2 hrs to fix

              Method has too many lines. [12/10]
              Open

                def zoom_update_and_test(item, zoom_db)
                  item_class = item.class.name
              
                  if !session[:skip_existing].nil? && (session[:skip_existing] == true)
                    # test if it's in there first

              This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

              Assignment Branch Condition size for private_search_authorisation is too high. [17.72/15]
              Open

                def private_search_authorisation
                  # Allow all public searches
                  return true unless is_a_private_search?
              
                  if (@current_basket == @site_basket) && !authorised_basket_names.empty?

              This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

              Method has too many lines. [11/10]
              Open

                def to_search_terms_slug(search_terms)
                  # This method should return the following:
                  #  quotes phrases:       word_after_word
                  #  non-quoted phrases:   word+after+word
                  # Join both types with +. i.e.

              This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

              Assignment Branch Condition size for zoom_update_and_test is too high. [15.56/15]
              Open

                def zoom_update_and_test(item, zoom_db)
                  item_class = item.class.name
              
                  if !session[:skip_existing].nil? && (session[:skip_existing] == true)
                    # test if it's in there first

              This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

              Assignment Branch Condition size for clear is too high. [15.17/15]
              Open

                def clear
                  if params[:search_id].to_i > 0
                    clear_users_previous_searches(params[:search_id].to_i)
                    flash[:notice] = t('search_controller.clear.selected_search_removed')
                    redirect_to action: 'list'

              This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

              Assignment Branch Condition size for load_results is too high. [15.17/15]
              Open

                def load_results(from_result_set)
                  @results = []
              
                  # protect against malformed requests
                  # for a start record that is more than the numbers of matching records, return a 404

              This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

              Method find_index has 36 lines of code (exceeds 25 allowed). Consider refactoring.
              Open

                def find_index
                  @current_basket = Basket.find(params[:current_basket_id])
                  @topics_outside_of_this_basket = false # turn this to true if you want to allow the Site basket
                  # homepage to be an About basket topic for example
                  @current_homepage = @current_basket.index_topic
              Severity: Minor
              Found in app/controllers/search_controller.rb - About 1 hr to fix

                Method private_search_authorisation has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.
                Open

                  def private_search_authorisation
                    # Allow all public searches
                    return true unless is_a_private_search?
                
                    if (@current_basket == @site_basket) && !authorised_basket_names.empty?
                Severity: Minor
                Found in app/controllers/search_controller.rb - About 55 mins to fix

                Cognitive Complexity

                Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

                A method's cognitive complexity is based on a few simple rules:

                • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
                • Code is considered more complex for each "break in the linear flow of the code"
                • Code is considered more complex when "flow breaking structures are nested"

                Further reading

                Method zoom_update_and_test has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
                Open

                  def zoom_update_and_test(item, zoom_db)
                    item_class = item.class.name
                
                    if !session[:skip_existing].nil? && (session[:skip_existing] == true)
                      # test if it's in there first
                Severity: Minor
                Found in app/controllers/search_controller.rb - About 25 mins to fix

                Cognitive Complexity

                Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

                A method's cognitive complexity is based on a few simple rules:

                • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
                • Code is considered more complex for each "break in the linear flow of the code"
                • Code is considered more complex when "flow breaking structures are nested"

                Further reading

                TODO found
                Open

                  #     # TODO: redirect_to search form of the same url
                Severity: Minor
                Found in app/controllers/search_controller.rb by fixme

                TODO found
                Open

                    # EOIN: TODO: re-enable these sometime
                Severity: Minor
                Found in app/controllers/search_controller.rb by fixme

                Put empty method definitions on a single line.
                Open

                  def list
                  end

                This cop checks for the formatting of empty method definitions. By default it enforces empty method definitions to go on a single line (compact style), but it can be configured to enforce the end to go on its own line (expanded style).

                Note: A method definition is not considered empty if it contains comments.

                Example: EnforcedStyle: compact (default)

                # bad
                def foo(bar)
                end
                
                def self.foo(bar)
                end
                
                # good
                def foo(bar); end
                
                def foo(bar)
                  # baz
                end
                
                def self.foo(bar); end

                Example: EnforcedStyle: expanded

                # bad
                def foo(bar); end
                
                def self.foo(bar); end
                
                # good
                def foo(bar)
                end
                
                def self.foo(bar)
                end

                The use of eval is a serious security risk.
                Open

                          eval \

                This cop checks for the use of Kernel#eval and Binding#eval.

                Example:

                # bad
                
                eval(something)
                binding.eval(something)

                Redundant curly braces around a hash parameter.
                Open

                      location_hash.merge!({
                                             search_terms_slug: to_search_terms_slug(params[:search_terms]),
                                             search_terms: params[:search_terms],
                                             action: 'for'
                                           })

                This cop checks for braces around the last parameter in a method call if the last parameter is a hash. It supports braces, no_braces and context_dependent styles.

                Example: EnforcedStyle: braces

                # The `braces` style enforces braces around all method
                # parameters that are hashes.
                
                # bad
                some_method(x, y, a: 1, b: 2)
                
                # good
                some_method(x, y, {a: 1, b: 2})

                Example: EnforcedStyle: no_braces (default)

                # The `no_braces` style checks that the last parameter doesn't
                # have braces around it.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                
                # good
                some_method(x, y, a: 1, b: 2)

                Example: EnforcedStyle: context_dependent

                # The `context_dependent` style checks that the last parameter
                # doesn't have braces around it, but requires braces if the
                # second to last parameter is also a hash literal.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)
                
                # good
                some_method(x, y, a: 1, b: 2)
                some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})

                Favor unless over if for negative conditions.
                Open

                    if !params[:limit_to_choice].blank?
                      location_hash[:limit_to_choice] = params[:limit_to_choice]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Redundant curly braces around a hash parameter.
                Open

                    @search.pqf_query.relations_include(url_for_dc_identifier(@source_item, { force_http: true, minimal: true }), should_be_exact: true) if !@source_item.nil?

                This cop checks for braces around the last parameter in a method call if the last parameter is a hash. It supports braces, no_braces and context_dependent styles.

                Example: EnforcedStyle: braces

                # The `braces` style enforces braces around all method
                # parameters that are hashes.
                
                # bad
                some_method(x, y, a: 1, b: 2)
                
                # good
                some_method(x, y, {a: 1, b: 2})

                Example: EnforcedStyle: no_braces (default)

                # The `no_braces` style checks that the last parameter doesn't
                # have braces around it.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                
                # good
                some_method(x, y, a: 1, b: 2)

                Example: EnforcedStyle: context_dependent

                # The `context_dependent` style checks that the last parameter
                # doesn't have braces around it, but requires braces if the
                # second to last parameter is also a hash literal.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)
                
                # good
                some_method(x, y, a: 1, b: 2)
                some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})

                Use each_with_object instead of inject.
                Open

                          pagination_methods.inject({}) do |hash, method_name|

                This cop looks for inject / reduce calls where the passed in object is returned at the end and so could be replaced by eachwithobject without the need to return the object at the end.

                However, we can't replace with eachwithobject if the accumulator parameter is assigned to within the block.

                Example:

                # bad
                [1, 2].inject({}) { |a, e| a[e] = e; a }
                
                # good
                [1, 2].each_with_object({}) { |e, a| a[e] = e }

                Move @successful = true out of the conditional.
                Open

                        @successful = true

                This cop checks for identical lines at the beginning or end of each branch of a conditional statement.

                Example:

                # bad
                if condition
                  do_x
                  do_z
                else
                  do_y
                  do_z
                end
                
                # good
                if condition
                  do_x
                else
                  do_y
                end
                do_z
                
                # bad
                if condition
                  do_z
                  do_x
                else
                  do_z
                  do_y
                end
                
                # good
                do_z
                if condition
                  do_x
                else
                  do_y
                end
                
                # bad
                case foo
                when 1
                  do_x
                when 2
                  do_x
                else
                  do_x
                end
                
                # good
                case foo
                when 1
                  do_x
                  do_y
                when 2
                  # nothing
                else
                  do_x
                  do_z
                end

                Convert if nested inside else to elsif.
                Open

                        @search.pqf_query.within(authorised_basket_names) if is_a_private_search? && !@site_admin

                If the else branch of a conditional consists solely of an if node, it can be combined with the else to become an elsif. This helps to keep the nesting level from getting too deep.

                Example:

                # bad
                if condition_a
                  action_a
                else
                  if condition_b
                    action_b
                  else
                    action_c
                  end
                end
                
                # good
                if condition_a
                  action_a
                elsif condition_b
                  action_b
                else
                  action_c
                end

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.relations_include(url_for_dc_identifier(@source_item, { force_http: true, minimal: true }), should_be_exact: true) if !@source_item.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.creators_or_contributors_equals_completely("'#{@contributor.login}'") if !@contributor.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.date_on_or_after(parse_date_into_zoom_compatible_format(@date_since, :beginning)) if !@date_since.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Favor unless over if for negative conditions.
                Open

                    if !params[:source_controller_singular].blank?
                      location_hash[:source_controller_singular] = params[:source_controller_singular]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use params[:page].to_i.positive? instead of params[:page].to_i > 0.
                Open

                        current_page = params[:page] && params[:page].to_i > 0 ? params[:page].to_i : 1

                This cop checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.

                The cop disregards #nonzero? as it its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

                The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

                Example: EnforcedStyle: predicate (default)

                # bad
                
                foo == 0
                0 > foo
                bar.baz > 0
                
                # good
                
                foo.zero?
                foo.negative?
                bar.baz.positive?

                Example: EnforcedStyle: comparison

                # bad
                
                foo.zero?
                foo.negative?
                bar.baz.positive?
                
                # good
                
                foo == 0
                0 > foo
                bar.baz > 0

                Do not use unless with else. Rewrite these with the positive case first.
                Open

                    unless zoom_class == 'Combined'
                      @search.pqf_query.kind_is(zoom_class, operator: 'none')
                    else
                      # we have to put something into this inorder to get results
                      @search.pqf_query.kind_is('oai', operator: 'none')

                This cop looks for unless expressions with else clauses.

                Example:

                # bad
                unless foo_bar.nil?
                  # do something...
                else
                  # do a different thing...
                end
                
                # good
                if foo_bar.present?
                  # do something...
                else
                  # do a different thing...
                end

                Favor unless over if for negative conditions.
                Open

                    if !params[:contributor].blank?
                      location_hash[:contributor] = params[:contributor]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                %w-literals should be delimited by [ and ].
                Open

                    plural_aliased_dc_methods = %w(relation subject creator contributor)

                This cop enforces the consistent usage of %-literal delimiters.

                Specify the 'default' key to set all preferred delimiters at once. You can continue to specify individual preferred delimiters to override the default.

                Example:

                # Style/PercentLiteralDelimiters:
                #   PreferredDelimiters:
                #     default: '[]'
                #     '%i':    '()'
                
                # good
                %w[alpha beta] + %i(gamma delta)
                
                # bad
                %W(alpha #{beta})
                
                # bad
                %I(alpha beta)

                Avoid rescuing without specifying an error class.
                Open

                    rescue

                This cop checks for rescuing StandardError. There are two supported styles implicit and explicit. This cop will not register an offense if any error other than StandardError is specified.

                Example: EnforcedStyle: implicit

                # `implicit` will enforce using `rescue` instead of
                # `rescue StandardError`.
                
                # bad
                begin
                  foo
                rescue StandardError
                  bar
                end
                
                # good
                begin
                  foo
                rescue
                  bar
                end
                
                # good
                begin
                  foo
                rescue OtherError
                  bar
                end
                
                # good
                begin
                  foo
                rescue StandardError, SecurityError
                  bar
                end

                Example: EnforcedStyle: explicit (default)

                # `explicit` will enforce using `rescue StandardError`
                # instead of `rescue`.
                
                # bad
                begin
                  foo
                rescue
                  bar
                end
                
                # good
                begin
                  foo
                rescue StandardError
                  bar
                end
                
                # good
                begin
                  foo
                rescue OtherError
                  bar
                end
                
                # good
                begin
                  foo
                rescue StandardError, SecurityError
                  bar
                end

                Pass &:id as an argument to collect instead of a block.
                Open

                      @existing_ids = existing.collect { |existing_item| existing_item.id }

                Use symbols as procs when possible.

                Example:

                # bad
                something.map { |s| s.upcase }
                
                # good
                something.map(&:upcase)

                Useless private access modifier.
                Open

                  private

                This cop checks for redundant access modifiers, including those with no code, those which are repeated, and leading public modifiers in a class or module body. Conditionally-defined methods are considered as always being defined, and thus access modifiers guarding such methods are not redundant.

                Example:

                class Foo
                  public # this is redundant (default access is public)
                
                  def method
                  end
                
                  private # this is not redundant (a method is defined)
                  def method2
                  end
                
                  private # this is redundant (no following methods are defined)
                end

                Example:

                class Foo
                  # The following is not redundant (conditionally defined methods are
                  # considered as always defining a method)
                  private
                
                  if condition?
                    def method
                    end
                  end
                
                  protected # this is not redundant (method is defined)
                
                  define_method(:method2) do
                  end
                
                  protected # this is redundant (repeated from previous modifier)
                
                  [1,2,3].each do |i|
                    define_method("foo#{i}") do
                    end
                  end
                
                  # The following is redundant (methods defined on the class'
                  # singleton class are not affected by the public modifier)
                  public
                
                  def self.method3
                  end
                end

                Example:

                # Lint/UselessAccessModifier:
                #   ContextCreatingMethods:
                #     - concerning
                require 'active_support/concern'
                class Foo
                  concerning :Bar do
                    def some_public_method
                    end
                
                    private
                
                    def some_private_method
                    end
                  end
                
                  # this is not redundant because `concerning` created its own context
                  private
                
                  def some_other_private_method
                  end
                end

                Example:

                # Lint/UselessAccessModifier:
                #   MethodCreatingMethods:
                #     - delegate
                require 'active_support/core_ext/module/delegation'
                class Foo
                  # this is not redundant because `delegate` creates methods
                  private
                
                  delegate :method_a, to: :method_b
                end

                Pass __FILE__ and __LINE__ to eval method, as they are used by backtraces.
                Open

                          eval \
                            "class << @results
                              define_method('#{method_name}') do
                                #{pagination_methods[method_name]}
                              end

                This cop checks eval method usage. eval can receive source location metadata, that are filename and line number. The metadata is used by backtraces. This cop recommends to pass the metadata to eval method.

                Example:

                # bad
                eval <<-RUBY
                  def do_something
                  end
                RUBY
                
                # bad
                C.class_eval <<-RUBY
                  def do_something
                  end
                RUBY
                
                # good
                eval <<-RUBY, binding, __FILE__, __LINE__ + 1
                  def do_something
                  end
                RUBY
                
                # good
                C.class_eval <<-RUBY, __FILE__, __LINE__ + 1
                  def do_something
                  end
                RUBY

                Favor unless over if for negative conditions.
                Open

                    if !params[:tag].blank?
                      location_hash[:tag] = params[:tag]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Favor unless over if for negative conditions.
                Open

                    if !params[:extended_field].blank?
                      location_hash.merge({ extended_field: params[:extended_field] })
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use && instead of and.
                Open

                    search_sort_direction = params[:sort_type].blank? and !sort_direction.blank? ? sort_direction : params[:sort_direction]

                This cop checks for uses of and and or, and suggests using && and || instead. It can be configured to check only in conditions, or in all contexts.

                Example: EnforcedStyle: always (default)

                # bad
                foo.save and return
                
                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                if foo && bar
                end

                Example: EnforcedStyle: conditionals

                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                foo.save and return
                
                # good
                if foo && bar
                end

                Use && instead of and.
                Open

                    params[:controller] == 'search' and params[:action] == 'find_related'

                This cop checks for uses of and and or, and suggests using && and || instead. It can be configured to check only in conditions, or in all contexts.

                Example: EnforcedStyle: always (default)

                # bad
                foo.save and return
                
                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                if foo && bar
                end

                Example: EnforcedStyle: conditionals

                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                foo.save and return
                
                # good
                if foo && bar
                end

                Use && instead of and.
                Open

                    params[:controller] == 'search' and params[:action] == 'find_index'

                This cop checks for uses of and and or, and suggests using && and || instead. It can be configured to check only in conditions, or in all contexts.

                Example: EnforcedStyle: always (default)

                # bad
                foo.save and return
                
                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                if foo && bar
                end

                Example: EnforcedStyle: conditionals

                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                foo.save and return
                
                # good
                if foo && bar
                end

                Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
                Open

                    if slideshow.results.nil?

                Checks for if and unless statements that would fit on one line if written as a modifier if/unless. The maximum line length is configured in the Metrics/LineLength cop.

                Example:

                # bad
                if condition
                  do_stuff(bar)
                end
                
                unless qux.empty?
                  Foo.do_something
                end
                
                # good
                do_stuff(bar) if condition
                Foo.do_something unless qux.empty?

                Favor unless over if for negative conditions.
                Open

                    if !params[:source_item].blank?
                      location_hash[:source_item] = params[:source_item]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use && instead of and.
                Open

                    search_sort_type = params[:sort_type].blank? and !sort_type.blank? ? sort_type : params[:sort_type]

                This cop checks for uses of and and or, and suggests using && and || instead. It can be configured to check only in conditions, or in all contexts.

                Example: EnforcedStyle: always (default)

                # bad
                foo.save and return
                
                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                if foo && bar
                end

                Example: EnforcedStyle: conditionals

                # bad
                if foo and bar
                end
                
                # good
                foo.save && return
                
                # good
                foo.save and return
                
                # good
                if foo && bar
                end

                Unused method argument - zoom_db. If it's necessary, use _ or _zoom_db as an argument name to indicate that it won't be used.
                Open

                  def zoom_update_and_test(item, zoom_db)

                This cop checks for unused method arguments.

                Example:

                # bad
                
                def some_method(used, unused, _unused_but_allowed)
                  puts used
                end

                Example:

                # good
                
                def some_method(used, _unused, _unused_but_allowed)
                  puts used
                end

                Avoid multi-line ternary operators, use if or unless instead.
                Open

                      params[:target_basket].nil? ? \
                           params[:urlified_name] : params[:target_basket]

                This cop checks for multi-line ternary op expressions.

                Example:

                # bad
                a = cond ?
                  b : c
                a = cond ? b :
                    c
                a = cond ?
                    b :
                    c
                
                # good
                a = cond ? b : c
                a =
                  if cond
                    b
                  else
                    c
                  end

                Favor unless over if for negative conditions.
                Open

                    if !@search_terms.blank?
                      # add the actual text search if there are search terms
                      @search.pqf_query.title_or_any_text_includes(@search_terms)
                
                      # this make searching for urls work

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use params[:search_id].to_i.positive? instead of params[:search_id].to_i > 0.
                Open

                    if params[:search_id].to_i > 0

                This cop checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.

                The cop disregards #nonzero? as it its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

                The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

                Example: EnforcedStyle: predicate (default)

                # bad
                
                foo == 0
                0 > foo
                bar.baz > 0
                
                # good
                
                foo.zero?
                foo.negative?
                bar.baz.positive?

                Example: EnforcedStyle: comparison

                # bad
                
                foo.zero?
                foo.negative?
                bar.baz.positive?
                
                # good
                
                foo == 0
                0 > foo
                bar.baz > 0

                Redundant curly braces around a hash parameter.
                Open

                      location_hash.merge({ extended_field: params[:extended_field] })

                This cop checks for braces around the last parameter in a method call if the last parameter is a hash. It supports braces, no_braces and context_dependent styles.

                Example: EnforcedStyle: braces

                # The `braces` style enforces braces around all method
                # parameters that are hashes.
                
                # bad
                some_method(x, y, a: 1, b: 2)
                
                # good
                some_method(x, y, {a: 1, b: 2})

                Example: EnforcedStyle: no_braces (default)

                # The `no_braces` style checks that the last parameter doesn't
                # have braces around it.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                
                # good
                some_method(x, y, a: 1, b: 2)

                Example: EnforcedStyle: context_dependent

                # The `context_dependent` style checks that the last parameter
                # doesn't have braces around it, but requires braces if the
                # second to last parameter is also a hash literal.
                
                # bad
                some_method(x, y, {a: 1, b: 2})
                some_method(x, y, {a: 1, b: 2}, a: 1, b: 2)
                
                # good
                some_method(x, y, a: 1, b: 2)
                some_method(x, y, {a: 1, b: 2}, {a: 1, b: 2})

                Use from_result_set.size.positive? instead of from_result_set.size > 0.
                Open

                    if from_result_set.size > 0

                This cop checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.

                The cop disregards #nonzero? as it its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

                The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

                Example: EnforcedStyle: predicate (default)

                # bad
                
                foo == 0
                0 > foo
                bar.baz > 0
                
                # good
                
                foo.zero?
                foo.negative?
                bar.baz.positive?

                Example: EnforcedStyle: comparison

                # bad
                
                foo.zero?
                foo.negative?
                bar.baz.positive?
                
                # good
                
                foo == 0
                0 > foo
                bar.baz > 0

                Use a guard clause instead of wrapping the code inside a conditional expression.
                Open

                    if item.has_appropriate_zoom_records?

                Use a guard clause instead of wrapping the code inside a conditional expression

                Example:

                # bad
                def test
                  if something
                    work
                  end
                end
                
                # good
                def test
                  return unless something
                  work
                end
                
                # also good
                def test
                  work if something
                end
                
                # bad
                if something
                  raise 'exception'
                else
                  ok
                end
                
                # good
                raise 'exception' if something
                ok

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.coverage_equals_completely(@topic_type.name.to_s) if !@topic_type.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use params[:page].to_i.positive? instead of params[:page].to_i > 0.
                Open

                    @current_page = params[:page] && params[:page].to_i > 0 ? params[:page].to_i : 1

                This cop checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.

                The cop disregards #nonzero? as it its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

                The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

                Example: EnforcedStyle: predicate (default)

                # bad
                
                foo == 0
                0 > foo
                bar.baz > 0
                
                # good
                
                foo.zero?
                foo.negative?
                bar.baz.positive?

                Example: EnforcedStyle: comparison

                # bad
                
                foo.zero?
                foo.negative?
                bar.baz.positive?
                
                # good
                
                foo == 0
                0 > foo
                bar.baz > 0

                Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
                Open

                    if !params[:tag].blank?

                Checks for if and unless statements that would fit on one line if written as a modifier if/unless. The maximum line length is configured in the Metrics/LineLength cop.

                Example:

                # bad
                if condition
                  do_stuff(bar)
                end
                
                unless qux.empty?
                  Foo.do_something
                end
                
                # good
                do_stuff(bar) if condition
                Foo.do_something unless qux.empty?

                Prefer single-quoted strings inside interpolations.
                Open

                      logger.info "A user who was #{logged_in? ? "" : "not "}logged was denied access to a private search."

                This cop checks that quotes inside the string interpolation match the configured preference.

                Example: EnforcedStyle: single_quotes (default)

                # bad
                result = "Tests #{success ? "PASS" : "FAIL"}"
                
                # good
                result = "Tests #{success ? 'PASS' : 'FAIL'}"

                Example: EnforcedStyle: double_quotes

                # bad
                result = "Tests #{success ? 'PASS' : 'FAIL'}"
                
                # good
                result = "Tests #{success ? "PASS" : "FAIL"}"

                Use the return of the conditional for variable assignment and comparison.
                Open

                      if params[:number_of_results_per_page].blank?
                        @number_per_page = session[:number_of_results_per_page] ? session[:number_of_results_per_page].to_i : SystemSetting.default_records_per_page
                      else
                        @number_per_page = params[:number_of_results_per_page].to_i
                      end

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.date_before(parse_date_into_zoom_compatible_format(@date_until, :beginning)) if !@date_until.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Favor unless over if for negative conditions.
                Open

                    if !params[:date_since].blank?
                      location_hash[:date_since] = params[:date_since]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use safe navigation (&.) instead of checking if an object exists before calling the method.
                Open

                        unless @current_homepage.nil?
                          # if there was a previous homepage topic, it'll be given a new version by update_index_topic
                          # so we need to add a contributor to prevent 500 errors on the history page of the topic
                          # we also have to pass in the version + 1, because we are working from an old copy of the previous homepage topic
                          # and the version is out of date by this stage, and calling reload on it will load the new homepage topic, not the old

                This cop transforms usages of a method call safeguarded by a non nil check for the variable whose method is being called to safe navigation (&.).

                Configuration option: ConvertCodeThatCanStartToReturnNil The default for this is false. When configured to true, this will check for code in the format !foo.nil? && foo.bar. As it is written, the return of this code is limited to false and whatever the return of the method is. If this is converted to safe navigation, foo&.bar can start returning nil as well as what the method returns.

                Example:

                # bad
                foo.bar if foo
                foo.bar(param1, param2) if foo
                foo.bar { |e| e.something } if foo
                foo.bar(param) { |e| e.something } if foo
                
                foo.bar if !foo.nil?
                foo.bar unless !foo
                foo.bar unless foo.nil?
                
                foo && foo.bar
                foo && foo.bar(param1, param2)
                foo && foo.bar { |e| e.something }
                foo && foo.bar(param) { |e| e.something }
                
                # good
                foo&.bar
                foo&.bar(param1, param2)
                foo&.bar { |e| e.something }
                foo&.bar(param) { |e| e.something }
                
                foo.nil? || foo.bar
                !foo || foo.bar
                
                # Methods that `nil` will `respond_to?` should not be converted to
                # use safe navigation
                foo.to_i if foo

                Use the return of the conditional for variable assignment and comparison.
                Open

                    if is_rss?
                      @number_per_page = (params[:count] || 50).to_i
                    else
                      # otherwise we fallback to default constant
                      # unless user has specifically chosen a different number

                Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
                Open

                    if is_a_private_search?

                Checks for if and unless statements that would fit on one line if written as a modifier if/unless. The maximum line length is configured in the Metrics/LineLength cop.

                Example:

                # bad
                if condition
                  do_stuff(bar)
                end
                
                unless qux.empty?
                  Foo.do_something
                end
                
                # good
                do_stuff(bar) if condition
                Foo.do_something unless qux.empty?

                Favor unless over if for negative conditions.
                Open

                    if !params[:topic_type].blank?
                      location_hash[:topic_type] = params[:topic_type]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Prefer single-quoted strings inside interpolations.
                Open

                    logger.debug("Stored results for page #{slideshow.current_page}: #{slideshow.results.join(", ")}")

                This cop checks that quotes inside the string interpolation match the configured preference.

                Example: EnforcedStyle: single_quotes (default)

                # bad
                result = "Tests #{success ? "PASS" : "FAIL"}"
                
                # good
                result = "Tests #{success ? 'PASS' : 'FAIL'}"

                Example: EnforcedStyle: double_quotes

                # bad
                result = "Tests #{success ? 'PASS' : 'FAIL'}"
                
                # good
                result = "Tests #{success ? "PASS" : "FAIL"}"

                Pass &:to_s as an argument to collect instead of a block.
                Open

                    @basket_access_hash.keys.collect { |key| key.to_s }

                Use symbols as procs when possible.

                Example:

                # bad
                something.map { |s| s.upcase }
                
                # good
                something.map(&:upcase)

                Closing array brace must be on the line after the last array element when opening brace is on a separate line from the first array element.
                Open

                          'previous_page', 'next_page']

                This cop checks that the closing brace in an array literal is either on the same line as the last array element, or a new line.

                When using the symmetrical (default) style:

                If an array's opening brace is on the same line as the first element of the array, then the closing brace should be on the same line as the last element of the array.

                If an array's opening brace is on the line above the first element of the array, then the closing brace should be on the line below the last element of the array.

                When using the new_line style:

                The closing brace of a multi-line array literal must be on the line after the last element of the array.

                When using the same_line style:

                The closing brace of a multi-line array literal must be on the same line as the last element of the array.

                Example: EnforcedStyle: symmetrical (default)

                # bad
                  [ :a,
                    :b
                  ]
                
                  # bad
                  [
                    :a,
                    :b ]
                
                  # good
                  [ :a,
                    :b ]
                
                  # good
                  [
                    :a,
                    :b
                  ]

                Example: EnforcedStyle: new_line

                # bad
                  [
                    :a,
                    :b ]
                
                  # bad
                  [ :a,
                    :b ]
                
                  # good
                  [ :a,
                    :b
                  ]
                
                  # good
                  [
                    :a,
                    :b
                  ]

                Example: EnforcedStyle: same_line

                # bad
                  [ :a,
                    :b
                  ]
                
                  # bad
                  [
                    :a,
                    :b
                  ]
                
                  # good
                  [
                    :a,
                    :b ]
                
                  # good
                  [ :a,
                    :b ]

                Rename is_rss? to rss?.
                Open

                  def is_rss?

                This cop makes sure that predicates are named properly.

                Example:

                # bad
                def is_even?(value)
                end
                
                # good
                def even?(value)
                end
                
                # bad
                def has_value?
                end
                
                # good
                def value?
                end

                Put empty method definitions on a single line.
                Open

                  def index
                  end

                This cop checks for the formatting of empty method definitions. By default it enforces empty method definitions to go on a single line (compact style), but it can be configured to enforce the end to go on its own line (expanded style).

                Note: A method definition is not considered empty if it contains comments.

                Example: EnforcedStyle: compact (default)

                # bad
                def foo(bar)
                end
                
                def self.foo(bar)
                end
                
                # good
                def foo(bar); end
                
                def foo(bar)
                  # baz
                end
                
                def self.foo(bar); end

                Example: EnforcedStyle: expanded

                # bad
                def foo(bar); end
                
                def self.foo(bar); end
                
                # good
                def foo(bar)
                end
                
                def self.foo(bar)
                end

                Favor unless over if for negative conditions.
                Open

                    @search.pqf_query.subjects_equals_completely(@tag.name.to_s) if !@tag.nil?

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Move @successful = true out of the conditional.
                Open

                        @successful = true

                This cop checks for identical lines at the beginning or end of each branch of a conditional statement.

                Example:

                # bad
                if condition
                  do_x
                  do_z
                else
                  do_y
                  do_z
                end
                
                # good
                if condition
                  do_x
                else
                  do_y
                end
                do_z
                
                # bad
                if condition
                  do_z
                  do_x
                else
                  do_z
                  do_y
                end
                
                # good
                do_z
                if condition
                  do_x
                else
                  do_y
                end
                
                # bad
                case foo
                when 1
                  do_x
                when 2
                  do_x
                else
                  do_x
                end
                
                # good
                case foo
                when 1
                  do_x
                  do_y
                when 2
                  # nothing
                else
                  do_x
                  do_z
                end

                Prefer single-quoted strings inside interpolations.
                Open

                      logger.info "A user who was #{logged_in? ? "" : "not "}logged was denied access to a private search."

                This cop checks that quotes inside the string interpolation match the configured preference.

                Example: EnforcedStyle: single_quotes (default)

                # bad
                result = "Tests #{success ? "PASS" : "FAIL"}"
                
                # good
                result = "Tests #{success ? 'PASS' : 'FAIL'}"

                Example: EnforcedStyle: double_quotes

                # bad
                result = "Tests #{success ? 'PASS' : 'FAIL'}"
                
                # good
                result = "Tests #{success ? "PASS" : "FAIL"}"

                Use %w or %W for an array of words.
                Open

                        pagination_methods = [
                          'total_entries', 'total_pages', 'current_page',
                          'previous_page', 'next_page']

                This cop can check for array literals made up of word-like strings, that are not using the %w() syntax.

                Alternatively, it can check for uses of the %w() syntax, in projects which do not want to include that syntax.

                Configuration option: MinSize If set, arrays with fewer elements than this value will not trigger the cop. For example, a MinSize of 3 will not enforce a style on an array of 2 or fewer elements.

                Example: EnforcedStyle: percent (default)

                # good
                %w[foo bar baz]
                
                # bad
                ['foo', 'bar', 'baz']

                Example: EnforcedStyle: brackets

                # good
                ['foo', 'bar', 'baz']
                
                # bad
                %w[foo bar baz]

                Convert if nested inside else to elsif.
                Open

                      if params[:number_of_results_per_page].blank?

                If the else branch of a conditional consists solely of an if node, it can be combined with the else to become an elsif. This helps to keep the nesting level from getting too deep.

                Example:

                # bad
                if condition_a
                  action_a
                else
                  if condition_b
                    action_b
                  else
                    action_c
                  end
                end
                
                # good
                if condition_a
                  action_a
                elsif condition_b
                  action_b
                else
                  action_c
                end

                Avoid multi-line ternary operators, use if or unless instead.
                Open

                      params[:controller_name_for_zoom_class].nil? ? \
                           zoom_class_controller(SystemSetting.default_search_class) : params[:controller_name_for_zoom_class]

                This cop checks for multi-line ternary op expressions.

                Example:

                # bad
                a = cond ?
                  b : c
                a = cond ? b :
                    c
                a = cond ?
                    b :
                    c
                
                # good
                a = cond ? b : c
                a =
                  if cond
                    b
                  else
                    c
                  end

                Favor unless over if for negative conditions.
                Open

                        if !@current_homepage.nil?
                          @results.reject! { |result| (result[:id].to_i == @current_homepage.id) }
                        end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Rename is_a_private_search? to a_private_search?.
                Open

                  def is_a_private_search?

                This cop makes sure that predicates are named properly.

                Example:

                # bad
                def is_even?(value)
                end
                
                # good
                def even?(value)
                end
                
                # bad
                def has_value?
                end
                
                # good
                def value?
                end

                Do not use :: for method calls.
                Open

                    Unicode::normalize_KD(slug.escape).downcase

                This cop checks for methods invoked via the :: operator instead of the . operator (like FileUtils::rmdir instead of FileUtils.rmdir).

                Example:

                # bad
                Timeout::timeout(500) { do_something }
                FileUtils::rmdir(dir)
                Marshal::dump(obj)
                
                # good
                Timeout.timeout(500) { do_something }
                FileUtils.rmdir(dir)
                Marshal.dump(obj)

                Favor unless over if for negative conditions.
                Open

                    if !params[:date_until].blank?
                      location_hash[:date_until] = params[:date_until]
                    end

                Checks for uses of if with a negated condition. Only ifs without else are considered. There are three different styles:

                - both
                - prefix
                - postfix

                Example: EnforcedStyle: both (default)

                # enforces `unless` for `prefix` and `postfix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo

                Example: EnforcedStyle: prefix

                # enforces `unless` for just `prefix` conditionals
                
                # bad
                
                if !foo
                  bar
                end
                
                # good
                
                unless foo
                  bar
                end
                
                # good
                
                bar if !foo

                Example: EnforcedStyle: postfix

                # enforces `unless` for just `postfix` conditionals
                
                # bad
                
                bar if !foo
                
                # good
                
                bar unless foo
                
                # good
                
                if !foo
                  bar
                end

                Use !empty? instead of size > 0.
                Open

                    if from_result_set.size > 0

                This cop checks for numeric comparisons that can be replaced by a predicate method, such as receiver.length == 0, receiver.length > 0, receiver.length != 0, receiver.length < 1 and receiver.size == 0 that can be replaced by receiver.empty? and !receiver.empty.

                Example:

                # bad
                [1, 2, 3].length == 0
                0 == "foobar".length
                array.length < 1
                {a: 1, b: 2}.length != 0
                string.length > 0
                hash.size > 0
                
                # good
                [1, 2, 3].empty?
                "foobar".empty?
                array.empty?
                !{a: 1, b: 2}.empty?
                !string.empty?
                !hash.empty?

                There are no issues that match your filters.

                Category
                Status