diff options
author | Carl Lerche <carllerche@mac.com> | 2010-06-06 02:03:53 -0700 |
---|---|---|
committer | Carl Lerche <carllerche@mac.com> | 2010-06-06 02:08:38 -0700 |
commit | 5c8d9c82b287ef2f6d2fd36b45d6cd11cad12c88 (patch) | |
tree | f297e7ed6ab79f2b452a56645768494f1cfc9c60 /lib | |
parent | bc84ffc545b6197fc50e1c0e8c7c5a576248ed0e (diff) | |
download | bundler-5c8d9c82b287ef2f6d2fd36b45d6cd11cad12c88.tar.gz |
Set things up to start working on the platform DSL
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bundler/definition.rb | 33 | ||||
-rw-r--r-- | lib/bundler/dependency.rb | 22 | ||||
-rw-r--r-- | lib/bundler/dsl.rb | 19 | ||||
-rw-r--r-- | lib/bundler/environment.rb | 7 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 9 | ||||
-rw-r--r-- | lib/bundler/runtime.rb | 2 | ||||
-rw-r--r-- | lib/bundler/spec_set.rb | 8 |
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 |