Sha256: 29c31780ea16a2cac09c34992695e4384932d1a7431f07b20f089d6900f16a69

Contents?: true

Size: 1.15 KB

Versions: 3

Compression:

Stored size: 1.15 KB

Contents

require 'parser'
require 'parser/current'
require 'gemfile_locker/gem_entry'

module GemfileLocker
  class GemfileProcessor
    class Rewriter < Parser::TreeRewriter
      def rewrite(*args, &block)
        @rewrite_block = block
        super(*args)
      end

      def on_send(node)
        children = node.children
        return unless children[0].nil? && node.children[1] == :gem
        gem_entry = GemEntry.new(self, node)
        @rewrite_block[gem_entry]
      end
    end

    attr_reader :path, :options

    def initialize(options = {})
      @options = options
    end

    def call(string)
      buffer = Parser::Source::Buffer.new('(Gemfile)')
      buffer.source = string
      parser = Parser::CurrentRuby.new
      ast = parser.parse(buffer)
      Rewriter.new.rewrite(buffer, ast) do |gem_entry|
        process_gem(gem_entry) unless skip_gem?(gem_entry)
      end
    end

    def skip_gem?(gem_entry)
      if options[:only]
        !options[:only].include?(gem_entry.name)
      elsif options[:except]
        options[:except].include?(gem_entry.name)
      end
    end

    def process_gem(_name, _data)
      raise 'Abstract method'
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gemfile_locker-0.4.0 lib/gemfile_locker/gemfile_processor.rb
gemfile_locker-0.3.1 lib/gemfile_locker/gemfile_processor.rb
gemfile_locker-0.3.0 lib/gemfile_locker/gemfile_processor.rb