grempe/tss-rb

View on GitHub
lib/tss/combiner.rb

Summary

Maintainability
B
5 hrs
Test Coverage

Method combine has a Cognitive Complexity of 15 (exceeds 5 allowed). Consider refactoring.
Open

    def combine
      # unwrap 'human' shares into binary shares
      if all_shares_appear_human?(shares)
        @shares = convert_shares_human_to_binary(shares)
      end
Severity: Minor
Found in lib/tss/combiner.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 combine has 40 lines of code (exceeds 25 allowed). Consider refactoring.
Open

    def combine
      # unwrap 'human' shares into binary shares
      if all_shares_appear_human?(shares)
        @shares = convert_shares_human_to_binary(shares)
      end
Severity: Minor
Found in lib/tss/combiner.rb - About 1 hr to fix

    Method extract_secret_from_shares! has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.
    Open

        def extract_secret_from_shares!(hash_id, shares_bytes)
          secret = []
    
          # build up an Array of index values from each share
          # u[i] equal to the first octet of the ith share
    Severity: Minor
    Found in lib/tss/combiner.rb - About 55 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 convert_shares_human_to_binary has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
    Open

        def convert_shares_human_to_binary(shares)
          shares.map do |s|
            s_b64 = s.match(Util::HUMAN_SHARE_RE)
            if s_b64.present? && s_b64.to_a[1].present?
              begin
    Severity: Minor
    Found in lib/tss/combiner.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 shares_bytes_have_valid_indexes! has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
    Open

        def shares_bytes_have_valid_indexes!(shares_bytes)
          u = shares_bytes.map do |s|
            raise TSS::ArgumentError, 'invalid shares, no index' if s[0].blank?
            raise TSS::ArgumentError, 'invalid shares, zero index' if s[0] == 0
            s[0]
    Severity: Minor
    Found in lib/tss/combiner.rb - About 25 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

    Don't use parentheses around a literal.
    Open

        Contract C::None => ({ :hash => C::Maybe[String], :hash_alg => C::HashAlgArg, :identifier => C::IdentifierArg, :process_time => C::Num, :secret => C::SecretArg, :threshold => C::ThresholdArg})
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    This cop checks for redundant parentheses.

    Example:

    # bad
    (x) if ((y.z).nil?)
    
    # good
    x if y.z.nil?

    Don't use parentheses around a literal.
    Open

        Contract C::Int, C::ArrayOf[C::ArrayOf[C::Num]] => ({ :secret => C::ArrayOf[C::Num], :hash => C::Maybe[String], :hash_alg => C::HashAlgArg })
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    This cop checks for redundant parentheses.

    Example:

    # bad
    (x) if ((y.z).nil?)
    
    # good
    x if y.z.nil?

    Use (s[0]).zero? instead of s[0] == 0.
    Open

            raise TSS::ArgumentError, 'invalid shares, zero index' if s[0] == 0
    Severity: Minor
    Found in lib/tss/combiner.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

    Use safe navigation (&.) instead of checking if an object exists before calling the method.
    Open

            bytestring.unpack('C*') unless bytestring.nil?
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    This cop transforms usages of a method call safeguarded by a non nil check for the variable whose method is being called to safe navigation (&.).

    Configuration option: ConvertCodeThatCanStartToReturnNil The default for this is false. When configured to true, this will check for code in the format !foo.nil? && foo.bar. As it is written, the return of this code is limited to false and whatever the return of the method is. If this is converted to safe navigation, foo&.bar can start returning nil as well as what the method returns.

    Example:

    # bad
    foo.bar if foo
    foo.bar(param1, param2) if foo
    foo.bar { |e| e.something } if foo
    foo.bar(param) { |e| e.something } if foo
    
    foo.bar if !foo.nil?
    foo.bar unless !foo
    foo.bar unless foo.nil?
    
    foo && foo.bar
    foo && foo.bar(param1, param2)
    foo && foo.bar { |e| e.something }
    foo && foo.bar(param) { |e| e.something }
    
    # good
    foo&.bar
    foo&.bar(param1, param2)
    foo&.bar { |e| e.something }
    foo&.bar(param) { |e| e.something }
    
    foo.nil? || foo.bar
    !foo || foo.bar
    
    # Methods that `nil` will `respond_to?` should not be converted to
    # use safe navigation
    foo.to_i if foo

    Missing magic comment # frozen_string_literal: true.
    Open

    module TSS
    Severity: Minor
    Found in lib/tss/combiner.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

    (...) interpreted as grouped expression.
    Open

        Contract ({ :shares => C::ArrayOfShares, :select_by => C::Maybe[C::SelectByArg], :padding => C::Maybe[C::Bool] }) => C::Any
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    Checks for space between the name of a called method and a left parenthesis.

    Example:

    # bad
    
    puts (x + y)

    Example:

    # good
    
    puts(x + y)

    Convert if nested inside else to elsif.
    Open

            secret = Util.unpad(secret) if padding
    Severity: Minor
    Found in lib/tss/combiner.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

    Don't use parentheses around a literal.
    Open

          unless Contract.valid?(fh, ({ :identifier => String, :hash_id => C::Int, :threshold => C::Int, :share_len => C::Int }))
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    This cop checks for redundant parentheses.

    Example:

    # bad
    (x) if ((y.z).nil?)
    
    # good
    x if y.z.nil?

    Don't use parentheses around a literal.
    Open

        Contract ({ :shares => C::ArrayOfShares, :select_by => C::Maybe[C::SelectByArg], :padding => C::Maybe[C::Bool] }) => C::Any
    Severity: Minor
    Found in lib/tss/combiner.rb by rubocop

    This cop checks for redundant parentheses.

    Example:

    # bad
    (x) if ((y.z).nil?)
    
    # good
    x if y.z.nil?

    There are no issues that match your filters.

    Category
    Status