class RuboCop::Cop::RSpec::SortMetadata


it ‘works’, :a, :b, baz: true, foo: ‘bar’
context ‘Something’, baz: true, foo: ‘bar’
describe ‘Something’, :a, :b
# good
it ‘works’, :b, :a, foo: ‘bar’, baz: true
context ‘Something’, foo: ‘bar’, baz: true
describe ‘Something’, :b, :a
# bad
@example
Sort RSpec metadata alphabetically.

def crime_scene(symbols, pairs)

def crime_scene(symbols, pairs)
  metadata = symbols + pairs
  range_between(
    metadata.first.loc.expression.begin_pos,
    metadata.last.loc.expression.end_pos
  )
end

def on_metadata(symbols, pairs)

def on_metadata(symbols, pairs)
  return if sorted?(symbols, pairs)
  crime_scene = crime_scene(symbols, pairs)
  add_offense(crime_scene) do |corrector|
    corrector.replace(crime_scene, replacement(symbols, pairs))
  end
end

def replacement(symbols, pairs)

def replacement(symbols, pairs)
  (sort_symbols(symbols) + sort_pairs(pairs)).map(&:source).join(', ')
end

def sort_pairs(pairs)

def sort_pairs(pairs)
  pairs.sort_by { |pair| pair.key.source.downcase }
end

def sort_symbols(symbols)

def sort_symbols(symbols)
  symbols.sort_by do |symbol|
    if %i[str sym].include?(symbol.type)
      symbol.value.to_s.downcase
    else
      symbol.source.downcase
    end
  end
end

def sorted?(symbols, pairs)

def sorted?(symbols, pairs)
  symbols == sort_symbols(symbols) && pairs == sort_pairs(pairs)
end