appraisal 1.0.0.beta3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -8
- data/appraisal.gemspec +0 -2
- data/bin/appraisal +6 -1
- data/features/support/dependency_helpers.rb +27 -21
- data/lib/appraisal/appraisal.rb +30 -2
- data/lib/appraisal/dependency.rb +3 -5
- data/lib/appraisal/dependency_list.rb +21 -0
- data/lib/appraisal/gemfile.rb +37 -27
- data/lib/appraisal/gemspec.rb +5 -4
- data/lib/appraisal/git_source.rb +12 -4
- data/lib/appraisal/group.rb +11 -4
- data/lib/appraisal/path_source.rb +31 -0
- data/lib/appraisal/platform.rb +12 -4
- data/lib/appraisal/task.rb +10 -7
- data/lib/appraisal/utils.rb +21 -0
- data/lib/appraisal/version.rb +1 -1
- data/spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb +98 -0
- data/spec/acceptance/cli/clean_spec.rb +20 -0
- data/spec/acceptance/cli/generate_spec.rb +28 -0
- data/spec/acceptance/cli/help_spec.rb +17 -0
- data/spec/acceptance/cli/install_spec.rb +70 -0
- data/spec/acceptance/cli/run_spec.rb +47 -0
- data/spec/acceptance/cli/update_spec.rb +43 -0
- data/spec/acceptance/cli/with_no_arguments_spec.rb +16 -0
- data/spec/acceptance/gemfile_dsl_compatibility_spec.rb +107 -0
- data/spec/acceptance/gemspec_spec.rb +75 -0
- data/spec/appraisal/gemspec_spec.rb +22 -0
- data/spec/appraisal/utils_spec.rb +24 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/support/acceptance_test_helpers.rb +73 -35
- data/spec/support/dependency_helpers.rb +49 -0
- metadata +32 -48
- data/features/appraisals.feature +0 -105
- data/features/bundler_gemfile_compatibility.feature +0 -70
- data/features/gemspec.feature +0 -68
- data/features/missing_appraisals_file.feature +0 -23
- data/features/step_definitions/dependency_steps.rb +0 -24
- data/features/support/aruba.rb +0 -4
- data/features/support/env.rb +0 -11
- data/spec/acceptance/cli_spec.rb +0 -233
data/lib/appraisal/task.rb
CHANGED
@@ -28,14 +28,17 @@ module Appraisal
|
|
28
28
|
exec 'bundle exec appraisal clean'
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
"
|
37
|
-
|
31
|
+
begin
|
32
|
+
File.each do |appraisal|
|
33
|
+
desc "DEPRECATED: Run the given task for appraisal #{appraisal.name}"
|
34
|
+
task appraisal.name do
|
35
|
+
ARGV.shift
|
36
|
+
warn "`rake appraisal:#{appraisal.name}` task is deprecated and will be removed soon. " +
|
37
|
+
"Please use `appraisal #{appraisal.name} rake #{ARGV.join(' ')}`."
|
38
|
+
exec "bundle exec appraisal #{appraisal.name} rake #{ARGV.join(' ')}"
|
39
|
+
end
|
38
40
|
end
|
41
|
+
rescue AppraisalsNotFound
|
39
42
|
end
|
40
43
|
|
41
44
|
task :all do
|
data/lib/appraisal/utils.rb
CHANGED
@@ -4,5 +4,26 @@ module Appraisal
|
|
4
4
|
def self.support_parallel_installation?
|
5
5
|
Gem::Version.create(Bundler::VERSION) >= Gem::Version.create('1.4.0.pre.1')
|
6
6
|
end
|
7
|
+
|
8
|
+
def self.format_string(object, enclosing_object = false)
|
9
|
+
case object
|
10
|
+
when Hash
|
11
|
+
items = object.map do |key, value|
|
12
|
+
"#{format_string(key, true)} => #{format_string(value, true)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
if enclosing_object
|
16
|
+
"{ #{items.join(', ')} }"
|
17
|
+
else
|
18
|
+
items.join(', ')
|
19
|
+
end
|
20
|
+
else
|
21
|
+
object.inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.format_arguments(arguments)
|
26
|
+
arguments.map { |object| format_string(object, false) }.join(', ')
|
27
|
+
end
|
7
28
|
end
|
8
29
|
end
|
data/lib/appraisal/version.rb
CHANGED
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Appraisals file Bundler DSL compatibility' do
|
4
|
+
it 'supports all Bundler DSL in Appraisals file' do
|
5
|
+
build_gems %w(bagel orange_juice milk waffle)
|
6
|
+
build_git_gem 'egg'
|
7
|
+
|
8
|
+
build_gemfile <<-Gemfile
|
9
|
+
source 'https://rubygems.org'
|
10
|
+
ruby RUBY_VERSION
|
11
|
+
|
12
|
+
gem 'bagel'
|
13
|
+
|
14
|
+
git '../gems/egg' do
|
15
|
+
gem 'egg'
|
16
|
+
end
|
17
|
+
|
18
|
+
path '../gems/waffle' do
|
19
|
+
gem 'waffle'
|
20
|
+
end
|
21
|
+
|
22
|
+
group :breakfast do
|
23
|
+
gem 'orange_juice'
|
24
|
+
end
|
25
|
+
|
26
|
+
platforms :ruby, :jruby do
|
27
|
+
gem 'milk'
|
28
|
+
end
|
29
|
+
|
30
|
+
gem 'appraisal', path: #{PROJECT_ROOT.inspect}
|
31
|
+
Gemfile
|
32
|
+
|
33
|
+
build_appraisal_file <<-Appraisals
|
34
|
+
appraise 'breakfast' do
|
35
|
+
source 'http://some-other-source.com'
|
36
|
+
ruby "1.8.7"
|
37
|
+
|
38
|
+
gem 'bread'
|
39
|
+
|
40
|
+
git '../gems/egg' do
|
41
|
+
gem 'porched_egg'
|
42
|
+
end
|
43
|
+
|
44
|
+
path '../gems/waffle' do
|
45
|
+
gem 'chocolate_waffle'
|
46
|
+
end
|
47
|
+
|
48
|
+
group :breakfast do
|
49
|
+
gem 'bacon'
|
50
|
+
end
|
51
|
+
|
52
|
+
platforms :ruby, :jruby do
|
53
|
+
gem 'yoghurt'
|
54
|
+
end
|
55
|
+
|
56
|
+
gemspec
|
57
|
+
end
|
58
|
+
Appraisals
|
59
|
+
|
60
|
+
run 'bundle install --local'
|
61
|
+
run 'appraisal generate'
|
62
|
+
|
63
|
+
expect(content_of 'gemfiles/breakfast.gemfile').to eq <<-Gemfile.strip_heredoc
|
64
|
+
# This file was generated by Appraisal
|
65
|
+
|
66
|
+
source "https://rubygems.org"
|
67
|
+
source "http://some-other-source.com"
|
68
|
+
|
69
|
+
ruby "1.8.7"
|
70
|
+
|
71
|
+
git "../gems/egg" do
|
72
|
+
gem "egg"
|
73
|
+
gem "porched_egg"
|
74
|
+
end
|
75
|
+
|
76
|
+
path "../gems/waffle" do
|
77
|
+
gem "waffle"
|
78
|
+
gem "chocolate_waffle"
|
79
|
+
end
|
80
|
+
|
81
|
+
gem "bagel"
|
82
|
+
gem "appraisal", :path => #{PROJECT_ROOT.inspect}
|
83
|
+
gem "bread"
|
84
|
+
|
85
|
+
group :breakfast do
|
86
|
+
gem "orange_juice"
|
87
|
+
gem "bacon"
|
88
|
+
end
|
89
|
+
|
90
|
+
platforms :ruby, :jruby do
|
91
|
+
gem "milk"
|
92
|
+
gem "yoghurt"
|
93
|
+
end
|
94
|
+
|
95
|
+
gemspec :path => "../"
|
96
|
+
Gemfile
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI', 'appraisal clean' do
|
4
|
+
it 'remove all gemfiles from gemfiles directory' do
|
5
|
+
build_appraisal_file <<-Appraisal
|
6
|
+
appraise '1.0.0' do
|
7
|
+
gem 'dummy', '1.0.0'
|
8
|
+
end
|
9
|
+
Appraisal
|
10
|
+
|
11
|
+
run 'appraisal install'
|
12
|
+
write_file 'gemfiles/non_related_file', ''
|
13
|
+
|
14
|
+
run 'appraisal clean'
|
15
|
+
|
16
|
+
expect(file 'gemfiles/1.0.0.gemfile').not_to be_exists
|
17
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').not_to be_exists
|
18
|
+
expect(file 'gemfiles/non_related_file').to be_exists
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI', 'appraisal generate' do
|
4
|
+
it 'generates the gemfiles' do
|
5
|
+
build_appraisal_file <<-Appraisal
|
6
|
+
appraise '1.0.0' do
|
7
|
+
gem 'dummy', '1.0.0'
|
8
|
+
end
|
9
|
+
|
10
|
+
appraise '1.1.0' do
|
11
|
+
gem 'dummy', '1.1.0'
|
12
|
+
end
|
13
|
+
Appraisal
|
14
|
+
|
15
|
+
run 'appraisal generate'
|
16
|
+
|
17
|
+
expect(file 'gemfiles/1.0.0.gemfile').to be_exists
|
18
|
+
expect(file 'gemfiles/1.1.0.gemfile').to be_exists
|
19
|
+
expect(content_of 'gemfiles/1.0.0.gemfile').to eq <<-gemfile.strip_heredoc
|
20
|
+
# This file was generated by Appraisal
|
21
|
+
|
22
|
+
source "https://rubygems.org"
|
23
|
+
|
24
|
+
gem "appraisal", :path => "#{PROJECT_ROOT}"
|
25
|
+
gem "dummy", "1.0.0"
|
26
|
+
gemfile
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI', 'appraisal help' do
|
4
|
+
it 'prints usage along with commands, and list of appraisals' do
|
5
|
+
build_appraisal_file <<-Appraisal
|
6
|
+
appraise '1.0.0' do
|
7
|
+
gem 'dummy', '1.0.0'
|
8
|
+
end
|
9
|
+
Appraisal
|
10
|
+
|
11
|
+
output = run 'appraisal help'
|
12
|
+
|
13
|
+
expect(output).to include 'Usage:'
|
14
|
+
expect(output).to include 'appraisal [APPRAISAL_NAME] EXTERNAL_COMMAND'
|
15
|
+
expect(output).to include '1.0.0'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI', 'appraisal install' do
|
4
|
+
it 'raises error when there is no Appraisals file' do
|
5
|
+
output = run 'appraisal install 2>&1', false
|
6
|
+
|
7
|
+
expect(output).to include "Unable to locate 'Appraisals' file"
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'installs the dependencies' do
|
11
|
+
build_appraisal_file <<-Appraisal
|
12
|
+
appraise '1.0.0' do
|
13
|
+
gem 'dummy', '1.0.0'
|
14
|
+
end
|
15
|
+
|
16
|
+
appraise '1.1.0' do
|
17
|
+
gem 'dummy', '1.1.0'
|
18
|
+
end
|
19
|
+
Appraisal
|
20
|
+
|
21
|
+
run 'appraisal install'
|
22
|
+
|
23
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').to be_exists
|
24
|
+
expect(file 'gemfiles/1.1.0.gemfile.lock').to be_exists
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'relativize directory in gemfile.lock' do
|
28
|
+
build_gemspec
|
29
|
+
add_gemspec_to_gemfile
|
30
|
+
|
31
|
+
build_appraisal_file <<-Appraisal
|
32
|
+
appraise '1.0.0' do
|
33
|
+
gem 'dummy', '1.0.0'
|
34
|
+
end
|
35
|
+
Appraisal
|
36
|
+
|
37
|
+
run 'appraisal install'
|
38
|
+
|
39
|
+
expect(content_of 'gemfiles/1.0.0.gemfile.lock').not_to include
|
40
|
+
current_directory
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with job size', parallel: true do
|
44
|
+
before do
|
45
|
+
build_appraisal_file <<-Appraisal
|
46
|
+
appraise '1.0.0' do
|
47
|
+
gem 'dummy', '1.0.0'
|
48
|
+
end
|
49
|
+
Appraisal
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'accepts --jobs option to set job size' do
|
53
|
+
output = run 'appraisal install --jobs=2'
|
54
|
+
|
55
|
+
expect(output).to include
|
56
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=2'
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'ignores --jobs option if the job size is less than or equal to 1' do
|
60
|
+
output = run 'appraisal install --jobs=0'
|
61
|
+
|
62
|
+
expect(output).not_to include
|
63
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile'
|
64
|
+
expect(output).not_to include
|
65
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=0'
|
66
|
+
expect(output).not_to include
|
67
|
+
'bundle install --gemfile=gemfiles/1.0.0.gemfile --jobs=1'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI appraisal (with arguments)' do
|
4
|
+
before do
|
5
|
+
build_appraisal_file <<-Appraisal
|
6
|
+
appraise '1.0.0' do
|
7
|
+
gem 'dummy', '1.0.0'
|
8
|
+
end
|
9
|
+
|
10
|
+
appraise '1.1.0' do
|
11
|
+
gem 'dummy', '1.1.0'
|
12
|
+
end
|
13
|
+
Appraisal
|
14
|
+
|
15
|
+
run 'appraisal install'
|
16
|
+
write_file 'test.rb', 'puts "Running: #{$dummy_version}"'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets APPRAISAL_INITIALIZED environment variable' do
|
20
|
+
write_file 'test.rb', <<-TEST_FILE.strip_heredoc
|
21
|
+
if ENV['APPRAISAL_INITIALIZED']
|
22
|
+
puts "Appraisal initialized!"
|
23
|
+
end
|
24
|
+
TEST_FILE
|
25
|
+
|
26
|
+
output = run 'appraisal 1.0.0 ruby -rbundler/setup -rdummy test.rb'
|
27
|
+
expect(output).to include 'Appraisal initialized!'
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with appraisal name' do
|
31
|
+
it 'runs the given command against a correct versions of dependency' do
|
32
|
+
output = run 'appraisal 1.0.0 ruby -rbundler/setup -rdummy test.rb'
|
33
|
+
|
34
|
+
expect(output).to include 'Running: 1.0.0'
|
35
|
+
expect(output).not_to include 'Running: 1.1.0'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'without appraisal name' do
|
40
|
+
it 'runs the given command against all versions of dependency' do
|
41
|
+
output = run 'appraisal ruby -rbundler/setup -rdummy test.rb'
|
42
|
+
|
43
|
+
expect(output).to include 'Running: 1.0.0'
|
44
|
+
expect(output).to include 'Running: 1.1.0'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI', 'appraisal update' do
|
4
|
+
before do
|
5
|
+
build_gem 'dummy2', '1.0.0'
|
6
|
+
|
7
|
+
build_appraisal_file <<-Appraisal
|
8
|
+
appraise 'dummy' do
|
9
|
+
gem 'dummy', '~> 1.0.0'
|
10
|
+
gem 'dummy2', '~> 1.0.0'
|
11
|
+
end
|
12
|
+
Appraisal
|
13
|
+
|
14
|
+
run 'appraisal install'
|
15
|
+
build_gem 'dummy', '1.0.1'
|
16
|
+
build_gem 'dummy2', '1.0.1'
|
17
|
+
end
|
18
|
+
|
19
|
+
after do
|
20
|
+
in_test_directory do
|
21
|
+
`gem uninstall dummy -v 1.0.1`
|
22
|
+
`gem uninstall dummy2 -a`
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'with no arguments' do
|
27
|
+
it 'updates all the gems' do
|
28
|
+
run 'appraisal update'
|
29
|
+
|
30
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy (1.0.1)'
|
31
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy2 (1.0.1)'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with a list of gems' do
|
36
|
+
it 'only updates specified gems' do
|
37
|
+
run 'appraisal update dummy'
|
38
|
+
|
39
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy (1.0.1)'
|
40
|
+
expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy2 (1.0.0)'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'CLI appraisal (with no arguments)' do
|
4
|
+
it 'runs install command' do
|
5
|
+
build_appraisal_file <<-Appraisal
|
6
|
+
appraise '1.0.0' do
|
7
|
+
gem 'dummy', '1.0.0'
|
8
|
+
end
|
9
|
+
Appraisal
|
10
|
+
|
11
|
+
run 'appraisal'
|
12
|
+
|
13
|
+
expect(file 'gemfiles/1.0.0.gemfile').to be_exists
|
14
|
+
expect(file 'gemfiles/1.0.0.gemfile.lock').to be_exists
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Gemfile DSL compatibility' do
|
4
|
+
it 'supports all Bundler DSL in Gemfile' do
|
5
|
+
build_gems %w(bacon orange_juice waffle)
|
6
|
+
build_git_gem 'egg'
|
7
|
+
build_gemspec
|
8
|
+
|
9
|
+
build_gemfile <<-Gemfile
|
10
|
+
source "https://rubygems.org"
|
11
|
+
ruby RUBY_VERSION
|
12
|
+
|
13
|
+
git "../gems/egg" do
|
14
|
+
gem "egg"
|
15
|
+
end
|
16
|
+
|
17
|
+
path "../gems/orange_juice" do
|
18
|
+
gem "orange_juice"
|
19
|
+
end
|
20
|
+
|
21
|
+
group :breakfast do
|
22
|
+
gem "bacon"
|
23
|
+
end
|
24
|
+
|
25
|
+
platforms :ruby, :jruby do
|
26
|
+
gem "waffle"
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'appraisal', path: #{PROJECT_ROOT.inspect}
|
30
|
+
|
31
|
+
gemspec
|
32
|
+
Gemfile
|
33
|
+
|
34
|
+
build_appraisal_file <<-Appraisals
|
35
|
+
appraise "japanese" do
|
36
|
+
gem "rice"
|
37
|
+
gem "miso_soup"
|
38
|
+
end
|
39
|
+
|
40
|
+
appraise "english" do
|
41
|
+
gem "bread"
|
42
|
+
end
|
43
|
+
Appraisals
|
44
|
+
|
45
|
+
run 'bundle install --local'
|
46
|
+
run 'appraisal generate'
|
47
|
+
|
48
|
+
expect(content_of 'gemfiles/japanese.gemfile').to eq <<-Gemfile.strip_heredoc
|
49
|
+
# This file was generated by Appraisal
|
50
|
+
|
51
|
+
source "https://rubygems.org"
|
52
|
+
|
53
|
+
ruby "#{RUBY_VERSION}"
|
54
|
+
|
55
|
+
git "../gems/egg" do
|
56
|
+
gem "egg"
|
57
|
+
end
|
58
|
+
|
59
|
+
path "../gems/orange_juice" do
|
60
|
+
gem "orange_juice"
|
61
|
+
end
|
62
|
+
|
63
|
+
gem "appraisal", :path => #{PROJECT_ROOT.inspect}
|
64
|
+
gem "rice"
|
65
|
+
gem "miso_soup"
|
66
|
+
|
67
|
+
group :breakfast do
|
68
|
+
gem "bacon"
|
69
|
+
end
|
70
|
+
|
71
|
+
platforms :ruby, :jruby do
|
72
|
+
gem "waffle"
|
73
|
+
end
|
74
|
+
|
75
|
+
gemspec :path => "../"
|
76
|
+
Gemfile
|
77
|
+
|
78
|
+
expect(content_of 'gemfiles/english.gemfile').to eq <<-Gemfile.strip_heredoc
|
79
|
+
# This file was generated by Appraisal
|
80
|
+
|
81
|
+
source "https://rubygems.org"
|
82
|
+
|
83
|
+
ruby "#{RUBY_VERSION}"
|
84
|
+
|
85
|
+
git "../gems/egg" do
|
86
|
+
gem "egg"
|
87
|
+
end
|
88
|
+
|
89
|
+
path "../gems/orange_juice" do
|
90
|
+
gem "orange_juice"
|
91
|
+
end
|
92
|
+
|
93
|
+
gem "appraisal", :path => #{PROJECT_ROOT.inspect}
|
94
|
+
gem "bread"
|
95
|
+
|
96
|
+
group :breakfast do
|
97
|
+
gem "bacon"
|
98
|
+
end
|
99
|
+
|
100
|
+
platforms :ruby, :jruby do
|
101
|
+
gem "waffle"
|
102
|
+
end
|
103
|
+
|
104
|
+
gemspec :path => "../"
|
105
|
+
Gemfile
|
106
|
+
end
|
107
|
+
end
|