TracksApp/tracks

View on GitHub
app/models/message_gateway.rb

Summary

Maintainability
A
0 mins
Test Coverage

Complex method MessageGateway#receive (26.0)
Open

  def receive(email)
    user = get_receiving_user_from_email_address(email)
    return false if user.nil?
    return false unless check_sender_is_in_mailmap(user, email)

Severity: Minor
Found in app/models/message_gateway.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

MessageGateway#get_all_parts refers to 'set' more than self (maybe move it to another class?)
Open

        set += get_all_parts(elem.parts)
      else
        set << elem
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#get_todo_params refers to 'email' more than self (maybe move it to another class?)
Open

    if email.multipart?
      params[:description] = get_text_or_nil(email.subject)
      params[:notes]       = get_first_text_plain_part(email)
    else
      if email.subject.blank?
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#get_todo_params has approx 8 statements
Open

  def get_todo_params(email)
Severity: Minor
Found in app/models/message_gateway.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.)

MessageGateway#check_sender_is_in_mailmap refers to 'user' more than self (maybe move it to another class?)
Open

    if user.present? && !sender_is_in_mailmap?(user, email)
      Rails.logger.warn "#{email.from[0]} not found in mailmap for #{user.login}"
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#get_todo_params refers to 'params' more than self (maybe move it to another class?)
Open

      params[:description] = get_text_or_nil(email.subject)
      params[:notes]       = get_first_text_plain_part(email)
    else
      if email.subject.blank?
        params[:description] = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#receive has approx 10 statements
Open

  def receive(email)
Severity: Minor
Found in app/models/message_gateway.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.)

MessageGateway#get_first_text_plain_part refers to 'parts' more than self (maybe move it to another class?)
Open

    parts.reject { |part| !part.content_type.start_with?("text/plain") }

    return parts.count > 0 ? parts[0].decoded.strip : ""
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#get_all_parts refers to 'elem' more than self (maybe move it to another class?)
Open

      if elem.content_type.start_with?("multipart/alternative")
        # recurse to handle multiparts in this multipart
        set += get_all_parts(elem.parts)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

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

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

Example

Running Reek on:

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

would report:

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

since this:

(item.price - item.rebate)

belongs to the Item class, not the Warehouse.

MessageGateway#attach_email_to_todo has approx 10 statements
Open

  def attach_email_to_todo(todo, email)
Severity: Minor
Found in app/models/message_gateway.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.)

MessageGateway tests 'user.nil?' at least 4 times
Open

    return false if user.nil?
    return false unless check_sender_is_in_mailmap(user, email)

    context = user.prefs.sms_context
    todo_params = get_todo_params(email)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

Example

Given

class RepeatedConditionals
  attr_accessor :switch

  def repeat_1
    puts "Repeat 1!" if switch
  end

  def repeat_2
    puts "Repeat 2!" if switch
  end

  def repeat_3
    puts "Repeat 3!" if switch
  end
end

Reek would emit the following warning:

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

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

MessageGateway#get_todo_params calls 'params[:description] = get_text_or_nil(email.subject)' 2 times
Open

      params[:description] = get_text_or_nil(email.subject)
      params[:notes]       = get_first_text_plain_part(email)
    else
      if email.subject.blank?
        params[:description] = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#receive calls 'context.name' 2 times
Open

      Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}"

      if attach_email_to_todo(todo, email)
        Rails.logger.info "Saved email as attachment to todo for user #{user.login} in context #{context.name}"
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_todo_params calls 'email.subject' 3 times
Open

      params[:description] = get_text_or_nil(email.subject)
      params[:notes]       = get_first_text_plain_part(email)
    else
      if email.subject.blank?
        params[:description] = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway has no descriptive comment
Open

class MessageGateway < ActionMailer::Base
Severity: Minor
Found in app/models/message_gateway.rb by reek

Classes and modules are the units of reuse and release. It is therefore considered good practice to annotate every class and module with a brief comment outlining its responsibilities.

Example

Given

class Dummy
  # Do things...
end

Reek would emit the following warning:

test.rb -- 1 warning:
  [1]:Dummy has no descriptive comment (IrresponsibleModule)

Fixing this is simple - just an explaining comment:

# The Dummy class is responsible for ...
class Dummy
  # Do things...
end

MessageGateway#get_receiving_user_from_sms_email calls 'address.strip' 2 times
Open

    user = User.where("preferences.sms_email" => address.strip).includes(:preference).first
    user = User.where("preferences.sms_email" => address.strip[1.100]).includes(:preference).first if user.nil?
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#receive calls 'user.login' 2 times
Open

      Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}"

      if attach_email_to_todo(todo, email)
        Rails.logger.info "Saved email as attachment to todo for user #{user.login} in context #{context.name}"
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_receiving_user_from_env_setting calls 'ENV['TRACKS_MAIL_RECEIVER']' 3 times
Open

    Rails.logger.info "All received email goes to #{ENV['TRACKS_MAIL_RECEIVER']}"
    user = User.where(:login => ENV['TRACKS_MAIL_RECEIVER']).first
    Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil?
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#sender_is_in_mailmap? calls 'SITE_CONFIG['mailmap']' 2 times
Open

    if (SITE_CONFIG['mailmap'].is_a? Hash) && SITE_CONFIG['email_dispatch'] == 'to'
      # Look for the sender in the map of allowed senders
      SITE_CONFIG['mailmap'][user.preference.sms_email].include? email.from[0]
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_todo_params calls 'get_decoded_text_or_nil(email.body)' 2 times
Open

        params[:description] = get_decoded_text_or_nil(email.body)
        params[:notes]       = nil
      else
        params[:description] = get_text_or_nil(email.subject)
        params[:notes]       = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_todo_params calls 'get_text_or_nil(email.subject)' 2 times
Open

      params[:description] = get_text_or_nil(email.subject)
      params[:notes]       = get_first_text_plain_part(email)
    else
      if email.subject.blank?
        params[:description] = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_todo_params calls 'email.body' 2 times
Open

        params[:description] = get_decoded_text_or_nil(email.body)
        params[:notes]       = nil
      else
        params[:description] = get_text_or_nil(email.subject)
        params[:notes]       = get_decoded_text_or_nil(email.body)
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#receive calls 'Rails.logger' 2 times
Open

      Rails.logger.info "Saved email as todo for user #{user.login} in context #{context.name}"

      if attach_email_to_todo(todo, email)
        Rails.logger.info "Saved email as attachment to todo for user #{user.login} in context #{context.name}"
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#get_receiving_user_from_env_setting calls 'Rails.logger' 2 times
Open

    Rails.logger.info "All received email goes to #{ENV['TRACKS_MAIL_RECEIVER']}"
    user = User.where(:login => ENV['TRACKS_MAIL_RECEIVER']).first
    Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil?
Severity: Minor
Found in app/models/message_gateway.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.

MessageGateway#receive performs a nil-check
Open

    return false if user.nil?
Severity: Minor
Found in app/models/message_gateway.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)

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

  def get_receiving_user_from_sms_email(address)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

  def get_text_or_nil(text)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

  def attach_email_to_todo(todo, email)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

  def sender_is_in_mailmap?(user, email)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

MessageGateway#get_receiving_user_from_sms_email performs a nil-check
Open

    user = User.where("preferences.sms_email" => address.strip[1.100]).includes(:preference).first if user.nil?
Severity: Minor
Found in app/models/message_gateway.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)

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

  def get_receiving_user_from_env_setting
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

  def get_address(email)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

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

  def get_decoded_text_or_nil(text)
Severity: Minor
Found in app/models/message_gateway.rb by reek

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

MessageGateway#get_receiving_user_from_env_setting performs a nil-check
Open

    Rails.logger.info "WARNING: Unknown user set for TRACKS_MAIL_RECEIVER (#{ENV['TRACKS_MAIL_RECEIVER']})" if user.nil?
Severity: Minor
Found in app/models/message_gateway.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)

MessageGateway#get_receiving_user_from_mail_header performs a nil-check
Open

    Rails.logger.info(user.nil? ? "User unknown" : "Email belongs to #{user.login}")
Severity: Minor
Found in app/models/message_gateway.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 MessageGateway#attach_email_to_todo (20.3)
Open

  def attach_email_to_todo(todo, email)
    attachment = todo.attachments.build

    # create temp file
    tmp = Tempfile.new(['attachment', '.eml'], universal_newline: true)
Severity: Minor
Found in app/models/message_gateway.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

Use delete instead of gsub.
Open

    tmp.write email.raw_source.gsub(/\r/, "")
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop identifies places where gsub can be replaced by tr or delete.

Example:

# bad
'abc'.gsub('b', 'd')
'abc'.gsub('a', '')
'abc'.gsub(/a/, 'd')
'abc'.gsub!('a', 'd')

# good
'abc'.gsub(/.*/, 'a')
'abc'.gsub(/a+/, 'd')
'abc'.tr('b', 'd')
'a b c'.delete(' ')

Use find_by instead of where.first.
Open

    user = User.where(:login => ENV['TRACKS_MAIL_RECEIVER']).first
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop is used to identify usages of where.first and change them to use find_by instead.

Example:

# bad
User.where(name: 'Bruce').first
User.where(name: 'Bruce').take

# good
User.find_by(name: 'Bruce')

Useless assignment to variable - set.
Open

        set += get_all_parts(elem.parts)
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

assigned but unused variable - foo

Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

Example:

# bad

def some_method
  some_var = 1
  do_something
end

Example:

# good

def some_method
  some_var = 1
  do_something(some_var)
end

Line is too long. [133/120]
Open

    SITE_CONFIG['email_dispatch'] == 'single_user' ? get_receiving_user_from_env_setting : get_receiving_user_from_mail_header(email)
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

Redundant return detected.
Open

    return user
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Useless assignment to variable - saved.
Open

    saved = attachment.save!
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

assigned but unused variable - foo

Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

Example:

# bad

def some_method
  some_var = 1
  do_something
end

Example:

# good

def some_method
  some_var = 1
  do_something(some_var)
end

Redundant return detected.
Open

    return text ? text.strip : nil
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Convert if nested inside else to elsif.
Open

      if email.subject.blank?
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

If the else branch of a conditional consists solely of an if node, it can be combined with the else to become an elsif. This helps to keep the nesting level from getting too deep.

Example:

# bad
if condition_a
  action_a
else
  if condition_b
    action_b
  else
    action_c
  end
end

# good
if condition_a
  action_a
elsif condition_b
  action_b
else
  action_c
end

Redundant return detected.
Open

    return user
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Redundant return detected.
Open

    return true
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Missing magic comment # frozen_string_literal: true.
Open

class MessageGateway < ActionMailer::Base
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop is designed to help upgrade to Ruby 3.0. It will add the comment # frozen_string_literal: true to the top of files to enable frozen string literals. Frozen string literals may be default in Ruby 3.0. The comment will be added below a shebang and encoding comment. The frozen string literal comment is only valid in Ruby 2.3+.

Example: EnforcedStyle: when_needed (default)

# The `when_needed` style will add the frozen string literal comment
# to files only when the `TargetRubyVersion` is set to 2.3+.
# bad
module Foo
  # ...
end

# good
# frozen_string_literal: true

module Foo
  # ...
end

Example: EnforcedStyle: always

# The `always` style will always add the frozen string literal comment
# to a file, regardless of the Ruby version or if `freeze` or `<<` are
# called on a string literal.
# bad
module Bar
  # ...
end

# good
# frozen_string_literal: true

module Bar
  # ...
end

Example: EnforcedStyle: never

# The `never` will enforce that the frozen string literal comment does
# not exist in a file.
# bad
# frozen_string_literal: true

module Baz
  # ...
end

# good
module Baz
  # ...
end

Redundant return detected.
Open

    return SITE_CONFIG['email_dispatch'] == 'to' ? email.to[0] : email.from[0]
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Use 0o for octal literals.
Open

    dir.chmod(0770)
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for octal, hex, binary and decimal literals using uppercase prefixes and corrects them to lowercase prefix or no prefix (in case of decimals). eg. for octal use 0o instead of 0 or 0O.

Can be configured to use 0 only for octal literals using EnforcedOctalStyle => zero_only

Redundant return detected.
Open

    return parts.count > 0 ? parts[0].decoded.strip : ""
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Do not prefix reader method names with get_.
Open

  def get_receiving_user_from_env_setting
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop makes sure that accessor methods are named properly.

Example:

# bad
def set_attribute(value)
end

# good
def attribute=(value)
end

# bad
def get_attribute
end

# good
def attribute
end

Redundant return detected.
Open

    return text ? text.decoded.strip : nil
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

Useless assignment to variable - all_parts.
Open

    all_parts = parts.inject([]) do |set, elem|
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for every useless assignment to local variable in every scope. The basic idea for this cop was from the warning of ruby -cw:

assigned but unused variable - foo

Currently this cop has advanced logic that detects unreferenced reassignments and properly handles varied cases such as branch, loop, rescue, ensure, etc.

Example:

# bad

def some_method
  some_var = 1
  do_something
end

Example:

# good

def some_method
  some_var = 1
  do_something(some_var)
end

Use parts.count.positive? instead of parts.count > 0.
Open

    return parts.count > 0 ? parts[0].decoded.strip : ""
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for usage of comparison operators (==, >, <) to test numbers as zero, positive, or negative. These can be replaced by their respective predicate methods. The cop can also be configured to do the reverse.

The cop disregards #nonzero? as it its value is truthy or falsey, but not true and false, and thus not always interchangeable with != 0.

The cop ignores comparisons to global variables, since they are often populated with objects which can be compared with integers, but are not themselves Interger polymorphic.

Example: EnforcedStyle: predicate (default)

# bad

foo == 0
0 > foo
bar.baz > 0

# good

foo.zero?
foo.negative?
bar.baz.positive?

Example: EnforcedStyle: comparison

# bad

foo.zero?
foo.negative?
bar.baz.positive?

# good

foo == 0
0 > foo
bar.baz > 0

Redundant return detected.
Open

    return user
Severity: Minor
Found in app/models/message_gateway.rb by rubocop

This cop checks for redundant return expressions.

Example:

def test
  return something
end

def test
  one
  two
  three
  return something
end

It should be extended to handle methods whose body is if/else or a case expression with a default branch.

There are no issues that match your filters.

Category
Status