TracksApp/tracks

View on GitHub
app/controllers/todos_controller.rb

Summary

Maintainability
F
4 days
Test Coverage

Model attribute used in file name
Open

      send_file(attachment.file.path,

Using user input when accessing files (local or remote) will raise a warning in Brakeman.

For example

File.open("/tmp/#{cookie[:file]}")

will raise an error like

Cookie value used in file name near line 4: File.open("/tmp/#{cookie[:file]}")

This type of vulnerability can be used to access arbitrary files on a server (including /etc/passwd.

Class has too many lines. [1065/300]
Open

class TodosController < ApplicationController
  skip_before_action :login_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
  prepend_before_action :login_or_feed_token_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
  append_before_action :find_and_activate_ready, :only => [:index, :list_deferred]

Severity: Minor
Found in app/controllers/todos_controller.rb by rubocop

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

File todos_controller.rb has 1067 lines of code (exceeds 300 allowed). Consider refactoring.
Open

class TodosController < ApplicationController
  skip_before_action :login_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
  prepend_before_action :login_or_feed_token_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
  append_before_action :find_and_activate_ready, :only => [:index, :list_deferred]

Severity: Major
Found in app/controllers/todos_controller.rb - About 2 days to fix

    Complex method TodosController#determine_remaining_in_container_count (191.0)
    Open

      def determine_remaining_in_container_count(todo = @todo)
        source_view do |from|
          from.deferred do
            todos_in_container, todos_in_target_container = find_todos_in_container_and_target_container(todo, @todo)
            @remaining_in_context = todos_in_container.deferred_or_blocked.count
    Severity: Minor
    Found in app/controllers/todos_controller.rb by flog

    Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

    You can read more about ABC metrics or the flog tool

    Complex method TodosController#create (190.5)
    Open

      def create
        @source_view = params['_source_view'] || 'todo'
        @default_context = current_user.contexts.where(:name => params['default_context_name']).first
        @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
    
    
    Severity: Minor
    Found in app/controllers/todos_controller.rb by flog

    Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

    You can read more about ABC metrics or the flog tool

    Class TodosController has 70 methods (exceeds 20 allowed). Consider refactoring.
    Open

    class TodosController < ApplicationController
      skip_before_action :login_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
      prepend_before_action :login_or_feed_token_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
      append_before_action :find_and_activate_ready, :only => [:index, :list_deferred]
    
    
    Severity: Major
    Found in app/controllers/todos_controller.rb - About 1 day to fix

      Complex method TodosController#create_multiple (139.3)
      Open

        def create_multiple
          p = Todos::TodoCreateParamsHelper.new(params, current_user)
          tag_list = p.tag_list
      
          @not_done_todos = []
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#index (130.3)
      Open

        def index
          @source_view = params['_source_view'] || 'todo'
      
          init_data_for_sidebar unless mobile?
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#toggle_check (128.0)
      Open

        def toggle_check
          @todo = current_user.todos.find(params['id'])
      
          @source_view = params['_source_view'] || 'todo'
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#update (94.5)
      Open

        def update
          @source_view = params['_source_view'] || 'todo'
      
          @todo = current_user.todos.find(params['id'])
          @original_item = current_user.todos.build(@todo.attributes)  # create a (unsaved) copy of the original todo
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#determine_down_count (84.8)
      Open

        def determine_down_count
          source_view do |from|
            from.todo do
              @down_count = current_user.todos.active.not_hidden.count
            end
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#destroy (72.4)
      Open

        def destroy
          @source_view = params['_source_view'] || 'todo'
          @todo = current_user.todos.find(params['id'])
          # Create a (unsaved) copy of the original todo
          @original_item = current_user.todos.build(@todo.attributes)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#tag (67.4)
      Open

        def tag
          get_params_for_tag_view
          @page_title = t('todos.tagged_page_title', :tag_name => @tag_title)
          @source_view = params['_source_view'] || 'tag'
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#defer (66.1)
      Open

        def defer
          @source_view = params['_source_view'] || 'todo'
          numdays = params['days'].to_i
      
          @todo = current_user.todos.find(params[:id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Assignment Branch Condition size for create is too high. [117/100]
      Open

        def create
          @source_view = params['_source_view'] || 'todo'
          @default_context = current_user.contexts.where(:name => params['default_context_name']).first
          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      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 determine_remaining_in_container_count is too high. [115/100]
      Open

        def determine_remaining_in_container_count(todo = @todo)
          source_view do |from|
            from.deferred do
              todos_in_container, todos_in_target_container = find_todos_in_container_and_target_container(todo, @todo)
              @remaining_in_context = todos_in_container.deferred_or_blocked.count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      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

      Complex method TodosController#update_project (55.1)
      Open

        def update_project
          @project_changed = false
          if params['todo']['project_id'].blank? && !params['project_name'].nil?
            if params['project_name'].blank?
              project = Project.null_object
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#count_old_due_empty (54.9)
      Open

        def count_old_due_empty(id)
          due_today_date = Time.zone.now
          due_this_week_date = Time.zone.now.end_of_week
          due_next_week_date = due_this_week_date + 7.days
          due_this_month_date = Time.zone.now.end_of_month
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#list_deferred (48.9)
      Open

        def list_deferred
          @source_view = 'deferred'
          @page_title = t('todos.deferred_tasks_title')
      
          @contexts_to_show = @contexts = current_user.contexts
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#new (47.9)
      Open

        def new
          @projects = current_user.projects.active
          @contexts = current_user.contexts
          respond_to do |format|
            format.m do
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Method create has a Cognitive Complexity of 64 (exceeds 50 allowed). Consider refactoring.
      Open

        def create
          @source_view = params['_source_view'] || 'todo'
          @default_context = current_user.contexts.where(:name => params['default_context_name']).first
          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
      
      Severity: Minor
      Found in app/controllers/todos_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

      Complex method TodosController#update_context (46.3)
      Open

        def update_context
          @context_changed = false
          if params['todo']['context_id'].blank? && params['context_name'].present?
            @context = current_user.contexts.where(:name => params['context_name'].strip).first
            if @context.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#determine_completed_count (45.5)
      Open

        def determine_completed_count
          todos = nil
      
          source_view do |from|
            from.todo    { todos = current_user.todos.not_hidden.completed }
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#determine_changes_by_this_update (45.1)
      Open

        def determine_changes_by_this_update
          @todo_was_activated_from_deferred_state = @todo.active? && @original_item.deferred?
          @todo_was_activated_from_pending_state = @todo.active? && @original_item.pending?
          @todo_was_deferred_from_active_state = @todo.deferred? && !@original_item.deferred?
          @todo_was_blocked_from_active_state = @todo.pending? && !@original_item.pending?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Block has too many lines. [50/25]
      Open

          source_view do |from|
            from.deferred do
              todos_in_container, todos_in_target_container = find_todos_in_container_and_target_container(todo, @todo)
              @remaining_in_context = todos_in_container.deferred_or_blocked.count
              @target_context_count = todos_in_target_container.deferred_or_blocked.count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      Complex method TodosController#check_for_next_todo (41.9)
      Open

        def check_for_next_todo(todo)
          # check if this todo has a related recurring_todo. If so, create next todo
          new_recurring_todo = nil
          recurring_todo = nil
          if todo.from_recurring_todo?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#get_params_for_tag_view (41.7)
      Open

        def get_params_for_tag_view
          filter_format_for_tag_view
      
          # Don't use sanitize here because these are only used for a DB query.
          @tag_expr = []
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#add_predecessor (39.7)
      Open

        def add_predecessor
          @source_view = params['_source_view'] || 'todo'
          @predecessor = current_user.todos.find(params['predecessor'])
          @predecessors = @predecessor.predecessors
          @todo = current_user.todos.includes(Todo::DEFAULT_INCLUDES).find(params['successor'])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#toggle_star (39.5)
      Open

        def toggle_star
          @todo = current_user.todos.find(params['id'])
          @todo.toggle_star!
          @saved = true # cannot determine error
          respond_to do |format|
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Method create_multiple has a Cognitive Complexity of 59 (exceeds 50 allowed). Consider refactoring.
      Open

        def create_multiple
          p = Todos::TodoCreateParamsHelper.new(params, current_user)
          tag_list = p.tag_list
      
          @not_done_todos = []
      Severity: Minor
      Found in app/controllers/todos_controller.rb - About 1 hr 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

      Complex method TodosController#change_context (34.1)
      Open

        def change_context
          # change context if you drag a todo to another context
          @todo = current_user.todos.find(params[:id])
          @original_item = current_user.todos.build(@todo.attributes)  # create a (unsaved) copy of the original todo
          @context = current_user.contexts.find(params[:todo][:context_id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Block has too many lines. [39/25]
      Open

            respond_to do |format|
              format.html do
                redirect_to :action => "index"
              end
              format.m do
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      Block has too many lines. [39/25]
      Open

          respond_to do |format|
            format.js do
              if @saved
                determine_remaining_in_container_count(@todo)
                determine_down_count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      Complex method TodosController#auto_complete_for_predecessor (34.0)
      Open

        def auto_complete_for_predecessor
          unless params['id'].nil?
            get_todo_from_params
            # Begin matching todos in current project, excluding @todo itself
            @items = get_not_completed_for_predecessor(@todo.project, @todo.id) unless @todo.project.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#tags (32.5)
      Open

        def tags
          tags_beginning = current_user.tags.where(Tag.arel_table[:name].matches("#{params[:term]}%"))
          tags_all = current_user.tags.where(Tag.arel_table[:name].matches("%#{params[:term]}%"))
          tags_all -= tags_beginning
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#edit (31.3)
      Open

        def edit
          @todo = current_user.todos.find(params['id'])
          @source_view = params['_source_view'] || 'todo'
          @tag_name = params['_tag_name']
          respond_to do |format|
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Complex method TodosController#done (29.3)
      Open

        def done
          @source_view = 'done'
          @page_title = t('todos.completed_tasks_title')
      
          @done_today, @done_rest_of_week, @done_rest_of_month = DoneTodos.done_todos_for_container(current_user.todos)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      TodosController#check_for_next_todo refers to 'todo' more than self (maybe move it to another class?)
      Open

          if todo.from_recurring_todo?
            recurring_todo = todo.recurring_todo
      
            # check if there are active todos belonging to this recurring todo. only
            # add new one if all active todos are completed
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

      Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

      Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

      Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

      Example

      Running Reek on:

      class Warehouse
        def sale_price(item)
          (item.price - item.rebate) * @vat
        end
      end

      would report:

      Warehouse#total_price refers to item more than self (FeatureEnvy)

      since this:

      (item.price - item.rebate)

      belongs to the Item class, not the Warehouse.

      TodosController#get_not_completed_for_predecessor refers to 'items' more than self (maybe move it to another class?)
      Open

          items = items.where("AND NOT(todos.id=?)", todo_id) unless todo_id.nil?
      
          items
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

      Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

      Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

      Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

      Example

      Running Reek on:

      class Warehouse
        def sale_price(item)
          (item.price - item.rebate) * @vat
        end
      end

      would report:

      Warehouse#total_price refers to item more than self (FeatureEnvy)

      since this:

      (item.price - item.rebate)

      belongs to the Item class, not the Warehouse.

      TodosController#add_predecessor has approx 14 statements
      Open

        def add_predecessor
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#check_for_next_todo has approx 9 statements
      Open

        def check_for_next_todo(todo)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#determine_changes_by_this_update has approx 17 statements
      Open

        def determine_changes_by_this_update
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController has at least 70 methods
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Too Many Methods is a special case of LargeClass.

      Example

      Given this configuration

      TooManyMethods:
        max_methods: 3

      and this code:

      class TooManyMethods
        def one; end
        def two; end
        def three; end
        def four; end
      end

      Reek would emit the following warning:

      test.rb -- 1 warning:
        [1]:TooManyMethods has at least 4 methods (TooManyMethods)

      TodosController#onsite_redirect_to refers to 'uri' more than self (maybe move it to another class?)
      Open

          if uri.query.present?
            redirect_to("#{uri.path}?#{uri.query}")
          else
            redirect_to(uri.path)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Feature Envy occurs when a code fragment references another object more often than it references itself, or when several clients do the same series of manipulations on a particular type of object.

      Feature Envy reduces the code's ability to communicate intent: code that "belongs" on one class but which is located in another can be hard to find, and may upset the "System of Names" in the host class.

      Feature Envy also affects the design's flexibility: A code fragment that is in the wrong class creates couplings that may not be natural within the application's domain, and creates a loss of cohesion in the unwilling host class.

      Feature Envy often arises because it must manipulate other objects (usually its arguments) to get them into a useful form, and one force preventing them (the arguments) doing this themselves is that the common knowledge lives outside the arguments, or the arguments are of too basic a type to justify extending that type. Therefore there must be something which 'knows' about the contents or purposes of the arguments. That thing would have to be more than just a basic type, because the basic types are either containers which don't know about their contents, or they are single objects which can't capture their relationship with their fellows of the same type. So, this thing with the extra knowledge should be reified into a class, and the utility method will most likely belong there.

      Example

      Running Reek on:

      class Warehouse
        def sale_price(item)
          (item.price - item.rebate) * @vat
        end
      end

      would report:

      Warehouse#total_price refers to item more than self (FeatureEnvy)

      since this:

      (item.price - item.rebate)

      belongs to the Item class, not the Warehouse.

      TodosController has at least 97 instance variables
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Too Many Instance Variables is a special case of LargeClass.

      Example

      Given this configuration

      TooManyInstanceVariables:
        max_instance_variables: 3

      and this code:

      class TooManyInstanceVariables
        def initialize
          @arg_1 = :dummy
          @arg_2 = :dummy
          @arg_3 = :dummy
          @arg_4 = :dummy
        end
      end

      Reek would emit the following warning:

      test.rb -- 5 warnings:
        [1]:TooManyInstanceVariables has at least 4 instance variables (TooManyInstanceVariables)

      TodosController#create_multiple has approx 48 statements
      Open

        def create_multiple
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#auto_complete_for_predecessor has approx 6 statements
      Open

        def auto_complete_for_predecessor
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#destroy has approx 35 statements
      Open

        def destroy
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#index contains iterators nested 2 deep
      Open

              @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A Nested Iterator occurs when a block contains another block.

      Example

      Given

      class Duck
        class << self
          def duck_names
            %i!tick trick track!.each do |surname|
              %i!duck!.each do |last_name|
                puts "full name is #{surname} #{last_name}"
              end
            end
          end
        end
      end

      Reek would report the following warning:

      test.rb -- 1 warning:
        [5]:Duck#duck_names contains iterators nested 2 deep (NestedIterators)

      TodosController#defer has approx 28 statements
      Open

        def defer
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#get_ids_from_tag_expr contains iterators nested 2 deep
      Open

            tag_list.each do |tag|
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A Nested Iterator occurs when a block contains another block.

      Example

      Given

      class Duck
        class << self
          def duck_names
            %i!tick trick track!.each do |surname|
              %i!duck!.each do |last_name|
                puts "full name is #{surname} #{last_name}"
              end
            end
          end
        end
      end

      Reek would report the following warning:

      test.rb -- 1 warning:
        [5]:Duck#duck_names contains iterators nested 2 deep (NestedIterators)

      TodosController#done has approx 9 statements
      Open

        def done
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#change_context has approx 14 statements
      Open

        def change_context
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#create has approx 51 statements
      Open

        def create
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#get_done_in_period has 4 parameters
      Open

        def get_done_in_period(completed_todos, before, after, includes = { :include => Todo::DEFAULT_INCLUDES })
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A Long Parameter List occurs when a method has a lot of parameters.

      Example

      Given

      class Dummy
        def long_list(foo,bar,baz,fling,flung)
          puts foo,bar,baz,fling,flung
        end
      end

      Reek would report the following warning:

      test.rb -- 1 warning:
        [2]:Dummy#long_list has 5 parameters (LongParameterList)

      A common solution to this problem would be the introduction of parameter objects.

      TodosController#determine_completed_count has approx 12 statements
      Open

        def determine_completed_count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#determine_down_count has approx 18 statements
      Open

        def determine_down_count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#determine_remaining_in_container_count has approx 41 statements
      Open

        def determine_remaining_in_container_count(todo = @todo)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#count_old_due_empty has approx 10 statements
      Open

        def count_old_due_empty(id)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#done_tag has approx 7 statements
      Open

        def done_tag
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#index has approx 38 statements
      Open

        def index
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#edit has approx 11 statements
      Open

        def edit
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#new has approx 10 statements
      Open

        def new
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#show_notes has approx 8 statements
      Open

        def show_notes
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#tags has approx 6 statements
      Open

        def tags
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#toggle_star has approx 16 statements
      Open

        def toggle_star
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#update has approx 39 statements
      Open

        def update
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#update_project has approx 11 statements
      Open

        def update_project
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#get_params_for_tag_view has approx 11 statements
      Open

        def get_params_for_tag_view
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#get_ids_from_tag_expr has approx 8 statements
      Open

        def get_ids_from_tag_expr(tag_expr)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#list_deferred has approx 18 statements
      Open

        def list_deferred
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#remove_predecessor has approx 9 statements
      Open

        def remove_predecessor
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#show has approx 6 statements
      Open

        def show
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#update_context has approx 11 statements
      Open

        def update_context
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#toggle_check has approx 40 statements
      Open

        def toggle_check
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#find_todos_with_tag_expr has approx 9 statements
      Open

        def find_todos_with_tag_expr(tag_expr)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#tag has approx 26 statements
      Open

        def tag
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      TodosController#get_due_id_for_calendar has approx 11 statements
      Open

        def get_due_id_for_calendar(due)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      A method with Too Many Statements is any method that has a large number of lines.

      Too Many Statements warns about any method that has more than 5 statements. Reek's smell detector for Too Many Statements counts +1 for every simple statement in a method and +1 for every statement within a control structure (if, else, case, when, for, while, until, begin, rescue) but it doesn't count the control structure itself.

      So the following method would score +6 in Reek's statement-counting algorithm:

      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil                                         # +1
        end
        opt = (val = parse_arg(val, &error))[1]                          # +2
        val = conv_arg(*val)                                             # +3
        if opt and !arg
          argv.shift                                                     # +4
        else
          val[0] = nil                                                   # +5
        end
        val                                                              # +6
      end

      (You might argue that the two assigments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)

      Complex method TodosController#convert_to_project (25.3)
      Open

        def convert_to_project
          todo = current_user.todos.find(params[:id])
          @project = ProjectFromTodo.new(todo).create
      
          if @project.valid?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Method toggle_check has a Cognitive Complexity of 53 (exceeds 50 allowed). Consider refactoring.
      Open

        def toggle_check
          @todo = current_user.todos.find(params['id'])
      
          @source_view = params['_source_view'] || 'todo'
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb - About 45 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

      TodosController tests '@todo.completed?' at least 5 times
      Open

            if @todo.completed?
              @pending_to_activate = @todo.activate_pending_todos
            else
              @active_to_block = @todo.block_successors
            end
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

      Example

      Given

      class RepeatedConditionals
        attr_accessor :switch
      
        def repeat_1
          puts "Repeat 1!" if switch
        end
      
        def repeat_2
          puts "Repeat 2!" if switch
        end
      
        def repeat_3
          puts "Repeat 3!" if switch
        end
      end

      Reek would emit the following warning:

      test.rb -- 4 warnings:
        [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

      If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

      TodosController tests 'mobile?' at least 4 times
      Open

          init_data_for_sidebar unless mobile?
      
          @todos = current_user.todos.includes(Todo::DEFAULT_INCLUDES)
          if params[:context_id]
            context = current_user.contexts.find(params[:context_id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

      Example

      Given

      class RepeatedConditionals
        attr_accessor :switch
      
        def repeat_1
          puts "Repeat 1!" if switch
        end
      
        def repeat_2
          puts "Repeat 2!" if switch
        end
      
        def repeat_3
          puts "Repeat 3!" if switch
        end
      end

      Reek would emit the following warning:

      test.rb -- 4 warnings:
        [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

      If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

      TodosController tests '@saved' at least 14 times
      Open

                if @saved
                  onsite_redirect_to @return_path
                else
                  @projects = current_user.projects
                  @contexts = current_user.contexts
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

      Example

      Given

      class RepeatedConditionals
        attr_accessor :switch
      
        def repeat_1
          puts "Repeat 1!" if switch
        end
      
        def repeat_2
          puts "Repeat 2!" if switch
        end
      
        def repeat_3
          puts "Repeat 3!" if switch
        end
      end

      Reek would emit the following warning:

      test.rb -- 4 warnings:
        [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

      If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

      TodosController tests 'cookies[:mobile_url]' at least 7 times
      Open

              @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
              @mobile_from_context = current_user.contexts.find(params[:from_context]) if params[:from_context]
              @mobile_from_project = current_user.projects.find(params[:from_project]) if params[:from_project]
              if params[:from_project] && !params[:from_context]
                # we have a project but not a context -> use the default context
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

      Example

      Given

      class RepeatedConditionals
        attr_accessor :switch
      
        def repeat_1
          puts "Repeat 1!" if switch
        end
      
        def repeat_2
          puts "Repeat 2!" if switch
        end
      
        def repeat_3
          puts "Repeat 3!" if switch
        end
      end

      Reek would emit the following warning:

      test.rb -- 4 warnings:
        [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

      If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

      TodosController tests 'tag.nil?' at least 3 times
      Open

            tag_id = tag.nil? ? -1 : tag.id
            return current_user.todos.with_tag(tag_id)
          end
      
          tag_ids = get_ids_from_tag_expr(tag_expr)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Repeated Conditional is a special case of Simulated Polymorphism. Basically it means you are checking the same value throughout a single class and take decisions based on this.

      Example

      Given

      class RepeatedConditionals
        attr_accessor :switch
      
        def repeat_1
          puts "Repeat 1!" if switch
        end
      
        def repeat_2
          puts "Repeat 2!" if switch
        end
      
        def repeat_3
          puts "Repeat 3!" if switch
        end
      end

      Reek would emit the following warning:

      test.rb -- 4 warnings:
        [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)

      If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.

      Block has too many lines. [29/25]
      Open

          respond_to do |format|
            format.html { redirect_to :action => "index" }
            format.js do
              determine_down_count if @saved
              @contexts = current_user.contexts if p.new_context_created
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      TodosController#add_predecessor calls 'current_user.todos' 2 times
      Open

          @predecessor = current_user.todos.find(params['predecessor'])
          @predecessors = @predecessor.predecessors
          @todo = current_user.todos.includes(Todo::DEFAULT_INCLUDES).find(params['successor'])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'current_user.contexts' 3 times
      Open

          @default_context = current_user.contexts.where(:name => params['default_context_name']).first
          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
          @tag_name = params['_tag_name']
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls 'p.new_context_created' 4 times
      Open

              @not_done_todos << todo if p.new_context_created || p.new_project_created
              @predecessor = todo
            end
          else
            @todos = @build_todos
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#count_old_due_empty calls 'Time.zone.now' 3 times
      Open

          due_today_date = Time.zone.now
          due_this_week_date = Time.zone.now.end_of_week
          due_next_week_date = due_this_week_date + 7.days
          due_this_month_date = Time.zone.now.end_of_month
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'todos_in_container.active.not_hidden' 2 times
      Open

              @remaining_in_context = todos_in_container.active.not_hidden.count
              @target_context_count = todos_in_target_container.active.not_hidden.count
            end
            from.tag do
              tag = Tag.where(:name => params['_tag_name']).first
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#do_mobile_todo_redirection calls 'cookies[:mobile_url]' 2 times
      Open

          if cookies[:mobile_url]
            old_path = cookies[:mobile_url]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_done_rest_of_month calls 'Time.zone' 2 times
      Open

          get_done_in_period(completed_todos, Time.zone.now.beginning_of_week, Time.zone.now.beginning_of_month)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_done_rest_of_week calls 'Time.zone' 2 times
      Open

          get_done_in_period(completed_todos, Time.zone.now.beginning_of_day, Time.zone.now.beginning_of_week)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#auto_complete_for_predecessor calls '@todo.context' 2 times
      Open

            @items = get_not_completed_for_predecessor(@todo.context, @todo.id) unless !@items.empty? || @todo.context.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'p.new_project_created' 2 times
      Open

            @not_done_todos = [@todo] if p.new_project_created || p.new_context_created
            @new_project_created = p.new_project_created
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@todo.active?' 2 times
      Open

          @todo_was_activated_from_deferred_state = @todo.active? && @original_item.deferred?
          @todo_was_activated_from_pending_state = @todo.active? && @original_item.pending?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@todo.pending?' 2 times
      Open

          @todo_was_blocked_from_active_state = @todo.pending? && !@original_item.pending?
      
          @todo_deferred_state_changed = @original_item.deferred? != @todo.deferred?
          @todo_pending_state_changed = @original_item.pending? != @todo.pending?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#edit calls 'cookies[:mobile_url]' 2 times
      Open

              @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'p.new_context_created' 2 times
      Open

            @not_done_todos = [@todo] if p.new_project_created || p.new_context_created
            @new_project_created = p.new_project_created
            @new_context_created = p.new_context_created
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_down_count calls '@todo.context_id' 2 times
      Open

              context_id = @original_item ? @original_item.context_id || @todo.context_id : @todo.context_id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_down_count calls '@todo.project_id' 2 times
      Open

              unless @todo.project_id == nil
                @down_count = current_user.projects.find(@todo.project_id).todos.active_or_hidden.count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'context.todos' 2 times
      Open

              @remaining_deferred_or_pending_count = context.todos.deferred_or_blocked.count
      
              remaining_actions_in_context = context.todos.reload.active
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'current_user.projects' 3 times
      Open

              @remaining_deferred_or_pending_count = current_user.projects.find(project_id).todos.deferred_or_blocked.count
      
              if @todo_was_completed_from_deferred_or_blocked_state
                @remaining_in_context = @remaining_deferred_or_pending_count
              else
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'tag.id' 4 times
      Open

              @remaining_in_context = todos_in_container.active.not_hidden.with_tag(tag.id).count
              @target_context_count = todos_in_target_container.active.not_hidden.with_tag(tag.id).count
              @remaining_hidden_count = current_user.todos.hidden.with_tag(tag.id).count
              @remaining_deferred_or_pending_count = current_user.todos.with_tag(tag.id).deferred_or_blocked.count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#check_for_next_todo calls 'Time.zone' 3 times
      Open

              date_to_check ||= Time.zone.now
      
              if recurring_todo.active? && recurring_todo.continues_recurring?(date_to_check)
                # shift the reference date to yesterday if date_to_check is furher in
                # the past. This is to make sure we do not get older todos for overdue
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@todo.deferred?' 2 times
      Open

          @todo_was_deferred_from_active_state = @todo.deferred? && !@original_item.deferred?
          @todo_was_blocked_from_active_state = @todo.pending? && !@original_item.pending?
      
          @todo_deferred_state_changed = @original_item.deferred? != @todo.deferred?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@todo.hidden?' 2 times
      Open

          @todo_hidden_state_changed = @original_item.hidden? != @todo.hidden?
      
          @due_date_changed = @original_item.due != @todo.due
      
          source_view do |page|
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_completed_count calls '@todo.project_id' 2 times
      Open

            from.project { todos = find_completed(current_user.projects, @todo.project_id, @todo.project.hidden?) unless @todo.project_id.nil? }
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_completed_count calls 'current_user.todos' 2 times
      Open

            from.todo    { todos = current_user.todos.not_hidden.completed }
            from.context { todos = find_completed(current_user.contexts, @todo.context_id, @todo.context.hidden?) }
            from.project { todos = find_completed(current_user.projects, @todo.project_id, @todo.project.hidden?) unless @todo.project_id.nil? }
            from.tag     { todos = current_user.todos.with_tag(@tag.id).completed }
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#filter_format_for_tag_view calls 'params[:name]' 2 times
      Open

          if params[:name] =~ /.*\.m$/
            set_format_for_tag_view(:m)
          elsif params[:name] =~ /.*\.txt$/
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#find_todos_with_tag_expr calls 'current_user.todos' 2 times
      Open

            return current_user.todos.with_tag(tag_id)
          end
      
          tag_ids = get_ids_from_tag_expr(tag_expr)
          todos = current_user.todos
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#auto_complete_for_predecessor calls '@todo.project' 2 times
      Open

            @items = get_not_completed_for_predecessor(@todo.project, @todo.id) unless @todo.project.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls '@todos[0].project' 2 times
      Open

                @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'current_user.projects.find(project_id).todos' 3 times
      Open

              @remaining_deferred_or_pending_count = current_user.projects.find(project_id).todos.deferred_or_blocked.count
      
              if @todo_was_completed_from_deferred_or_blocked_state
                @remaining_in_context = @remaining_deferred_or_pending_count
              else
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_done_rest_of_week calls 'Time.zone.now' 2 times
      Open

          get_done_in_period(completed_todos, Time.zone.now.beginning_of_day, Time.zone.now.beginning_of_week)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#check_for_next_todo calls 'Time.zone.now' 3 times
      Open

              date_to_check ||= Time.zone.now
      
              if recurring_todo.active? && recurring_todo.continues_recurring?(date_to_check)
                # shift the reference date to yesterday if date_to_check is furher in
                # the past. This is to make sure we do not get older todos for overdue
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#count_old_due_empty calls 'Time.zone' 3 times
      Open

          due_today_date = Time.zone.now
          due_this_week_date = Time.zone.now.end_of_week
          due_next_week_date = due_this_week_date + 7.days
          due_this_month_date = Time.zone.now.end_of_month
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'current_user.projects' 3 times
      Open

          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
          @tag_name = params['_tag_name']
      
          is_multiple = params[:todo] && params[:todo][:multiple_todos] && !params[:todo][:multiple_todos].nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#defer calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.find(params[:id])
          # Create a (unsaved) copy of the original todo
          @original_item = current_user.todos.build(@todo.attributes)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@original_item.pending?' 3 times
      Open

          @todo_was_activated_from_pending_state = @todo.active? && @original_item.pending?
          @todo_was_deferred_from_active_state = @todo.deferred? && !@original_item.deferred?
          @todo_was_blocked_from_active_state = @todo.pending? && !@original_item.pending?
      
          @todo_deferred_state_changed = @original_item.deferred? != @todo.deferred?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'context.hidden?' 2 times
      Open

              remaining_actions_in_context = remaining_actions_in_context.not_hidden if !context.hidden?
              @remaining_in_context = remaining_actions_in_context.count
      
              if @todo_was_deferred_or_blocked
                actions_in_target = current_user.contexts.find(@todo.context_id).todos.reload.active
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#auto_complete_for_predecessor calls '!@items.empty?' 2 times
      Open

            @items = get_not_completed_for_predecessor(@todo.context, @todo.id) unless !@items.empty? || @todo.context.nil?
            # Match todos in other projects, excluding @todo itself
            @items = get_not_completed_for_predecessor(current_user, @todo.id) unless !@items.empty?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'params['default_context_name']' 2 times
      Open

          @default_context = current_user.contexts.where(:name => params['default_context_name']).first
          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
          @tag_name = params['_tag_name']
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'params[:todo][:multiple_todos]' 2 times
      Open

          is_multiple = params[:todo] && params[:todo][:multiple_todos] && !params[:todo][:multiple_todos].nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_down_count calls 'current_user.todos' 3 times
      Open

              @down_count = current_user.todos.active.not_hidden.count
            end
            from.context do
              context_id = @original_item ? @original_item.context_id || @todo.context_id : @todo.context_id
              todos = current_user.contexts.find(context_id).todos.not_completed
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls '!context.hidden?' 2 times
      Open

              remaining_actions_in_context = remaining_actions_in_context.not_hidden if !context.hidden?
              @remaining_in_context = remaining_actions_in_context.count
      
              if @todo_was_deferred_or_blocked
                actions_in_target = current_user.contexts.find(@todo.context_id).todos.reload.active
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'todos_in_container.active' 2 times
      Open

              @remaining_in_context = todos_in_container.active.not_hidden.count
              @target_context_count = todos_in_target_container.active.not_hidden.count
            end
            from.tag do
              tag = Tag.where(:name => params['_tag_name']).first
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#auto_complete_for_predecessor calls '@items.empty?' 2 times
      Open

            @items = get_not_completed_for_predecessor(@todo.context, @todo.id) unless !@items.empty? || @todo.context.nil?
            # Match todos in other projects, excluding @todo itself
            @items = get_not_completed_for_predecessor(current_user, @todo.id) unless !@items.empty?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#count_old_due_empty calls 'current_user.todos' 5 times
      Open

            return current_user.todos.not_completed.where('todos.due <= ?', due_today_date).count
          when "due_this_week"
            return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date).count
          when "due_next_week"
            return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date).count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#count_old_due_empty calls 'current_user.todos.not_completed' 5 times
      Open

            return current_user.todos.not_completed.where('todos.due <= ?', due_today_date).count
          when "due_this_week"
            return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date).count
          when "due_next_week"
            return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date).count
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'cookies[:mobile_url]' 2 times
      Open

                @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls 'current_user.projects' 2 times
      Open

              @projects = current_user.projects if p.new_project_created
              @new_project_created = p.new_project_created
              @new_context_created = p.new_context_created
              @initial_context_name = params['default_context_name']
              @initial_project_name = params['default_project_name']
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'todos_in_target_container.active.not_hidden' 2 times
      Open

              @target_context_count = todos_in_target_container.active.not_hidden.count
            end
            from.tag do
              tag = Tag.where(:name => params['_tag_name']).first
              tag = Tag.new(:name => params['tag']) if tag.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'params['default_project_name']' 3 times
      Open

          @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
      
          @tag_name = params['_tag_name']
      
          is_multiple = params[:todo] && params[:todo][:multiple_todos] && !params[:todo][:multiple_todos].nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls '@todos.size' 3 times
      Open

              if @saved && @todos.size > 0
                @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil?
              else
                @multiple_error = @todos.size > 0 ? "" : t('todos.next_action_needed')
                @saved = false
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#defer calls '@todo.show_from' 2 times
      Open

          @todo_was_deferred_from_active_state = @todo.show_from.nil?
      
          @todo.show_from = (@todo.show_from || @todo.user.date) + numdays.days
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@original_item.deferred?' 3 times
      Open

          @todo_was_activated_from_deferred_state = @todo.active? && @original_item.deferred?
          @todo_was_activated_from_pending_state = @todo.active? && @original_item.pending?
          @todo_was_deferred_from_active_state = @todo.deferred? && !@original_item.deferred?
          @todo_was_blocked_from_active_state = @todo.pending? && !@original_item.pending?
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls '@todos[0]' 4 times
      Open

                @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil?
              else
                @multiple_error = @todos.size > 0 ? "" : t('todos.next_action_needed')
                @saved = false
                @default_tags = current_user.projects.where(:name => @initial_project_name).default_tags if @initial_project_name.present?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls 'p.new_project_created' 4 times
      Open

              @not_done_todos << todo if p.new_context_created || p.new_project_created
              @predecessor = todo
            end
          else
            @todos = @build_todos
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'current_user.contexts' 2 times
      Open

              context = current_user.contexts.find(todo.context_id)
              @remaining_deferred_or_pending_count = context.todos.deferred_or_blocked.count
      
              remaining_actions_in_context = context.todos.reload.active
              remaining_actions_in_context = remaining_actions_in_context.not_hidden if !context.hidden?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'todos_in_target_container.active' 2 times
      Open

              @target_context_count = todos_in_target_container.active.not_hidden.count
            end
            from.tag do
              tag = Tag.where(:name => params['_tag_name']).first
              tag = Tag.new(:name => params['tag']) if tag.nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#change_context calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.find(params[:id])
          @original_item = current_user.todos.build(@todo.attributes)  # create a (unsaved) copy of the original todo
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls '@todo.pending?' 2 times
      Open

            @todo_was_created_blocked = @todo.pending?
            @not_done_todos = [@todo] if p.new_project_created || p.new_context_created
            @new_project_created = p.new_project_created
            @new_context_created = p.new_context_created
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_changes_by_this_update calls '@todo.due' 2 times
      Open

          @due_date_changed = @original_item.due != @todo.due
      
          source_view do |page|
            page.calendar do
              @old_due_empty = is_old_due_empty(@original_item_due_id)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'current_user.todos' 4 times
      Open

              @remaining_hidden_count = current_user.todos.hidden.with_tag(tag.id).count
              @remaining_deferred_or_pending_count = current_user.todos.with_tag(tag.id).deferred_or_blocked.count
            end
            from.project do
              project_id = @project_changed ? @original_item.project_id : @todo.project_id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_due_id_for_calendar calls 'Time.zone' 3 times
      Open

          due_today_date = Time.zone.now
          due_this_week_date = Time.zone.now.end_of_week
          due_next_week_date = due_this_week_date + 7.days
          due_this_month_date = Time.zone.now.end_of_month
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#new calls 'params[:from_context]' 3 times
      Open

              @mobile_from_context = current_user.contexts.find(params[:from_context]) if params[:from_context]
              @mobile_from_project = current_user.projects.find(params[:from_project]) if params[:from_project]
              if params[:from_project] && !params[:from_context]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls 'params['todo']' 3 times
      Open

          if params['todo']['context_id'].blank? && params['context_name'].present?
            @context = current_user.contexts.where(:name => params['context_name'].strip).first
            if @context.nil?
              @new_context = current_user.contexts.build
              @new_context.name = params['context_name'].strip
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'params['todo']' 3 times
      Open

          if params['todo']['project_id'].blank? && !params['project_name'].nil?
            if params['project_name'].blank?
              project = Project.null_object
            else
              project = current_user.projects.where(:name => params['project_name'].strip).first
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@contexts'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@new_context'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#create calls '@todo.errors' 2 times
      Open

            if @todo.errors.empty?
              @todo.add_predecessor_list(p.predecessor_list)
              @saved = @todo.save
              @todo.tag_with(tag_list) if @saved && tag_list.present?
              @todo.block! if @todo.uncompleted_predecessors?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create calls 'params[:todo]' 3 times
      Open

          is_multiple = params[:todo] && params[:todo][:multiple_todos] && !params[:todo][:multiple_todos].nil?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_star calls 'cookies[:mobile_url]' 2 times
      Open

              if cookies[:mobile_url]
                old_path = cookies[:mobile_url]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_dependency_state calls '@todo.state' 2 times
      Open

              @todo.activate! if @todo.state == 'pending' # Activate pending if no uncompleted predecessors
            else
              @todo.block! if @todo.state == 'active' # Block active if we got uncompleted predecessors
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'current_user.projects' 2 times
      Open

              project = current_user.projects.where(:name => params['project_name'].strip).first
              unless project
                project = current_user.projects.build
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'project.id' 2 times
      Open

            params["todo"]["project_id"] = project.id
            @project_changed = @original_item.project_id != params["todo"]["project_id"] = project.id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@original_item_due_id'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@tag'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#create calls '@todo.deferred?' 2 times
      Open

            @todo_was_created_deferred = @todo.deferred?
            @todo_was_created_blocked = @todo.pending?
            @not_done_todos = [@todo] if p.new_project_created || p.new_context_created
            @new_project_created = p.new_project_created
            @new_context_created = p.new_context_created
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#destroy calls 'redirect_to :action => 'index'' 2 times
      Open

                redirect_to :action => 'index'
              else
                notify :error, t('todos.action_deleted_error'), 2.0
                redirect_to :action => 'index'
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'current_user.projects.find(project_id)' 3 times
      Open

              @remaining_deferred_or_pending_count = current_user.projects.find(project_id).todos.deferred_or_blocked.count
      
              if @todo_was_completed_from_deferred_or_blocked_state
                @remaining_in_context = @remaining_deferred_or_pending_count
              else
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#done calls 'current_user.todos' 2 times
      Open

          @done_today, @done_rest_of_week, @done_rest_of_month = DoneTodos.done_todos_for_container(current_user.todos)
          @count = @done_today.size + @done_rest_of_week.size + @done_rest_of_month.size
      
          respond_to do |format|
            format.html
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#index calls 'current_user.contexts' 3 times
      Open

            context = current_user.contexts.find(params[:context_id])
            @todos = @todos.where('context_id' => context.id)
          end
          if params[:project_id]
            project = current_user.projects.find(params[:project_id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_check calls '@todo.description' 4 times
      Open

                notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
                redirect_to :action => "index"
              else
                notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index")
                redirect_to :action => "index"
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_star calls 'notify(:notice, "Star toggled")' 2 times
      Open

                notify(:notice, "Star toggled")
                onsite_redirect_to old_path
              else
                notify(:notice, "Star toggled")
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_completed_state calls 'params['done'] == '1'' 2 times
      Open

          if params['done'] == '1' && !@todo.completed?
            @todo.complete!
            @todo.activate_pending_todos
          end
          # strange. if checkbox is not checked, there is no 'done' in params.
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'params['project_name']' 4 times
      Open

          if params['todo']['project_id'].blank? && !params['project_name'].nil?
            if params['project_name'].blank?
              project = Project.null_object
            else
              project = current_user.projects.where(:name => params['project_name'].strip).first
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@project_changed'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@return_path'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo_was_completed_from_deferred_or_blocked_state'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#remove_predecessor calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.includes(Todo::DEFAULT_INCLUDES).find(params['id'])
          @predecessor = current_user.todos.find(params['predecessor'])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#tags calls 'Tag.arel_table' 2 times
      Open

          tags_beginning = current_user.tags.where(Tag.arel_table[:name].matches("#{params[:term]}%"))
          tags_all = current_user.tags.where(Tag.arel_table[:name].matches("%#{params[:term]}%"))
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#tags calls 'Tag.arel_table[:name]' 2 times
      Open

          tags_beginning = current_user.tags.where(Tag.arel_table[:name].matches("#{params[:term]}%"))
          tags_all = current_user.tags.where(Tag.arel_table[:name].matches("%#{params[:term]}%"))
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls 'params['context_name'].strip' 2 times
      Open

            @context = current_user.contexts.where(:name => params['context_name'].strip).first
            if @context.nil?
              @new_context = current_user.contexts.build
              @new_context.name = params['context_name'].strip
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@context'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@count'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@new_context_created'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@original_state'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#get_params_for_tag_view calls ''and' + i.to_s' 2 times
      Open

          while params['and' + i.to_s]
            @tag_expr << params['and' + i.to_s].split(',')
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_params_for_tag_view calls 'params[:and]' 2 times
      Open

          @tag_expr << params[:and].split(',') if params[:and]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#tags calls 'params[:term]' 3 times
      Open

          tags_beginning = current_user.tags.where(Tag.arel_table[:name].matches("#{params[:term]}%"))
          tags_all = current_user.tags.where(Tag.arel_table[:name].matches("%#{params[:term]}%"))
          tags_all -= tags_beginning
      
          respond_to do |format|
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls '@context.id' 2 times
      Open

            params["todo"]["context_id"] = @context.id
            @context_changed = @original_item.context_id != params["todo"]["context_id"] = @context.id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'params["todo"]["project_id"] = project.id' 2 times
      Open

            params["todo"]["project_id"] = project.id
            @project_changed = @original_item.project_id != params["todo"]["project_id"] = project.id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@done_today'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todos'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@uncompleted_predecessors'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController has no descriptive comment
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes and modules are the units of reuse and release. It is therefore considered good practice to annotate every class and module with a brief comment outlining its responsibilities.

      Example

      Given

      class Dummy
        # Do things...
      end

      Reek would emit the following warning:

      test.rb -- 1 warning:
        [1]:Dummy has no descriptive comment (IrresponsibleModule)

      Fixing this is simple - just an explaining comment:

      # The Dummy class is responsible for ...
      class Dummy
        # Do things...
      end

      TodosController#get_due_id_for_calendar calls 'Time.zone.now' 3 times
      Open

          due_today_date = Time.zone.now
          due_this_week_date = Time.zone.now.end_of_week
          due_next_week_date = due_this_week_date + 7.days
          due_this_month_date = Time.zone.now.end_of_month
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_params_for_tag_view calls '@tag_expr[0]' 2 times
      Open

          @single_tag = @tag_expr.size == 1 && @tag_expr[0].size == 1
          @tag_name = @tag_expr[0][0]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_params_for_tag_view calls 'i.to_s' 2 times
      Open

          while params['and' + i.to_s]
            @tag_expr << params['and' + i.to_s].split(',')
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#index calls 'current_user.todos' 3 times
      Open

          @todos = current_user.todos.includes(Todo::DEFAULT_INCLUDES)
          if params[:context_id]
            context = current_user.contexts.find(params[:context_id])
            @todos = @todos.where('context_id' => context.id)
          end
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#index calls 'params[:limit]' 2 times
      Open

          @todos = @todos.limit(sanitize(params[:limit])) if params[:limit]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#new calls 'cookies[:mobile_url]' 2 times
      Open

              @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#new calls 'params[:from_project]' 3 times
      Open

              @mobile_from_project = current_user.projects.find(params[:from_project]) if params[:from_project]
              if params[:from_project] && !params[:from_context]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_completed_state calls '@todo.completed?' 2 times
      Open

          if params['done'] == '1' && !@todo.completed?
            @todo.complete!
            @todo.activate_pending_todos
          end
          # strange. if checkbox is not checked, there is no 'done' in params.
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls 'params['context_name']' 3 times
      Open

          if params['todo']['context_id'].blank? && params['context_name'].present?
            @context = current_user.contexts.where(:name => params['context_name'].strip).first
            if @context.nil?
              @new_context = current_user.contexts.build
              @new_context.name = params['context_name'].strip
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_tags calls 'params[:tag_list]' 2 times
      Open

          if params[:tag_list]
            @todo.tag_with(params[:tag_list])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@context_changed'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@done'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@done_rest_of_week'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@hidden'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@remaining_deferred_or_pending_count'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@status_message'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo_hidden_state_changed'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#toggle_check calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.find(params['id'])
      
          @source_view = params['_source_view'] || 'todo'
      
          # Create a (unsaved) copy of the original todo, before it was toggled
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_check calls 't("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete')' 3 times
      Open

                notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
                redirect_to :action => "index"
              else
                notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index")
                redirect_to :action => "index"
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls 'params["todo"]["context_id"] = @context.id' 2 times
      Open

            params["todo"]["context_id"] = @context.id
            @context_changed = @original_item.context_id != params["todo"]["context_id"] = @context.id
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@project'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@tag_title'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#get_params_for_tag_view calls 'params['and' + i.to_s]' 2 times
      Open

          while params['and' + i.to_s]
            @tag_expr << params['and' + i.to_s].split(',')
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#index calls 'params[:context_id]' 2 times
      Open

          if params[:context_id]
            context = current_user.contexts.find(params[:context_id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_check calls 'cookies[:mobile_url]' 2 times
      Open

                if cookies[:mobile_url]
                  old_path = cookies[:mobile_url]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@build_todos'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@done_rest_of_month'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@initial_project_name'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@mobile_from_project'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#toggle_check calls '@todo.completed?' 6 times
      Open

            if @todo.completed?
              @pending_to_activate = @todo.activate_pending_todos
            else
              @active_to_block = @todo.block_successors
            end
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.find(params['id'])
          @original_item = current_user.todos.build(@todo.attributes)  # create a (unsaved) copy of the original todo
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_date_for_update calls 'params['todo']' 3 times
      Open

          params['todo'][key] = params["todo"].key?(key) ? parse_date_for_update(params["todo"][key], t("todos.error.invalid_#{key}_date")) : ""
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_project calls 'params['project_name'].strip' 2 times
      Open

              project = current_user.projects.where(:name => params['project_name'].strip).first
              unless project
                project = current_user.projects.build
                project.name = params['project_name'].strip
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@original_item'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@tag_name'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@xml_todos'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#show_notes calls 'cookies[:mobile_url]' 2 times
      Open

          @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_check calls 'notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))' 3 times
      Open

                notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
                redirect_to :action => "index"
              else
                notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index")
                redirect_to :action => "index"
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#toggle_check calls 'redirect_to :action => "index"' 2 times
      Open

                redirect_to :action => "index"
              else
                notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index")
                redirect_to :action => "index"
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@group_view_by'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo_was_deferred_or_blocked'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#index calls 'params[:project_id]' 2 times
      Open

          if params[:project_id]
            project = current_user.projects.find(params[:project_id])
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@single_tag'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@successor'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#index calls 'Mime[:text]' 2 times
      Open

              headers['Content-Type'.freeze] = Mime[:text].to_s
              render :content_type => Mime[:text]
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#new calls 'current_user.projects' 2 times
      Open

          @projects = current_user.projects.active
          @contexts = current_user.contexts
          respond_to do |format|
            format.m do
              @new_mobile = true
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#onsite_redirect_to calls 'uri.path' 2 times
      Open

            redirect_to("#{uri.path}?#{uri.query}")
          else
            redirect_to(uri.path)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#onsite_redirect_to calls 'uri.query' 2 times
      Open

          if uri.query.present?
            redirect_to("#{uri.path}?#{uri.query}")
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@not_done_todos'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@original_completed_period'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@tag_expr'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo_was_destroyed_from_pending_state'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#tag calls 'Arel.sql('todos.show_from ASC, todos.created_at DESC')' 2 times
      Open

            .reorder(Arel.sql('todos.show_from ASC, todos.created_at DESC'))
            .includes(Todo::DEFAULT_INCLUDES)
          @pending_todos = todos_with_tag_ids
            .blocked
            .reorder(Arel.sql('todos.show_from ASC, todos.created_at DESC'))
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#tags calls 'current_user.tags' 2 times
      Open

          tags_beginning = current_user.tags.where(Tag.arel_table[:name].matches("#{params[:term]}%"))
          tags_all = current_user.tags.where(Tag.arel_table[:name].matches("%#{params[:term]}%"))
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@new_due_id'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@predecessor'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#index calls 'current_user.projects' 3 times
      Open

            project = current_user.projects.find(params[:project_id])
            @todos = @todos.where('project_id' => project.id)
          end
          @todos = @todos.limit(sanitize(params[:limit])) if params[:limit]
      
      
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_context calls 'current_user.contexts' 2 times
      Open

            @context = current_user.contexts.where(:name => params['context_name'].strip).first
            if @context.nil?
              @new_context = current_user.contexts.build
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@pending_to_activate'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#list_deferred calls 'current_user.todos' 2 times
      Open

          @not_done_todos = current_user.todos.deferred.includes(includes).reorder('show_from') + current_user.todos.pending.includes(includes)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#new calls 'current_user.contexts' 2 times
      Open

          @contexts = current_user.contexts
          respond_to do |format|
            format.m do
              @new_mobile = true
              @return_path = cookies[:mobile_url] ? cookies[:mobile_url] : mobile_path
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@items'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@todo_was_destroyed_from_deferred_state'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController#auto_complete_for_predecessor calls '@todo.id' 3 times
      Open

            @items = get_not_completed_for_predecessor(@todo.project, @todo.id) unless @todo.project.nil?
            # Then look in the current context, excluding @todo itself
            @items = get_not_completed_for_predecessor(@todo.context, @todo.id) unless !@items.empty? || @todo.context.nil?
            # Match todos in other projects, excluding @todo itself
            @items = get_not_completed_for_predecessor(current_user, @todo.id) unless !@items.empty?
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#create_multiple calls '@todos.size > 0' 2 times
      Open

              if @saved && @todos.size > 0
                @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil?
              else
                @multiple_error = @todos.size > 0 ? "" : t('todos.next_action_needed')
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#destroy calls 'current_user.todos' 2 times
      Open

          @todo = current_user.todos.find(params['id'])
          # Create a (unsaved) copy of the original todo
          @original_item = current_user.todos.build(@todo.attributes)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#determine_remaining_in_container_count calls 'find_todos_in_container_and_target_container(todo, @todo)' 3 times
      Open

              todos_in_container, todos_in_target_container = find_todos_in_container_and_target_container(todo, @todo)
              @remaining_in_context = todos_in_container.deferred_or_blocked.count
              @target_context_count = todos_in_target_container.deferred_or_blocked.count
            end
            from.todo do
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#find_todos_in_container_and_target_container calls 'current_user.contexts' 2 times
      Open

            todos_in_container = current_user.contexts.find(todo.context_id).todos
            todos_in_target_container = current_user.contexts.find(@todo.context_id).todos
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#get_done_rest_of_month calls 'Time.zone.now' 2 times
      Open

          get_done_in_period(completed_todos, Time.zone.now.beginning_of_week, Time.zone.now.beginning_of_month)
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController#update_completed_state calls 'params['done']' 2 times
      Open

          if params['done'] == '1' && !@todo.completed?
            @todo.complete!
            @todo.activate_pending_todos
          end
          # strange. if checkbox is not checked, there is no 'done' in params.
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Duplication occurs when two fragments of code look nearly identical, or when two fragments of code have nearly identical effects at some conceptual level.

      Reek implements a check for Duplicate Method Call.

      Example

      Here's a very much simplified and contrived example. The following method will report a warning:

      def double_thing()
        @other.thing + @other.thing
      end

      One quick approach to silence Reek would be to refactor the code thus:

      def double_thing()
        thing = @other.thing
        thing + thing
      end

      A slightly different approach would be to replace all calls of double_thing by calls to @other.double_thing:

      class Other
        def double_thing()
          thing + thing
        end
      end

      The approach you take will depend on balancing other factors in your code.

      TodosController assumes too much for instance variable '@new_project_created'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@projects'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      TodosController assumes too much for instance variable '@saved'
      Open

      class TodosController < ApplicationController
      Severity: Minor
      Found in app/controllers/todos_controller.rb by reek

      Classes should not assume that instance variables are set or present outside of the current class definition.

      Good:

      class Foo
        def initialize
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Good as well:

      class Foo
        def foo?
          bar == :foo
        end
      
        def bar
          @bar ||= :foo
        end
      end

      Bad:

      class Foo
        def go_foo!
          @bar = :foo
        end
      
        def foo?
          @bar == :foo
        end
      end

      Example

      Running Reek on:

      class Dummy
        def test
          @ivar
        end
      end

      would report:

      [1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar

      Note that this example would trigger this smell warning as well:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          @omg
        end
      end

      The way to address the smell warning is that you should create an attr_reader to use @omg in the subclass and not access @omg directly like this:

      class Parent
        attr_reader :omg
      
        def initialize(omg)
          @omg = omg
        end
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Directly accessing instance variables is considered a smell because it breaks encapsulation and makes it harder to reason about code.

      If you don't want to expose those methods as public API just make them private like this:

      class Parent
        def initialize(omg)
          @omg = omg
        end
      
        private
        attr_reader :omg
      end
      
      class Child < Parent
        def foo
          omg
        end
      end

      Current Support in Reek

      An instance variable must:

      • be set in the constructor
      • or be accessed through a method with lazy initialization / memoization.

      If not, Instance Variable Assumption will be reported.

      Block has too many lines. [28/25]
      Open

          source_view do |from|
            from.todo do
              @down_count = current_user.todos.active.not_hidden.count
            end
            from.context do
      Severity: Minor
      Found in app/controllers/todos_controller.rb by rubocop

      This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

      Complex method TodosController#remove_predecessor (22.4)
      Open

        def remove_predecessor
          @source_view = params['_source_view'] || 'todo'
          @todo = current_user.todos.includes(Todo::DEFAULT_INCLUDES).find(params['id'])
          @predecessor = current_user.todos.find(params['predecessor'])
          @predecessors = @predecessor.predecessors
      Severity: Minor
      Found in app/controllers/todos_controller.rb by flog

      Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

      You can read more about ABC metrics or the flog tool

      Avoid too many return statements within this method.
      Open

            return current_user.todos.not_completed.where('todos.due > ?', due_this_month_date).count
      Severity: Major
      Found in app/controllers/todos_controller.rb - About 30 mins to fix

        Complex method TodosController#find_todos_with_tag_expr (21.9)
        Open

          def find_todos_with_tag_expr(tag_expr)
            # Optimize for the common case of selecting only one tag
            if @single_tag
              tag = current_user.tags.where(:name => @tag_name).first
              tag_id = tag.nil? ? -1 : tag.id
        Severity: Minor
        Found in app/controllers/todos_controller.rb by flog

        Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

        You can read more about ABC metrics or the flog tool

        Complex method TodosController#get_due_id_for_calendar (21.2)
        Open

          def get_due_id_for_calendar(due)
            return "" if due.nil?
            due_today_date = Time.zone.now
            due_this_week_date = Time.zone.now.end_of_week
            due_next_week_date = due_this_week_date + 7.days
        Severity: Minor
        Found in app/controllers/todos_controller.rb by flog

        Flog calculates the ABC score for methods. The ABC score is based on assignments, branches (method calls), and conditions.

        You can read more about ABC metrics or the flog tool

        TodosController takes parameters ['completed_todos', 'includes'] to 4 methods
        Open

          def get_done_today(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
            start_of_this_day = Time.zone.now.beginning_of_day
            completed_todos.completed_after(start_of_this_day).includes(includes[:include])
          end
        
        
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        In general, a Data Clump occurs when the same two or three items frequently appear together in classes and parameter lists, or when a group of instance variable names start or end with similar substrings.

        The recurrence of the items often means there is duplicate code spread around to handle them. There may be an abstraction missing from the code, making the system harder to understand.

        Example

        Given

        class Dummy
          def x(y1,y2); end
          def y(y1,y2); end
          def z(y1,y2); end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [2, 3, 4]:Dummy takes parameters [y1, y2] to 3 methods (DataClump)

        A possible way to fix this problem (quoting from Martin Fowler):

        The first step is to replace data clumps with objects and use the objects whenever you see them. An immediate benefit is that you'll shrink some parameter lists. The interesting stuff happens as you begin to look for behavior to move into the new objects.

        TodosController#list_deferred performs a nil-check
        Open

            @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#find_todos_with_tag_expr performs a nil-check
        Open

              tag_id = tag.nil? ? -1 : tag.id
              return current_user.todos.with_tag(tag_id)
            end
        
            tag_ids = get_ids_from_tag_expr(tag_expr)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#find_todos_in_project_container performs a nil-check
        Open

            if todo.project.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#determine_down_count performs a nil-check
        Open

                unless @todo.project_id == nil
                  @down_count = current_user.projects.find(@todo.project_id).todos.active_or_hidden.count
                end
              end
              from.deferred do
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#get_due_id_for_calendar performs a nil-check
        Open

            return "" if due.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#create performs a nil-check
        Open

            is_multiple = params[:todo] && params[:todo][:multiple_todos] && !params[:todo][:multiple_todos].nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#defer performs a nil-check
        Open

            @todo_was_deferred_from_active_state = @todo.show_from.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#index performs a nil-check
        Open

                @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#update_context performs a nil-check
        Open

              if @context.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#auto_complete_for_predecessor performs a nil-check
        Open

            unless params['id'].nil?
              get_todo_from_params
              # Begin matching todos in current project, excluding @todo itself
              @items = get_not_completed_for_predecessor(@todo.project, @todo.id) unless @todo.project.nil?
              # Then look in the current context, excluding @todo itself
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#determine_completed_count performs a nil-check
        Open

              from.project { todos = find_completed(current_user.projects, @todo.project_id, @todo.project.hidden?) unless @todo.project_id.nil? }
              from.tag     { todos = current_user.todos.with_tag(@tag.id).completed }
            end
        
            @completed_count = todos.nil? ? 0 : todos.count
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#determine_remaining_in_container_count performs a nil-check
        Open

                tag = Tag.new(:name => params['tag']) if tag.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#create_multiple performs a nil-check
        Open

                  @default_tags = @todos[0].project.default_tags unless @todos[0].project.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#get_not_completed_for_predecessor performs a nil-check
        Open

            items = items.where("AND NOT(todos.id=?)", todo_id) unless todo_id.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#determine_deferred_tag_count performs a nil-check
        Open

            @remaining_deferred_or_pending_count = tag.nil? ? 0 : current_user.todos.deferred.with_tag(tag.id).count
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#update_project performs a nil-check
        Open

            if params['todo']['project_id'].blank? && !params['project_name'].nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#filter_format_for_tag_view performs a nil-check
        Open

            elsif params[:format].nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#tag performs a nil-check
        Open

            @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#toggle_check performs a nil-check
        Open

                  @wants_redirect_after_complete = @todo.completed? && !@todo.project_id.nil? && current_user.prefs.show_project_on_todo_done && !source_view_is(:project)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A NilCheck is a type check. Failures of NilCheck violate the "tell, don't ask" principle.

        Additionally, type checks often mask bigger problems in your source code like not using OOP and / or polymorphism when you should.

        Example

        Given

        class Klass
          def nil_checker(argument)
            if argument.nil?
              puts "argument isn't nil!"
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 1 warning:
          [3]:Klass#nil_checker performs a nil-check. (NilCheck)

        TodosController#get_due_id_for_calendar doesn't depend on instance state (maybe move it to another class?)
        Open

          def get_due_id_for_calendar(due)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        TodosController#tag_title doesn't depend on instance state (maybe move it to another class?)
        Open

          def tag_title(tag_expr)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        TodosController#find_completed doesn't depend on instance state (maybe move it to another class?)
        Open

          def find_completed(relation, id, include_hidden)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        TodosController#get_done_in_period doesn't depend on instance state (maybe move it to another class?)
        Open

          def get_done_in_period(completed_todos, before, after, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        TodosController#get_ids_from_tag_expr doesn't depend on instance state (maybe move it to another class?)
        Open

          def get_ids_from_tag_expr(tag_expr)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        TodosController#get_done_today doesn't depend on instance state (maybe move it to another class?)
        Open

          def get_done_today(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        A Utility Function is any instance method that has no dependency on the state of the instance.

        Block has too many lines. [26/25]
        Open

            respond_to do |format|
              format.html do
                if @saved
                  message = t('todos.action_deleted_success')
                  if activated_successor_count > 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks if the length of a block exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable. The cop can be configured to ignore blocks passed to certain methods.

        TodosController#find_todos_in_container_and_target_container has unused parameter 'target_todo'
        Open

          def find_todos_in_container_and_target_container(todo, target_todo)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        Unused Parameter refers to methods with parameters that are unused in scope of the method.

        Having unused parameters in a method is code smell because leaving dead code in a method can never improve the method and it makes the code confusing to read.

        Example

        Given:

        class Klass
          def unused_parameters(x,y,z)
            puts x,y # but not z
          end
        end

        Reek would emit the following warning:

        [2]:Klass#unused_parameters has unused parameter 'z' (UnusedParameters)

        TodosController#get_done_rest_of_month has unused parameter 'includes'
        Open

          def get_done_rest_of_month(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        Unused Parameter refers to methods with parameters that are unused in scope of the method.

        Having unused parameters in a method is code smell because leaving dead code in a method can never improve the method and it makes the code confusing to read.

        Example

        Given:

        class Klass
          def unused_parameters(x,y,z)
            puts x,y # but not z
          end
        end

        Reek would emit the following warning:

        [2]:Klass#unused_parameters has unused parameter 'z' (UnusedParameters)

        TodosController#get_done_rest_of_week has unused parameter 'includes'
        Open

          def get_done_rest_of_week(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        Unused Parameter refers to methods with parameters that are unused in scope of the method.

        Having unused parameters in a method is code smell because leaving dead code in a method can never improve the method and it makes the code confusing to read.

        Example

        Given:

        class Klass
          def unused_parameters(x,y,z)
            puts x,y # but not z
          end
        end

        Reek would emit the following warning:

        [2]:Klass#unused_parameters has unused parameter 'z' (UnusedParameters)

        TodosController#create_multiple has the variable name 'p'
        Open

            p = Todos::TodoCreateParamsHelper.new(params, current_user)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#get_params_for_tag_view has the variable name 'i'
        Open

            i = 1
            while params['and' + i.to_s]
              @tag_expr << params['and' + i.to_s].split(',')
              i += 1
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#index has the variable name 't'
        Open

                @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#update_dependency_state has the variable name 't'
        Open

                .map { |t| t.specification }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#tag_title has the variable name 's'
        Open

            and_list = tag_expr.inject([]) { |s, tag_list| s << tag_list.join(',') }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#create has the variable name 'p'
        Open

              p = Todos::TodoCreateParamsHelper.new(params, current_user)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#list_deferred has the variable name 't'
        Open

            @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        TodosController#tag has the variable name 't'
        Open

            @todos_without_project = @not_done_todos.select { |t| t.project.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by reek

        An Uncommunicative Variable Name is a variable name that doesn't communicate its intent well enough.

        Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

        Avoid more than 3 levels of block nesting.
        Open

                  date = date_to_check.at_midnight >= Time.zone.now.at_midnight ? date_to_check : Time.zone.now - 1.day
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for excessive nesting of conditional and looping constructs.

        You can configure if blocks are considered using the CountBlocks option. When set to false (the default) blocks are not counted towards the nesting level. Set to true to count blocks as well.

        The maximum level of nesting allowed is configurable.

        Use match? instead of =~ when MatchData is not used.
        Open

            if params[:name] =~ /.*\.m$/
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        In Ruby 2.4, String#match?, Regexp#match? and Symbol#match? have been added. The methods are faster than match. Because the methods avoid creating a MatchData object or saving backref. So, when MatchData is not used, use match? instead of match.

        Example:

        # bad
        def foo
          if x =~ /re/
            do_something
          end
        end
        
        # bad
        def foo
          if x.match(/re/)
            do_something
          end
        end
        
        # bad
        def foo
          if /re/ === x
            do_something
          end
        end
        
        # good
        def foo
          if x.match?(/re/)
            do_something
          end
        end
        
        # good
        def foo
          if x =~ /re/
            do_something(Regexp.last_match)
          end
        end
        
        # good
        def foo
          if x.match(/re/)
            do_something($~)
          end
        end
        
        # good
        def foo
          if /re/ === x
            do_something($~)
          end
        end

        Use match? instead of =~ when MatchData is not used.
        Open

            elsif params[:name] =~ /.*\.txt$/
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        In Ruby 2.4, String#match?, Regexp#match? and Symbol#match? have been added. The methods are faster than match. Because the methods avoid creating a MatchData object or saving backref. So, when MatchData is not used, use match? instead of match.

        Example:

        # bad
        def foo
          if x =~ /re/
            do_something
          end
        end
        
        # bad
        def foo
          if x.match(/re/)
            do_something
          end
        end
        
        # bad
        def foo
          if /re/ === x
            do_something
          end
        end
        
        # good
        def foo
          if x.match?(/re/)
            do_something
          end
        end
        
        # good
        def foo
          if x =~ /re/
            do_something(Regexp.last_match)
          end
        end
        
        # good
        def foo
          if x.match(/re/)
            do_something($~)
          end
        end
        
        # good
        def foo
          if /re/ === x
            do_something($~)
          end
        end

        Tagging a string as html safe may be a security risk.
        Open

                    render_failure @todo.errors.to_xml.html_safe, 409
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for the use of output safety calls like htmlsafe, raw, and safeconcat. These methods do not escape content. They simply return a SafeBuffer containing the content as is. Instead, use safe_join to join content and escape it and concat to concatenate content and escape it, ensuring its safety.

        Example:

        user_content = "hi"
        
        # bad
        "

        #{user_content}

        ".html_safe # => ActiveSupport::SafeBuffer "

        hi

        " # good content_tag(:p, user_content) # => ActiveSupport::SafeBuffer "

        <b>hi</b>

        " # bad out = "" out << "
      • #{user_content}
      • " out << "
      • #{user_content}
      • " out.html_safe # => ActiveSupport::SafeBuffer "
      • hi
      • hi
      • " # good out = [] out << content_tag(:li, user_content) out << content_tag(:li, user_content) safe_join(out) # => ActiveSupport::SafeBuffer # "
      • <b>hi</b>
      • <b>hi</b>
      • " # bad out = "

        trusted content

        ".html_safe out.safe_concat(user_content) # => ActiveSupport::SafeBuffer "

        trusted_content

        hi" # good out = "

        trusted content

        ".html_safe out.concat(user_content) # => ActiveSupport::SafeBuffer # "

        trusted_content

        <b>hi</b>" # safe, though maybe not good style out = "trusted content" result = out.concat(user_content) # => String "trusted contenthi" # because when rendered in ERB the String will be escaped: # <%= result %> # => trusted content<b>hi</b> # bad (user_content + " " + content_tag(:span, user_content)).html_safe # => ActiveSupport::SafeBuffer "hi <span><b>hi</b></span>" # good safe_join([user_content, " ", content_tag(:span, user_content)]) # => ActiveSupport::SafeBuffer # "<b>hi</b> <span>&lt;b&gt;hi&lt;/b&gt;</span>"

        Use ids.blank? instead of ids.nil? || ids.empty?.
        Open

              todos = todos.with_tags(ids) unless ids.nil? || ids.empty?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cops checks for code that can be changed to blank?. Settings: NilOrEmpty: Convert checks for nil or empty? to blank? NotPresent: Convert usages of not present? to blank? UnlessPresent: Convert usages of unless present? to blank?

        Example:

        # NilOrEmpty: true
          # bad
          foo.nil? || foo.empty?
          foo == nil || foo.empty?
        
          # good
          foo.blank?
        
        # NotPresent: true
          # bad
          !foo.present?
        
          # good
          foo.blank?
        
        # UnlessPresent: true
          # bad
          something unless foo.present?
          unless foo.present?
            something
          end
        
          # good
          something if foo.blank?
          if foo.blank?
            something
          end

        Use request.referer instead of request.referrer.
        Open

              format.html { redirect_to request.referrer }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for consistent uses of request.referer or request.referrer, depending on the cop's configuration.

        Example: EnforcedStyle: referer (default)

        # bad
        request.referrer
        
        # good
        request.referer

        Example: EnforcedStyle: referrer

        # bad
        request.referer
        
        # good
        request.referrer

        TODO found
        Open

              # New todo - TODO: Filter on current project in project view
        Severity: Minor
        Found in app/controllers/todos_controller.rb by fixme

        TODO found
        Open

            # TODO: duplication with todo_create_params_helper
        Severity: Minor
        Found in app/controllers/todos_controller.rb by fixme

        TODO found
        Open

                  # TODO: I think this will work, but can't figure out how to test it
        Severity: Minor
        Found in app/controllers/todos_controller.rb by fixme

        TODO found
        Open

            # TODO: this was a :append_before but was removed to tune performance per
        Severity: Minor
        Found in app/controllers/todos_controller.rb by fixme

        end at 891, 0 is not aligned with def at 886, 2.
        Open

        end
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks whether the end keywords of method definitions are aligned properly.

        Two modes are supported through the EnforcedStyleAlignWith configuration parameter. If it's set to start_of_line (which is the default), the end shall be aligned with the start of the line where the def keyword is. If it's set to def, the end shall be aligned with the def keyword.

        Example: EnforcedStyleAlignWith: startofline (default)

        # bad
        
        private def foo
                    end
        
        # good
        
        private def foo
        end

        Example: EnforcedStyleAlignWith: def

        # bad
        
        private def foo
                    end
        
        # good
        
        private def foo
                end

        Redundant curly braces around a hash parameter.
        Open

                @todo = current_user.todos.build({ :description => line, :context_id => p.context_id, :project_id => p.project_id })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 the return of the conditional for variable assignment and comparison.
        Open

                if @todo.context.hidden?
                  # include hidden todos
                  @down_count = todos.count
                else
                  # exclude hidden_todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

                if @todo_was_completed_from_deferred_or_blocked_state
                  @remaining_in_context = @remaining_deferred_or_pending_count
                else
                  @remaining_in_context = current_user.projects.find(project_id).todos.active_or_hidden.count
                end
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

            if due <= due_today_date
              new_due_id = "due_today"
            elsif due <= due_this_week_date
              new_due_id = "due_this_week"
            elsif due <= due_next_week_date
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Missing magic comment # frozen_string_literal: true.
        Open

        class TodosController < ApplicationController
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop is designed to help upgrade to Ruby 3.0. It will add the comment # frozen_string_literal: true to the top of files to enable frozen string literals. Frozen string literals may be default in Ruby 3.0. The comment will be added below a shebang and encoding comment. The frozen string literal comment is only valid in Ruby 2.3+.

        Example: EnforcedStyle: when_needed (default)

        # The `when_needed` style will add the frozen string literal comment
        # to files only when the `TargetRubyVersion` is set to 2.3+.
        # bad
        module Foo
          # ...
        end
        
        # good
        # frozen_string_literal: true
        
        module Foo
          # ...
        end

        Example: EnforcedStyle: always

        # The `always` style will always add the frozen string literal comment
        # to a file, regardless of the Ruby version or if `freeze` or `<<` are
        # called on a string literal.
        # bad
        module Bar
          # ...
        end
        
        # good
        # frozen_string_literal: true
        
        module Bar
          # ...
        end

        Example: EnforcedStyle: never

        # The `never` will enforce that the frozen string literal comment does
        # not exist in a file.
        # bad
        # frozen_string_literal: true
        
        module Baz
          # ...
        end
        
        # good
        module Baz
          # ...
        end

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

            if original_item_predecessor_list != params[:predecessor_list]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Use @todos.size.positive? instead of @todos.size > 0.
        Open

                  @multiple_error = @todos.size > 0 ? "" : t('todos.next_action_needed')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 return detected. To return multiple values, use an array.
        Open

            return todos_in_container, todos_in_target_container
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Align .reorder with todos_with_tag_ids on line 638.
        Open

              .reorder(Arel.sql('todos.show_from ASC, todos.created_at DESC'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Line is too long. [157/120]
        Open

                    notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

            if !(params['done'] == '1') && @todo.completed?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

            todos = todos.not_hidden if !include_hidden
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 use of Object#to_s in interpolation.
        Open

            params[:name] = params[:name].chomp(".#{format.to_s}")
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for string conversion in string interpolation, which is redundant.

        Example:

        # bad
        
        "result is #{something.to_s}"

        Example:

        # good
        
        "result is #{something}"

        Pass array contents as separate arguments.
        Open

                render :xml => @xml_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })])
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for unneeded usages of splat expansion

        Example:

        # bad
        
        a = *[1, 2, 3]
        a = *'a'
        a = *1
        
        begin
          foo
        rescue *[StandardError, ApplicationError]
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Example:

        # good
        
        c = [1, 2, 3]
        a = *c
        a, b = *c
        a, *b = *c
        a = *1..10
        a = ['a']
        
        begin
          foo
        rescue StandardError, ApplicationError
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

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

          def get_done_rest_of_week(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Line is too long. [170/120]
        Open

                  notify(:notice, t("todos.action_marked_complete_error", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'), "index")
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [151/120]
        Open

            @done = current_user.todos.completed.includes(Todo::DEFAULT_INCLUDES).reorder('completed_at DESC').paginate :page => params[:page], :per_page => 20
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [133/120]
        Open

              return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date).count
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [134/120]
        Open

              return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_next_week_date, due_this_month_date).count
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Move redirect_to :action => "index" out of the conditional.
        Open

                  redirect_to :action => "index"
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Use count_old_due_empty(id).zero? instead of 0 == count_old_due_empty(id).
        Open

            return 0 == count_old_due_empty(id)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 return detected.
        Open

            return and_list.join(' AND ')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Pass array contents as separate arguments.
        Open

                render :xml => completed_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })])
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for unneeded usages of splat expansion

        Example:

        # bad
        
        a = *[1, 2, 3]
        a = *'a'
        a = *1
        
        begin
          foo
        rescue *[StandardError, ApplicationError]
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Example:

        # good
        
        c = [1, 2, 3]
        a = *c
        a, b = *c
        a, *b = *c
        a = *1..10
        a = ['a']
        
        begin
          foo
        rescue StandardError, ApplicationError
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Useless assignment to variable - todos_in_container.
        Open

              todos_in_container = current_user.projects.find(todo.project_id).todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

        assigned but unused variable - foo

        Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

        Example:

        # bad
        
        def some_method
          some_var = 1
          do_something
        end

        Example:

        # good
        
        def some_method
          some_var = 1
          do_something(some_var)
        end

        Line is too long. [132/120]
        Open

                  @default_tags = current_user.projects.where(:name => @initial_project_name).default_tags if @initial_project_name.present?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Redundant curly braces around a hash parameter.
        Open

                render :xml => @xml_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })])
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 a guard clause instead of wrapping the code inside a conditional expression.
        Open

            if params['todo']['project_id'].blank? && !params['project_name'].nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
        Open

                if @tag.nil?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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?

        Align .reorder with .completed on line 650.
        Open

              .reorder('todos.completed_at DESC')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Line is too long. [122/120]
        Open

          prepend_before_action :login_or_feed_token_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [127/120]
        Open

                @status_message = @todos.size > 1 ? t('todos.added_new_next_action_plural') : t('todos.added_new_next_action_singular')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [138/120]
        Open

            @todo_was_destroyed_from_deferred_or_pending_state = @todo_was_destroyed_from_deferred_state || @todo_was_destroyed_from_pending_state
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [129/120]
        Open

              return current_user.todos.not_completed.where('todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date).count
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Use recurring_todo.todos.active.count.zero? instead of recurring_todo.todos.active.count == 0.
        Open

              if recurring_todo.todos.active.count == 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 one level of indentation for parameters following the first line of a multi-line method call.
        Open

                :context_id, :project_id, :description, :notes,
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Here we check if the parameters on a multi-line method call or definition are aligned.

        Example: EnforcedStyle: withfirstparameter (default)

        # good
        
        foo :bar,
            :baz
        
        # bad
        
        foo :bar,
          :baz

        Example: EnforcedStyle: withfixedindentation

        # good
        
        foo :bar,
          :baz
        
        # bad
        
        foo :bar,
            :baz

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

          def get_done_rest_of_month(completed_todos, includes = { :include => Todo::DEFAULT_INCLUDES })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Line is too long. [138/120]
        Open

              from.project { todos = find_completed(current_user.projects, @todo.project_id, @todo.project.hidden?) unless @todo.project_id.nil? }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Redundant curly braces around a hash parameter.
        Open

                render :xml => completed_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })])
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 if over unless for negative conditions.
        Open

              @items = get_not_completed_for_predecessor(current_user, @todo.id) unless !@items.empty?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Align .active with todos_with_tag_ids on line 630.
        Open

              .active.not_hidden
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .hidden with todos_with_tag_ids on line 634.
        Open

              .hidden
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Line is too long. [157/120]
        Open

                    notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

            @not_done_todos.empty? ? @count = 0 : @count = @not_done_todos.size
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Use activated_successor_count.positive? instead of activated_successor_count > 0.
        Open

                  if activated_successor_count > 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Align .includes with todos_with_tag_ids on line 638.
        Open

              .includes(Todo::DEFAULT_INCLUDES)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .where with .todos on line 757.
        Open

              .where('(LOWER(todos.description) ' + Common.like_operator + '?)', "%#{params[:term].downcase}%")
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Pass array contents as separate arguments.
        Open

              format.xml { render :xml => @todo.to_xml(*[todo_xml_params[0].merge({ :root => :todo })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for unneeded usages of splat expansion

        Example:

        # bad
        
        a = *[1, 2, 3]
        a = *'a'
        a = *1
        
        begin
          foo
        rescue *[StandardError, ApplicationError]
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Example:

        # good
        
        c = [1, 2, 3]
        a = *c
        a, b = *c
        a, *b = *c
        a = *1..10
        a = ['a']
        
        begin
          foo
        rescue StandardError, ApplicationError
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Useless assignment to variable - todos_in_container.
        Open

              todos_in_container = current_user.todos.where(:project_id => nil)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

        assigned but unused variable - foo

        Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

        Example:

        # bad
        
        def some_method
          some_var = 1
          do_something
        end

        Example:

        # good
        
        def some_method
          some_var = 1
          do_something(some_var)
        end

        Rename is_old_due_empty to old_due_empty?.
        Open

          def is_old_due_empty(id)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Redundant curly braces around a hash parameter.
        Open

              format.xml { render :xml => @todo.to_xml(*[todo_xml_params[0].merge({ :root => :todo })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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})

        Move redirect_to :action => "index" out of the conditional.
        Open

                  redirect_to :action => "index"
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

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

            %w{ due show_from }.each { |date| update_date_for_update(date) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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)

        Align .includes with todos_with_tag_ids on line 642.
        Open

              .includes(Todo::DEFAULT_INCLUDES)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Pass array contents as separate arguments.
        Open

              format.xml { render :xml => @hidden.to_xml(*[todo_xml_params[0].merge({ :root => :todos })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for unneeded usages of splat expansion

        Example:

        # bad
        
        a = *[1, 2, 3]
        a = *'a'
        a = *1
        
        begin
          foo
        rescue *[StandardError, ApplicationError]
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Example:

        # good
        
        c = [1, 2, 3]
        a = *c
        a, b = *c
        a, *b = *c
        a = *1..10
        a = ['a']
        
        begin
          foo
        rescue StandardError, ApplicationError
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

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

          def find_todos_in_container_and_target_container(todo, target_todo)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Line is too long. [162/120]
        Open

                  @wants_redirect_after_complete = @todo.completed? && !@todo.project_id.nil? && current_user.prefs.show_project_on_todo_done && !source_view_is(:project)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [136/120]
        Open

              @remaining_undone_in_project = current_user.projects.find(@original_item.project_id).todos.active.count if source_view_is :project
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Do not prefix reader method names with get_.
        Open

          def get_todo_from_params
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop makes sure that accessor methods are named properly.

        Example:

        # bad
        def set_attribute(value)
        end
        
        # good
        def attribute=(value)
        end
        
        # bad
        def get_attribute
        end
        
        # good
        def attribute
        end

        Convert if nested inside else to elsif.
        Open

                @todo.block! if @todo.state == 'active' # Block active if we got uncompleted predecessors
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

                remaining_actions_in_context = remaining_actions_in_context.not_hidden if !context.hidden?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 max_completed.zero? instead of max_completed == 0.
        Open

            @done = current_user.todos.completed.limit(max_completed).includes(Todo::DEFAULT_INCLUDES) unless max_completed == 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Indent the first parameter one step more than the start of the previous line.
        Open

                :context_id, :project_id, :description, :notes,
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the first parameter in a method call. Parameters after the first one are checked by Style/AlignParameters, not by this cop.

        Example:

        # bad
        some_method(
        first_param,
        second_param)
        
        # good
        some_method(
          first_param,
        second_param)

        Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
        Open

                :due, :show_from, :state)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks that the closing brace in a method call is either on the same line as the last method argument, or a new line.

        When using the symmetrical (default) style:

        If a method call's opening brace is on the same line as the first argument of the call, then the closing brace should be on the same line as the last argument of the call.

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

        When using the new_line style:

        The closing brace of a multi-line method call must be on the line after the last argument of the call.

        When using the same_line style:

        The closing brace of a multi-line method call must be on the same line as the last argument of the call.

        Example:

        # symmetrical: bad
          # new_line: good
          # same_line: bad
          foo(a,
            b
          )
        
          # symmetrical: bad
          # new_line: bad
          # same_line: good
          foo(
            a,
            b)
        
          # symmetrical: good
          # new_line: bad
          # same_line: good
          foo(a,
            b)
        
          # symmetrical: good
          # new_line: good
          # same_line: bad
          foo(
            a,
            b
          )

        Align .reorder with todos_with_tag_ids on line 630.
        Open

              .reorder(Arel.sql('todos.due IS NULL, todos.due ASC, todos.created_at ASC'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .limit with .completed on line 650.
        Open

              .limit(current_user.prefs.show_number_completed)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Pass array contents as separate arguments.
        Open

              format.xml { render :xml => @not_done_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for unneeded usages of splat expansion

        Example:

        # bad
        
        a = *[1, 2, 3]
        a = *'a'
        a = *1
        
        begin
          foo
        rescue *[StandardError, ApplicationError]
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Example:

        # good
        
        c = [1, 2, 3]
        a = *c
        a, b = *c
        a, *b = *c
        a = *1..10
        a = ['a']
        
        begin
          foo
        rescue StandardError, ApplicationError
          bar
        end
        
        case foo
        when *[1, 2, 3]
          bar
        else
          baz
        end

        Line is too long. [124/120]
        Open

                @todo = current_user.todos.build({ :description => line, :context_id => p.context_id, :project_id => p.project_id })
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [137/120]
        Open

            @not_done_todos = current_user.todos.deferred.includes(includes).reorder('show_from') + current_user.todos.pending.includes(includes)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Do not prefix writer method names with set_.
        Open

          def set_format_for_tag_view(format)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop makes sure that accessor methods are named properly.

        Example:

        # bad
        def set_attribute(value)
        end
        
        # good
        def attribute=(value)
        end
        
        # bad
        def get_attribute
        end
        
        # good
        def attribute
        end

        Favor unless over if for negative conditions.
        Open

                  actions_in_target = actions_in_target.not_hidden if !context.hidden?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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 @todos.size.positive? instead of @todos.size > 0.
        Open

                if @saved && @todos.size > 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Align .includes with todos_with_tag_ids on line 634.
        Open

              .includes(Todo::DEFAULT_INCLUDES)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .deferred with todos_with_tag_ids on line 638.
        Open

              .deferred
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .map with .predecessors on line 1227.
        Open

                .map { |t| t.specification }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Do not prefix reader method names with get_.
        Open

          def get_params_for_tag_view
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop makes sure that accessor methods are named properly.

        Example:

        # bad
        def set_attribute(value)
        end
        
        # good
        def attribute=(value)
        end
        
        # bad
        def get_attribute
        end
        
        # good
        def attribute
        end

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

            if params[:tag_list]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Prefer the use of the nil? predicate.
        Open

                unless @todo.project_id == nil
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for comparison of something with nil using ==.

        Example:

        # bad
        if x == nil
        end
        
        # good
        if x.nil?
        end

        Redundant return detected.
        Open

            return todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Align .includes with todos_with_tag_ids on line 630.
        Open

              .includes(Todo::DEFAULT_INCLUDES)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Do not use spaces inside percent literal delimiters.
        Open

            %w{ due show_from }.each { |date| update_date_for_update(date) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Checks for unnecessary additional spaces inside the delimiters of %i/%w/%x literals.

        Example:

        # good
        %i(foo bar baz)
        
        # bad
        %w( foo bar baz )
        
        # bad
        %x(  ls -l )

        Line is too long. [140/120]
        Open

            @default_project = current_user.projects.where(:name => params['default_project_name']).first if params['default_project_name'].present?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Use next to skip iteration.
        Open

              if line.present?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Use next to skip iteration instead of a condition at the end.

        Example: EnforcedStyle: skipmodifierifs (default)

        # bad
        [1, 2].each do |a|
          if a == 1
            puts a
          end
        end
        
        # good
        [1, 2].each do |a|
          next unless a == 1
          puts a
        end
        
        # good
        [1, 2].each do |o|
          puts o unless o == 1
        end

        Example: EnforcedStyle: always

        # With `always` all conditions at the end of an iteration needs to be
        # replaced by next - with `skip_modifier_ifs` the modifier if like
        # this one are ignored: `[1, 2].each { |a| return 'yes' if a == 1 }`
        
        # bad
        [1, 2].each do |o|
          puts o unless o == 1
        end
        
        # bad
        [1, 2].each do |a|
          if a == 1
            puts a
          end
        end
        
        # good
        [1, 2].each do |a|
          next unless a == 1
          puts a
        end

        Align .join with .predecessors on line 1227.
        Open

                .join(', ')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Do not use spaces inside percent literal delimiters.
        Open

            %w{ due show_from }.each { |date| update_date_for_update(date) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Checks for unnecessary additional spaces inside the delimiters of %i/%w/%x literals.

        Example:

        # good
        %i(foo bar baz)
        
        # bad
        %w( foo bar baz )
        
        # bad
        %x(  ls -l )

        Do not prefix reader method names with get_.
        Open

          def get_not_done_todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop makes sure that accessor methods are named properly.

        Example:

        # bad
        def set_attribute(value)
        end
        
        # good
        def attribute=(value)
        end
        
        # bad
        def get_attribute
        end
        
        # good
        def attribute
        end

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

              if record.is_a?(Dependency)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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?

        Align .reorder with todos_with_tag_ids on line 634.
        Open

              .reorder(Arel.sql('todos.completed_at DESC, todos.created_at DESC'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Align .reorder with todos_with_tag_ids on line 642.
        Open

              .reorder(Arel.sql('todos.show_from ASC, todos.created_at DESC'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Redundant curly braces around a hash parameter.
        Open

              format.xml { render :xml => @not_done_todos.to_xml(*[todo_xml_params[0].merge({ :root => :todos })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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})

        Redundant curly braces around a hash parameter.
        Open

              format.xml { render :xml => @hidden.to_xml(*[todo_xml_params[0].merge({ :root => :todos })]) }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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})

        Move redirect_to :action => 'index' out of the conditional.
        Open

                  redirect_to :action => 'index'
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Redundant begin block detected.
        Open

            begin
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant begin blocks.

        Currently it checks for code like this:

        Example:

        def redundant
          begin
            ala
            bala
          rescue StandardError => e
            something
          end
        end
        
        def preferred
          ala
          bala
        rescue StandardError => e
          something
        end

        Redundant return detected.
        Open

            return ids
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Align .blocked with todos_with_tag_ids on line 642.
        Open

              .blocked
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Useless assignment to variable - filename.
        Open

            filename = params[:filename]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

        assigned but unused variable - foo

        Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

        Example:

        # bad
        
        def some_method
          some_var = 1
          do_something
        end

        Example:

        # good
        
        def some_method
          some_var = 1
          do_something(some_var)
        end

        Line is too long. [155/120]
        Open

                  notify(:notice, t("todos.action_marked_complete", :description => @todo.description, :completed => @todo.completed? ? 'complete' : 'incomplete'))
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Line is too long. [169/120]
        Open

            @done = current_user.todos.completed.with_tag(@tag.id).reorder('completed_at DESC').includes(Todo::DEFAULT_INCLUDES).paginate :page => params[:page], :per_page => 20
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

            if params['todo']['context_id'].blank? && params['context_name'].present?
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Use one level of indentation for parameters following the first line of a multi-line method call.
        Open

                :due, :show_from, :state)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Here we check if the parameters on a multi-line method call or definition are aligned.

        Example: EnforcedStyle: withfirstparameter (default)

        # good
        
        foo :bar,
            :baz
        
        # bad
        
        foo :bar,
          :baz

        Example: EnforcedStyle: withfixedindentation

        # good
        
        foo :bar,
          :baz
        
        # bad
        
        foo :bar,
            :baz

        Align .includes with .completed on line 650.
        Open

              .includes(Todo::DEFAULT_INCLUDES)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks the indentation of the method name part in method calls that span more than one line.

        Example: EnforcedStyle: aligned

        # bad
        while myvariable
        .b
          # do something
        end
        
        # good
        while myvariable
              .b
          # do something
        end
        
        # good
        Thing.a
             .b
             .c

        Example: EnforcedStyle: indented

        # good
        while myvariable
          .b
        
          # do something
        end

        Example: EnforcedStyle: indentedrelativeto_receiver

        # good
        while myvariable
                .a
                .b
        
          # do something
        end
        
        # good
        myvariable = Thing
                       .a
                       .b
                       .c

        Useless assignment to variable - errors.
        Open

            errors = []
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

        assigned but unused variable - foo

        Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

        Example:

        # bad
        
        def some_method
          some_var = 1
          do_something
        end

        Example:

        # good
        
        def some_method
          some_var = 1
          do_something(some_var)
        end

        Line is too long. [138/120]
        Open

            params['todo'][key] = params["todo"].key?(key) ? parse_date_for_update(params["todo"][key], t("todos.error.invalid_#{key}_date")) : ""
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

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

            if todo.project.nil?
              # container with todos without project
              todos_in_container = current_user.todos.where(:project_id => nil)
            else
              todos_in_container = current_user.projects.find(todo.project_id).todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Move redirect_to :action => 'index' out of the conditional.
        Open

                  redirect_to :action => 'index'
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Avoid rescuing without specifying an error class.
        Open

            rescue
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Use %i or %I for an array of symbols.
        Open

          skip_before_action :login_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop can check for array literals made up of symbols that are not using the %i() syntax.

        Alternatively, it checks for symbol arrays using the %i() syntax on projects which do not want to use that syntax.

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

        Example: EnforcedStyle: percent (default)

        # good
        %i[foo bar baz]
        
        # bad
        [:foo, :bar, :baz]

        Example: EnforcedStyle: brackets

        # good
        [:foo, :bar, :baz]
        
        # bad
        %i[foo bar baz]

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

            unless @predecessor.completed?
              begin
                @todo.add_predecessor(@predecessor)
                @todo.block! unless @todo.pending?
                @saved = @todo.save
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Redundant return detected.
        Open

            return todos
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Omit parentheses for ternary conditions.
        Open

            determine_remaining_in_container_count((@context_changed || @project_changed) ? @original_item : @todo)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for the presence of parentheses around ternary conditions. It is configurable to enforce inclusion or omission of parentheses using EnforcedStyle. Omission is only enforced when removing the parentheses won't cause a different behavior.

        Example: EnforcedStyle: requirenoparentheses (default)

        # bad
        foo = (bar?) ? a : b
        foo = (bar.baz?) ? a : b
        foo = (bar && baz) ? a : b
        
        # good
        foo = bar? ? a : b
        foo = bar.baz? ? a : b
        foo = bar && baz ? a : b

        Example: EnforcedStyle: require_parentheses

        # bad
        foo = bar? ? a : b
        foo = bar.baz? ? a : b
        foo = bar && baz ? a : b
        
        # good
        foo = (bar?) ? a : b
        foo = (bar.baz?) ? a : b
        foo = (bar && baz) ? a : b

        Example: EnforcedStyle: requireparentheseswhen_complex

        # bad
        foo = (bar?) ? a : b
        foo = (bar.baz?) ? a : b
        foo = bar && baz ? a : b
        
        # good
        foo = bar? ? a : b
        foo = bar.baz? ? a : b
        foo = (bar && baz) ? a : b

        Use !empty? instead of size > 0.
        Open

                if @saved && @todos.size > 0
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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?

        Redundant return detected.
        Open

            return new_due_id
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Reverse the order of the operands 0 == count_old_due_empty(id).
        Open

            return 0 == count_old_due_empty(id)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for Yoda conditions, i.e. comparison operations where readability is reduced because the operands are not ordered the same way as they would be ordered in spoken English.

        Example: EnforcedStyle: allcomparisonoperators (default)

        # bad
        99 == foo
        "bar" != foo
        42 >= foo
        10 < bar
        
        # good
        foo == 99
        foo == "bar"
        foo <= 42
        bar > 10

        Example: EnforcedStyle: equalityoperatorsonly

        # bad
        99 == foo
        "bar" != foo
        
        # good
        99 >= foo
        3 < a && a < 5

        Redundant return detected.
        Open

            return new_recurring_todo
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Use %i or %I for an array of symbols.
        Open

          prepend_before_action :login_or_feed_token_required, :only => [:index, :tag, :list_deferred, :show, :list_hidden, :done]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop can check for array literals made up of symbols that are not using the %i() syntax.

        Alternatively, it checks for symbol arrays using the %i() syntax on projects which do not want to use that syntax.

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

        Example: EnforcedStyle: percent (default)

        # good
        %i[foo bar baz]
        
        # bad
        [:foo, :bar, :baz]

        Example: EnforcedStyle: brackets

        # good
        [:foo, :bar, :baz]
        
        # bad
        %i[foo bar baz]

        Use %i or %I for an array of symbols.
        Open

          append_before_action :find_and_activate_ready, :only => [:index, :list_deferred]
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop can check for array literals made up of symbols that are not using the %i() syntax.

        Alternatively, it checks for symbol arrays using the %i() syntax on projects which do not want to use that syntax.

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

        Example: EnforcedStyle: percent (default)

        # good
        %i[foo bar baz]
        
        # bad
        [:foo, :bar, :baz]

        Example: EnforcedStyle: brackets

        # good
        [:foo, :bar, :baz]
        
        # bad
        %i[foo bar baz]

        Use %i or %I for an array of symbols.
        Open

            includes = params[:format] == 'xml' ? [:context, :project] : Todo::DEFAULT_INCLUDES
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop can check for array literals made up of symbols that are not using the %i() syntax.

        Alternatively, it checks for symbol arrays using the %i() syntax on projects which do not want to use that syntax.

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

        Example: EnforcedStyle: percent (default)

        # good
        %i[foo bar baz]
        
        # bad
        [:foo, :bar, :baz]

        Example: EnforcedStyle: brackets

        # good
        [:foo, :bar, :baz]
        
        # bad
        %i[foo bar baz]

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

            unless params['id'].nil?
              get_todo_from_params
              # Begin matching todos in current project, excluding @todo itself
              @items = get_not_completed_for_predecessor(@todo.project, @todo.id) unless @todo.project.nil?
              # Then look in the current context, excluding @todo itself
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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

        Redundant return detected.
        Open

            return 0 == count_old_due_empty(id)
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        This cop checks for redundant return expressions.

        Example:

        def test
          return something
        end
        
        def test
          one
          two
          three
          return something
        end

        It should be extended to handle methods whose body is if/else or a case expression with a default branch.

        Pass &:specification as an argument to map instead of a block.
        Open

                .map { |t| t.specification }
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        Use symbols as procs when possible.

        Example:

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

        Use !empty? instead of size > 0.
        Open

                  @multiple_error = @todos.size > 0 ? "" : t('todos.next_action_needed')
        Severity: Minor
        Found in app/controllers/todos_controller.rb by rubocop

        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