ManageIQ/ovirt

View on GitHub
lib/ovirt/service.rb

Summary

Maintainability
D
2 days
Test Coverage
D
68%

Class Service has 58 methods (exceeds 20 allowed). Consider refactoring.
Open

  class Service
    include Logging

    DEFAULT_OPTIONS  = {}
    REQUIRED_OPTIONS = [:server, :username, :password]
Severity: Major
Found in lib/ovirt/service.rb - About 1 day to fix

    File service.rb has 371 lines of code (exceeds 250 allowed). Consider refactoring.
    Open

    require 'nokogiri'
    require 'openssl'
    require 'rest-client'
    require 'tempfile'
    require 'uri'
    Severity: Minor
    Found in lib/ovirt/service.rb - About 4 hrs to fix

      Method resource_verb has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.
      Open

          def resource_verb(path, verb, *args)
            log_header = "#{self.class.name}#resource_#{verb}"
            resource   = create_resource(path)
            logger.info "#{log_header}: Sending URL: <#{resource.url}>"
            logger.debug "#{log_header}: With args: <#{args.inspect}>"
      Severity: Minor
      Found in lib/ovirt/service.rb - About 1 hr 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 api_uri has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.
      Open

          def api_uri(path = nil)
            # Calculate the complete URI:
            uri = URI.join(base_uri, api_path).to_s
      
            # The path passed to this method will have the "/api" prefix if it comes from the "ems_ref"
      Severity: Minor
      Found in lib/ovirt/service.rb - About 1 hr 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 resource_verb has 26 lines of code (exceeds 25 allowed). Consider refactoring.
      Open

          def resource_verb(path, verb, *args)
            log_header = "#{self.class.name}#resource_#{verb}"
            resource   = create_resource(path)
            logger.info "#{log_header}: Sending URL: <#{resource.url}>"
            logger.debug "#{log_header}: With args: <#{args.inspect}>"
      Severity: Minor
      Found in lib/ovirt/service.rb - About 1 hr to fix

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

            def probe_api_path(uri, path)
              uri = URI.join(uri, path)
              request = RestClient::Resource.new(uri.to_s, :verify_ssl => OpenSSL::SSL::VERIFY_NONE)
              begin
                request.get
        Severity: Minor
        Found in lib/ovirt/service.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 standard_collection has 5 arguments (exceeds 4 allowed). Consider refactoring.
        Open

            def standard_collection(uri_suffix, element_name = nil, paginate = false, sort_by = :name, direction = :asc)
        Severity: Minor
        Found in lib/ovirt/service.rb - About 35 mins to fix

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

              def resource_options
                headers = merge_headers(
                  'Version' => '3',
                  'Prefer'  => 'persistent-auth',
                )
          Severity: Minor
          Found in lib/ovirt/service.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

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

              def paginate_resource_get(path = nil, sort_by = :name, direction = :asc)
                log_header = "#{self.class.name}#paginate_resource_get"
                page       = 1
                full_xml   = nil
                loop do
          Severity: Minor
          Found in lib/ovirt/service.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

          Method has too many optional parameters. [4/3]
          Open

              def standard_collection(uri_suffix, element_name = nil, paginate = false, sort_by = :name, direction = :asc)
                if paginate
                  doc = paginate_resource_get(uri_suffix, sort_by, direction)
                else
                  xml = resource_get(uri_suffix)
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          Checks for methods with too many parameters.

          The maximum number of parameters is configurable. Keyword arguments can optionally be excluded from the total count, as they add less complexity than positional or optional parameters.

          Any number of arguments for initialize method inside a block of Struct.new and Data.define like this is always allowed:

          Struct.new(:one, :two, :three, :four, :five, keyword_init: true) do
            def initialize(one:, two:, three:, four:, five:)
            end
          end

          This is because checking the number of arguments of the initialize method does not make sense.

          NOTE: Explicit block argument &block is not counted to prevent erroneous change that is avoided by making block argument implicit.

          Example: Max: 3

          # good
          def foo(a, b, c = 1)
          end

          Example: Max: 2

          # bad
          def foo(a, b, c = 1)
          end

          Example: CountKeywordArgs: true (default)

          # counts keyword args towards the maximum
          
          # bad (assuming Max is 3)
          def foo(a, b, c, d: 1)
          end
          
          # good (assuming Max is 3)
          def foo(a, b, c: 1)
          end

          Example: CountKeywordArgs: false

          # don't count keyword args towards the maximum
          
          # good (assuming Max is 3)
          def foo(a, b, c, d: 1)
          end

          This cop also checks for the maximum number of optional parameters. This can be configured using the MaxOptionalParameters config option.

          Example: MaxOptionalParameters: 3 (default)

          # good
          def foo(a = 1, b = 2, c = 3)
          end

          Example: MaxOptionalParameters: 2

          # bad
          def foo(a = 1, b = 2, c = 3)
          end

          Use match? instead of =~ when MatchData is not used.
          Open

                    if www_authenticate =~ /^Basic realm="?(RESTAPI|ENGINE)"?$/
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          In Ruby 2.4, String#match?, Regexp#match? and Symbol#match? have been added. The methods are faster than match. Because the methods avoid creating a MatchData object or saving backref. So, when MatchData is not used, use match? instead of match.

          Example:

          # bad
          def foo
            if x =~ /re/
              do_something
            end
          end
          
          # bad
          def foo
            if x.match(/re/)
              do_something
            end
          end
          
          # bad
          def foo
            if /re/ === x
              do_something
            end
          end
          
          # good
          def foo
            if x.match?(/re/)
              do_something
            end
          end
          
          # good
          def foo
            if x =~ /re/
              do_something(Regexp.last_match)
            end
          end
          
          # good
          def foo
            if x.match(/re/)
              do_something($~)
            end
          end
          
          # good
          def foo
            if /re/ === x
              do_something($~)
            end
          end

          Do not suppress exceptions.
          Open

              rescue OpenSSL::X509::CertificateError
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          Checks for rescue blocks with no body.

          Example:

          # bad
          def some_method
            do_something
          rescue
          end
          
          # bad
          begin
            do_something
          rescue
          end
          
          # good
          def some_method
            do_something
          rescue
            handle_exception
          end
          
          # good
          begin
            do_something
          rescue
            handle_exception
          end

          Example: AllowComments: true (default)

          # good
          def some_method
            do_something
          rescue
            # do nothing
          end
          
          # good
          begin
            do_something
          rescue
            # do nothing
          end

          Example: AllowComments: false

          # bad
          def some_method
            do_something
          rescue
            # do nothing
          end
          
          # bad
          begin
            do_something
          rescue
            # do nothing
          end

          Example: AllowNil: true (default)

          # good
          def some_method
            do_something
          rescue
            nil
          end
          
          # good
          begin
            do_something
          rescue
            # do nothing
          end
          
          # good
          do_something rescue nil

          Example: AllowNil: false

          # bad
          def some_method
            do_something
          rescue
            nil
          end
          
          # bad
          begin
            do_something
          rescue
            nil
          end
          
          # bad
          do_something rescue nil

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

              rescue Exception => e
                logger.error("#{log_header}: class = #{e.class.name}, message=#{e.message}, URI=#{resource ? resource.url : path}")
                raise
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          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

          Do not suppress exceptions.
          Open

              rescue RestClient::ResourceNotFound
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          Checks for rescue blocks with no body.

          Example:

          # bad
          def some_method
            do_something
          rescue
          end
          
          # bad
          begin
            do_something
          rescue
          end
          
          # good
          def some_method
            do_something
          rescue
            handle_exception
          end
          
          # good
          begin
            do_something
          rescue
            handle_exception
          end

          Example: AllowComments: true (default)

          # good
          def some_method
            do_something
          rescue
            # do nothing
          end
          
          # good
          begin
            do_something
          rescue
            # do nothing
          end

          Example: AllowComments: false

          # bad
          def some_method
            do_something
          rescue
            # do nothing
          end
          
          # bad
          begin
            do_something
          rescue
            # do nothing
          end

          Example: AllowNil: true (default)

          # good
          def some_method
            do_something
          rescue
            nil
          end
          
          # good
          begin
            do_something
          rescue
            # do nothing
          end
          
          # good
          do_something rescue nil

          Example: AllowNil: false

          # bad
          def some_method
            do_something
          rescue
            nil
          end
          
          # bad
          begin
            do_something
          rescue
            nil
          end
          
          # bad
          do_something rescue nil

          Unused block argument - request. If it's necessary, use _ or _request as an argument name to indicate that it won't be used.
          Open

                resource.send(verb, *args) do |response, request, result, &block|
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          Checks for unused block arguments.

          Example:

          # bad
          do_something do |used, unused|
            puts used
          end
          
          do_something do |bar|
            puts :foo
          end
          
          define_method(:foo) do |bar|
            puts :baz
          end
          
          # good
          do_something do |used, _unused|
            puts used
          end
          
          do_something do
            puts :foo
          end
          
          define_method(:foo) do |_bar|
            puts :baz
          end

          Example: IgnoreEmptyBlocks: true (default)

          # good
          do_something { |unused| }

          Example: IgnoreEmptyBlocks: false

          # bad
          do_something { |unused| }

          Example: AllowUnusedKeywordArguments: false (default)

          # bad
          do_something do |unused: 42|
            foo
          end

          Example: AllowUnusedKeywordArguments: true

          # good
          do_something do |unused: 42|
            foo
          end

          Unused block argument - result. If it's necessary, use _ or _result as an argument name to indicate that it won't be used.
          Open

                resource.send(verb, *args) do |response, request, result, &block|
          Severity: Minor
          Found in lib/ovirt/service.rb by rubocop

          Checks for unused block arguments.

          Example:

          # bad
          do_something do |used, unused|
            puts used
          end
          
          do_something do |bar|
            puts :foo
          end
          
          define_method(:foo) do |bar|
            puts :baz
          end
          
          # good
          do_something do |used, _unused|
            puts used
          end
          
          do_something do
            puts :foo
          end
          
          define_method(:foo) do |_bar|
            puts :baz
          end

          Example: IgnoreEmptyBlocks: true (default)

          # good
          do_something { |unused| }

          Example: IgnoreEmptyBlocks: false

          # bad
          do_something { |unused| }

          Example: AllowUnusedKeywordArguments: false (default)

          # bad
          do_something do |unused: 42|
            foo
          end

          Example: AllowUnusedKeywordArguments: true

          # good
          do_something do |unused: 42|
            foo
          end

          There are no issues that match your filters.

          Category
          Status