appraisal 0.1
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.
- data/Gemfile +5 -0
- data/Gemfile.lock +38 -0
- data/README.textile +97 -0
- data/Rakefile +19 -0
- data/features/appraisals.feature +75 -0
- data/features/step_definitions/dependency_steps.rb +4 -0
- data/features/support/env.rb +4 -0
- data/lib/appraisal.rb +4 -0
- data/lib/appraisal/appraisal.rb +46 -0
- data/lib/appraisal/command.rb +57 -0
- data/lib/appraisal/dependency.rb +27 -0
- data/lib/appraisal/file.rb +41 -0
- data/lib/appraisal/gemfile.rb +42 -0
- data/lib/appraisal/task.rb +44 -0
- metadata +136 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
aruba (0.2.4)
|
5
|
+
background_process
|
6
|
+
cucumber (~> 0.9.3)
|
7
|
+
background_process (1.2)
|
8
|
+
builder (2.1.2)
|
9
|
+
cucumber (0.9.4)
|
10
|
+
builder (~> 2.1.2)
|
11
|
+
diff-lcs (~> 1.1.2)
|
12
|
+
gherkin (~> 2.2.9)
|
13
|
+
json (~> 1.4.6)
|
14
|
+
term-ansicolor (~> 1.0.5)
|
15
|
+
diff-lcs (1.1.2)
|
16
|
+
gherkin (2.2.9)
|
17
|
+
json (~> 1.4.6)
|
18
|
+
term-ansicolor (~> 1.0.5)
|
19
|
+
json (1.4.6)
|
20
|
+
rake (0.8.7)
|
21
|
+
rspec (2.1.0)
|
22
|
+
rspec-core (~> 2.1.0)
|
23
|
+
rspec-expectations (~> 2.1.0)
|
24
|
+
rspec-mocks (~> 2.1.0)
|
25
|
+
rspec-core (2.1.0)
|
26
|
+
rspec-expectations (2.1.0)
|
27
|
+
diff-lcs (~> 1.1.2)
|
28
|
+
rspec-mocks (2.1.0)
|
29
|
+
term-ansicolor (1.0.5)
|
30
|
+
|
31
|
+
PLATFORMS
|
32
|
+
ruby
|
33
|
+
|
34
|
+
DEPENDENCIES
|
35
|
+
aruba
|
36
|
+
cucumber
|
37
|
+
rake
|
38
|
+
rspec
|
data/README.textile
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
h1. Appraisal
|
2
|
+
|
3
|
+
Find out what your Ruby gems are worth.
|
4
|
+
|
5
|
+
h2. Synopsis
|
6
|
+
|
7
|
+
Appraisal integrates with bundler and rake to test your library against
|
8
|
+
different versions of dependencies in repeatable scenarios called "appraisals."
|
9
|
+
Appraisal is designed to make is easy to check for regressions in your library
|
10
|
+
without interfering with day-to-day development using bundler.
|
11
|
+
|
12
|
+
h2. Installation
|
13
|
+
|
14
|
+
<pre>
|
15
|
+
gem install appraisal
|
16
|
+
</pre>
|
17
|
+
|
18
|
+
h2. Setup
|
19
|
+
|
20
|
+
Setting up appraisal requires an Appraisals file (similar to a Gemfile) in your
|
21
|
+
project root, and some slight changes to your project's Rakefile.
|
22
|
+
|
23
|
+
An Appraisals file consists of several appraisal definitions. An appraisal
|
24
|
+
definition is simply a list of gem dependencies. For example, to test with a
|
25
|
+
few versions of Rails:
|
26
|
+
|
27
|
+
<pre>
|
28
|
+
appraise "rails2" do
|
29
|
+
gem "rails", "2.3.9"
|
30
|
+
end
|
31
|
+
|
32
|
+
appraise "rails3" do
|
33
|
+
gem "rails", "3.0.0"
|
34
|
+
end
|
35
|
+
</pre>
|
36
|
+
|
37
|
+
The dependencies in your Appraisals file are combined with dependencies in your
|
38
|
+
Gemfile, so you don't need to repeat anything that's the same for each
|
39
|
+
appraisal. If something is specified in both the Gemfile and an appraisal, the
|
40
|
+
version from the appraisal takes precedence.
|
41
|
+
|
42
|
+
Once you have an Appraisals file set up, just require appraisal in your Rakefile:
|
43
|
+
|
44
|
+
<pre>
|
45
|
+
require 'appraisal'
|
46
|
+
</pre>
|
47
|
+
|
48
|
+
It's also recommended that you setup bundler at the very top of your Rakefile,
|
49
|
+
so that you don't need to constantly run bundle exec:
|
50
|
+
|
51
|
+
<pre>
|
52
|
+
require 'rubygems'
|
53
|
+
require 'bundler/setup'
|
54
|
+
</pre>
|
55
|
+
|
56
|
+
h2. Usage
|
57
|
+
|
58
|
+
Once you've configured the appraisals you want to use, you need to install the
|
59
|
+
dependencies for each appraisal:
|
60
|
+
|
61
|
+
<pre>
|
62
|
+
rake appraisal:install
|
63
|
+
</pre>
|
64
|
+
|
65
|
+
This will resolve, install, and lock the dependencies for that appraisal using
|
66
|
+
bundler. Once you have your dependencies setup, you can run any rake task in a
|
67
|
+
single appraisal:
|
68
|
+
|
69
|
+
<pre>
|
70
|
+
rake appraisal:rails2 test
|
71
|
+
</pre>
|
72
|
+
|
73
|
+
This will run your "test" rake task using the dependencies configured for Rails
|
74
|
+
2. You can also run each appraisal in turn:
|
75
|
+
|
76
|
+
<pre>
|
77
|
+
rake appraisal test
|
78
|
+
</pre>
|
79
|
+
|
80
|
+
If you want to use only the dependencies from your Gemfile, just run "rake
|
81
|
+
test" as normal. This allows you to keep running with the latest versions of
|
82
|
+
your dependencies in quick test runs, but keep running the tests in older
|
83
|
+
versions to check for regressions.
|
84
|
+
|
85
|
+
h2. Under the hood
|
86
|
+
|
87
|
+
Running "rake appraisal:install" generates a Gemfile for each appraisal by
|
88
|
+
combining your root Gemfile with the specific requirements for each appraisal.
|
89
|
+
These are stored in the "gemfiles" directory, and should be added to version
|
90
|
+
control to ensure that the same versions are always used. When running rake
|
91
|
+
tasks for an appraisal, the rake task is run with the appropriate Gemfile for
|
92
|
+
that appraisal, ensuring the correct dependencies are used.
|
93
|
+
|
94
|
+
h2. Author
|
95
|
+
|
96
|
+
Copyright 2010 Joe Ferris
|
97
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'cucumber/rake/task'
|
5
|
+
|
6
|
+
eval("$specification = #{IO.read('appraisal.gemspec')}")
|
7
|
+
Rake::GemPackageTask.new($specification) do |package|
|
8
|
+
package.need_zip = true
|
9
|
+
package.need_tar = true
|
10
|
+
end
|
11
|
+
|
12
|
+
Cucumber::Rake::Task.new(:cucumber) do |t|
|
13
|
+
t.fork = true
|
14
|
+
t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Default: run the cucumber scenarios"
|
18
|
+
task :default => :cucumber
|
19
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
Feature: run a rake task through several appraisals
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a directory named "projecto"
|
5
|
+
When I cd to "projecto"
|
6
|
+
And I write to "Gemfile" with:
|
7
|
+
"""
|
8
|
+
source "http://rubygems.org"
|
9
|
+
gem "rake"
|
10
|
+
gem "factory_girl"
|
11
|
+
"""
|
12
|
+
When I add "appraisal" from this project as a dependency
|
13
|
+
And I write to "Appraisals" with:
|
14
|
+
"""
|
15
|
+
appraise "1.3.2" do
|
16
|
+
gem "factory_girl", "1.3.2"
|
17
|
+
end
|
18
|
+
appraise "1.3.0" do
|
19
|
+
gem "factory_girl", "1.3.0"
|
20
|
+
end
|
21
|
+
"""
|
22
|
+
When I write to "Rakefile" with:
|
23
|
+
"""
|
24
|
+
require 'rubygems'
|
25
|
+
require 'bundler/setup'
|
26
|
+
require 'appraisal'
|
27
|
+
task :version do
|
28
|
+
require 'factory_girl'
|
29
|
+
puts "Loaded #{Factory::VERSION}"
|
30
|
+
end
|
31
|
+
task :fail do
|
32
|
+
require 'factory_girl'
|
33
|
+
puts "Fail #{Factory::VERSION}"
|
34
|
+
raise
|
35
|
+
end
|
36
|
+
task :default => :version
|
37
|
+
"""
|
38
|
+
When I successfully run "rake appraisal:install --trace"
|
39
|
+
|
40
|
+
@disable-bundler
|
41
|
+
Scenario: run a specific task with one appraisal
|
42
|
+
When I successfully run "rake appraisal:1.3.0 version --trace"
|
43
|
+
Then the output should contain "Loaded 1.3.0"
|
44
|
+
|
45
|
+
@disable-bundler
|
46
|
+
Scenario: run a specific task with all appraisals
|
47
|
+
When I successfully run "rake appraisal version --trace"
|
48
|
+
Then the output should contain "Loaded 1.3.0"
|
49
|
+
And the output should contain "Loaded 1.3.2"
|
50
|
+
And the output should not contain "Invoke version"
|
51
|
+
|
52
|
+
@disable-bundler
|
53
|
+
Scenario: run the default task with one appraisal
|
54
|
+
When I successfully run "rake appraisal:1.3.0 --trace"
|
55
|
+
Then the output should contain "Loaded 1.3.0"
|
56
|
+
|
57
|
+
@disable-bundler
|
58
|
+
Scenario: run the default task with all appraisals
|
59
|
+
When I successfully run "rake appraisal --trace"
|
60
|
+
Then the output should contain "Loaded 1.3.0"
|
61
|
+
And the output should contain "Loaded 1.3.2"
|
62
|
+
|
63
|
+
@disable-bundler
|
64
|
+
Scenario: run a failing task with one appraisal
|
65
|
+
When I run "rake appraisal:1.3.0 fail --trace"
|
66
|
+
Then the output should contain "Fail 1.3.0"
|
67
|
+
And the exit status should be 1
|
68
|
+
|
69
|
+
@disable-bundler
|
70
|
+
Scenario: run a failing task with all appraisals
|
71
|
+
When I run "rake appraisal fail --trace"
|
72
|
+
Then the output should contain "Fail 1.3.2"
|
73
|
+
But the output should not contain "Fail 1.3.0"
|
74
|
+
And the exit status should be 1
|
75
|
+
|
data/lib/appraisal.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'appraisal/gemfile'
|
2
|
+
require 'appraisal/command'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Appraisal
|
6
|
+
# Represents one appraisal and its dependencies
|
7
|
+
class Appraisal
|
8
|
+
attr_reader :name, :gemfile
|
9
|
+
|
10
|
+
def initialize(name, source_gemfile)
|
11
|
+
@name = name
|
12
|
+
@gemfile = source_gemfile.dup
|
13
|
+
end
|
14
|
+
|
15
|
+
def gem(name, *requirements)
|
16
|
+
gemfile.gem(name, *requirements)
|
17
|
+
end
|
18
|
+
|
19
|
+
def write_gemfile
|
20
|
+
::File.open(gemfile_path, "w") do |file|
|
21
|
+
file.puts("# This file was generated by Appraisal")
|
22
|
+
file.puts
|
23
|
+
file.write(gemfile.to_s)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def install
|
28
|
+
Command.new("bundle install --gemfile=#{gemfile_path}").run
|
29
|
+
end
|
30
|
+
|
31
|
+
def gemfile_path
|
32
|
+
unless ::File.exist?(gemfile_root)
|
33
|
+
FileUtils.mkdir(gemfile_root)
|
34
|
+
end
|
35
|
+
|
36
|
+
::File.join(gemfile_root, "#{name}.gemfile")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def gemfile_root
|
42
|
+
"gemfiles"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Appraisal
|
2
|
+
# Executes commands with a clean environment
|
3
|
+
class Command
|
4
|
+
BUNDLER_ENV_VARS = %w(RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE).freeze
|
5
|
+
|
6
|
+
def self.from_args(gemfile)
|
7
|
+
command = ([$0] + ARGV.slice(1, ARGV.size)).join(' ')
|
8
|
+
new(command, gemfile)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(command, gemfile = nil)
|
12
|
+
@original_env = {}
|
13
|
+
@gemfile = gemfile
|
14
|
+
@command = command
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
announce
|
19
|
+
with_clean_env do
|
20
|
+
unless Kernel.system(@command)
|
21
|
+
exit(1)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def exec
|
27
|
+
announce
|
28
|
+
with_clean_env { Kernel.exec(@command) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def with_clean_env
|
34
|
+
unset_bundler_env_vars
|
35
|
+
ENV['BUNDLE_GEMFILE'] = @gemfile
|
36
|
+
yield
|
37
|
+
ensure
|
38
|
+
restore_env
|
39
|
+
end
|
40
|
+
|
41
|
+
def announce
|
42
|
+
puts ">> BUNDLE_GEMFILE=#{@gemfile} #{@command}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def unset_bundler_env_vars
|
46
|
+
BUNDLER_ENV_VARS.each do |key|
|
47
|
+
@original_env[key] = ENV[key]
|
48
|
+
ENV[key] = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def restore_env
|
53
|
+
@original_env.each { |key, value| ENV[key] = value }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Appraisal
|
2
|
+
# Dependency on a gem and optional version requirements
|
3
|
+
class Dependency
|
4
|
+
attr_reader :name, :requirements
|
5
|
+
|
6
|
+
def initialize(name, requirements)
|
7
|
+
@name = name
|
8
|
+
@requirements = requirements
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
gem_name = %{gem "#{name}"}
|
13
|
+
if requirements.nil? || requirements.empty?
|
14
|
+
gem_name
|
15
|
+
else
|
16
|
+
"#{gem_name}, #{inspect_requirements}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def inspect_requirements
|
23
|
+
requirements.map { |requirement| requirement.inspect }.join(", ")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'appraisal/appraisal'
|
2
|
+
require 'appraisal/gemfile'
|
3
|
+
|
4
|
+
module Appraisal
|
5
|
+
# Loads and parses Appraisal files
|
6
|
+
class File
|
7
|
+
attr_reader :appraisals, :gemfile
|
8
|
+
|
9
|
+
def self.each(&block)
|
10
|
+
new.each(&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@appraisals = []
|
15
|
+
@gemfile = Gemfile.new
|
16
|
+
@gemfile.load('Gemfile')
|
17
|
+
run(IO.read(path))
|
18
|
+
end
|
19
|
+
|
20
|
+
def each(&block)
|
21
|
+
appraisals.each(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def appraise(name, &block)
|
25
|
+
@appraisals << Appraisal.new(name, gemfile).tap do |appraisal|
|
26
|
+
appraisal.instance_eval(&block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def run(definitions)
|
33
|
+
instance_eval definitions, __FILE__, __LINE__
|
34
|
+
end
|
35
|
+
|
36
|
+
def path
|
37
|
+
'Appraisals'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'appraisal/dependency'
|
2
|
+
|
3
|
+
module Appraisal
|
4
|
+
# Load bundler Gemfiles and merge dependencies
|
5
|
+
class Gemfile
|
6
|
+
attr_reader :dependencies
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@dependencies = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def load(path)
|
13
|
+
run(IO.read(path))
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(definitions)
|
17
|
+
instance_eval(definitions, __FILE__, __LINE__)
|
18
|
+
end
|
19
|
+
|
20
|
+
def gem(name, *requirements)
|
21
|
+
@dependencies[name] = Dependency.new(name, requirements)
|
22
|
+
end
|
23
|
+
|
24
|
+
def source(source)
|
25
|
+
@source = source
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
%{source "#{@source}"\n} <<
|
30
|
+
dependencies.values.map { |dependency| dependency.to_s }.join("\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
def dup
|
34
|
+
Gemfile.new.tap do |gemfile|
|
35
|
+
gemfile.source @source
|
36
|
+
dependencies.values.each do |dependency|
|
37
|
+
gemfile.gem(dependency.name, *dependency.requirements)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'appraisal/file'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
module Appraisal
|
5
|
+
# Defines tasks for installing appraisal dependencies and running other tasks
|
6
|
+
# for a given appraisal.
|
7
|
+
class Task < Rake::TaskLib
|
8
|
+
def initialize
|
9
|
+
namespace :appraisal do
|
10
|
+
desc "Generate a Gemfile for each appraisal"
|
11
|
+
task :gemfiles do
|
12
|
+
File.each do |appraisal|
|
13
|
+
appraisal.write_gemfile
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Resolve and install dependencies for each appraisal"
|
18
|
+
task :install => :gemfiles do
|
19
|
+
File.each do |appraisal|
|
20
|
+
appraisal.install
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
File.each do |appraisal|
|
25
|
+
desc "Run the given task for appraisal #{appraisal.name}"
|
26
|
+
task appraisal.name do
|
27
|
+
Command.from_args(appraisal.gemfile_path).exec
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :all do
|
32
|
+
File.each do |appraisal|
|
33
|
+
Command.from_args(appraisal.gemfile_path).run
|
34
|
+
end
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Run the given task for all appraisals"
|
40
|
+
task :appraisal => "appraisal:all"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: appraisal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: "0.1"
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Joe Ferris
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-11-11 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
name: cucumber
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
name: aruba
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
requirement: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
name: rake
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
requirement: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
name: bundler
|
66
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
requirement: *id004
|
76
|
+
description: Appraisal integrates with bundler and rake to test your library against different versions of dependencies in repeatable scenarios called "appraisals."
|
77
|
+
email: jferris@thoughtbot.com
|
78
|
+
executables: []
|
79
|
+
|
80
|
+
extensions: []
|
81
|
+
|
82
|
+
extra_rdoc_files: []
|
83
|
+
|
84
|
+
files:
|
85
|
+
- Gemfile
|
86
|
+
- Gemfile.lock
|
87
|
+
- Rakefile
|
88
|
+
- README.textile
|
89
|
+
- lib/appraisal/appraisal.rb
|
90
|
+
- lib/appraisal/command.rb
|
91
|
+
- lib/appraisal/dependency.rb
|
92
|
+
- lib/appraisal/file.rb
|
93
|
+
- lib/appraisal/gemfile.rb
|
94
|
+
- lib/appraisal/task.rb
|
95
|
+
- lib/appraisal.rb
|
96
|
+
- features/appraisals.feature
|
97
|
+
- features/step_definitions/dependency_steps.rb
|
98
|
+
- features/support/env.rb
|
99
|
+
has_rdoc: false
|
100
|
+
homepage: http://github.com/thoughtbot/appraisal
|
101
|
+
licenses: []
|
102
|
+
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
version: "0"
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
hash: 3
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
version: "0"
|
126
|
+
requirements: []
|
127
|
+
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 1.3.7
|
130
|
+
signing_key:
|
131
|
+
specification_version: 3
|
132
|
+
summary: Find out what your Ruby gems are worth
|
133
|
+
test_files:
|
134
|
+
- features/appraisals.feature
|
135
|
+
- features/step_definitions/dependency_steps.rb
|
136
|
+
- features/support/env.rb
|