1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
# frozen_string_literal: true
RSpec.describe "bundle install" do
describe "with path configured" do
before :each do
build_gem "myrack", "1.0.0", to_system: true do |s|
s.write "lib/myrack.rb", "puts 'FAIL'"
end
gemfile <<-G
source "https://gem.repo1"
gem "myrack"
G
end
it "does not use available system gems with `vendor/bundle" do
bundle "config set --local path vendor/bundle"
bundle :install
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "uses system gems with `path.system` configured with more priority than `path`" do
bundle "config set --local path.system true"
bundle "config set --global path vendor/bundle"
bundle :install
run "require 'myrack'", raise_on_error: false
expect(out).to include("FAIL")
end
it "handles paths with regex characters in them" do
dir = bundled_app("bun++dle")
dir.mkpath
bundle "config set --local path #{dir.join("vendor/bundle")}"
bundle :install, dir: dir
expect(out).to include("installed into `./vendor/bundle`")
dir.rmtree
end
it "prints a message to let the user know where gems where installed" do
bundle "config set --local path vendor/bundle"
bundle :install
expect(out).to include("gems are installed into `./vendor/bundle`")
end
it "disallows --path vendor/bundle --system", bundler: "< 3" do
bundle "install --path vendor/bundle --system", raise_on_error: false
expect(err).to include("Please choose only one option.")
expect(exitstatus).to eq(15)
end
it "remembers to disable system gems after the first time with bundle --path vendor/bundle", bundler: "< 3" do
bundle "install --path vendor/bundle"
FileUtils.rm_r bundled_app("vendor")
bundle "install"
expect(vendored_gems("gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
context "with path_relative_to_cwd set to true" do
before { bundle "config set path_relative_to_cwd true" }
it "installs the bundle relatively to current working directory", bundler: "< 3" do
bundle "install --gemfile='#{bundled_app}/Gemfile' --path vendor/bundle", dir: bundled_app.parent
expect(out).to include("installed into `./vendor/bundle`")
expect(bundled_app("../vendor/bundle")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "installs the standalone bundle relative to the cwd" do
bundle :install, gemfile: bundled_app_gemfile, standalone: true, dir: bundled_app.parent
expect(out).to include("installed into `./bundled_app/bundle`")
expect(bundled_app("bundle")).to be_directory
expect(bundled_app("bundle/ruby")).to be_directory
bundle "config unset path"
bundle :install, gemfile: bundled_app_gemfile, standalone: true, dir: bundled_app("subdir").tap(&:mkpath)
expect(out).to include("installed into `../bundle`")
expect(bundled_app("bundle")).to be_directory
expect(bundled_app("bundle/ruby")).to be_directory
end
end
end
describe "when BUNDLE_PATH or the global path config is set" do
before :each do
build_lib "myrack", "1.0.0", to_system: true do |s|
s.write "lib/myrack.rb", "raise 'FAIL'"
end
gemfile <<-G
source "https://gem.repo1"
gem "myrack"
G
end
def set_bundle_path(type, location)
if type == :env
ENV["BUNDLE_PATH"] = location
elsif type == :global
bundle "config set path #{location}", "no-color" => nil
end
end
[:env, :global].each do |type|
context "when set via #{type}" do
it "installs gems to a path if one is specified" do
set_bundle_path(type, bundled_app("vendor2").to_s)
bundle "config set --local path vendor/bundle"
bundle :install
expect(vendored_gems("gems/myrack-1.0.0")).to be_directory
expect(bundled_app("vendor2")).not_to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "installs gems to ." do
set_bundle_path(type, ".")
bundle "config set --global disable_shared_gems true"
bundle :install
paths_to_exist = %w[cache/myrack-1.0.0.gem gems/myrack-1.0.0 specifications/myrack-1.0.0.gemspec].map {|path| bundled_app(Bundler.ruby_scope, path) }
expect(paths_to_exist).to all exist
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "installs gems to the path" do
set_bundle_path(type, bundled_app("vendor").to_s)
bundle :install
expect(bundled_app("vendor", Bundler.ruby_scope, "gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "installs gems to the path relative to root when relative" do
set_bundle_path(type, "vendor")
FileUtils.mkdir_p bundled_app("lol")
bundle :install, dir: bundled_app("lol")
expect(bundled_app("vendor", Bundler.ruby_scope, "gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
end
end
it "installs gems to BUNDLE_PATH from .bundle/config" do
config "BUNDLE_PATH" => bundled_app("vendor/bundle").to_s
bundle :install
expect(vendored_gems("gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "sets BUNDLE_PATH as the first argument to bundle install" do
bundle "config set --local path ./vendor/bundle"
bundle :install
expect(vendored_gems("gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "disables system gems when passing a path to install" do
# This is so that vendored gems can be distributed to others
build_gem "myrack", "1.1.0", to_system: true
bundle "config set --local path ./vendor/bundle"
bundle :install
expect(vendored_gems("gems/myrack-1.0.0")).to be_directory
expect(the_bundle).to include_gems "myrack 1.0.0"
end
it "re-installs gems whose extensions have been deleted" do
build_lib "very_simple_binary", "1.0.0", to_system: true do |s|
s.write "lib/very_simple_binary.rb", "raise 'FAIL'"
end
gemfile <<-G
source "https://gem.repo1"
gem "very_simple_binary"
G
bundle "config set --local path ./vendor/bundle"
bundle :install
expect(vendored_gems("gems/very_simple_binary-1.0")).to be_directory
expect(vendored_gems("extensions")).to be_directory
expect(the_bundle).to include_gems "very_simple_binary 1.0", source: "remote1"
vendored_gems("extensions").rmtree
run "require 'very_simple_binary_c'", raise_on_error: false
expect(err).to include("Bundler::GemNotFound")
bundle "config set --local path ./vendor/bundle"
bundle :install
expect(vendored_gems("gems/very_simple_binary-1.0")).to be_directory
expect(vendored_gems("extensions")).to be_directory
expect(the_bundle).to include_gems "very_simple_binary 1.0", source: "remote1"
end
end
describe "to a file" do
before do
FileUtils.touch bundled_app("bundle")
end
it "reports the file exists" do
gemfile <<-G
source "https://gem.repo1"
gem "myrack"
G
bundle "config set --local path bundle"
bundle :install, raise_on_error: false
expect(err).to include("file already exists")
end
end
end
|