app/workers/invoice_for_project_anchor_worker.rb

Summary

Maintainability
A
2 hrs
Test Coverage
B
86%

Method has too many lines. [28/10]
Open

  def perform(project_anchor_id, year, quarter, selected_org_unit_ids = nil, options = {})
    default_options = {
      slice_size: 25
    }
    raise "no more supported : should provide an single selected_org_unit_ids " if selected_org_unit_ids.nil? || selected_org_unit_ids.size > 1

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 perform has 28 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  def perform(project_anchor_id, year, quarter, selected_org_unit_ids = nil, options = {})
    default_options = {
      slice_size: 25
    }
    raise "no more supported : should provide an single selected_org_unit_ids " if selected_org_unit_ids.nil? || selected_org_unit_ids.size > 1
Severity: Minor
Found in app/workers/invoice_for_project_anchor_worker.rb - About 1 hr to fix

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

      def perform(project_anchor_id, year, quarter, selected_org_unit_ids = nil, options = {})
        default_options = {
          slice_size: 25
        }
        raise "no more supported : should provide an single selected_org_unit_ids " if selected_org_unit_ids.nil? || selected_org_unit_ids.size > 1
    Severity: Minor
    Found in app/workers/invoice_for_project_anchor_worker.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

    Method perform has 5 arguments (exceeds 4 allowed). Consider refactoring.
    Open

      def perform(project_anchor_id, year, quarter, selected_org_unit_ids = nil, options = {})
    Severity: Minor
    Found in app/workers/invoice_for_project_anchor_worker.rb - About 35 mins to fix

      Do not write to stdout. Use Rails's logger if you want to log.
      Open

          puts "job failed #{e.message} : #{project_anchor}, #{year}Q#{quarter} #{selected_org_unit_ids}"

      This cop checks for the use of output calls like puts and print

      Example:

      # bad
      puts 'A debug message'
      pp 'A debug message'
      print 'A debug message'
      
      # good
      Rails.logger.debug 'A debug message'

      Align the elements of a hash literal if they span more than one line.
      Open

          key_suffix:  ->(project_anchor_id, _year, _quarter, _selected_org_unit_ids = nil, _options = {}) {
            per_process_id = ENV.fetch("HEROKU_DYNO_ID", $PROCESS_ID)
            [project_anchor_id, per_process_id].join("-")
          }

      Check that the keys, separators, and values of a multi-line hash literal are aligned according to configuration. The configuration options are:

      - key (left align keys, one space before hash rockets and values)
      - separator (align hash rockets and colons, right align keys)
      - table (left align keys, hash rockets, and values)

      The treatment of hashes passed as the last argument to a method call can also be configured. The options are:

      - always_inspect
      - always_ignore
      - ignore_implicit (without curly braces)

      Alternatively you can specify multiple allowed styles. That's done by passing a list of styles to EnforcedStyles.

      Example: EnforcedHashRocketStyle: key (default)

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
        :ba => baz
      }

      Example: EnforcedHashRocketStyle: separator

      # bad
      {
        :foo => bar,
        :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
         :ba => baz
      }

      Example: EnforcedHashRocketStyle: table

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      
      # good
      {
        :foo => bar,
        :ba  => baz
      }

      Example: EnforcedColonStyle: key (default)

      # bad
      {
        foo: bar,
         ba: baz
      }
      {
        foo: bar,
        ba:  baz
      }
      
      # good
      {
        foo: bar,
        ba: baz
      }

      Example: EnforcedColonStyle: separator

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
         ba: baz
      }

      Example: EnforcedColonStyle: table

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
        ba:  baz
      }

      Example: EnforcedLastArgumentHashStyle: always_inspect (default)

      # Inspect both implicit and explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
                   bar: 2)
      
      # good
      do_something(
        foo: 1,
        bar: 2
      )
      
      # good
      do_something({foo: 1,
                    bar: 2})
      
      # good
      do_something({
        foo: 1,
        bar: 2
      })

      Example: EnforcedLastArgumentHashStyle: always_ignore

      # Ignore both implicit and explicit hashes.
      
      # good
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Example: EnforcedLastArgumentHashStyle: ignore_implicit

      # Ignore only implicit hashes.
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
        bar: 2)

      Example: EnforcedLastArgumentHashStyle: ignore_explicit

      # Ignore only explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Use the lambda method for multiline lambdas.
      Open

          key_suffix:  ->(project_anchor_id, _year, _quarter, _selected_org_unit_ids = nil, _options = {}) {

      This cop (by default) checks for uses of the lambda literal syntax for single line lambdas, and the method call syntax for multiline lambdas. It is configurable to enforce one of the styles for both single line and multiline lambdas as well.

      Example: EnforcedStyle: linecountdependent (default)

      # bad
      f = lambda { |x| x }
      f = ->(x) do
            x
          end
      
      # good
      f = ->(x) { x }
      f = lambda do |x|
            x
          end

      Example: EnforcedStyle: lambda

      # bad
      f = ->(x) { x }
      f = ->(x) do
            x
          end
      
      # good
      f = lambda { |x| x }
      f = lambda do |x|
            x
          end

      Example: EnforcedStyle: literal

      # bad
      f = lambda { |x| x }
      f = lambda do |x|
            x
          end
      
      # good
      f = ->(x) { x }
      f = ->(x) do
            x
          end

      Line is too long. [143/100]
      Open

          raise "no more supported : should provide an single selected_org_unit_ids " if selected_org_unit_ids.nil? || selected_org_unit_ids.size > 1

      Line is too long. [105/100]
      Open

            project = project_anchor.projects.for_date(request.end_date_as_date) || project_anchor.latest_draft

      Align the elements of a hash literal if they span more than one line.
      Open

              sidekiq_job_ref:        jid

      Check that the keys, separators, and values of a multi-line hash literal are aligned according to configuration. The configuration options are:

      - key (left align keys, one space before hash rockets and values)
      - separator (align hash rockets and colons, right align keys)
      - table (left align keys, hash rockets, and values)

      The treatment of hashes passed as the last argument to a method call can also be configured. The options are:

      - always_inspect
      - always_ignore
      - ignore_implicit (without curly braces)

      Alternatively you can specify multiple allowed styles. That's done by passing a list of styles to EnforcedStyles.

      Example: EnforcedHashRocketStyle: key (default)

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
        :ba => baz
      }

      Example: EnforcedHashRocketStyle: separator

      # bad
      {
        :foo => bar,
        :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
         :ba => baz
      }

      Example: EnforcedHashRocketStyle: table

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      
      # good
      {
        :foo => bar,
        :ba  => baz
      }

      Example: EnforcedColonStyle: key (default)

      # bad
      {
        foo: bar,
         ba: baz
      }
      {
        foo: bar,
        ba:  baz
      }
      
      # good
      {
        foo: bar,
        ba: baz
      }

      Example: EnforcedColonStyle: separator

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
         ba: baz
      }

      Example: EnforcedColonStyle: table

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
        ba:  baz
      }

      Example: EnforcedLastArgumentHashStyle: always_inspect (default)

      # Inspect both implicit and explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
                   bar: 2)
      
      # good
      do_something(
        foo: 1,
        bar: 2
      )
      
      # good
      do_something({foo: 1,
                    bar: 2})
      
      # good
      do_something({
        foo: 1,
        bar: 2
      })

      Example: EnforcedLastArgumentHashStyle: always_ignore

      # Ignore both implicit and explicit hashes.
      
      # good
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Example: EnforcedLastArgumentHashStyle: ignore_implicit

      # Ignore only implicit hashes.
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
        bar: 2)

      Example: EnforcedLastArgumentHashStyle: ignore_explicit

      # Ignore only explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Line is too long. [102/100]
      Open

          key_suffix:  ->(project_anchor_id, _year, _quarter, _selected_org_unit_ids = nil, _options = {}) {

      Align the elements of a hash literal if they span more than one line.
      Open

              force_project_id:       nil,

      Check that the keys, separators, and values of a multi-line hash literal are aligned according to configuration. The configuration options are:

      - key (left align keys, one space before hash rockets and values)
      - separator (align hash rockets and colons, right align keys)
      - table (left align keys, hash rockets, and values)

      The treatment of hashes passed as the last argument to a method call can also be configured. The options are:

      - always_inspect
      - always_ignore
      - ignore_implicit (without curly braces)

      Alternatively you can specify multiple allowed styles. That's done by passing a list of styles to EnforcedStyles.

      Example: EnforcedHashRocketStyle: key (default)

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
        :ba => baz
      }

      Example: EnforcedHashRocketStyle: separator

      # bad
      {
        :foo => bar,
        :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
         :ba => baz
      }

      Example: EnforcedHashRocketStyle: table

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      
      # good
      {
        :foo => bar,
        :ba  => baz
      }

      Example: EnforcedColonStyle: key (default)

      # bad
      {
        foo: bar,
         ba: baz
      }
      {
        foo: bar,
        ba:  baz
      }
      
      # good
      {
        foo: bar,
        ba: baz
      }

      Example: EnforcedColonStyle: separator

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
         ba: baz
      }

      Example: EnforcedColonStyle: table

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
        ba:  baz
      }

      Example: EnforcedLastArgumentHashStyle: always_inspect (default)

      # Inspect both implicit and explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
                   bar: 2)
      
      # good
      do_something(
        foo: 1,
        bar: 2
      )
      
      # good
      do_something({foo: 1,
                    bar: 2})
      
      # good
      do_something({
        foo: 1,
        bar: 2
      })

      Example: EnforcedLastArgumentHashStyle: always_ignore

      # Ignore both implicit and explicit hashes.
      
      # good
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Example: EnforcedLastArgumentHashStyle: ignore_implicit

      # Ignore only implicit hashes.
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
        bar: 2)

      Example: EnforcedLastArgumentHashStyle: ignore_explicit

      # Ignore only explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Line is too long. [111/100]
      Open

          InvoicingJob.execute(project_anchor, "#{year}Q#{quarter}", selected_org_unit_ids&.first) do |invoicing_job|

      Align the elements of a hash literal if they span more than one line.
      Open

              invoicing_job:          invoicing_job,

      Check that the keys, separators, and values of a multi-line hash literal are aligned according to configuration. The configuration options are:

      - key (left align keys, one space before hash rockets and values)
      - separator (align hash rockets and colons, right align keys)
      - table (left align keys, hash rockets, and values)

      The treatment of hashes passed as the last argument to a method call can also be configured. The options are:

      - always_inspect
      - always_ignore
      - ignore_implicit (without curly braces)

      Alternatively you can specify multiple allowed styles. That's done by passing a list of styles to EnforcedStyles.

      Example: EnforcedHashRocketStyle: key (default)

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
        :ba => baz
      }

      Example: EnforcedHashRocketStyle: separator

      # bad
      {
        :foo => bar,
        :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
         :ba => baz
      }

      Example: EnforcedHashRocketStyle: table

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      
      # good
      {
        :foo => bar,
        :ba  => baz
      }

      Example: EnforcedColonStyle: key (default)

      # bad
      {
        foo: bar,
         ba: baz
      }
      {
        foo: bar,
        ba:  baz
      }
      
      # good
      {
        foo: bar,
        ba: baz
      }

      Example: EnforcedColonStyle: separator

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
         ba: baz
      }

      Example: EnforcedColonStyle: table

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
        ba:  baz
      }

      Example: EnforcedLastArgumentHashStyle: always_inspect (default)

      # Inspect both implicit and explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
                   bar: 2)
      
      # good
      do_something(
        foo: 1,
        bar: 2
      )
      
      # good
      do_something({foo: 1,
                    bar: 2})
      
      # good
      do_something({
        foo: 1,
        bar: 2
      })

      Example: EnforcedLastArgumentHashStyle: always_ignore

      # Ignore both implicit and explicit hashes.
      
      # good
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Example: EnforcedLastArgumentHashStyle: ignore_implicit

      # Ignore only implicit hashes.
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
        bar: 2)

      Example: EnforcedLastArgumentHashStyle: ignore_explicit

      # Ignore only explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Align the elements of a hash literal if they span more than one line.
      Open

              publish_to_dhis2:       true,

      Check that the keys, separators, and values of a multi-line hash literal are aligned according to configuration. The configuration options are:

      - key (left align keys, one space before hash rockets and values)
      - separator (align hash rockets and colons, right align keys)
      - table (left align keys, hash rockets, and values)

      The treatment of hashes passed as the last argument to a method call can also be configured. The options are:

      - always_inspect
      - always_ignore
      - ignore_implicit (without curly braces)

      Alternatively you can specify multiple allowed styles. That's done by passing a list of styles to EnforcedStyles.

      Example: EnforcedHashRocketStyle: key (default)

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
        :ba => baz
      }

      Example: EnforcedHashRocketStyle: separator

      # bad
      {
        :foo => bar,
        :ba => baz
      }
      {
        :foo => bar,
        :ba  => baz
      }
      
      # good
      {
        :foo => bar,
         :ba => baz
      }

      Example: EnforcedHashRocketStyle: table

      # bad
      {
        :foo => bar,
         :ba => baz
      }
      
      # good
      {
        :foo => bar,
        :ba  => baz
      }

      Example: EnforcedColonStyle: key (default)

      # bad
      {
        foo: bar,
         ba: baz
      }
      {
        foo: bar,
        ba:  baz
      }
      
      # good
      {
        foo: bar,
        ba: baz
      }

      Example: EnforcedColonStyle: separator

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
         ba: baz
      }

      Example: EnforcedColonStyle: table

      # bad
      {
        foo: bar,
        ba: baz
      }
      
      # good
      {
        foo: bar,
        ba:  baz
      }

      Example: EnforcedLastArgumentHashStyle: always_inspect (default)

      # Inspect both implicit and explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
                   bar: 2)
      
      # good
      do_something(
        foo: 1,
        bar: 2
      )
      
      # good
      do_something({foo: 1,
                    bar: 2})
      
      # good
      do_something({
        foo: 1,
        bar: 2
      })

      Example: EnforcedLastArgumentHashStyle: always_ignore

      # Ignore both implicit and explicit hashes.
      
      # good
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Example: EnforcedLastArgumentHashStyle: ignore_implicit

      # Ignore only implicit hashes.
      
      # bad
      do_something({foo: 1,
        bar: 2})
      
      # good
      do_something(foo: 1,
        bar: 2)

      Example: EnforcedLastArgumentHashStyle: ignore_explicit

      # Ignore only explicit hashes.
      
      # bad
      do_something(foo: 1,
        bar: 2)
      
      # good
      do_something({foo: 1,
        bar: 2})

      Use a guard clause (raise e unless e.message =~ /In equation/) instead of wrapping the code inside a conditional expression.
      Open

          if e.message =~ /In equation/

      Use a guard clause instead of wrapping the code inside a conditional expression

      Example:

      # bad
      def test
        if something
          work
        end
      end
      
      # good
      def test
        return unless something
        work
      end
      
      # also good
      def test
        work if something
      end
      
      # bad
      if something
        raise 'exception'
      else
        ok
      end
      
      # good
      raise 'exception' if something
      ok

      There are no issues that match your filters.

      Category
      Status