diff options
author | André Arko <mail@arko.net> | 2015-05-03 11:45:58 -0700 |
---|---|---|
committer | André Arko <mail@arko.net> | 2015-05-03 11:45:58 -0700 |
commit | 0c57d06335675576635d6378b9a7b8859ded2103 (patch) | |
tree | 26678cdbd970b9b0c598e4594a5699de94b6df2a | |
parent | 18a2828a2433998aeb2f2ae609b81707e4af3f6f (diff) | |
parent | 6342a6bf2bb4a51902fdea14ef6d80c1fb6847e0 (diff) | |
download | bundler-0c57d06335675576635d6378b9a7b8859ded2103.tar.gz |
Merge pull request #3611 from bundler/seg-install-if
[DSL] Add install_if method / option
-rw-r--r-- | lib/bundler/dependency.rb | 13 | ||||
-rw-r--r-- | lib/bundler/dsl.rb | 43 | ||||
-rw-r--r-- | spec/install/gems/install_if.rb | 38 |
3 files changed, 74 insertions, 20 deletions
diff --git a/lib/bundler/dependency.rb b/lib/bundler/dependency.rb index 6a9284fd56..e58ed4b7d5 100644 --- a/lib/bundler/dependency.rb +++ b/lib/bundler/dependency.rb @@ -50,11 +50,12 @@ module Bundler type = options["type"] || :runtime super(name, version, type) - @autorequire = nil - @groups = Array(options["group"] || :default).map { |g| g.to_sym } - @source = options["source"] - @platforms = Array(options["platforms"]) - @env = options["env"] + @autorequire = nil + @groups = Array(options["group"] || :default).map { |g| g.to_sym } + @source = options["source"] + @platforms = Array(options["platforms"]) + @env = options["env"] + @should_include = options.fetch("should_include", true) if options.key?('require') @autorequire = Array(options['require'] || []) @@ -74,7 +75,7 @@ module Bundler end def should_include? - current_env? && current_platform? + @should_include && current_env? && current_platform? end def current_env? diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index cc1e19bdbd..c4a9f05d16 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -16,15 +16,16 @@ module Bundler attr_accessor :dependencies def initialize - @source = nil - @sources = SourceList.new - @git_sources = {} - @dependencies = [] - @groups = [] - @optional_groups = [] - @platforms = [] - @env = nil - @ruby_version = nil + @source = nil + @sources = SourceList.new + @git_sources = {} + @dependencies = [] + @groups = [] + @install_conditionals = [] + @optional_groups = [] + @platforms = [] + @env = nil + @ruby_version = nil add_git_sources end @@ -174,6 +175,13 @@ module Bundler args.each { @groups.pop } end + def install_if(*args, &blk) + @install_conditionals.concat args + blk.call + ensure + args.each { @groups.pop } + end + def platforms(*platforms) @platforms.concat platforms yield @@ -228,7 +236,7 @@ module Bundler end def valid_keys - @valid_keys ||= %w(group groups git path glob name branch ref tag require submodules platform platforms type source) + @valid_keys ||= %w(group groups git path glob name branch ref tag require submodules platform platforms type source install_if) end def normalize_options(name, version, opts) @@ -249,6 +257,12 @@ module Bundler groups.concat Array(opts.delete("group")) groups = [:default] if groups.empty? + install_if = @install_conditionals.dup + install_if.concat Array(opts.delete("install_if")) + install_if = install_if.reduce(true) do |memo, val| + memo && (val.respond_to?(:call) ? val.call : val) + end + platforms = @platforms.dup opts["platforms"] = opts["platform"] || opts["platforms"] platforms.concat Array(opts.delete("platforms")) @@ -281,10 +295,11 @@ module Bundler end end - opts["source"] ||= @source - opts["env"] ||= @env - opts["platforms"] = platforms.dup - opts["group"] = groups + opts["source"] ||= @source + opts["env"] ||= @env + opts["platforms"] = platforms.dup + opts["group"] = groups + opts["should_include"] = install_if end def normalize_group_options(opts, groups) diff --git a/spec/install/gems/install_if.rb b/spec/install/gems/install_if.rb new file mode 100644 index 0000000000..79e6dd87bd --- /dev/null +++ b/spec/install/gems/install_if.rb @@ -0,0 +1,38 @@ +require "spec_helper" + +describe "bundle install with install_if conditionals" do + it "follows the install_if DSL" do + install_gemfile <<-G + source "file://#{gem_repo1}" + gem "rack" + install_if(lambda { true }) do + gem "activesupport", "2.3.5" + end + gem "thin", :install_if => false + G + + should_be_installed("rack 1.0", "activesupport 2.3.5") + should_not_be_installed("thin") + + lockfile_should_be <<-L + GEM + remote: file:#{gem_repo1}/ + specs: + activesupport (2.3.5) + rack (1.0.0) + thin (1.0) + rack + + PLATFORMS + ruby + + DEPENDENCIES + activesupport (= 2.3.5) + rack + thin + + BUNDLED WITH + 1.9.4 + L + end +end |