appraisal 1.0.3 → 2.0.0
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 +1 -0
- data/CONTRIBUTING.md +6 -2
- data/Gemfile +5 -0
- data/README.md +5 -0
- data/appraisal.gemspec +1 -1
- data/lib/appraisal/appraisal.rb +10 -2
- data/lib/appraisal/bundler_dsl.rb +124 -0
- data/lib/appraisal/cli.rb +21 -2
- data/lib/appraisal/command.rb +22 -6
- data/lib/appraisal/dependency_list.rb +2 -1
- data/lib/appraisal/gemfile.rb +9 -126
- data/lib/appraisal/gemspec.rb +1 -1
- data/lib/appraisal/git_source.rb +7 -19
- data/lib/appraisal/group.rb +5 -46
- data/lib/appraisal/path_source.rb +7 -19
- data/lib/appraisal/platform.rb +16 -14
- data/lib/appraisal/travis_ci_helper.rb +65 -0
- data/lib/appraisal/version.rb +1 -1
- data/spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb +18 -2
- data/spec/acceptance/bundle_with_custom_path_spec.rb +22 -0
- data/spec/acceptance/cli/generate_spec.rb +6 -0
- data/spec/acceptance/cli/install_spec.rb +1 -1
- data/spec/acceptance/cli/list_spec.rb +28 -0
- data/spec/acceptance/cli/version_spec.rb +27 -0
- data/spec/acceptance/gemfile_dsl_compatibility_spec.rb +3 -3
- data/spec/acceptance/gemspec_spec.rb +3 -3
- data/spec/acceptance/travis_ci_integration_spec.rb +94 -0
- data/spec/appraisal/gemfile_spec.rb +147 -16
- data/spec/appraisal/utils_spec.rb +6 -5
- data/spec/spec_helper.rb +6 -2
- data/spec/support/acceptance_test_helpers.rb +24 -18
- data/spec/support/dependency_helpers.rb +7 -0
- metadata +15 -7
- data/features/support/dependency_helpers.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f0ed208de18ec1152d5f8d9d77e86a42236f89f
|
4
|
+
data.tar.gz: 5a0a145e1c89faeb6447aa5ca47b9662e69ed84c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c182a653a7e693cfcf9f288aa25a0f9c5ec312b89c7ea3741927eea0a4d4c7890230ef760313a3753bfee4cb9ddf3a5829f255f5a14393fd6013724e0bcf97f
|
7
|
+
data.tar.gz: 9bc7f08e8982c0234ddc3e098fe75ba530604eb2f79546032537db14faa74d2dc3aa71a17e5e15ced8059e39de17701bff90e6b66caa3c76422071d8b4a44f6b
|
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
We love pull requests from everyone. By participating in this project, you agree
|
4
|
+
to abide by the thoughtbot [code of conduct].
|
5
|
+
|
6
|
+
[code of conduct]: https://thoughtbot.com/open-source-code-of-conduct
|
2
7
|
|
3
8
|
1. Fork the repo.
|
4
9
|
|
@@ -13,7 +18,6 @@ a test!
|
|
13
18
|
|
14
19
|
5. Push to your fork and submit a pull request.
|
15
20
|
|
16
|
-
|
17
21
|
At this point you're waiting on us. We like to at least comment on, if not
|
18
22
|
accept, pull requests within three business days (and, typically, one business
|
19
23
|
day). We may suggest some changes or improvements or alternatives.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -139,6 +139,11 @@ all versions of its dependency, you might have to set a `script` setting:
|
|
139
139
|
That will make sure that each of the test sub-job are not getting run more than
|
140
140
|
one time.
|
141
141
|
|
142
|
+
You can also running your test against multiple versions of Ruby locally, just
|
143
|
+
like running on Travis CI, by using [WWTD].
|
144
|
+
|
145
|
+
[WWTD]: https://github.com/grosser/wwtd
|
146
|
+
|
142
147
|
Credits
|
143
148
|
-------
|
144
149
|
|
data/appraisal.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_runtime_dependency('rake')
|
22
22
|
s.add_runtime_dependency('bundler')
|
23
23
|
s.add_runtime_dependency('thor', '>= 0.14.0')
|
24
|
+
s.add_runtime_dependency("activesupport", ">= 3.2.21")
|
24
25
|
|
25
|
-
s.add_development_dependency('activesupport', '>= 3.2.13')
|
26
26
|
s.add_development_dependency('rspec', '~> 3.0')
|
27
27
|
end
|
data/lib/appraisal/appraisal.rb
CHANGED
@@ -65,7 +65,7 @@ module Appraisal
|
|
65
65
|
|
66
66
|
def update(gems = [])
|
67
67
|
command, env = update_command(gems)
|
68
|
-
Command.new(command, env
|
68
|
+
Command.new(command, :env => env).run
|
69
69
|
end
|
70
70
|
|
71
71
|
def gemfile_path
|
@@ -73,7 +73,11 @@ module Appraisal
|
|
73
73
|
gemfile_root.mkdir
|
74
74
|
end
|
75
75
|
|
76
|
-
gemfile_root.join(
|
76
|
+
gemfile_root.join(gemfile_name).to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
def relative_gemfile_path
|
80
|
+
::File.join("gemfiles", gemfile_name)
|
77
81
|
end
|
78
82
|
|
79
83
|
def relativize
|
@@ -108,6 +112,10 @@ module Appraisal
|
|
108
112
|
Pathname.new(::File.join(Dir.pwd, "gemfiles"))
|
109
113
|
end
|
110
114
|
|
115
|
+
def gemfile_name
|
116
|
+
"#{clean_name}.gemfile"
|
117
|
+
end
|
118
|
+
|
111
119
|
def lockfile_path
|
112
120
|
"#{gemfile_path}.lock"
|
113
121
|
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require "appraisal/dependency_list"
|
2
|
+
require "active_support/ordered_hash"
|
3
|
+
|
4
|
+
module Appraisal
|
5
|
+
class BundlerDSL
|
6
|
+
attr_reader :dependencies
|
7
|
+
|
8
|
+
PARTS = %w(source ruby_version git_sources path_sources dependencies groups
|
9
|
+
platforms gemspec)
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@sources = []
|
13
|
+
@ruby_version = nil
|
14
|
+
@dependencies = DependencyList.new
|
15
|
+
@gemspec = nil
|
16
|
+
@groups = ActiveSupport::OrderedHash.new
|
17
|
+
@platforms = ActiveSupport::OrderedHash.new
|
18
|
+
@git_sources = ActiveSupport::OrderedHash.new
|
19
|
+
@path_sources = ActiveSupport::OrderedHash.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def run(&block)
|
23
|
+
instance_exec(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def gem(name, *requirements)
|
27
|
+
@dependencies.add(name, requirements)
|
28
|
+
end
|
29
|
+
|
30
|
+
def group(*names, &block)
|
31
|
+
@groups[names] ||= Group.new(names)
|
32
|
+
@groups[names].run(&block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def platforms(*names, &block)
|
36
|
+
@platforms[names] ||= Platform.new(names)
|
37
|
+
@platforms[names].run(&block)
|
38
|
+
end
|
39
|
+
|
40
|
+
alias_method :platform, :platforms
|
41
|
+
|
42
|
+
def source(source)
|
43
|
+
@sources << source
|
44
|
+
end
|
45
|
+
|
46
|
+
def ruby(ruby_version)
|
47
|
+
@ruby_version = ruby_version
|
48
|
+
end
|
49
|
+
|
50
|
+
def git(source, options = {}, &block)
|
51
|
+
@git_sources[source] ||= GitSource.new(source, options)
|
52
|
+
@git_sources[source].run(&block)
|
53
|
+
end
|
54
|
+
|
55
|
+
def path(source, options = {}, &block)
|
56
|
+
@path_sources[source] ||= PathSource.new(source, options)
|
57
|
+
@path_sources[source].run(&block)
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_s
|
61
|
+
Utils.join_parts PARTS.map { |part| send("#{part}_entry") }
|
62
|
+
end
|
63
|
+
|
64
|
+
def for_dup
|
65
|
+
Utils.join_parts PARTS.map { |part| send("#{part}_entry_for_dup") }
|
66
|
+
end
|
67
|
+
|
68
|
+
def gemspec(options = {})
|
69
|
+
@gemspec = Gemspec.new(options)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def source_entry
|
75
|
+
@sources.uniq.map { |source| "source #{source.inspect}" }.join("\n")
|
76
|
+
end
|
77
|
+
|
78
|
+
alias_method :source_entry_for_dup, :source_entry
|
79
|
+
|
80
|
+
def ruby_version_entry
|
81
|
+
if @ruby_version
|
82
|
+
"ruby #{@ruby_version.inspect}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
alias_method :ruby_version_entry_for_dup, :ruby_version_entry
|
87
|
+
|
88
|
+
[:dependencies, :gemspec].each do |method_name|
|
89
|
+
class_eval <<-METHODS, __FILE__, __LINE__
|
90
|
+
private
|
91
|
+
|
92
|
+
def #{method_name}_entry
|
93
|
+
if @#{method_name}
|
94
|
+
@#{method_name}.to_s
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def #{method_name}_entry_for_dup
|
99
|
+
if @#{method_name}
|
100
|
+
@#{method_name}.for_dup
|
101
|
+
end
|
102
|
+
end
|
103
|
+
METHODS
|
104
|
+
end
|
105
|
+
|
106
|
+
[:git_sources, :path_sources, :platforms, :groups].each do |method_name|
|
107
|
+
class_eval <<-METHODS, __FILE__, __LINE__
|
108
|
+
private
|
109
|
+
|
110
|
+
def #{method_name}_entry
|
111
|
+
@#{method_name}.values.map(&:to_s).join("\n\n")
|
112
|
+
end
|
113
|
+
|
114
|
+
def #{method_name}_entry_for_dup
|
115
|
+
@#{method_name}.values.map(&:for_dup).join("\n\n")
|
116
|
+
end
|
117
|
+
METHODS
|
118
|
+
end
|
119
|
+
|
120
|
+
def indent(string)
|
121
|
+
string.strip.gsub(/^(.+)$/, ' \1')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/lib/appraisal/cli.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'fileutils'
|
3
|
+
require "appraisal/travis_ci_helper"
|
3
4
|
|
4
5
|
module Appraisal
|
5
6
|
class CLI < Thor
|
6
7
|
default_task :install
|
8
|
+
map ["-v", "--version"] => "version"
|
7
9
|
|
8
10
|
# Override help command to print out usage
|
9
11
|
def self.help(shell, subcommand = false)
|
@@ -49,10 +51,17 @@ module Appraisal
|
|
49
51
|
end
|
50
52
|
|
51
53
|
desc 'generate', 'Generate a gemfile for each appraisal'
|
54
|
+
method_option "travis", :type => :boolean, :default => false
|
52
55
|
def generate
|
53
56
|
File.each do |appraisal|
|
54
57
|
appraisal.write_gemfile
|
55
58
|
end
|
59
|
+
|
60
|
+
if options[:travis]
|
61
|
+
TravisCIHelper.display_instruction
|
62
|
+
else
|
63
|
+
TravisCIHelper.validate_configuration_file
|
64
|
+
end
|
56
65
|
end
|
57
66
|
|
58
67
|
desc 'clean', 'Remove all generated gemfiles and lockfiles from gemfiles folder'
|
@@ -69,16 +78,26 @@ module Appraisal
|
|
69
78
|
end
|
70
79
|
end
|
71
80
|
|
81
|
+
desc 'list', 'List the names of the defined appraisals'
|
82
|
+
def list
|
83
|
+
File.new.appraisals.each { |appraisal| puts appraisal.name }
|
84
|
+
end
|
85
|
+
|
86
|
+
desc "version", "Display the version and exit"
|
87
|
+
def version
|
88
|
+
puts "Appraisal #{VERSION}"
|
89
|
+
end
|
90
|
+
|
72
91
|
private
|
73
92
|
|
74
93
|
def method_missing(name, *args, &block)
|
75
94
|
matching_appraisal = File.new.appraisals.detect { |appraisal| appraisal.name == name.to_s }
|
76
95
|
|
77
96
|
if matching_appraisal
|
78
|
-
Command.new(args, gemfile
|
97
|
+
Command.new(args, :gemfile => matching_appraisal.gemfile_path).run
|
79
98
|
else
|
80
99
|
File.each do |appraisal|
|
81
|
-
Command.new(ARGV, gemfile
|
100
|
+
Command.new(ARGV, :gemfile => appraisal.gemfile_path).run
|
82
101
|
end
|
83
102
|
end
|
84
103
|
end
|
data/lib/appraisal/command.rb
CHANGED
@@ -15,19 +15,20 @@ module Appraisal
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
|
+
with_clean_env { ensure_bundler_is_available }
|
18
19
|
announce
|
20
|
+
|
19
21
|
with_clean_env do
|
20
|
-
|
22
|
+
env.each_pair do |key, value|
|
23
|
+
ENV[key] = value
|
24
|
+
end
|
25
|
+
|
26
|
+
unless Kernel.system(command_as_string)
|
21
27
|
exit(1)
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
26
|
-
def exec
|
27
|
-
announce
|
28
|
-
with_clean_env { Kernel.exec(env, command_as_string) }
|
29
|
-
end
|
30
|
-
|
31
32
|
private
|
32
33
|
|
33
34
|
def with_clean_env
|
@@ -39,6 +40,21 @@ module Appraisal
|
|
39
40
|
restore_env
|
40
41
|
end
|
41
42
|
|
43
|
+
def ensure_bundler_is_available
|
44
|
+
unless system %(gem list -q "^bundler$" | grep -q bundler)
|
45
|
+
puts ">> Reinstall Bundler into #{ENV["GEM_HOME"]}"
|
46
|
+
|
47
|
+
unless system "gem install bundler"
|
48
|
+
puts
|
49
|
+
puts <<-ERROR.strip.gsub(/\s+/, " ")
|
50
|
+
Bundler installation failed. Please try running
|
51
|
+
`GEM_HOME="#{ENV["GEM_HOME"]}" gem install bundler` manually.
|
52
|
+
ERROR
|
53
|
+
exit(1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
42
58
|
def announce
|
43
59
|
if gemfile
|
44
60
|
puts ">> BUNDLE_GEMFILE=#{gemfile} #{command_as_string}"
|
data/lib/appraisal/gemfile.rb
CHANGED
@@ -1,29 +1,14 @@
|
|
1
|
-
require
|
2
|
-
require 'appraisal/gemspec'
|
3
|
-
require 'appraisal/git_source'
|
4
|
-
require 'appraisal/path_source'
|
5
|
-
require 'appraisal/group'
|
6
|
-
require 'appraisal/platform'
|
1
|
+
require "appraisal/bundler_dsl"
|
7
2
|
|
8
3
|
module Appraisal
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
platforms gemspec)
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
@sources = []
|
18
|
-
@ruby_version = nil
|
19
|
-
@dependencies = DependencyList.new
|
20
|
-
@gemspec = nil
|
21
|
-
@groups = {}
|
22
|
-
@platforms = {}
|
23
|
-
@git_sources = {}
|
24
|
-
@path_sources = {}
|
25
|
-
end
|
4
|
+
autoload :Gemspec, "appraisal/gemspec"
|
5
|
+
autoload :GitSource, "appraisal/git_source"
|
6
|
+
autoload :PathSource, "appraisal/path_source"
|
7
|
+
autoload :Group, "appraisal/group"
|
8
|
+
autoload :Platform, "appraisal/platform"
|
26
9
|
|
10
|
+
# Load bundler Gemfiles and merge dependencies
|
11
|
+
class Gemfile < BundlerDSL
|
27
12
|
def load(path)
|
28
13
|
run(IO.read(path))
|
29
14
|
end
|
@@ -32,112 +17,10 @@ module Appraisal
|
|
32
17
|
instance_eval(definitions, __FILE__, __LINE__) if definitions
|
33
18
|
end
|
34
19
|
|
35
|
-
def gem(name, *requirements)
|
36
|
-
@dependencies.add(name, requirements)
|
37
|
-
end
|
38
|
-
|
39
|
-
def group(*names, &block)
|
40
|
-
@groups[names] ||= Group.new(names)
|
41
|
-
@groups[names].run(&block)
|
42
|
-
end
|
43
|
-
|
44
|
-
# :nodoc:
|
45
|
-
def groups(*names, &block)
|
46
|
-
$stderr.puts <<-WARNING.gsub(/\n\s+/, " ").strip
|
47
|
-
Warning: `#groups` is deprecated and will be removed in 2.0.0.
|
48
|
-
Please use `#group` instead.
|
49
|
-
WARNING
|
50
|
-
|
51
|
-
group(*names, &block)
|
52
|
-
end
|
53
|
-
|
54
|
-
def platforms(*names, &block)
|
55
|
-
@platforms[names] ||= Platform.new(names)
|
56
|
-
@platforms[names].run(&block)
|
57
|
-
end
|
58
|
-
|
59
|
-
alias_method :platform, :platforms
|
60
|
-
|
61
|
-
def source(source)
|
62
|
-
@sources << source
|
63
|
-
end
|
64
|
-
|
65
|
-
def ruby(ruby_version)
|
66
|
-
@ruby_version = ruby_version
|
67
|
-
end
|
68
|
-
|
69
|
-
def git(source, options = {}, &block)
|
70
|
-
@git_sources[source] ||= GitSource.new(source, options)
|
71
|
-
@git_sources[source].run(&block)
|
72
|
-
end
|
73
|
-
|
74
|
-
def path(source, options = {}, &block)
|
75
|
-
@path_sources[source] ||= PathSource.new(source, options)
|
76
|
-
@path_sources[source].run(&block)
|
77
|
-
end
|
78
|
-
|
79
|
-
def to_s
|
80
|
-
Utils.join_parts PARTS.map { |part| send("#{part}_entry") }
|
81
|
-
end
|
82
|
-
|
83
20
|
def dup
|
84
21
|
Gemfile.new.tap do |gemfile|
|
85
|
-
gemfile.run(
|
86
|
-
Utils.join_parts PARTS.map { |part| send("#{part}_entry_for_dup") }
|
87
|
-
)
|
22
|
+
gemfile.run(for_dup)
|
88
23
|
end
|
89
24
|
end
|
90
|
-
|
91
|
-
def gemspec(options = {})
|
92
|
-
@gemspec = Gemspec.new(options)
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def source_entry
|
98
|
-
@sources.map { |source| "source #{source.inspect}" }.join("\n")
|
99
|
-
end
|
100
|
-
|
101
|
-
alias_method :source_entry_for_dup, :source_entry
|
102
|
-
|
103
|
-
def ruby_version_entry
|
104
|
-
if @ruby_version
|
105
|
-
"ruby #{@ruby_version.inspect}"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
alias_method :ruby_version_entry_for_dup, :ruby_version_entry
|
110
|
-
|
111
|
-
[:dependencies, :gemspec].each do |method_name|
|
112
|
-
class_eval <<-METHODS, __FILE__, __LINE__
|
113
|
-
private
|
114
|
-
|
115
|
-
def #{method_name}_entry
|
116
|
-
if @#{method_name}
|
117
|
-
@#{method_name}.to_s
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def #{method_name}_entry_for_dup
|
122
|
-
if @#{method_name}
|
123
|
-
@#{method_name}.for_dup
|
124
|
-
end
|
125
|
-
end
|
126
|
-
METHODS
|
127
|
-
end
|
128
|
-
|
129
|
-
[:git_sources, :path_sources, :platforms, :groups].each do |method_name|
|
130
|
-
class_eval <<-METHODS, __FILE__, __LINE__
|
131
|
-
private
|
132
|
-
|
133
|
-
def #{method_name}_entry
|
134
|
-
@#{method_name}.values.map(&:to_s).join("\n\n")
|
135
|
-
end
|
136
|
-
|
137
|
-
def #{method_name}_entry_for_dup
|
138
|
-
@#{method_name}.values.map(&:for_dup).join("\n\n")
|
139
|
-
end
|
140
|
-
METHODS
|
141
|
-
end
|
142
25
|
end
|
143
26
|
end
|