SpeciesFileGroup/taxonworks

View on GitHub
app/models/observation.rb

Summary

Maintainability
A
1 hr
Test Coverage

Method has too many lines. [27/25]
Open

  def self.code_column(observation_matrix_column_id, observation_params)
    c = ObservationMatrixColumn.find(observation_matrix_column_id)
    o = ObservationMatrix.find(c.observation_matrix_id)

    descriptor = c.descriptor
Severity: Minor
Found in app/models/observation.rb by rubocop

This cop checks if the length of a method exceeds some maximum value. Comment lines can optionally be ignored. The maximum allowed length is configurable.

Method code_column has 27 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  def self.code_column(observation_matrix_column_id, observation_params)
    c = ObservationMatrixColumn.find(observation_matrix_column_id)
    o = ObservationMatrix.find(c.observation_matrix_id)

    descriptor = c.descriptor
Severity: Minor
Found in app/models/observation.rb - About 1 hr to fix

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

      def self.code_column(observation_matrix_column_id, observation_params)
        c = ObservationMatrixColumn.find(observation_matrix_column_id)
        o = ObservationMatrix.find(c.observation_matrix_id)
    
        descriptor = c.descriptor
    Severity: Minor
    Found in app/models/observation.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

    Use update! instead of update if the return value is not checked.
    Open

              d.update(observation_object_global_id: new_global_id)
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop identifies possible cases where Active Record save! or related should be used instead of save because the model might have failed to save and an exception is better than unhandled failure.

    This will allow: - update or save calls, assigned to a variable, or used as a condition in an if/unless/case statement. - create calls, assigned to a variable that then has a call to persisted?. - calls if the result is explicitly returned from methods and blocks, or provided as arguments. - calls whose signature doesn't look like an ActiveRecord persistence method.

    By default it will also allow implicit returns from methods and blocks. that behavior can be turned off with AllowImplicitReturn: false.

    You can permit receivers that are giving false positives with AllowedReceivers: []

    Example:

    # bad
    user.save
    user.update(name: 'Joe')
    user.find_or_create_by(name: 'Joe')
    user.destroy
    
    # good
    unless user.save
      # ...
    end
    user.save!
    user.update!(name: 'Joe')
    user.find_or_create_by!(name: 'Joe')
    user.destroy!
    
    user = User.find_or_create_by(name: 'Joe')
    unless user.persisted?
      # ...
    end
    
    def save_user
      return user.save
    end

    Example: AllowImplicitReturn: true (default)

    # good
    users.each { |u| u.save }
    
    def save_user
      user.save
    end

    Example: AllowImplicitReturn: false

    # bad
    users.each { |u| u.save }
    def save_user
      user.save
    end
    
    # good
    users.each { |u| u.save! }
    
    def save_user
      user.save!
    end
    
    def save_user
      return user.save
    end

    Example: AllowedReceivers: ['merchant.customers', 'Service::Mailer']

    # bad
    merchant.create
    customers.builder.save
    Mailer.create
    
    module Service::Mailer
      self.create
    end
    
    # good
    merchant.customers.create
    MerchantService.merchant.customers.destroy
    Service::Mailer.update(message: 'Message')
    ::Service::Mailer.update
    Services::Service::Mailer.update(message: 'Message')
    Service::Mailer::update

    Use update! instead of update if the return value is not checked.
    Open

                j.update(depiction_object: d)
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop identifies possible cases where Active Record save! or related should be used instead of save because the model might have failed to save and an exception is better than unhandled failure.

    This will allow: - update or save calls, assigned to a variable, or used as a condition in an if/unless/case statement. - create calls, assigned to a variable that then has a call to persisted?. - calls if the result is explicitly returned from methods and blocks, or provided as arguments. - calls whose signature doesn't look like an ActiveRecord persistence method.

    By default it will also allow implicit returns from methods and blocks. that behavior can be turned off with AllowImplicitReturn: false.

    You can permit receivers that are giving false positives with AllowedReceivers: []

    Example:

    # bad
    user.save
    user.update(name: 'Joe')
    user.find_or_create_by(name: 'Joe')
    user.destroy
    
    # good
    unless user.save
      # ...
    end
    user.save!
    user.update!(name: 'Joe')
    user.find_or_create_by!(name: 'Joe')
    user.destroy!
    
    user = User.find_or_create_by(name: 'Joe')
    unless user.persisted?
      # ...
    end
    
    def save_user
      return user.save
    end

    Example: AllowImplicitReturn: true (default)

    # good
    users.each { |u| u.save }
    
    def save_user
      user.save
    end

    Example: AllowImplicitReturn: false

    # bad
    users.each { |u| u.save }
    def save_user
      user.save
    end
    
    # good
    users.each { |u| u.save! }
    
    def save_user
      user.save!
    end
    
    def save_user
      return user.save
    end

    Example: AllowedReceivers: ['merchant.customers', 'Service::Mailer']

    # bad
    merchant.create
    customers.builder.save
    Mailer.create
    
    module Service::Mailer
      self.create
    end
    
    # good
    merchant.customers.create
    MerchantService.merchant.customers.destroy
    Service::Mailer.update(message: 'Message')
    ::Service::Mailer.update
    Services::Service::Mailer.update(message: 'Message')
    Service::Mailer::update

    TODO found
    Open

      # TODO: deprecate or remove
    Severity: Minor
    Found in app/models/observation.rb by fixme

    TODO found
    Open

      # TODO: this is not memoized correctly ?!
    Severity: Minor
    Found in app/models/observation.rb by fixme

    Prefer the new style validations validates :column, presence: value over validates_presence_of.
    Open

      validates_presence_of :observation_object
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop checks for the use of old-style attribute validation macros.

    Example:

    # bad
    validates_acceptance_of :foo
    validates_confirmation_of :foo
    validates_exclusion_of :foo
    validates_format_of :foo
    validates_inclusion_of :foo
    validates_length_of :foo
    validates_numericality_of :foo
    validates_presence_of :foo
    validates_absence_of :foo
    validates_size_of :foo
    validates_uniqueness_of :foo
    
    # good
    validates :foo, acceptance: true
    validates :foo, confirmation: true
    validates :foo, exclusion: true
    validates :foo, format: true
    validates :foo, inclusion: true
    validates :foo, length: true
    validates :foo, numericality: true
    validates :foo, presence: true
    validates :foo, absence: true
    validates :foo, size: true
    validates :foo, uniqueness: true

    Do not use Time.now without zone. Use one of Time.zone.now, Time.current, Time.now.in_time_zone, Time.now.utc, Time.now.getlocal, Time.now.xmlschema, Time.now.iso8601, Time.now.jisx0301, Time.now.rfc3339, Time.now.httpdate, Time.now.to_i, Time.now.to_f instead.
    Open

      validates :year_made, date_year: { min_year: 1757, max_year: -> {Time.now.year} }
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop checks for the use of Time methods without zone.

    Built on top of Ruby on Rails style guide (https://github.com/rubocop-hq/rails-style-guide#time) and the article http://danilenko.org/2012/7/6/rails_timezones/

    Two styles are supported for this cop. When EnforcedStyle is 'strict' then only use of Time.zone is allowed.

    When EnforcedStyle is 'flexible' then it's also allowed to use Time.intimezone.

    Example: EnforcedStyle: strict

    # `strict` means that `Time` should be used with `zone`.
    
    # bad
    Time.now
    Time.parse('2015-03-02 19:05:37')
    
    # bad
    Time.current
    Time.at(timestamp).in_time_zone
    
    # good
    Time.zone.now
    Time.zone.parse('2015-03-02 19:05:37')

    Example: EnforcedStyle: flexible (default)

    # `flexible` allows usage of `in_time_zone` instead of `zone`.
    
    # bad
    Time.now
    Time.parse('2015-03-02 19:05:37')
    
    # good
    Time.zone.now
    Time.zone.parse('2015-03-02 19:05:37')
    
    # good
    Time.current
    Time.at(timestamp).in_time_zone

    Prefer the new style validations validates :column, presence: value over validates_presence_of.
    Open

      validates_presence_of :type # not required, it's STI
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop checks for the use of old-style attribute validation macros.

    Example:

    # bad
    validates_acceptance_of :foo
    validates_confirmation_of :foo
    validates_exclusion_of :foo
    validates_format_of :foo
    validates_inclusion_of :foo
    validates_length_of :foo
    validates_numericality_of :foo
    validates_presence_of :foo
    validates_absence_of :foo
    validates_size_of :foo
    validates_uniqueness_of :foo
    
    # good
    validates :foo, acceptance: true
    validates :foo, confirmation: true
    validates :foo, exclusion: true
    validates :foo, format: true
    validates :foo, inclusion: true
    validates :foo, length: true
    validates :foo, numericality: true
    validates :foo, presence: true
    validates :foo, absence: true
    validates :foo, size: true
    validates :foo, uniqueness: true

    Prefer the new style validations validates :column, presence: value over validates_presence_of.
    Open

      validates_presence_of :descriptor_id # should be :descriptor
    Severity: Minor
    Found in app/models/observation.rb by rubocop

    This cop checks for the use of old-style attribute validation macros.

    Example:

    # bad
    validates_acceptance_of :foo
    validates_confirmation_of :foo
    validates_exclusion_of :foo
    validates_format_of :foo
    validates_inclusion_of :foo
    validates_length_of :foo
    validates_numericality_of :foo
    validates_presence_of :foo
    validates_absence_of :foo
    validates_size_of :foo
    validates_uniqueness_of :foo
    
    # good
    validates :foo, acceptance: true
    validates :foo, confirmation: true
    validates :foo, exclusion: true
    validates :foo, format: true
    validates :foo, inclusion: true
    validates :foo, length: true
    validates :foo, numericality: true
    validates :foo, presence: true
    validates :foo, absence: true
    validates :foo, size: true
    validates :foo, uniqueness: true

    There are no issues that match your filters.

    Category
    Status