aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bundler/plugin/dsl.rb
blob: 296bfdbc43dd0ac5cd7dbf89061b4acfcafe3948 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# frozen_string_literal: true

module Bundler
  # Dsl to parse the Gemfile looking for plugins to install
  module Plugin
    class DSL < Bundler::Dsl
      class PluginGemfileError < PluginError; end
      alias_method :_gem, :gem # To use for plugin installation as gem

      # So that we don't have to override all there methods to dummy ones
      # explicitly.
      # They will be handled by method_missing
      [:gemspec, :gem, :path, :install_if, :platforms, :env].each {|m| undef_method m }

      attr_reader :auto_plugins

      def initialize
        super
        @sources = Plugin::SourceList.new
        @auto_plugins = [] # The source plugins inferred from :type
      end

      def plugin(name, *args)
        _gem(name, *args)
      end

      def method_missing(name, *args)
        raise PluginGemfileError, "Undefined local variable or method `#{name}' for Gemfile" unless Bundler::Dsl.method_defined? name
      end

      def source(source, *args, &blk)
        options = args.last.is_a?(Hash) ? args.pop.dup : {}
        options = normalize_hash(options)
        return super unless options.key?("type")

        plugin_name = "bundler-source-#{options["type"]}"
        unless @auto_plugins.include? plugin_name
          plugin(plugin_name)
          @auto_plugins << plugin_name
        end
      end
    end
  end
end