ClusterLabs/hawk

View on GitHub
hawk/app/controllers/simulator_controller.rb

Summary

Maintainability
C
1 day
Test Coverage

Assignment Branch Condition size for run is too high. [66.02/15]
Open

  def run
    if current_cib.id == "live"
      head :bad_request
      return
    end

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Assignment Branch Condition size for result is too high. [53.24/15]
Open

  def result
    case params[:file]
    when "info"
      send_data File.new("#{Rails.root}/tmp/sim.info").read,
                type: "text/plain", disposition: :inline

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

Method has too many lines. [59/30]
Open

  def run
    if current_cib.id == "live"
      head :bad_request
      return
    end

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 has too many lines. [49/30]
Open

  def result
    case params[:file]
    when "info"
      send_data File.new("#{Rails.root}/tmp/sim.info").read,
                type: "text/plain", disposition: :inline

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 run has a Cognitive Complexity of 22 (exceeds 5 allowed). Consider refactoring.
Open

  def run
    if current_cib.id == "live"
      head :bad_request
      return
    end
Severity: Minor
Found in hawk/app/controllers/simulator_controller.rb - About 3 hrs 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

Cyclomatic complexity for run is too high. [18/6]
Open

  def run
    if current_cib.id == "live"
      head :bad_request
      return
    end

This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

Method result has a Cognitive Complexity of 20 (exceeds 5 allowed). Consider refactoring.
Open

  def result
    case params[:file]
    when "info"
      send_data File.new("#{Rails.root}/tmp/sim.info").read,
                type: "text/plain", disposition: :inline
Severity: Minor
Found in hawk/app/controllers/simulator_controller.rb - About 2 hrs 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

Cyclomatic complexity for result is too high. [14/6]
Open

  def result
    case params[:file]
    when "info"
      send_data File.new("#{Rails.root}/tmp/sim.info").read,
                type: "text/plain", disposition: :inline

This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum. The cyclomatic complexity is the number of linearly independent paths through a method. The algorithm counts decision points and adds one.

An if statement (or unless or ?:) increases the complexity by one. An else branch does not, since it doesn't add a decision point. The && operator (or keyword and) can be converted to a nested if statement, and ||/or is shorthand for a sequence of ifs, so they also add one. Loops can be said to have an exit condition, so they add one.

Method run has 59 lines of code (exceeds 25 allowed). Consider refactoring.
Open

  def run
    if current_cib.id == "live"
      head :bad_request
      return
    end
Severity: Major
Found in hawk/app/controllers/simulator_controller.rb - About 2 hrs to fix

    Perceived complexity for run is too high. [12/7]
    Open

      def run
        if current_cib.id == "live"
          head :bad_request
          return
        end

    This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

    Example:

    def my_method                   # 1
      if cond                       # 1
        case var                    # 2 (0.8 + 4 * 0.2, rounded)
        when 1 then func_one
        when 2 then func_two
        when 3 then func_three
        when 4..10 then func_other
        end
      else                          # 1
        do_something until a && b   # 2
      end                           # ===
    end                             # 7 complexity points

    Perceived complexity for result is too high. [12/7]
    Open

      def result
        case params[:file]
        when "info"
          send_data File.new("#{Rails.root}/tmp/sim.info").read,
                    type: "text/plain", disposition: :inline

    This cop tries to produce a complexity score that's a measure of the complexity the reader experiences when looking at a method. For that reason it considers when nodes as something that doesn't add as much complexity as an if or a &&. Except if it's one of those special case/when constructs where there's no expression after case. Then the cop treats it as an if/elsif/elsif... and lets all the when nodes count. In contrast to the CyclomaticComplexity cop, this cop considers else nodes as adding complexity.

    Example:

    def my_method                   # 1
      if cond                       # 1
        case var                    # 2 (0.8 + 4 * 0.2, rounded)
        when 1 then func_one
        when 2 then func_two
        when 3 then func_three
        when 4..10 then func_other
        end
      else                          # 1
        do_something until a && b   # 2
      end                           # ===
    end                             # 7 complexity points

    Assignment Branch Condition size for intervals is too high. [19.13/15]
    Open

      def intervals
        intervals = []
        res = Primitive.find params[:id]  # RORSCAN_ITL (authz via cibadmin)
        Rails.logger.debug "#{res.ops}"
        res.ops["monitor"].each do |op|

    This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

    Method result has 49 lines of code (exceeds 25 allowed). Consider refactoring.
    Open

      def result
        case params[:file]
        when "info"
          send_data File.new("#{Rails.root}/tmp/sim.info").read,
                    type: "text/plain", disposition: :inline
    Severity: Minor
    Found in hawk/app/controllers/simulator_controller.rb - About 1 hr to fix

      Assignment Branch Condition size for sim_reload_state is too high. [16.28/15]
      Open

        def sim_reload_state
          require "tempfile"
          shadow_id = ENV["CIB_shadow"]
          ENV.delete("CIB_shadow")
          begin

      This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric

      Use =~ in places where the MatchData returned by #match will not be used.
      Open

            if f.readline().match(/^<transition_graph.*[^\/]>$/)

      This cop identifies the use of Regexp#match or String#match, which returns #<MatchData>/nil. The return value of =~ is an integral index/nil and is more performant.

      Example:

      # bad
      do_something if str.match(/regex/)
      while regex.match('str')
        do_something
      end
      
      # good
      method(str =~ /regex/)
      return value unless regex =~ 'str'

      Use one level of indentation for parameters following the first line of a multi-line method call.
      Open

                      "-G", "#{Rails.root}/tmp/sim.graph",

      Here we check if the parameters on a multi-line method call or definition are aligned.

      Example: EnforcedStyle: withfirstparameter (default)

      # good
      
      foo :bar,
          :baz
      
      # bad
      
      foo :bar,
        :baz

      Example: EnforcedStyle: withfixedindentation

      # good
      
      foo :bar,
        :baz
      
      # bad
      
      foo :bar,
          :baz

      Use %r around regular expression.
      Open

            if f.readline().match(/^<transition_graph.*[^\/]>$/)

      This cop enforces using // or %r around regular expressions.

      Example: EnforcedStyle: slashes (default)

      # bad
      snake_case = %r{^[\dA-Z_]+$}
      
      # bad
      regex = %r{
        foo
        (bar)
        (baz)
      }x
      
      # good
      snake_case = /^[\dA-Z_]+$/
      
      # good
      regex = /
        foo
        (bar)
        (baz)
      /x

      Example: EnforcedStyle: percent_r

      # bad
      snake_case = /^[\dA-Z_]+$/
      
      # bad
      regex = /
        foo
        (bar)
        (baz)
      /x
      
      # good
      snake_case = %r{^[\dA-Z_]+$}
      
      # good
      regex = %r{
        foo
        (bar)
        (baz)
      }x

      Example: EnforcedStyle: mixed

      # bad
      snake_case = %r{^[\dA-Z_]+$}
      
      # bad
      regex = /
        foo
        (bar)
        (baz)
      /x
      
      # good
      snake_case = /^[\dA-Z_]+$/
      
      # good
      regex = %r{
        foo
        (bar)
        (baz)
      }x

      Example: AllowInnerSlashes: false (default)

      # If `false`, the cop will always recommend using `%r` if one or more
      # slashes are found in the regexp string.
      
      # bad
      x =~ /home\//
      
      # good
      x =~ %r{home/}

      Example: AllowInnerSlashes: true

      # good
      x =~ /home\//

      Use one level of indentation for parameters following the first line of a multi-line method call.
      Open

                      "-D", "#{Rails.root}/tmp/sim.dot",

      Here we check if the parameters on a multi-line method call or definition are aligned.

      Example: EnforcedStyle: withfirstparameter (default)

      # good
      
      foo :bar,
          :baz
      
      # bad
      
      foo :bar,
        :baz

      Example: EnforcedStyle: withfixedindentation

      # good
      
      foo :bar,
        :baz
      
      # bad
      
      foo :bar,
          :baz

      Extra empty line detected at class body end.
      Open

      
      end

      This cops checks if empty lines around the bodies of classes match the configuration.

      Example: EnforcedStyle: empty_lines

      # good
      
      class Foo
      
        def bar
          # ...
        end
      
      end

      Example: EnforcedStyle: emptylinesexcept_namespace

      # good
      
      class Foo
        class Bar
      
          # ...
      
        end
      end

      Example: EnforcedStyle: emptylinesspecial

      # good
      class Foo
      
        def bar; end
      
      end

      Example: EnforcedStyle: noemptylines (default)

      # good
      
      class Foo
        def bar
          # ...
        end
      end

      Do not use parentheses for method calls with no arguments.
      Open

            if f.readline().match(/^<transition_graph.*[^\/]>$/)

      This cop checks for unwanted parentheses in parameterless method calls.

      Example:

      # bad
      object.some_method()
      
      # good
      object.some_method

      Prefer to_s over string interpolation.
      Open

          Rails.logger.debug "#{res.ops}"

      This cop checks for strings that are just an interpolated expression.

      Example:

      # bad
      "#{@var}"
      
      # good
      @var.to_s
      
      # good if @var is already a String
      @var

      Avoid rescuing the Exception class. Perhaps you meant to rescue StandardError?
      Open

          rescue Exception
            # TODO(could): actually handle potential failure of crm_simulate run
            render json: { error: "Could not read graph" }, status: 500

      This cop checks for rescue blocks targeting the Exception class.

      Example:

      # bad
      
      begin
        do_something
      rescue Exception
        handle_exception
      end

      Example:

      # good
      
      begin
        do_something
      rescue ArgumentError
        handle_exception
      end

      Use one level of indentation for parameters following the first line of a multi-line method call.
      Open

                      *injections)

      Here we check if the parameters on a multi-line method call or definition are aligned.

      Example: EnforcedStyle: withfirstparameter (default)

      # good
      
      foo :bar,
          :baz
      
      # bad
      
      foo :bar,
        :baz

      Example: EnforcedStyle: withfixedindentation

      # good
      
      foo :bar,
        :baz
      
      # bad
      
      foo :bar,
          :baz

      Use one level of indentation for parameters following the first line of a multi-line method call.
      Open

                      type: "text/plain", disposition: :inline

      Here we check if the parameters on a multi-line method call or definition are aligned.

      Example: EnforcedStyle: withfirstparameter (default)

      # good
      
      foo :bar,
          :baz
      
      # bad
      
      foo :bar,
        :baz

      Example: EnforcedStyle: withfixedindentation

      # good
      
      foo :bar,
        :baz
      
      # bad
      
      foo :bar,
          :baz

      Indent the first parameter one step more than the start of the previous line.
      Open

                      "-S", "-L",

      This cop checks the indentation of the first parameter in a method call. Parameters after the first one are checked by Style/AlignParameters, not by this cop.

      Example:

      # bad
      some_method(
      first_param,
      second_param)
      
      # good
      some_method(
        first_param,
      second_param)

      Use one level of indentation for parameters following the first line of a multi-line method call.
      Open

                      "-S", "-L",

      Here we check if the parameters on a multi-line method call or definition are aligned.

      Example: EnforcedStyle: withfirstparameter (default)

      # good
      
      foo :bar,
          :baz
      
      # bad
      
      foo :bar,
        :baz

      Example: EnforcedStyle: withfixedindentation

      # good
      
      foo :bar,
        :baz
      
      # bad
      
      foo :bar,
          :baz

      Favor a normal if-statement over a modifier clause in a multiline statement.
      Open

          params[:injections].each do |i|
            parts = i.split(/\s+/)
            case parts[0]
            when "node"
              case parts[2]

      Checks for uses of if/unless modifiers with multiple-lines bodies.

      Example:

      # bad
      {
        result: 'this should not happen'
      } unless cond
      
      # good
      { result: 'ok' } if cond

      Use 0o for octal literals.
      Open

            File.chmod(0666, tmpfile.path)

      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

      Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
      Open

                      *injections)

      This cop checks that the closing brace in a method call is either on the same line as the last method argument, or a new line.

      When using the symmetrical (default) style:

      If a method call's opening brace is on the same line as the first argument of the call, then the closing brace should be on the same line as the last argument of the call.

      If an method call's opening brace is on the line above the first argument of the call, then the closing brace should be on the line below the last argument of the call.

      When using the new_line style:

      The closing brace of a multi-line method call must be on the line after the last argument of the call.

      When using the same_line style:

      The closing brace of a multi-line method call must be on the same line as the last argument of the call.

      Example:

      # symmetrical: bad
        # new_line: good
        # same_line: bad
        foo(a,
          b
        )
      
        # symmetrical: bad
        # new_line: bad
        # same_line: good
        foo(
          a,
          b)
      
        # symmetrical: good
        # new_line: bad
        # same_line: good
        foo(a,
          b)
      
        # symmetrical: good
        # new_line: good
        # same_line: bad
        foo(
          a,
          b
        )

      Favor a normal if-statement over a modifier clause in a multiline statement.
      Open

          res.ops["monitor"].each do |op|
            Rails.logger.debug "#{params[:id]}, #{op}"
            intervals << Util.crm_get_msec(op["interval"])
          end if res.ops.key?("monitor")

      Checks for uses of if/unless modifiers with multiple-lines bodies.

      Example:

      # bad
      {
        result: 'this should not happen'
      } unless cond
      
      # good
      { result: 'ok' } if cond

      Unnecessary spacing detected.
      Open

          res = Primitive.find params[:id]  # RORSCAN_ITL (authz via cibadmin)

      This cop checks for extra/unnecessary whitespace.

      Example:

      # good if AllowForAlignment is true
      name      = "RuboCop"
      # Some comment and an empty line
      
      website  += "/bbatsov/rubocop" unless cond
      puts        "rubocop"          if     debug
      
      # bad for any configuration
      set_app("RuboCop")
      website  = "https://github.com/bbatsov/rubocop"

      There are no issues that match your filters.

      Category
      Status