sanger/sequencescape

View on GitHub
app/controllers/studies_controller.rb

Summary

Maintainability
C
1 day
Test Coverage
C
76%

Class StudiesController has 31 methods (exceeds 20 allowed). Consider refactoring.
Open

class StudiesController < ApplicationController
  # WARNING! This filter bypasses security mechanisms in rails 4 and mimics rails 2 behviour.
  # It should be removed wherever possible and the correct Strong  Parameter options applied in its place.
  before_action :evil_parameter_hack!
  include REXML
Severity: Minor
Found in app/controllers/studies_controller.rb - About 3 hrs to fix

    Complex method StudiesController#create (59.6)
    Open

      def create # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
        ActiveRecord::Base.transaction do
          @study = Study.new(params['study'].merge(user: current_user))
          @study.save!
          current_user.grant_manager(@study)
    Severity: Minor
    Found in app/controllers/studies_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 StudiesController#update (56.9)
    Open

      def update # rubocop:todo Metrics/AbcSize
        @study = Study.find(params[:id])
    
        ActiveRecord::Base.transaction do
          @study.update!(params[:study])
    Severity: Minor
    Found in app/controllers/studies_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

    File studies_controller.rb has 306 lines of code (exceeds 250 allowed). Consider refactoring.
    Open

    require 'rexml/document'
    
    # rubocop:todo Metrics/ClassLength
    class StudiesController < ApplicationController
      # WARNING! This filter bypasses security mechanisms in rails 4 and mimics rails 2 behviour.
    Severity: Minor
    Found in app/controllers/studies_controller.rb - About 3 hrs to fix

      Complex method StudiesController::role_helper (44.5)
      Open

        def self.role_helper(name, success_action, error_action) # rubocop:todo Metrics/AbcSize
          define_method(:"#{name}_role") do
            ActiveRecord::Base.transaction do
              @study = Study.find(params[:id])
              @user = User.find(params.require(:role).fetch(:user))
      Severity: Minor
      Found in app/controllers/studies_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 update has a Cognitive Complexity of 14 (exceeds 5 allowed). Consider refactoring.
      Open

        def update # rubocop:todo Metrics/AbcSize
          @study = Study.find(params[:id])
      
          ActiveRecord::Base.transaction do
            @study.update!(params[:study])
      Severity: Minor
      Found in app/controllers/studies_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 StudiesController#setup_studies_from_scope (32.5)
      Open

        def setup_studies_from_scope(exclude_nested_resource = false) # rubocop:todo Metrics/AbcSize
          if logged_in? && (not exclude_nested_resource)
            @alternatives = [
              'interesting',
              'followed',
      Severity: Minor
      Found in app/controllers/studies_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 StudiesController#studies_from_scope (31.6)
      Open

        def studies_from_scope(scope) # rubocop:todo Metrics/CyclomaticComplexity
          studies =
            case scope
            when 'interesting'
              Study.of_interest_to(current_user)
      Severity: Minor
      Found in app/controllers/studies_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 studies_from_scope has 30 lines of code (exceeds 25 allowed). Consider refactoring.
      Open

        def studies_from_scope(scope) # rubocop:todo Metrics/CyclomaticComplexity
          studies =
            case scope
            when 'interesting'
              Study.of_interest_to(current_user)
      Severity: Minor
      Found in app/controllers/studies_controller.rb - About 1 hr to fix

        StudiesController#update has approx 13 statements
        Open

          def update # rubocop:todo Metrics/AbcSize
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#self.role_helper has approx 9 statements
        Open

          def self.role_helper(name, success_action, error_action) # rubocop:todo Metrics/AbcSize
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#setup_studies_from_scope has boolean parameter 'exclude_nested_resource'
        Open

          def setup_studies_from_scope(exclude_nested_resource = false) # rubocop:todo Metrics/AbcSize
        Severity: Minor
        Found in app/controllers/studies_controller.rb by reek

        Boolean Parameter is a special case of Control Couple, where a method parameter is defaulted to true or false. A Boolean Parameter effectively permits a method's caller to decide which execution path to take. This is a case of bad cohesion. You're creating a dependency between methods that is not really necessary, thus increasing coupling.

        Example

        Given

        class Dummy
          def hit_the_switch(switch = true)
            if switch
              puts 'Hitting the switch'
              # do other things...
            else
              puts 'Not hitting the switch'
              # do other things...
            end
          end
        end

        Reek would emit the following warning:

        test.rb -- 3 warnings:
          [1]:Dummy#hit_the_switch has boolean parameter 'switch' (BooleanParameter)
          [2]:Dummy#hit_the_switch is controlled by argument switch (ControlParameter)

        Note that both smells are reported, Boolean Parameter and Control Parameter.

        Getting rid of the smell

        This is highly dependent on your exact architecture, but looking at the example above what you could do is:

        • Move everything in the if branch into a separate method
        • Move everything in the else branch into a separate method
        • Get rid of the hit_the_switch method alltogether
        • Make the decision what method to call in the initial caller of hit_the_switch

        StudiesController has at least 30 methods
        Open

        class StudiesController < ApplicationController
        Severity: Minor
        Found in app/controllers/studies_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)

        StudiesController#studies_from_scope has approx 14 statements
        Open

          def studies_from_scope(scope) # rubocop:todo Metrics/CyclomaticComplexity
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#index has approx 8 statements
        Open

          def index
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#show has approx 9 statements
        Open

          def show
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController has at least 11 instance variables
        Open

        class StudiesController < ApplicationController
        Severity: Minor
        Found in app/controllers/studies_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)

        StudiesController#rescue_accession_errors has approx 13 statements
        Open

          def rescue_accession_errors # rubocop:todo Metrics/AbcSize
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#study_status has approx 6 statements
        Open

          def study_status
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#close has approx 8 statements
        Open

          def close
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#follow has approx 6 statements
        Open

          def follow # rubocop:todo Metrics/AbcSize
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#create has approx 22 statements
        Open

          def create # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#open has approx 6 statements
        Open

          def open
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#properties has approx 6 statements
        Open

          def properties
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#accession has approx 6 statements
        Open

          def accession
        Severity: Minor
        Found in app/controllers/studies_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.)

        StudiesController#create calls 'format.html' 2 times
        Open

              format.html { redirect_to study_path(@study) }
              format.xml { render xml: @study, status: :created, location: @study }
              format.json { render json: @study, status: :created, location: @study }
            end
          rescue ActiveRecord::RecordInvalid => e
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#create calls 'format.json' 2 times
        Open

              format.json { render json: @study, status: :created, location: @study }
            end
          rescue ActiveRecord::RecordInvalid => e
            flash.now[:error] = 'Problems creating your new study'
            respond_to do |format|
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#update calls '@study.owners' 2 times
        Open

                  @study.owners.first.remove_role('owner', @study) if @study.owners.size == 1
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#update calls 'params[:study_owner_id]' 2 times
        Open

              if params[:study_owner_id].present?
                owner = User.find(params[:study_owner_id])
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#setup_studies_from_scope calls 'params[:project_id]' 2 times
        Open

            elsif params[:project_id] && !(project = Project.find(params[:project_id])).nil?
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#rescue_accession_errors calls 'study_path(@study)' 2 times
        Open

            redirect_to(study_path(@study))
          rescue AccessionService::NumberNotGenerated => e
            flash[:warning] = 'No accession number was generated'
            redirect_to(study_path(@study))
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#create calls 'format.xml' 2 times
        Open

              format.xml { render xml: @study, status: :created, location: @study }
              format.json { render json: @study, status: :created, location: @study }
            end
          rescue ActiveRecord::RecordInvalid => e
            flash.now[:error] = 'Problems creating your new study'
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#rescue_accession_errors calls 'e.message' 2 times
        Open

            flash[:warning] = e.message || 'An accession number is not required for this study'
            redirect_to(study_path(@study))
          rescue AccessionService::NumberNotGenerated => e
            flash[:warning] = 'No accession number was generated'
            redirect_to(study_path(@study))
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#rescue_accession_errors calls 'redirect_to(study_path(@study))' 2 times
        Open

            redirect_to(study_path(@study))
          rescue AccessionService::NumberNotGenerated => e
            flash[:warning] = 'No accession number was generated'
            redirect_to(study_path(@study))
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#create calls '@study.errors' 2 times
        Open

              format.xml { render xml: @study.errors, status: :unprocessable_entity }
              format.json { render json: @study.errors, status: :unprocessable_entity }
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#follow calls '@study.name' 2 times
        Open

              flash[:notice] = "You have stopped following the '#{@study.name}' study."
            else
              current_user.grant_follower(@study)
              flash[:notice] = "You are now following the '#{@study.name}' study."
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#studies_from_scope calls 'Study.managed_by(current_user)' 2 times
        Open

                Study.managed_by(current_user).is_active
              when 'managed & inactive'
                Study.managed_by(current_user).is_inactive
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#create calls 'params[:study_owner_id]' 2 times
        Open

              User.find(params[:study_owner_id]).grant_owner(@study) if params[:study_owner_id].present?
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#edit calls '@study.warnings' 2 times
        Open

            flash.now[:warning] = @study.warnings if @study.warnings.present?
        Severity: Minor
        Found in app/controllers/studies_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.

        Complex method StudiesController#rescue_accession_errors (21.3)
        Open

          def rescue_accession_errors # rubocop:todo Metrics/AbcSize
            yield
          rescue ActiveRecord::RecordInvalid => e
            flash.now[:error] = 'Please fill in the required fields'
            render(action: :edit)
        Severity: Minor
        Found in app/controllers/studies_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

        StudiesController#setup_studies_from_scope performs a nil-check
        Open

            elsif params[:project_id] && !(project = Project.find(params[:project_id])).nil?
        Severity: Minor
        Found in app/controllers/studies_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)

        StudiesController#update has the variable name 'e'
        Open

          rescue ActiveRecord::RecordInvalid => e
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#create has the variable name 'e'
        Open

          rescue ActiveRecord::RecordInvalid => e
        Severity: Minor
        Found in app/controllers/studies_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.

        StudiesController#rescue_accession_errors has the variable name 'e'
        Open

          rescue ActiveRecord::RecordInvalid => e
            flash.now[:error] = 'Please fill in the required fields'
            render(action: :edit)
          rescue AccessionService::NumberNotRequired => e
            flash[:warning] = e.message || 'An accession number is not required for this study'
        Severity: Minor
        Found in app/controllers/studies_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.

        Similar blocks of code found in 2 locations. Consider refactoring.
        Open

          rescue ActiveRecord::RecordInvalid => e
            flash.now[:error] = 'Problems creating your new study'
            respond_to do |format|
              format.html { render action: 'new' }
              format.xml { render xml: @study.errors, status: :unprocessable_entity }
        Severity: Minor
        Found in app/controllers/studies_controller.rb and 1 other location - About 50 mins to fix
        app/controllers/projects_controller.rb on lines 63..70

        Duplicated Code

        Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

        Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

        When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

        Tuning

        This issue has a mass of 42.

        We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

        The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

        If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

        See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

        Refactorings

        Further Reading

        Similar blocks of code found in 2 locations. Consider refactoring.
        Open

          def follow # rubocop:todo Metrics/AbcSize
            @study = Study.find(params[:id])
            if current_user.follower_of?(@study)
              current_user.remove_role 'follower', @study
              flash[:notice] = "You have stopped following the '#{@study.name}' study."
        Severity: Minor
        Found in app/controllers/studies_controller.rb and 1 other location - About 45 mins to fix
        app/controllers/projects_controller.rb on lines 111..120

        Duplicated Code

        Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

        Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

        When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

        Tuning

        This issue has a mass of 40.

        We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

        The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

        If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

        See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

        Refactorings

        Further Reading

        Similar blocks of code found in 2 locations. Consider refactoring.
        Open

            respond_to do |format|
              format.html { redirect_to study_path(@study) }
              format.xml { render xml: @study, status: :created, location: @study }
              format.json { render json: @study, status: :created, location: @study }
        Severity: Minor
        Found in app/controllers/studies_controller.rb and 1 other location - About 30 mins to fix
        app/controllers/projects_controller.rb on lines 58..61

        Duplicated Code

        Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

        Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

        When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

        Tuning

        This issue has a mass of 32.

        We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

        The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

        If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

        See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

        Refactorings

        Further Reading

        Similar blocks of code found in 2 locations. Consider refactoring.
        Open

          def policy_accession
            rescue_accession_errors do
              @study = Study.find(params[:id])
              @study.accession_service.submit_policy_for_user(@study, current_user)
        
        
        Severity: Minor
        Found in app/controllers/studies_controller.rb and 1 other location - About 15 mins to fix
        app/controllers/studies_controller.rb on lines 253..259

        Duplicated Code

        Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

        Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

        When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

        Tuning

        This issue has a mass of 26.

        We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

        The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

        If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

        See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

        Refactorings

        Further Reading

        Similar blocks of code found in 2 locations. Consider refactoring.
        Open

          def dac_accession
            rescue_accession_errors do
              @study = Study.find(params[:id])
              @study.accession_service.submit_dac_for_user(@study, current_user)
        
        
        Severity: Minor
        Found in app/controllers/studies_controller.rb and 1 other location - About 15 mins to fix
        app/controllers/studies_controller.rb on lines 263..269

        Duplicated Code

        Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

        Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

        When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

        Tuning

        This issue has a mass of 26.

        We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

        The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

        If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

        See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

        Refactorings

        Further Reading

        There are no issues that match your filters.

        Category
        Status