Module: RuboCop::SortedMethodsByCall::Compare

Defined in:
lib/rubocop/sorted_methods_by_call/compare.rb

Overview

RuboCop::SortedMethodsByCall::Compare provides helpers to compare definition orders and call orders using “ordered subsequence” semantics. It’s used by the cop to check that called methods appear in the same relative order as they are defined (not necessarily contiguously).

Class Method Summary collapse

Class Method Details

.hashes_ordered_equal?(actual, expected) ⇒ Boolean

Check that each scope’s call list is an ordered subsequence of its definition list.

Parameters:

  • actual (Hash<Object, Array<Symbol>>)

    Per-scope definition method names.

  • expected (Hash<Object, Array<Symbol>>)

    Per-scope called method names.

Returns:

  • (Boolean)


16
17
18
19
20
21
22
23
24
# File 'lib/rubocop/sorted_methods_by_call/compare.rb', line 16

def hashes_ordered_equal?(actual, expected)
  return false unless actual.is_a?(Hash) && expected.is_a?(Hash)

  (actual.keys | expected.keys).all? do |k|
    defs = Array(actual[k])
    calls = Array(expected[k])
    (calls - defs).empty? && subsequence?(defs, calls)
  end
end

.subsequence?(arr, sub) ⇒ Boolean

Check if sub appears as an ordered (not necessarily contiguous) subsequence of arr.

Parameters:

  • arr (Array<Symbol>)

    The full sequence to search within.

  • sub (Array<Symbol>)

    The subsequence to search for.

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
39
# File 'lib/rubocop/sorted_methods_by_call/compare.rb', line 31

def subsequence?(arr, sub)
  return true if sub.nil? || sub.empty?

  i = 0
  sub.all? do |el|
    i += 1 while i < arr.length && arr[i] != el
    (i < arr.length).tap { i += 1 }
  end
end