aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorCarl Lerche <carllerche@mac.com>2010-06-06 02:03:53 -0700
committerCarl Lerche <carllerche@mac.com>2010-06-06 02:08:38 -0700
commit5c8d9c82b287ef2f6d2fd36b45d6cd11cad12c88 (patch)
treef297e7ed6ab79f2b452a56645768494f1cfc9c60 /lib
parentbc84ffc545b6197fc50e1c0e8c7c5a576248ed0e (diff)
downloadbundler-5c8d9c82b287ef2f6d2fd36b45d6cd11cad12c88.tar.gz
Set things up to start working on the platform DSL
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/definition.rb33
-rw-r--r--lib/bundler/dependency.rb22
-rw-r--r--lib/bundler/dsl.rb19
-rw-r--r--lib/bundler/environment.rb7
-rw-r--r--lib/bundler/resolver.rb9
-rw-r--r--lib/bundler/runtime.rb2
-rw-r--r--lib/bundler/spec_set.rb8
7 files changed, 69 insertions, 31 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index c615ebac..5f07ebbc 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -52,10 +52,6 @@ module Bundler
current_platform = Gem.platforms.map { |p| p.to_generic }.compact.last
@platforms |= [current_platform]
- @dependencies.each do |dependency|
- dependency.platforms.replace @platforms
- end
-
converge
end
@@ -68,6 +64,11 @@ module Bundler
@specs ||= resolve_local_specs
end
+ def specs_for(groups)
+ deps = dependencies.select { |d| (d.groups & groups).any? }
+ specs.for(expand_dependencies(deps))
+ end
+
def last_resolve
resolve_local_specs unless @specs
@last_resolve
@@ -172,7 +173,9 @@ module Bundler
converged << s
end
- @last_resolve = SpecSet.new(converged).for(deps, @unlock[:gems])
+ resolve = SpecSet.new(converged)
+ resolve = resolve.for(expand_dependencies(deps), @unlock[:gems])
+ @last_resolve = resolve
end
def in_locked_deps?(dep)
@@ -185,6 +188,20 @@ module Bundler
@last_resolve.any? { |s| s.satisfies?(dep) }
end
+ def expanded_dependencies
+ @expanded_dependencies ||= expand_dependencies(dependencies)
+ end
+
+ def expand_dependencies(dependencies)
+ deps = []
+ dependencies.each do |dep|
+ dep.gem_platforms(@platforms).each do |p|
+ deps << DepProxy.new(dep, p)
+ end
+ end
+ deps
+ end
+
def sorted_sources
@sources.sort_by do |s|
# Place GEM at the top
@@ -200,8 +217,8 @@ module Bundler
end
# Run a resolve against the locally available gems
- resolve = Resolver.resolve(dependencies, idx, source_requirements, @last_resolve)
- [resolve, resolve.materialize(type, dependencies)]
+ resolve = Resolver.resolve(expanded_dependencies, idx, source_requirements, @last_resolve)
+ [resolve, resolve.materialize(type, expanded_dependencies)]
end
def resolve_local_specs
@@ -211,7 +228,7 @@ module Bundler
# TODO: Improve this logic
def resolve_remote_specs
- raise "lol" unless @last_resolve.valid_for?(dependencies)
+ raise "lol" unless @last_resolve.valid_for?(expanded_dependencies)
resolve_local_specs
rescue #InvalidSpecSet, GemNotFound, PathError
@last_resolve, @specs = resolve(:specs, remote_index)
diff --git a/lib/bundler/dependency.rb b/lib/bundler/dependency.rb
index dacf991e..1d0a912d 100644
--- a/lib/bundler/dependency.rb
+++ b/lib/bundler/dependency.rb
@@ -7,19 +7,39 @@ module Bundler
attr_reader :groups
attr_reader :platforms
+ PLATFORM_MAP = {
+ :ruby => Gem::Platform::RUBY,
+ :ruby_18 => Gem::Platform::RUBY,
+ :ruby_19 => Gem::Platform::RUBY,
+ :jruby => Gem::Platform::JAVA,
+ :mswin => Gem::Platform::MSWIN
+ }
+
def initialize(name, version, options = {}, &blk)
super(name, version)
@autorequire = nil
@groups = Array(options["group"] || :default).map { |g| g.to_sym }
@source = options["source"]
- @platforms = []
+ @platforms = Array(options["platforms"])
if options.key?('require')
@autorequire = Array(options['require'] || [])
end
end
+ def gem_platforms(valid_platforms)
+ return valid_platforms if @platforms.empty?
+
+ platforms = []
+ @platforms.each do |p|
+ platform = PLATFORM_MAP[p]
+ next unless valid_platforms.include?(platform)
+ platforms |= [platform]
+ end
+ platforms
+ end
+
def to_lock
out = " #{name}"
diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb
index 998c9a29..39e88f48 100644
--- a/lib/bundler/dsl.rb
+++ b/lib/bundler/dsl.rb
@@ -8,12 +8,15 @@ module Bundler
builder.to_definition
end
+ VALID_PLATFORMS = [:ruby_18, :ruby_19, :ruby, :jruby, :mswin]
+
def initialize
@rubygems_source = Source::Rubygems.new
@source = nil
@sources = []
@dependencies = []
@groups = []
+ @platforms = []
end
def gem(name, *args)
@@ -69,6 +72,13 @@ module Bundler
args.each { @groups.pop }
end
+ def platforms(*platforms)
+ @platforms.concat platforms
+ yield
+ ensure
+ platforms.each { @platforms.pop }
+ end
+
# Deprecated methods
def self.deprecate(name, replacement = nil)
@@ -133,6 +143,14 @@ module Bundler
groups.concat Array(opts.delete("group"))
groups = [:default] if groups.empty?
+ platforms = @platforms.dup
+ platforms.concat Array(opts.delete("platforms"))
+ platforms.map! { |p| p.to_sym }
+ platforms.each do |p|
+ next if VALID_PLATFORMS.include?(p)
+ raise DslError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
+ end
+
# Normalize git and path options
["git", "path"].each do |type|
if param = opts[type]
@@ -144,6 +162,7 @@ module Bundler
opts["source"] ||= @source
+ opts["platforms"] = @platforms.dup
opts["group"] = groups
end
diff --git a/lib/bundler/environment.rb b/lib/bundler/environment.rb
index 9bf31b9b..d0a7ddcc 100644
--- a/lib/bundler/environment.rb
+++ b/lib/bundler/environment.rb
@@ -18,7 +18,7 @@ module Bundler
@requested_specs ||= begin
groups = @definition.groups - Bundler.settings.without
groups.map! { |g| g.to_sym }
- specs_for(groups)
+ @definition.specs_for(groups)
end
end
@@ -40,11 +40,6 @@ module Bundler
private
- def specs_for(groups)
- deps = dependencies.select { |d| (d.groups & groups).any? }
- specs.for(deps)
- end
-
# ==== Locking
def write_yml_lock
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index c351d6df..0920c3c7 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -151,15 +151,8 @@ module Bundler
def start(reqs)
activated = {}
- requirements = []
- reqs.each do |d|
- d.platforms.each do |p|
- requirements << DepProxy.new(d, p)
- end
- end
-
- resolve(requirements, activated)
+ resolve(reqs, activated)
end
def resolve(reqs, activated)
diff --git a/lib/bundler/runtime.rb b/lib/bundler/runtime.rb
index 8e28cce7..1603e0b9 100644
--- a/lib/bundler/runtime.rb
+++ b/lib/bundler/runtime.rb
@@ -13,7 +13,7 @@ module Bundler
# Has to happen first
clean_load_path
- specs = groups.any? ? specs_for(groups) : requested_specs
+ specs = groups.any? ? @definition.specs_for(groups) : requested_specs
cripple_rubygems(specs)
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb
index 6d7c229e..2e1c06e0 100644
--- a/lib/bundler/spec_set.rb
+++ b/lib/bundler/spec_set.rb
@@ -17,13 +17,7 @@ module Bundler
end
def for(dependencies, skip = [], check = false)
- handled, deps, specs = {}, [], []
-
- dependencies.each do |d|
- d.platforms.each do |p|
- deps << DepProxy.new(d, p)
- end
- end
+ handled, deps, specs = {}, dependencies.dup, []
until deps.empty?
dep = deps.shift