summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel E. Giddins <segiddins@segiddins.me>2015-05-02 00:55:40 -0700
committerSamuel E. Giddins <segiddins@segiddins.me>2015-05-02 00:55:40 -0700
commit6342a6bf2bb4a51902fdea14ef6d80c1fb6847e0 (patch)
treeddee91308c73a1091d3cd4b30b680d34d1f8c093
parentd386ed1b342711fb3d307a7ca640cafc64b3be85 (diff)
downloadbundler-seg-install-if.tar.gz
[DSL] Add install_if method / optionseg-install-if
-rw-r--r--lib/bundler/dependency.rb13
-rw-r--r--lib/bundler/dsl.rb43
-rw-r--r--spec/install/gems/install_if.rb38
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