summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Arko <andre@arko.net>2013-08-04 15:37:16 -0700
committerAndre Arko <andre@arko.net>2013-08-04 15:37:16 -0700
commiteefe9c68ab4f2afa56a8809fc7f731fef7e20e56 (patch)
tree7d4d20b5bd6c61baa68f6edda0a80be30dd57d1c
parent07d8b0ae2583a776672ed0375911932886031949 (diff)
parent6bbcbdcd1cd8dd02fe288499ad67b3bd5dc62df5 (diff)
downloadbundler-sources.tar.gz
Merge pull request #2507 from whitepages/multi_source_depssources
Add spec test for dependency in multiple sources
-rw-r--r--spec/install/gems/dependency_api_spec.rb25
-rw-r--r--spec/support/artifice/local_endpoint_with_api.rb97
-rw-r--r--spec/support/path.rb8
3 files changed, 130 insertions, 0 deletions
diff --git a/spec/install/gems/dependency_api_spec.rb b/spec/install/gems/dependency_api_spec.rb
index 58d9f272dc..d56d788c21 100644
--- a/spec/install/gems/dependency_api_spec.rb
+++ b/spec/install/gems/dependency_api_spec.rb
@@ -196,6 +196,31 @@ describe "gemcutter's dependency API" do
end
end
+ it "should handle dependencies with versions in multiple sources" do
+ FileUtils.rm_rf upstream_gem_repo
+ build_repo upstream_gem_repo do
+ build_gem "from-upstream", "1.0.0"
+ build_gem "from-upstream", "1.1.0"
+ end
+
+ FileUtils.rm_rf local_gem_repo
+ build_repo local_gem_repo do
+ build_gem "site-local", "1.0.0" do |s|
+ s.add_dependency "from-upstream", "~> 1.1"
+ end
+ build_gem "from-upstream", "1.0.1"
+ end
+
+ gemfile <<-G
+ source "#{source_uri}/upstream"
+ source "#{source_uri}/local"
+ gem "site-local", "~> 1.0"
+ G
+
+ bundle :install, :artifice => "local_endpoint_with_api"
+ should_be_installed "site-local 1.0.0"
+ end
+
it "fetches again when more dependencies are found in subsequent sources" do
build_repo2 do
build_gem "back_deps" do |s|
diff --git a/spec/support/artifice/local_endpoint_with_api.rb b/spec/support/artifice/local_endpoint_with_api.rb
new file mode 100644
index 0000000000..332f3e5224
--- /dev/null
+++ b/spec/support/artifice/local_endpoint_with_api.rb
@@ -0,0 +1,97 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+module ApiDependencies
+ def self.dependencies_for(gem_names, repo_path)
+ return [] if gem_names.nil? || gem_names.empty?
+ read_dependencies(gem_names, repo_path, "specs.4.8") # + read_dependencies(gem_names, repo_path, "prerelease_specs.4.8")
+ end
+
+ def self.read_dependencies(gem_names, repo_path, index_file)
+ marshal_file = File.join(repo_path, index_file)
+ return [] unless File.exists?(marshal_file)
+
+ require 'rubygems'
+ require 'bundler'
+ Bundler::Deprecate.skip_during do
+ Marshal.load(File.open(marshal_file).read).map do |name, version, platform|
+ spec = load_spec(name, version, platform, repo_path)
+ if gem_names.include?(spec.name)
+ rv = {
+ :name => spec.name,
+ :number => spec.version.version,
+ :platform => spec.platform.to_s,
+ :dependencies => spec.dependencies.select {|dep| dep.type == :runtime }.map do |dep|
+ [dep.name, dep.requirement.requirements.map {|a| a.join(" ") }.join(", ")]
+ end
+ }
+ rv
+ end
+ end.compact
+ end
+ end
+
+ def self.load_spec(name, version, platform, repo_path)
+ full_name = "#{name}-#{version}"
+ full_name += "-#{platform}" if platform != "ruby"
+ Marshal.load(Gem.inflate(File.open(File.join(repo_path, "/quick/Marshal.4.8/#{full_name}.gemspec.rz")).read))
+ end
+end
+
+class LocalEndpointWithApi < Endpoint
+ # Local
+ get "/local/quick/Marshal.4.8/:id" do
+ redirect "/local/fetch/actual/gem/#{params[:id]}"
+ end
+
+ get "/local/fetch/actual/gem/:id" do
+ File.read("#{local_gem_repo}/quick/Marshal.4.8/#{params[:id]}")
+ end
+
+ get "/local/gems/:id" do
+ File.read("#{local_gem_repo}/gems/#{params[:id]}")
+ end
+
+ get "/local/api/v1/dependencies" do
+ gem_list = (params[:gems] || '').split(',')
+ deps = Marshal.dump(ApiDependencies.dependencies_for(gem_list, local_gem_repo))
+ deps
+ end
+
+ get "/local/specs.4.8.gz" do
+ File.read("#{local_gem_repo}/specs.4.8.gz")
+ end
+
+ get "/local/prerelease_specs.4.8.gz" do
+ File.read("#{local_gem_repo}/prerelease_specs.4.8.gz")
+ end
+
+ # Upstream
+ get "/upstream/quick/Marshal.4.8/:id" do
+ redirect "/upstream/fetch/actual/gem/#{params[:id]}"
+ end
+
+ get "/upstream/fetch/actual/gem/:id" do
+ File.read("#{upstream_gem_repo}/quick/Marshal.4.8/#{params[:id]}")
+ end
+
+ get "/upstream/gems/:id" do
+ File.read("#{upstream_gem_repo}/gems/#{params[:id]}")
+ end
+
+ get "/upstream/api/v1/dependencies" do
+ gem_list = (params[:gems] || '').split(',')
+ Marshal.dump(ApiDependencies.dependencies_for(gem_list, upstream_gem_repo))
+ end
+
+ get "/upstream/specs.4.8.gz" do
+ File.read("#{upstream_gem_repo}/specs.4.8.gz")
+ end
+
+ get "/upstream/prerelease_specs.4.8.gz" do
+ File.read("#{upstream_gem_repo}/prerelease_specs.4.8.gz")
+ end
+end
+
+Artifice.activate_with(LocalEndpointWithApi)
diff --git a/spec/support/path.rb b/spec/support/path.rb
index b1d3c601f2..bf8bcd7bb7 100644
--- a/spec/support/path.rb
+++ b/spec/support/path.rb
@@ -56,6 +56,14 @@ module Spec
tmp("gems/remote3", *args)
end
+ def local_gem_repo(*args)
+ tmp("gems/remote_local", *args)
+ end
+
+ def upstream_gem_repo(*args)
+ tmp("gems/remote_upstream", *args)
+ end
+
def security_repo(*args)
tmp("gems/security_repo", *args)
end