appraisal 0.5.2 → 1.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +12 -4
- data/README.md +87 -36
- data/appraisal.gemspec +10 -7
- data/bin/appraisal +7 -0
- data/features/appraisals.feature +16 -2
- data/features/bundler_gemfile_compatibility.feature +70 -0
- data/features/gemspec.feature +0 -11
- data/features/missing_appraisals_file.feature +23 -0
- data/features/step_definitions/dependency_steps.rb +17 -24
- data/features/support/dependency_helpers.rb +29 -0
- data/lib/appraisal/appraisal.rb +52 -12
- data/lib/appraisal/cli.rb +87 -0
- data/lib/appraisal/command.rb +4 -2
- data/lib/appraisal/errors.rb +8 -0
- data/lib/appraisal/file.rb +8 -2
- data/lib/appraisal/gemfile.rb +40 -10
- data/lib/appraisal/gemspec.rb +1 -7
- data/lib/appraisal/git_source.rb +23 -0
- data/lib/appraisal/group.rb +17 -0
- data/lib/appraisal/task.rb +20 -18
- data/lib/appraisal/utils.rb +8 -0
- data/lib/appraisal/version.rb +1 -1
- data/spec/acceptance/cli_spec.rb +233 -0
- data/spec/appraisal/appraisal_spec.rb +61 -7
- data/spec/appraisal/file_spec.rb +9 -0
- data/spec/appraisal/gemfile_spec.rb +43 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/acceptance_test_helpers.rb +113 -0
- metadata +61 -11
- data/GOALS +0 -5
data/lib/appraisal/version.rb
CHANGED
@@ -0,0 +1,233 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'appraisal/utils'
|
3
|
+
|
4
|
+
describe 'CLI' do
|
5
|
+
context 'appraisal (with no arguments)' do
|
6
|
+
it 'runs install command' do
|
7
|
+
build_appraisal_file <<-Appraisal
|
8
|
+
appraise '1.0.0' do
|
9
|
+
gem 'dummy', '1.0.0'
|
10
|
+
end
|
11
|
+
Appraisal
|
12
|
+
|
13
|
+
run_simple 'appraisal'
|
14
|
+
|
15
|
+
expect(file 'gemfiles/1.0.0.gemfile').to be_exists
|
16
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').to be_exists
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'appraisal (with arguments)' do
|
21
|
+
before do
|
22
|
+
build_appraisal_file <<-Appraisal
|
23
|
+
appraise '1.0.0' do
|
24
|
+
gem 'dummy', '1.0.0'
|
25
|
+
end
|
26
|
+
|
27
|
+
appraise '1.1.0' do
|
28
|
+
gem 'dummy', '1.1.0'
|
29
|
+
end
|
30
|
+
Appraisal
|
31
|
+
|
32
|
+
run_simple 'appraisal install'
|
33
|
+
write_file 'test.rb', 'puts "Running: #{$dummy_version}"'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'sets APPRAISAL_INITIALIZED environment variable' do
|
37
|
+
write_file 'test.rb', <<-TEST_FILE.strip_heredoc
|
38
|
+
if ENV['APPRAISAL_INITIALIZED']
|
39
|
+
puts "Appraisal initialized!"
|
40
|
+
end
|
41
|
+
TEST_FILE
|
42
|
+
|
43
|
+
test_command = 'appraisal 1.0.0 ruby -rbundler/setup -rdummy test.rb'
|
44
|
+
run_simple test_command
|
45
|
+
expect(output_from test_command).to include 'Appraisal initialized!'
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'with appraisal name' do
|
49
|
+
it 'runs the given command against a correct versions of dependency' do
|
50
|
+
test_command = 'appraisal 1.0.0 ruby -rbundler/setup -rdummy test.rb'
|
51
|
+
run_simple test_command
|
52
|
+
|
53
|
+
expect(output_from test_command).to include 'Running: 1.0.0'
|
54
|
+
expect(output_from test_command).to_not include 'Running: 1.1.0'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'without appraisal name' do
|
59
|
+
it 'runs the given command against all versions of dependency' do
|
60
|
+
test_command = 'appraisal ruby -rbundler/setup -rdummy test.rb'
|
61
|
+
run_simple test_command
|
62
|
+
|
63
|
+
expect(output_from test_command).to include 'Running: 1.0.0'
|
64
|
+
expect(output_from test_command).to include 'Running: 1.1.0'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'appraisal generate' do
|
70
|
+
it 'generates the gemfiles' do
|
71
|
+
build_appraisal_file <<-Appraisal
|
72
|
+
appraise '1.0.0' do
|
73
|
+
gem 'dummy', '1.0.0'
|
74
|
+
end
|
75
|
+
|
76
|
+
appraise '1.1.0' do
|
77
|
+
gem 'dummy', '1.1.0'
|
78
|
+
end
|
79
|
+
Appraisal
|
80
|
+
|
81
|
+
run_simple 'appraisal generate'
|
82
|
+
|
83
|
+
expect(file 'gemfiles/1.0.0.gemfile').to be_exists
|
84
|
+
expect(file 'gemfiles/1.1.0.gemfile').to be_exists
|
85
|
+
expect(content_of 'gemfiles/1.0.0.gemfile').to eq <<-gemfile.strip_heredoc
|
86
|
+
# This file was generated by Appraisal
|
87
|
+
|
88
|
+
source "https://rubygems.org"
|
89
|
+
|
90
|
+
gem "appraisal", :path=>"#{PROJECT_ROOT}"
|
91
|
+
gem "dummy", "1.0.0"
|
92
|
+
gemfile
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'appraisal install' do
|
97
|
+
it 'installs the dependencies' do
|
98
|
+
build_appraisal_file <<-Appraisal
|
99
|
+
appraise '1.0.0' do
|
100
|
+
gem 'dummy', '1.0.0'
|
101
|
+
end
|
102
|
+
|
103
|
+
appraise '1.1.0' do
|
104
|
+
gem 'dummy', '1.1.0'
|
105
|
+
end
|
106
|
+
Appraisal
|
107
|
+
|
108
|
+
run_simple 'appraisal install'
|
109
|
+
|
110
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').to be_exists
|
111
|
+
expect(file 'gemfiles/1.1.0.gemfile.lock').to be_exists
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'relativize directory in gemfile.lock' do
|
115
|
+
build_gemspec
|
116
|
+
add_gemspec_to_gemfile
|
117
|
+
build_appraisal_file <<-Appraisal
|
118
|
+
appraise '1.0.0' do
|
119
|
+
gem 'dummy', '1.0.0'
|
120
|
+
end
|
121
|
+
Appraisal
|
122
|
+
|
123
|
+
run_simple 'appraisal install'
|
124
|
+
|
125
|
+
expect(content_of 'gemfiles/1.0.0.gemfile.lock').not_to include current_dir
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'with job size', parallel: true do
|
129
|
+
before do
|
130
|
+
build_appraisal_file <<-Appraisal
|
131
|
+
appraise '1.0.0' do
|
132
|
+
gem 'dummy', '1.0.0'
|
133
|
+
end
|
134
|
+
Appraisal
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'accepts --jobs option to set job size' do
|
138
|
+
run_simple 'appraisal install --jobs=2'
|
139
|
+
|
140
|
+
expect(output_from 'appraisal install --jobs=2').to include
|
141
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=2'
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'ignores --jobs option if the job size is less than or equal to 1' do
|
145
|
+
run_simple 'appraisal install --jobs=0'
|
146
|
+
|
147
|
+
expect(output_from 'appraisal install --jobs=0').not_to include
|
148
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile'
|
149
|
+
expect(output_from 'appraisal install --jobs=0').not_to include
|
150
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=0'
|
151
|
+
expect(output_from 'appraisal install --jobs=0').not_to include
|
152
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=1'
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'appraisal clean' do
|
158
|
+
it 'remove all gemfiles from gemfiles directory' do
|
159
|
+
build_appraisal_file <<-Appraisal
|
160
|
+
appraise '1.0.0' do
|
161
|
+
gem 'dummy', '1.0.0'
|
162
|
+
end
|
163
|
+
Appraisal
|
164
|
+
|
165
|
+
run_simple 'appraisal install'
|
166
|
+
write_file 'gemfiles/non_related_file', ''
|
167
|
+
|
168
|
+
run_simple 'appraisal clean'
|
169
|
+
|
170
|
+
expect(file 'gemfiles/1.0.0.gemfile').not_to be_exists
|
171
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').not_to be_exists
|
172
|
+
expect(file 'gemfiles/non_related_file').to be_exists
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'appraisal update' do
|
177
|
+
before do
|
178
|
+
build_gem 'dummy2', '1.0.0'
|
179
|
+
|
180
|
+
build_appraisal_file <<-Appraisal
|
181
|
+
appraise 'dummy' do
|
182
|
+
gem 'dummy', '~> 1.0.0'
|
183
|
+
gem 'dummy2', '~> 1.0.0'
|
184
|
+
end
|
185
|
+
Appraisal
|
186
|
+
|
187
|
+
run_simple 'appraisal install'
|
188
|
+
build_gem 'dummy', '1.0.1'
|
189
|
+
build_gem 'dummy2', '1.0.1'
|
190
|
+
end
|
191
|
+
|
192
|
+
after do
|
193
|
+
in_current_dir do
|
194
|
+
`gem uninstall dummy -v 1.0.1`
|
195
|
+
`gem uninstall dummy2 -a`
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context 'with no arguments' do
|
200
|
+
it 'updates all the gems' do
|
201
|
+
run_simple 'appraisal update'
|
202
|
+
|
203
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy (1.0.1)'
|
204
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy2 (1.0.1)'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'with a list of gems' do
|
209
|
+
it 'only updates specified gems' do
|
210
|
+
run_simple 'appraisal update dummy'
|
211
|
+
|
212
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy (1.0.1)'
|
213
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy2 (1.0.0)'
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'appraisal help' do
|
219
|
+
it 'prints usage along with commands, and list of appraisals' do
|
220
|
+
build_appraisal_file <<-Appraisal
|
221
|
+
appraise '1.0.0' do
|
222
|
+
gem 'dummy', '1.0.0'
|
223
|
+
end
|
224
|
+
Appraisal
|
225
|
+
|
226
|
+
run_simple 'appraisal help'
|
227
|
+
|
228
|
+
expect(output_from 'appraisal help').to include 'Usage:'
|
229
|
+
expect(output_from 'appraisal help').to include 'appraisal [APPRAISAL_NAME] EXTERNAL_COMMAND'
|
230
|
+
expect(output_from 'appraisal help').to include '1.0.0'
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'appraisal/appraisal'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'active_support/core_ext/kernel/reporting'
|
3
5
|
|
4
6
|
describe Appraisal::Appraisal do
|
5
|
-
it "creates a proper bundle command" do
|
6
|
-
appraisal = Appraisal::Appraisal.new('fake', 'fake')
|
7
|
-
appraisal.stub(:gemfile_path).and_return("/home/test/test directory")
|
8
|
-
|
9
|
-
appraisal.bundle_command.should == "bundle check --gemfile='/home/test/test directory' || bundle install --gemfile='/home/test/test directory'"
|
10
|
-
end
|
11
|
-
|
12
7
|
it "converts spaces to underscores in the gemfile path" do
|
13
8
|
appraisal = Appraisal::Appraisal.new("one two", "Gemfile")
|
14
9
|
appraisal.gemfile_path.should =~ /one_two\.gemfile$/
|
@@ -23,4 +18,63 @@ describe Appraisal::Appraisal do
|
|
23
18
|
appraisal = Appraisal::Appraisal.new("rails3.0", "Gemfile")
|
24
19
|
appraisal.gemfile_path.should =~ /rails3\.0\.gemfile$/
|
25
20
|
end
|
21
|
+
|
22
|
+
context 'gemfiles generation' do
|
23
|
+
before do
|
24
|
+
@output = Tempfile.new('output')
|
25
|
+
end
|
26
|
+
|
27
|
+
after do
|
28
|
+
@output.close
|
29
|
+
@output.unlink
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'generates a gemfile with a newline at the end of file' do
|
33
|
+
appraisal = Appraisal::Appraisal.new('fake', 'fake')
|
34
|
+
appraisal.stub(:gemfile_path) { @output.path }
|
35
|
+
appraisal.write_gemfile
|
36
|
+
@output.read.should =~ /[^\n]*\n\z/m
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'parallel installation' do
|
41
|
+
before do
|
42
|
+
@appraisal = Appraisal::Appraisal.new('fake', 'fake')
|
43
|
+
@appraisal.stub(:gemfile_path).and_return("/home/test/test directory")
|
44
|
+
Appraisal::Command.stub(:new => double(:run => true))
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'runs single install command on Bundler < 1.4.0' do
|
48
|
+
stub_const('Bundler::VERSION', '1.3.0')
|
49
|
+
|
50
|
+
warning = capture(:stderr) do
|
51
|
+
@appraisal.install(42)
|
52
|
+
end
|
53
|
+
|
54
|
+
Appraisal::Command.should have_received(:new).
|
55
|
+
with("#{bundle_check_command} || #{bundle_single_install_command}")
|
56
|
+
warning.should include 'Please upgrade Bundler'
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'runs parallel install command on Bundler >= 1.4.0' do
|
60
|
+
stub_const('Bundler::VERSION', '1.4.0')
|
61
|
+
|
62
|
+
@appraisal.install(42)
|
63
|
+
|
64
|
+
Appraisal::Command.should have_received(:new).
|
65
|
+
with("#{bundle_check_command} || #{bundle_parallel_install_command}")
|
66
|
+
end
|
67
|
+
|
68
|
+
def bundle_check_command
|
69
|
+
"bundle check --gemfile='/home/test/test directory'"
|
70
|
+
end
|
71
|
+
|
72
|
+
def bundle_single_install_command
|
73
|
+
"bundle install --gemfile='/home/test/test directory'"
|
74
|
+
end
|
75
|
+
|
76
|
+
def bundle_parallel_install_command
|
77
|
+
"bundle install --gemfile='/home/test/test directory' --jobs=42"
|
78
|
+
end
|
79
|
+
end
|
26
80
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'appraisal/file'
|
3
|
+
|
4
|
+
describe Appraisal::File do
|
5
|
+
it "should complain when no Appraisals file is found" do
|
6
|
+
::File.stub(:exist?).with("Appraisals").and_return(false)
|
7
|
+
expect { described_class.new }.to raise_error(Appraisal::AppraisalsNotFound)
|
8
|
+
end
|
9
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'appraisal/gemfile'
|
3
|
+
require 'active_support/core_ext/string/strip'
|
3
4
|
|
4
5
|
describe Appraisal::Gemfile do
|
5
6
|
it "supports gemfiles without sources" do
|
@@ -27,4 +28,46 @@ describe Appraisal::Gemfile do
|
|
27
28
|
gemfile.source :one
|
28
29
|
gemfile.to_s.strip.should == %{source :one}
|
29
30
|
end
|
31
|
+
|
32
|
+
it 'supports group syntax' do
|
33
|
+
gemfile = Appraisal::Gemfile.new
|
34
|
+
|
35
|
+
gemfile.group :development, :test do
|
36
|
+
gem "one"
|
37
|
+
end
|
38
|
+
|
39
|
+
gemfile.to_s.should == <<-GEMFILE.strip_heredoc.strip
|
40
|
+
group :development, :test do
|
41
|
+
gem "one"
|
42
|
+
end
|
43
|
+
GEMFILE
|
44
|
+
end
|
45
|
+
|
46
|
+
context "excess new line" do
|
47
|
+
context "no contents" do
|
48
|
+
it "shows empty string" do
|
49
|
+
gemfile = Appraisal::Gemfile.new
|
50
|
+
gemfile.to_s.should eq ""
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "full contents" do
|
55
|
+
it "does not show newline at end" do
|
56
|
+
gemfile = Appraisal::Gemfile.new
|
57
|
+
gemfile.source "source"
|
58
|
+
gemfile.gem "gem"
|
59
|
+
gemfile.gemspec
|
60
|
+
gemfile.to_s.should =~ /[^\n]\z/m
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "no gemspec" do
|
65
|
+
it "does not show newline at end" do
|
66
|
+
gemfile = Appraisal::Gemfile.new
|
67
|
+
gemfile.source "source"
|
68
|
+
gemfile.gem "gem"
|
69
|
+
gemfile.to_s.should =~ /[^\n]\z/m
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
30
73
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
|
+
require 'aruba/api'
|
4
|
+
require './spec/support/acceptance_test_helpers'
|
5
|
+
|
6
|
+
PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
|
7
|
+
TMP_GEM_ROOT = File.join(PROJECT_ROOT, "tmp", "gems")
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.include AcceptanceTestHelpers, :type => :acceptance, :example_group => {
|
11
|
+
:file_path => %r{spec\/acceptance\/}
|
12
|
+
}
|
13
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'rspec/expectations/expectation_target'
|
2
|
+
require 'active_support/core_ext/string/strip'
|
3
|
+
require 'active_support/concern'
|
4
|
+
require './features/support/dependency_helpers'
|
5
|
+
|
6
|
+
module AcceptanceTestHelpers
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include Aruba::Api
|
9
|
+
include DependencyHelpers
|
10
|
+
|
11
|
+
included do
|
12
|
+
metadata[:type] = :acceptance
|
13
|
+
|
14
|
+
before :all do
|
15
|
+
initialize_aruba_instance_variables
|
16
|
+
build_default_dummy_gems
|
17
|
+
end
|
18
|
+
|
19
|
+
after :all do
|
20
|
+
cleanup_default_gems
|
21
|
+
end
|
22
|
+
|
23
|
+
before parallel: true do
|
24
|
+
unless Appraisal::Utils.support_parallel_installation?
|
25
|
+
pending 'This Bundler version does not support --jobs flag.'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
before do
|
30
|
+
cleanup_artifacts
|
31
|
+
build_default_gemfile
|
32
|
+
unset_bundler_env_vars
|
33
|
+
ENV["GEM_PATH"] = [TMP_GEM_ROOT, ENV["GEM_PATH"]].join(":")
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
restore_env
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_appraisal_file(content)
|
42
|
+
write_file 'Appraisals', content.strip_heredoc
|
43
|
+
end
|
44
|
+
|
45
|
+
def build_gemfile(content)
|
46
|
+
write_file 'Gemfile', content.strip_heredoc
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_gemspec_to_gemfile
|
50
|
+
append_to_file 'gemfile', 'gemspec'
|
51
|
+
end
|
52
|
+
|
53
|
+
def build_gemspec
|
54
|
+
gem_name = dirs.last
|
55
|
+
|
56
|
+
write_file "#{gem_name}.gemspec", <<-gemspec
|
57
|
+
Gem::Specification.new do |s|
|
58
|
+
s.name = '#{gem_name}'
|
59
|
+
s.version = '0.1'
|
60
|
+
s.summary = 'Awesome Gem!'
|
61
|
+
end
|
62
|
+
gemspec
|
63
|
+
end
|
64
|
+
|
65
|
+
def content_of(path)
|
66
|
+
file(path).read
|
67
|
+
end
|
68
|
+
|
69
|
+
def file(path)
|
70
|
+
Pathname.new(current_dir) + path
|
71
|
+
end
|
72
|
+
|
73
|
+
def be_exists
|
74
|
+
be_exist
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def cleanup_artifacts
|
80
|
+
FileUtils.rm_rf(current_dir)
|
81
|
+
end
|
82
|
+
|
83
|
+
def cleanup_default_gems
|
84
|
+
FileUtils.rm_rf(TMP_GEM_ROOT)
|
85
|
+
end
|
86
|
+
|
87
|
+
def initialize_aruba_instance_variables
|
88
|
+
@announce_stdout = nil
|
89
|
+
@announce_stderr = nil
|
90
|
+
@announce_cmd = nil
|
91
|
+
@announce_dir = nil
|
92
|
+
@announce_env = nil
|
93
|
+
@aruba_timeout_seconds = 60
|
94
|
+
@aruba_io_wait_seconds = nil
|
95
|
+
end
|
96
|
+
|
97
|
+
def build_default_dummy_gems
|
98
|
+
FileUtils.rm_rf(TMP_GEM_ROOT)
|
99
|
+
FileUtils.mkdir_p(TMP_GEM_ROOT)
|
100
|
+
|
101
|
+
build_gem 'dummy', '1.0.0'
|
102
|
+
build_gem 'dummy', '1.1.0'
|
103
|
+
end
|
104
|
+
|
105
|
+
def build_default_gemfile
|
106
|
+
build_gemfile <<-Gemfile
|
107
|
+
source 'https://rubygems.org'
|
108
|
+
|
109
|
+
gem 'dummy'
|
110
|
+
gem 'appraisal', :path => '#{PROJECT_ROOT}'
|
111
|
+
Gemfile
|
112
|
+
end
|
113
|
+
end
|