sanemat/gemfile_arranger

View on GitHub
lib/gemfile_arranger/traverse/sort_block.rb

Summary

Maintainability
A
0 mins
Test Coverage
module GemfileArranger
  module Traverse
    class SortBlock < Parser::AST::Processor
      def initialize(keys)
        @keys = Array(keys).dup.map(&:to_sym)
      end

      def on_begin(node)
        sorted_block = sort_block_with_keys(node, @keys)
        node.updated(:begin, sorted_block) if node != sorted_block
      end

      def sort_block_with_keys(node, keys)
        node.children.sort_by.with_index do |child, i|
          _, gem_name, *_ = child.children
          key_index = keys.index(gem_name) || keys.length
          [key_index, i]
        end
      end
    end
  end
end