2018-11-02 19:07:56 -04:00
# frozen_string_literal: true
RSpec . shared_examples " bundle install --standalone " do
shared_examples " common functionality " do
it " still makes the gems available to normal bundler " do
args = expected_gems . map { | k , v | " #{ k } #{ v } " }
expect ( the_bundle ) . to include_gems ( * args )
end
2021-02-01 10:17:16 -05:00
it " still makes system gems unavailable to normal bundler " do
system_gems " rack-1.0.0 "
expect ( the_bundle ) . to_not include_gems ( " rack " )
end
2018-11-02 19:07:56 -04:00
it " generates a bundle/bundler/setup.rb " do
expect ( bundled_app ( " bundle/bundler/setup.rb " ) ) . to exist
end
it " makes the gems available without bundler " do
testrb = String . new <<-RUBY
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
RUBY
expected_gems . each do | k , _ |
testrb << " \n require \" #{ k } \" "
testrb << " \n puts #{ k . upcase } "
end
2020-05-15 08:31:12 -04:00
ruby testrb
2018-11-02 19:07:56 -04:00
expect ( out ) . to eq ( expected_gems . values . join ( " \n " ) )
end
2021-02-01 10:17:16 -05:00
it " makes the gems available without bundler via Kernel.require " do
testrb = String . new <<-RUBY
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
RUBY
expected_gems . each do | k , _ |
testrb << " \n Kernel.require \" #{ k } \" "
testrb << " \n puts #{ k . upcase } "
end
ruby testrb
expect ( out ) . to eq ( expected_gems . values . join ( " \n " ) )
end
it " makes system gems unavailable without bundler " do
system_gems " rack-1.0.0 "
testrb = String . new <<-RUBY
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
begin
require " rack "
rescue LoadError
puts " LoadError "
end
RUBY
ruby testrb
expect ( out ) . to eq ( " LoadError " )
end
2018-11-02 19:07:56 -04:00
it " works on a different system " do
2020-05-08 01:19:04 -04:00
begin
FileUtils . mv ( bundled_app , " #{ bundled_app } 2 " )
rescue Errno :: ENOTEMPTY
puts " Couldn't rename test app since the target folder has these files: #{ Dir . glob ( " #{ bundled_app } 2/* " ) } "
raise
end
2018-11-02 19:07:56 -04:00
testrb = String . new <<-RUBY
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
RUBY
expected_gems . each do | k , _ |
testrb << " \n require \" #{ k } \" "
testrb << " \n puts #{ k . upcase } "
end
2020-05-15 08:31:12 -04:00
ruby testrb , :dir = > " #{ bundled_app } 2 "
2018-11-02 19:07:56 -04:00
expect ( out ) . to eq ( expected_gems . values . join ( " \n " ) )
end
end
describe " with simple gems " do
before do
gemfile <<-G
2019-05-06 12:06:21 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " rails "
G
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
end
let ( :expected_gems ) do
{
" actionpack " = > " 2.3.2 " ,
" rails " = > " 2.3.2 " ,
}
end
include_examples " common functionality "
end
2021-07-25 10:23:15 -04:00
describe " with default gems and a lockfile " , :ruby_repo do
before do
skip " does not work on rubygems versions where `--install_dir` doesn't respect --default " unless Gem :: Installer . for_spec ( loaded_gemspec , :install_dir = > " /foo " ) . default_spec_file == " /foo/specifications/default/bundler- #{ Bundler :: VERSION } .gemspec " # Since rubygems 3.2.0.rc.2
skip " does not work on old rubies because the realworld gems that need to be installed don't support them " if RUBY_VERSION < " 2.7.0 "
realworld_system_gems " fiddle --version 1.0.6 " , " tsort --version 0.1.0 "
2021-10-25 13:17:00 -04:00
necessary_system_gems = [ " optparse --version 0.1.1 " , " psych --version 3.3.2 " , " yaml --version 0.1.1 " , " logger --version 1.4.3 " , " etc --version 1.2.0 " , " stringio --version 3.0.0 " ]
2021-07-25 10:23:15 -04:00
necessary_system_gems += [ " shellwords --version 0.1.0 " , " base64 --version 0.1.0 " , " resolv --version 0.2.1 " ] if Gem . rubygems_version < Gem :: Version . new ( " 3.3.3.a " )
realworld_system_gems ( * necessary_system_gems , :path = > scoped_gem_path ( bundled_app ( " bundle " ) ) )
build_gem " foo " , " 1.0.0 " , :to_system = > true , :default = > true do | s |
s . add_dependency " bar "
end
build_gem " bar " , " 1.0.0 " , :to_system = > true , :default = > true
build_repo4 do
build_gem " foo " , " 1.0.0 " do | s |
s . add_dependency " bar "
end
build_gem " bar " , " 1.0.0 "
end
gemfile <<-G
source " https://gem.repo4 "
gem " foo "
G
bundle " lock " , :dir = > cwd , :artifice = > " compact_index "
end
it " works " do
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
bundle :install , :standalone = > true , :dir = > cwd , :artifice = > " compact_index " , :env = > { " BUNDLER_GEM_DEFAULT_DIR " = > system_gem_path . to_s }
end
end
2021-07-27 13:43:01 -04:00
describe " with Gemfiles using path sources and resulting bundle moved to a folder hierarchy with different nesting " do
before do
build_lib " minitest " , " 1.0.0 " , :path = > lib_path ( " minitest " )
Dir . mkdir bundled_app ( " app " )
gemfile bundled_app ( " app/Gemfile " ) , <<-G
source " #{ file_uri_for ( gem_repo1 ) } "
gem " minitest " , :path = > " #{ lib_path ( " minitest " ) } "
G
bundle " install " , :standalone = > true , :dir = > bundled_app ( " app " )
Dir . mkdir tmp ( " one_more_level " )
FileUtils . mv bundled_app , tmp ( " one_more_level " )
end
it " also works " do
ruby <<-RUBY, :dir => tmp("one_more_level/bundled_app/app")
require " ./bundle/bundler/setup "
require " minitest "
puts MINITEST
RUBY
expect ( out ) . to eq ( " 1.0.0 " )
expect ( err ) . to be_empty
end
end
2020-05-16 06:47:24 -04:00
describe " with gems with native extension " , :ruby_repo do
2018-11-02 19:07:56 -04:00
before do
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-05-29 06:46:16 -04:00
install_gemfile <<-G, :standalone => true, :dir => cwd
2019-05-06 12:06:21 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " very_simple_binary "
G
end
2019-04-14 02:01:35 -04:00
it " generates a bundle/bundler/setup.rb with the proper paths " do
2018-11-02 19:07:56 -04:00
expected_path = bundled_app ( " bundle/bundler/setup.rb " )
extension_line = File . read ( expected_path ) . each_line . find { | line | line . include? " /extensions/ " } . strip
2021-07-30 06:42:18 -04:00
expect ( extension_line ) . to start_with '$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{RbConfig::CONFIG["ruby_version"]}/extensions/'
2020-10-15 00:20:25 -04:00
expect ( extension_line ) . to end_with '/very_simple_binary-1.0")'
2018-11-02 19:07:56 -04:00
end
end
describe " with gem that has an invalid gemspec " do
before do
build_git " bar " , :gemspec = > false do | s |
s . write " lib/bar/version.rb " , %( BAR_VERSION = '1.0' )
s . write " bar.gemspec " , <<-G
lib = File . expand_path ( '../lib/' , __FILE__ )
$: . unshift lib unless $: . include? ( lib )
require 'bar/version'
Gem :: Specification . new do | s |
s . name = 'bar'
s . version = BAR_VERSION
s . summary = 'Bar'
s . files = Dir [ " lib/**/*.rb " ]
s . author = 'Anonymous'
s . require_path = [ 1 , 2 ]
end
G
end
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 12:43:17 -04:00
install_gemfile <<-G, :standalone => true, :dir => cwd, :raise_on_error => false
2021-07-24 11:27:02 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " bar " , :git = > " #{ lib_path ( " bar-1.0 " ) } "
G
end
it " outputs a helpful error message " do
2019-04-14 02:01:35 -04:00
expect ( err ) . to include ( " You have one or more invalid gemspecs that need to be fixed. " )
expect ( err ) . to include ( " bar 1.0 has an invalid gemspec " )
2018-11-02 19:07:56 -04:00
end
end
describe " with a combination of gems and git repos " do
before do
build_git " devise " , " 1.0 "
gemfile <<-G
2019-05-06 12:06:21 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " rails "
gem " devise " , :git = > " #{ lib_path ( " devise-1.0 " ) } "
G
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
end
let ( :expected_gems ) do
{
" actionpack " = > " 2.3.2 " ,
" devise " = > " 1.0 " ,
" rails " = > " 2.3.2 " ,
}
end
include_examples " common functionality "
end
describe " with groups " do
before do
build_git " devise " , " 1.0 "
gemfile <<-G
2019-05-06 12:06:21 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " rails "
group :test do
gem " rspec "
gem " rack-test "
end
G
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
end
let ( :expected_gems ) do
{
" actionpack " = > " 2.3.2 " ,
" rails " = > " 2.3.2 " ,
}
end
include_examples " common functionality "
it " allows creating a standalone file with limited groups " do
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > " default " , :dir = > cwd
2018-11-02 19:07:56 -04:00
2020-05-15 08:31:12 -04:00
load_error_ruby <<-RUBY, "spec"
2020-05-08 01:19:04 -04:00
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
2018-11-02 19:07:56 -04:00
2020-05-08 01:19:04 -04:00
require " actionpack "
puts ACTIONPACK
require " spec "
RUBY
2018-11-02 19:07:56 -04:00
2019-06-01 05:49:40 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
expect ( err ) . to eq ( " ZOMG LOAD ERROR " )
2018-11-02 19:07:56 -04:00
end
2020-05-29 06:27:15 -04:00
it " allows `without` configuration to limit the groups used in a standalone " do
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
bundle " config set --local without test "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
2020-05-15 08:31:12 -04:00
load_error_ruby <<-RUBY, "spec"
2020-05-08 01:19:04 -04:00
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
2018-11-02 19:07:56 -04:00
2020-05-08 01:19:04 -04:00
require " actionpack "
puts ACTIONPACK
require " spec "
RUBY
2018-11-02 19:07:56 -04:00
2019-06-01 05:49:40 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
expect ( err ) . to eq ( " ZOMG LOAD ERROR " )
2018-11-02 19:07:56 -04:00
end
2020-05-29 06:27:15 -04:00
it " allows `path` configuration to change the location of the standalone bundle " do
2021-01-03 20:11:34 -05:00
bundle " config set --local path path/to/bundle "
2020-06-03 14:45:36 -04:00
bundle " install " , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
2020-05-15 08:31:12 -04:00
ruby <<-RUBY
2020-05-08 01:19:04 -04:00
$: . unshift File . expand_path ( " path/to/bundle " )
require " bundler/setup "
2018-11-02 19:07:56 -04:00
2020-05-08 01:19:04 -04:00
require " actionpack "
puts ACTIONPACK
RUBY
2018-11-02 19:07:56 -04:00
2019-06-01 05:49:40 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
2018-11-02 19:07:56 -04:00
end
2020-05-29 06:27:15 -04:00
it " allows `without` to limit the groups used in a standalone " do
2021-01-03 20:11:34 -05:00
bundle " config set --local without test "
2020-06-03 14:45:36 -04:00
bundle :install , :dir = > cwd
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
2020-05-15 08:31:12 -04:00
load_error_ruby <<-RUBY, "spec"
2020-05-08 01:19:04 -04:00
$: . unshift File . expand_path ( " bundle " )
require " bundler/setup "
2018-11-02 19:07:56 -04:00
2020-05-08 01:19:04 -04:00
require " actionpack "
puts ACTIONPACK
require " spec "
RUBY
2018-11-02 19:07:56 -04:00
2019-06-01 05:49:40 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
expect ( err ) . to eq ( " ZOMG LOAD ERROR " )
2018-11-02 19:07:56 -04:00
end
end
describe " with gemcutter's dependency API " do
let ( :source_uri ) { " http://localgemserver.test " }
describe " simple gems " do
before do
gemfile <<-G
source " #{ source_uri } "
gem " rails "
G
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :artifice = > " endpoint " , :dir = > cwd
2018-11-02 19:07:56 -04:00
end
let ( :expected_gems ) do
{
" actionpack " = > " 2.3.2 " ,
" rails " = > " 2.3.2 " ,
}
end
include_examples " common functionality "
end
end
2019-01-04 08:10:58 -05:00
describe " with --binstubs " , :bundler = > " < 3 " do
2018-11-02 19:07:56 -04:00
before do
gemfile <<-G
2019-05-06 12:06:21 -04:00
source " #{ file_uri_for ( gem_repo1 ) } "
2018-11-02 19:07:56 -04:00
gem " rails "
G
2021-01-03 20:11:34 -05:00
bundle " config set --local path #{ bundled_app ( " bundle " ) } "
2020-06-03 14:45:36 -04:00
bundle :install , :standalone = > true , :binstubs = > true , :dir = > cwd
2018-11-02 19:07:56 -04:00
end
let ( :expected_gems ) do
{
" actionpack " = > " 2.3.2 " ,
" rails " = > " 2.3.2 " ,
}
end
include_examples " common functionality "
it " creates stubs that use the standalone load path " do
2020-05-08 01:19:04 -04:00
expect ( sys_exec ( " bin/rails -v " ) . chomp ) . to eql " 2.3.2 "
2018-11-02 19:07:56 -04:00
end
it " creates stubs that can be executed from anywhere " do
require " tmpdir "
2020-06-03 14:46:35 -04:00
sys_exec ( %( #{ bundled_app ( " bin/rails " ) } -v ) , :dir = > Dir . tmpdir )
2020-05-08 01:19:04 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
2018-11-02 19:07:56 -04:00
end
it " creates stubs that can be symlinked " do
2020-05-08 01:19:04 -04:00
skip " symlinks unsupported " if Gem . win_platform?
2018-11-02 19:07:56 -04:00
symlink_dir = tmp ( " symlink " )
FileUtils . mkdir_p ( symlink_dir )
symlink = File . join ( symlink_dir , " rails " )
File . symlink ( bundled_app ( " bin/rails " ) , symlink )
2020-06-03 14:46:35 -04:00
sys_exec ( " #{ symlink } -v " )
2018-11-02 19:07:56 -04:00
expect ( out ) . to eq ( " 2.3.2 " )
end
it " creates stubs with the correct load path " do
extension_line = File . read ( bundled_app ( " bin/rails " ) ) . each_line . find { | line | line . include? " $:.unshift " } . strip
expect ( extension_line ) . to eq %( $:.unshift File.expand_path "../../bundle", path.realpath )
end
end
end
RSpec . describe " bundle install --standalone " do
2020-05-08 01:19:04 -04:00
let ( :cwd ) { bundled_app }
2018-11-02 19:07:56 -04:00
include_examples ( " bundle install --standalone " )
end
RSpec . describe " bundle install --standalone run in a subdirectory " do
2020-05-08 01:19:04 -04:00
let ( :cwd ) { bundled_app ( " bob " ) . tap ( & :mkpath ) }
2018-11-02 19:07:56 -04:00
include_examples ( " bundle install --standalone " )
end