sanger/sequencescape

View on GitHub
app/models/labware.rb

Summary

Maintainability
A
3 hrs
Test Coverage
A
95%

Class Labware has 26 methods (exceeds 20 allowed). Consider refactoring.
Open

class Labware < Asset
  include Commentable
  include Uuid::Uuidable
  include AssetLink::Associations
  include SharedBehaviour::Named
Severity: Minor
Found in app/models/labware.rb - About 3 hrs to fix

    Labware has at least 26 methods
    Open

    class Labware < Asset
    Severity: Minor
    Found in app/models/labware.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)

    Labware#lookup_labwhere has approx 6 statements
    Open

      def lookup_labwhere(barcode)
    Severity: Minor
    Found in app/models/labware.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.)

    Labware#labwhere_locations has approx 7 statements
    Open

        def labwhere_locations(labware_barcodes) # rubocop:todo Metrics/MethodLength
    Severity: Minor
    Found in app/models/labware.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.)

    Labware#receptacle_proxy calls 'proxy_association.owner' 2 times
    Open

          return self unless proxy_association.owner.respond_to?(:receptacle)
    
          reset # We're about to modify the association indirectly, so any existing records are invalid
          proxy_association.owner.receptacle.aliquots
    Severity: Minor
    Found in app/models/labware.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.

    Labware#lookup_labwhere calls 'info_from_labwhere.location' 2 times
    Open

        info_from_labwhere.location.location_info if info_from_labwhere.present? && info_from_labwhere.location.present?
    Severity: Minor
    Found in app/models/labware.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.

    Labware#receptacle_proxy manually dispatches method call
    Open

          return self unless proxy_association.owner.respond_to?(:receptacle)
    Severity: Minor
    Found in app/models/labware.rb by reek

    Reek reports a Manual Dispatch smell if it finds source code that manually checks whether an object responds to a method before that method is called. Manual dispatch is a type of Simulated Polymorphism which leads to code that is harder to reason about, debug, and refactor.

    Example

    class MyManualDispatcher
      attr_reader :foo
    
      def initialize(foo)
        @foo = foo
      end
    
      def call
        foo.bar if foo.respond_to?(:bar)
      end
    end

    Reek would emit the following warning:

    test.rb -- 1 warning:
      [9]: MyManualDispatcher manually dispatches method call (ManualDispatch)

    Labware#lookup_labwhere doesn't depend on instance state (maybe move it to another class?)
    Open

      def lookup_labwhere(barcode)
    Severity: Minor
    Found in app/models/labware.rb by reek

    A Utility Function is any instance method that has no dependency on the state of the instance.

    Complex method Labware::labwhere_locations (20.8)
    Open

        def labwhere_locations(labware_barcodes) # rubocop:todo Metrics/MethodLength
          info_from_labwhere = LabWhereClient::LabwareSearch.find_locations_by_barcodes(labware_barcodes)
    
          if info_from_labwhere.blank?
            raise LabWhereClient::LabwhereException, 'Labwhere service did not return information'
    Severity: Minor
    Found in app/models/labware.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

    Labware#lookup_labwhere has the variable name 'e'
    Open

        rescue StandardError => e
    Severity: Minor
    Found in app/models/labware.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.

    There are no issues that match your filters.

    Category
    Status