sanger/sequencescape

View on GitHub
app/controllers/batches_controller.rb

Summary

Maintainability
D
1 day
Test Coverage
C
72%

Class BatchesController has 36 methods (exceeds 20 allowed). Consider refactoring.
Open

class BatchesController < ApplicationController # rubocop:todo Metrics/ClassLength
  # WARNING! This filter bypasses security mechanisms in rails 4 and mimics rails 2 behaviour.
  # It should be removed wherever possible and the correct Strong  Parameter options applied in its place.

  before_action :evil_parameter_hack!
Severity: Minor
Found in app/controllers/batches_controller.rb - About 4 hrs to fix

    File batches_controller.rb has 325 lines of code (exceeds 250 allowed). Consider refactoring.
    Open

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

      Complex method BatchesController#standard_create (40.4)
      Open

        def standard_create(requests) # rubocop:todo Metrics/CyclomaticComplexity
          unless @pipeline.all_requests_from_submissions_selected?(requests)
            return pipeline_error_on_batch_creation('All plates in a submission must be selected')
          end
          if @pipeline.max_size && requests.length > @pipeline.max_size
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#show (36.0)
      Open

        def show # rubocop:todo Metrics/AbcSize
          respond_to do |format|
            format.html do
              @submenu_presenter = Presenters::BatchSubmenuPresenter.new(current_user, @batch)
      
      
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#swap (34.5)
      Open

        def swap # rubocop:todo Metrics/AbcSize
          if @batch.swap(
               current_user,
               'batch_1' => {
                 'id' => params['batch']['1'],
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#index (33.8)
      Open

        def index # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
          if logged_in?
            @user = params.fetch(:user, current_user)
            @batches = Batch.for_user(@user).order(id: :desc).includes(:user, :assignee, :pipeline).page(params[:page])
          else
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#create (33.3)
      Open

        def create # rubocop:todo Metrics/AbcSize
          @pipeline = Pipeline.find(params[:id])
      
          requests = @pipeline.extract_requests_from_input_params(request_parameters)
      
      
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#update (30.8)
      Open

        def update # rubocop:todo Metrics/AbcSize
          if batch_parameters[:assignee_id]
            user = User.find(batch_parameters[:assignee_id])
            assigned_message = "Assigned to #{user.name} (#{user.login})."
          else
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#print (28.8)
      Open

        def print # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
          @task = Task.find_by(id: params[:task_id])
          @pipeline = @batch.pipeline
          @comments = @batch.comments
          template = @pipeline.batch_worksheet
      Severity: Minor
      Found in app/controllers/batches_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 print has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.
      Open

        def print # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
          @task = Task.find_by(id: params[:task_id])
          @pipeline = @batch.pipeline
          @comments = @batch.comments
          template = @pipeline.batch_worksheet
      Severity: Minor
      Found in app/controllers/batches_controller.rb - About 55 mins to fix

      Cognitive Complexity

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

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

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

      Further reading

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

        def standard_create(requests) # rubocop:todo Metrics/CyclomaticComplexity
          unless @pipeline.all_requests_from_submissions_selected?(requests)
            return pipeline_error_on_batch_creation('All plates in a submission must be selected')
          end
          if @pipeline.max_size && requests.length > @pipeline.max_size
      Severity: Minor
      Found in app/controllers/batches_controller.rb - About 55 mins to fix

      Cognitive Complexity

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

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

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

      Further reading

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

        def show # rubocop:todo Metrics/AbcSize
          respond_to do |format|
            format.html do
              @submenu_presenter = Presenters::BatchSubmenuPresenter.new(current_user, @batch)
      
      
      Severity: Minor
      Found in app/controllers/batches_controller.rb - About 55 mins to fix

      Cognitive Complexity

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

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

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

      Further reading

      BatchesController#print_plate_labels has approx 10 statements
      Open

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

      BatchesController has at least 21 instance variables
      Open

      class BatchesController < ApplicationController # rubocop:todo Metrics/ClassLength
      Severity: Minor
      Found in app/controllers/batches_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)

      BatchesController#index has approx 9 statements
      Open

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

      BatchesController#find_batch_by_barcode has approx 6 statements
      Open

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

      BatchesController#show has approx 14 statements
      Open

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

      BatchesController#create has approx 12 statements
      Open

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

      BatchesController#print has approx 11 statements
      Open

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

      BatchesController#standard_create has approx 14 statements
      Open

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

      BatchesController#verify_tube_layout has approx 6 statements
      Open

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

      BatchesController#transition_requests has approx 8 statements
      Open

        def transition_requests(requests, transition, message)
      Severity: Minor
      Found in app/controllers/batches_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.)

      BatchesController#update has approx 13 statements
      Open

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

      BatchesController#fail_items has approx 6 statements
      Open

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

      BatchesController#released has approx 6 statements
      Open

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

      BatchesController has at least 36 methods
      Open

      class BatchesController < ApplicationController # rubocop:todo Metrics/ClassLength
      Severity: Minor
      Found in app/controllers/batches_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)

      Method print_plate_labels has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
      Open

        def print_plate_labels # rubocop:todo Metrics/MethodLength
          @pipeline = @batch.pipeline
          @output_barcodes = []
      
          @output_labware = @batch.plate_group_barcodes || []
      Severity: Minor
      Found in app/controllers/batches_controller.rb - About 35 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

      BatchesController#swap calls 'params['batch']['position']' 2 times
      Open

                 'lane' => params['batch']['position']['1']
               },
               'batch_2' => {
                 'id' => params['batch']['2'],
                 'lane' => params['batch']['position']['2']
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#index calls 'params[:page]' 2 times
      Open

            @batches = Batch.for_user(@user).order(id: :desc).includes(:user, :assignee, :pipeline).page(params[:page])
          else
            # Can end up here with XML. And it causes pain.
            @batches = Batch.order(id: :asc).page(params[:page]).limit(10)
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#show calls '@batch.robot_id' 2 times
      Open

                @robot = @batch.robot_id ? Robot.find(@batch.robot_id) : Robot.with_verification_behaviour.first
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#swap calls 'params['batch']' 4 times
      Open

                 'id' => params['batch']['1'],
                 'lane' => params['batch']['position']['1']
               },
               'batch_2' => {
                 'id' => params['batch']['2'],
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#edit calls '@batch.pipeline' 2 times
      Open

          @rits = @batch.pipeline.request_information_types
          @requests = @batch.ordered_requests.includes(:batch_request, :asset, :target_asset, :comments)
          @users = User.all
          @controls = @batch.pipeline.controls
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#update calls 'format.xml' 2 times
      Open

              format.xml { head :ok }
            else
              format.html { render action: 'edit' }
              format.xml { render xml: @batch.errors.to_xml }
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#show calls 'Robot.with_verification_behaviour' 2 times
      Open

                @robot = @batch.robot_id ? Robot.find(@batch.robot_id) : Robot.with_verification_behaviour.first
      
                # In the event we have no robots with the correct behaviour, and none are specialised on the batch, fall-back
                # to the first robot.
                @robot ||= Robot.first
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#update calls 'batch_parameters[:assignee_id]' 2 times
      Open

          if batch_parameters[:assignee_id]
            user = User.find(batch_parameters[:assignee_id])
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#standard_create calls '@pipeline.max_size' 3 times
      Open

          if @pipeline.max_size && requests.length > @pipeline.max_size
            return pipeline_error_on_batch_creation("Maximum batch size is #{@pipeline.max_size}")
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#update calls 'format.html' 2 times
      Open

              format.html { redirect_to batch_url(@batch) }
              format.xml { head :ok }
            else
              format.html { render action: 'edit' }
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#print calls 'params[:barcode]' 2 times
      Open

            @plates = params[:barcode] ? Plate.with_barcode(params[:barcode]) : @batch.output_plates
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#fail_items (22.7)
      Open

        def fail_items # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
          ActiveRecord::Base.transaction do
            fail_params =
              params.permit(:id, requested_fail: {}, requested_remove: {}, failure: %i[reason comment fail_but_charge])
            fail_and_remover = Batch::RequestFailAndRemover.new(fail_params)
      Severity: Minor
      Found in app/controllers/batches_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 BatchesController#released (21.3)
      Open

        def released
          # The params fall-back here reflects an older route where pipeline got passed in as :id. It should be removed
          # in the near future.
          @pipeline = Pipeline.find(params[:pipeline_id] || params[:id])
      
      
      Severity: Minor
      Found in app/controllers/batches_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

      BatchesController#print_plate_labels performs a nil-check
      Open

            next if parent.nil?
      Severity: Minor
      Found in app/controllers/batches_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)

      BatchesController#find_batch_by_barcode performs a nil-check
      Open

          if batch_id.nil?
      Severity: Minor
      Found in app/controllers/batches_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)

      Complex method BatchesController#verify_tube_layout (20.4)
      Open

        def verify_tube_layout # rubocop:todo Metrics/AbcSize
          tube_barcodes = Array.new(@batch.requests.count) { |i| params["barcode_#{i}"] }
      
          if @batch.verify_tube_layout(tube_barcodes, current_user)
            flash[:notice] = 'All of the tubes are in their correct positions.'
      Severity: Minor
      Found in app/controllers/batches_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

      BatchesController#verify_tube_layout has the variable name 'i'
      Open

          tube_barcodes = Array.new(@batch.requests.count) { |i| params["barcode_#{i}"] }
      Severity: Minor
      Found in app/controllers/batches_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.

      BatchesController#standard_create has the variable name 'e'
      Open

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

      BatchesController#create has the variable name 'e'
      Open

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

      TODO found
      Open

          # TODO: These should be different endpoints
      Severity: Minor
      Found in app/controllers/batches_controller.rb by fixme

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

        def started
          # The params fall-back here reflects an older route where pipeline got passed in as :id. It should be removed
          # in the near future.
          @pipeline = Pipeline.find(params[:pipeline_id] || params[:id])
          @batches = @pipeline.batches.started.order(id: :desc).includes(%i[user pipeline]).page(params[:page])
      Severity: Minor
      Found in app/controllers/batches_controller.rb and 3 other locations - About 20 mins to fix
      app/controllers/batches_controller.rb on lines 146..150
      app/controllers/batches_controller.rb on lines 172..176
      app/controllers/batches_controller.rb on lines 179..183

      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 28.

      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 4 locations. Consider refactoring.
      Open

        def pending
          # The params fall-back here reflects an older route where pipeline got passed in as :id. It should be removed
          # in the near future.
          @pipeline = Pipeline.find(params[:pipeline_id] || params[:id])
          @batches = @pipeline.batches.pending.order(id: :desc).includes(%i[user pipeline]).page(params[:page])
      Severity: Minor
      Found in app/controllers/batches_controller.rb and 3 other locations - About 20 mins to fix
      app/controllers/batches_controller.rb on lines 153..157
      app/controllers/batches_controller.rb on lines 172..176
      app/controllers/batches_controller.rb on lines 179..183

      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 28.

      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 4 locations. Consider refactoring.
      Open

        def completed
          # The params fall-back here reflects an older route where pipeline got passed in as :id. It should be removed
          # in the near future.
          @pipeline = Pipeline.find(params[:pipeline_id] || params[:id])
          @batches = @pipeline.batches.completed.order(id: :desc).includes(%i[user pipeline]).page(params[:page])
      Severity: Minor
      Found in app/controllers/batches_controller.rb and 3 other locations - About 20 mins to fix
      app/controllers/batches_controller.rb on lines 146..150
      app/controllers/batches_controller.rb on lines 153..157
      app/controllers/batches_controller.rb on lines 179..183

      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 28.

      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 4 locations. Consider refactoring.
      Open

        def failed
          # The params fall-back here reflects an older route where pipeline got passed in as :id. It should be removed
          # in the near future.
          @pipeline = Pipeline.find(params[:pipeline_id] || params[:id])
          @batches = @pipeline.batches.failed.order(id: :desc).includes(%i[user pipeline]).page(params[:page])
      Severity: Minor
      Found in app/controllers/batches_controller.rb and 3 other locations - About 20 mins to fix
      app/controllers/batches_controller.rb on lines 146..150
      app/controllers/batches_controller.rb on lines 153..157
      app/controllers/batches_controller.rb on lines 172..176

      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 28.

      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