sanger/sequencescape

View on GitHub
app/models/bulk_transfer.rb

Summary

Maintainability
A
45 mins
Test Coverage
A
100%

Complex method BulkTransfer#each_transfer (38.9)
Open

  def each_transfer # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
    well_transfers
      .group_by { |tf| [tf['source_uuid'], tf['destination_uuid']] }
      .each do |source_dest, all_transfers|
        transfers = Hash.new { |h, i| h[i] = [] }
Severity: Minor
Found in app/models/bulk_transfer.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

BulkTransfer#each_transfer contains iterators nested 2 deep
Open

        transfers = Hash.new { |h, i| h[i] = [] }
        all_transfers.each { |t| transfers[t['source_location']] << t['destination_location'] }
Severity: Minor
Found in app/models/bulk_transfer.rb by reek

A Nested Iterator occurs when a block contains another block.

Example

Given

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

Reek would report the following warning:

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

BulkTransfer#each_transfer has approx 12 statements
Open

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

Method each_transfer has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
Open

  def each_transfer # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
    well_transfers
      .group_by { |tf| [tf['source_uuid'], tf['destination_uuid']] }
      .each do |source_dest, all_transfers|
        transfers = Hash.new { |h, i| h[i] = [] }
Severity: Minor
Found in app/models/bulk_transfer.rb - About 45 mins to fix

Cognitive Complexity

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

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

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

Further reading

BulkTransfer has missing safe method 'build_transfers!'
Open

  def build_transfers!
Severity: Minor
Found in app/models/bulk_transfer.rb by reek

A candidate method for the Missing Safe Method smell are methods whose names end with an exclamation mark.

An exclamation mark in method names means (the explanation below is taken from here ):

The ! in method names that end with ! means, “This method is dangerous”—or, more precisely, this method is the “dangerous” version of an otherwise equivalent method, with the same name minus the !. “Danger” is relative; the ! doesn’t mean anything at all unless the method name it’s in corresponds to a similar but bang-less method name. So, for example, gsub! is the dangerous version of gsub. exit! is the dangerous version of exit. flatten! is the dangerous version of flatten. And so forth.

Such a method is called Missing Safe Method if and only if her non-bang version does not exist and this method is reported as a smell.

Example

Given

class C
  def foo; end
  def foo!; end
  def bar!; end
end

Reek would report bar! as Missing Safe Method smell but not foo!.

Reek reports this smell only in a class context, not in a module context in order to allow perfectly legit code like this:

class Parent
  def foo; end
end

module Dangerous
  def foo!; end
end

class Son < Parent
  include Dangerous
end

class Daughter < Parent
end

In this example, Reek would not report the Missing Safe Method smell for the method foo of the Dangerous module.

BulkTransfer#well_transfers is a writable attribute
Open

  attr_accessor :well_transfers
Severity: Minor
Found in app/models/bulk_transfer.rb by reek

A class that publishes a setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.

The same holds to a lesser extent for getters, but Reek doesn't flag those.

Example

Given:

class Klass
  attr_accessor :dummy
end

Reek would emit the following warning:

reek test.rb

test.rb -- 1 warning:
  [2]:Klass declares the writable attribute dummy (Attribute)

BulkTransfer#each_transfer has the variable name 'i'
Open

        transfers = Hash.new { |h, i| h[i] = [] }
Severity: Minor
Found in app/models/bulk_transfer.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.

BulkTransfer#each_transfer has the variable name 'h'
Open

        transfers = Hash.new { |h, i| h[i] = [] }
Severity: Minor
Found in app/models/bulk_transfer.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.

BulkTransfer#each_transfer has the variable name 't'
Open

        all_transfers.each { |t| transfers[t['source_location']] << t['destination_location'] }
Severity: Minor
Found in app/models/bulk_transfer.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