gemika 0.2.0 → 0.3.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 +7 -0
- data/.travis.yml +30 -22
- data/.yardopts +1 -0
- data/README.md +140 -34
- data/gemfiles/Gemfile.2.3.mysql2 +8 -2
- data/gemfiles/Gemfile.2.3.mysql2.lock +3 -1
- data/gemfiles/Gemfile.3.2.mysql2 +8 -2
- data/gemfiles/Gemfile.3.2.mysql2.lock +6 -1
- data/gemfiles/Gemfile.4.2.mysql2 +7 -0
- data/gemfiles/Gemfile.4.2.mysql2.lock +3 -1
- data/gemfiles/Gemfile.4.2.pg +9 -0
- data/gemfiles/Gemfile.4.2.pg.lock +6 -1
- data/gemfiles/Gemfile.5.0.mysql2 +7 -0
- data/gemfiles/Gemfile.5.0.mysql2.lock +3 -1
- data/gemfiles/Gemfile.5.0.pg +7 -0
- data/gemfiles/Gemfile.5.0.pg.lock +3 -1
- data/lib/gemika/database.rb +41 -4
- data/lib/gemika/env.rb +119 -67
- data/lib/gemika/errors.rb +9 -0
- data/lib/gemika/matrix.rb +44 -11
- data/lib/gemika/rspec.rb +87 -44
- data/lib/gemika/tasks/matrix.rb +17 -23
- data/lib/gemika/tasks/rspec.rb +9 -0
- data/lib/gemika/tasks.rb +1 -1
- data/lib/gemika/version.rb +1 -1
- data/lib/gemika.rb +3 -2
- data/spec/fixtures/gemfiles/Gemfile_with_activesupport_5 +3 -0
- data/spec/fixtures/gemfiles/Gemfile_with_activesupport_5.lock +23 -0
- data/spec/gemika/env_spec.rb +86 -0
- data/spec/gemika/matrix_spec.rb +5 -5
- data/spec/gemika/rspec_spec.rb +44 -0
- data/spec/spec_helper.rb +2 -8
- metadata +30 -46
- data/lib/gemika/tasks/database.rb +0 -1
data/lib/gemika/database.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'active_record'
|
2
3
|
require 'gemika/env'
|
4
|
+
require 'gemika/errors'
|
3
5
|
|
4
6
|
module Gemika
|
7
|
+
##
|
8
|
+
# Helpers for creating a test database.
|
9
|
+
#
|
5
10
|
class Database
|
6
11
|
|
7
12
|
class Error < StandardError; end
|
@@ -20,6 +25,9 @@ module Gemika
|
|
20
25
|
@connected = false
|
21
26
|
end
|
22
27
|
|
28
|
+
##
|
29
|
+
# Connects ActiveRecord to the database configured in `spec/support/database.yml`.
|
30
|
+
#
|
23
31
|
def connect
|
24
32
|
unless @connected
|
25
33
|
ActiveRecord::Base.establish_connection(adapter_config)
|
@@ -27,6 +35,9 @@ module Gemika
|
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
38
|
+
##
|
39
|
+
# Drops all tables from the current database.
|
40
|
+
#
|
30
41
|
def drop_tables!
|
31
42
|
connect
|
32
43
|
connection.tables.each do |table|
|
@@ -34,28 +45,52 @@ module Gemika
|
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
48
|
+
##
|
49
|
+
# Runs the [ActiveRecord database migration](http://api.rubyonrails.org/classes/ActiveRecord/Migration.html) described in `block`.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# Gemika::Database.new.migrate do
|
53
|
+
# create_table :users do |t|
|
54
|
+
# t.string :name
|
55
|
+
# t.string :email
|
56
|
+
# t.string :city
|
57
|
+
# end
|
58
|
+
# end
|
37
59
|
def migrate(&block)
|
38
60
|
connect
|
39
61
|
ActiveRecord::Migration.class_eval(&block)
|
40
62
|
end
|
41
63
|
|
64
|
+
##
|
65
|
+
# Drops all tables, then
|
66
|
+
# runs the [ActiveRecord database migration](http://api.rubyonrails.org/classes/ActiveRecord/Migration.html) described in `block`.
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
# Gemika::Database.new.rewrite_schema! do
|
70
|
+
# create_table :users do |t|
|
71
|
+
# t.string :name
|
72
|
+
# t.string :email
|
73
|
+
# t.string :city
|
74
|
+
# end
|
75
|
+
# end
|
42
76
|
def rewrite_schema!(&block)
|
43
77
|
connect
|
44
78
|
drop_tables!
|
45
79
|
migrate(&block)
|
46
80
|
end
|
47
81
|
|
48
|
-
|
49
|
-
|
82
|
+
##
|
83
|
+
# Returns a hash of ActiveRecord adapter options for the currently activated database gem.
|
84
|
+
#
|
50
85
|
def adapter_config
|
51
86
|
default_config = {}
|
52
87
|
default_config['database'] = guess_database_name
|
53
|
-
if Env.pg
|
88
|
+
if Env.gem?('pg')
|
54
89
|
default_config['adapter'] = 'postgresql'
|
55
90
|
default_config['username'] = 'postgres' if Env.travis?
|
56
91
|
default_config['password'] = ''
|
57
92
|
user_config = @yaml_config['postgresql'] || @yaml_config['postgres'] || @yaml_config['pg'] || {}
|
58
|
-
elsif Env.mysql2
|
93
|
+
elsif Env.gem?('mysql2')
|
59
94
|
default_config['adapter'] = 'mysql2'
|
60
95
|
default_config['username'] = 'travis' if Env.travis?
|
61
96
|
default_config['encoding'] = 'utf8'
|
@@ -66,6 +101,8 @@ module Gemika
|
|
66
101
|
default_config.merge(user_config)
|
67
102
|
end
|
68
103
|
|
104
|
+
private
|
105
|
+
|
69
106
|
def guess_database_name
|
70
107
|
project_name = File.basename(Dir.pwd)
|
71
108
|
"#{project_name}_test"
|
data/lib/gemika/env.rb
CHANGED
@@ -1,84 +1,126 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'gemika/errors'
|
3
|
+
|
1
4
|
module Gemika
|
5
|
+
##
|
6
|
+
# Version switches to write code that works with different versions of
|
7
|
+
# Ruby and gem dependencies.
|
8
|
+
#
|
2
9
|
module Env
|
3
10
|
|
4
|
-
|
5
|
-
class Unknown < Error; end
|
11
|
+
VERSION_PATTERN = /(?:\d+\.)*\d+/
|
6
12
|
|
13
|
+
##
|
14
|
+
# Returns the path to the gemfile for the current Ruby process.
|
15
|
+
#
|
7
16
|
def gemfile
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
17
|
+
if @gemfile_changed
|
18
|
+
@process_gemfile
|
19
|
+
else
|
20
|
+
ENV['BUNDLE_GEMFILE']
|
21
|
+
end
|
13
22
|
end
|
14
23
|
|
24
|
+
##
|
25
|
+
# Changes the gemfile to the given `path`, runs the given `block`, then resets
|
26
|
+
# the gemfile to its original path.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# Gemika::Env.with_gemfile('gemfiles/Gemfile.rails3') do
|
30
|
+
# system('rspec spec') or raise 'RSpec failed'
|
31
|
+
# end
|
32
|
+
#
|
15
33
|
def with_gemfile(path, *args, &block)
|
16
|
-
|
17
|
-
|
18
|
-
|
34
|
+
# Make sure that if block calls #gemfile we still return the gemfile for this
|
35
|
+
# process, regardless of what's in ENV temporarily
|
36
|
+
@gemfile_changed = true
|
37
|
+
@process_gemfile = ENV['BUNDLE_GEMFILE']
|
38
|
+
Bundler.with_clean_env do
|
39
|
+
ENV['BUNDLE_GEMFILE'] = path
|
40
|
+
block.call(*args)
|
41
|
+
end
|
19
42
|
ensure
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
43
|
+
@gemfile_changed = false
|
44
|
+
ENV['BUNDLE_GEMFILE'] = @process_gemfile
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Check if the given gem was activated by the current gemfile.
|
49
|
+
# It might or might not have been `require`d yet.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# Gemika::Env.gem?('activerecord')
|
53
|
+
# Gemika::Env.gem?('activerecord', '= 5.0.0')
|
54
|
+
# Gemika::Env.gem?('activerecord', '~> 4.2.0')
|
55
|
+
#
|
56
|
+
def gem?(*args)
|
57
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
58
|
+
name, requirement_string = args
|
59
|
+
if options[:gemfile] && !process_gemfile?(options[:gemfile])
|
60
|
+
gem_in_gemfile?(options[:gemfile], name, requirement_string)
|
61
|
+
else
|
62
|
+
gem_activated?(name, requirement_string)
|
63
|
+
end
|
37
64
|
end
|
38
65
|
|
39
|
-
|
40
|
-
|
66
|
+
##
|
67
|
+
# Returns the current version of Ruby.
|
68
|
+
#
|
69
|
+
def ruby
|
70
|
+
RUBY_VERSION
|
41
71
|
end
|
42
72
|
|
43
|
-
|
44
|
-
|
73
|
+
##
|
74
|
+
# Check if the current version of Ruby satisfies the given requirements.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# Gemika::Env.ruby?('>= 2.1.0')
|
78
|
+
#
|
79
|
+
def ruby?(requirement)
|
80
|
+
requirement_satisfied?(requirement, ruby)
|
45
81
|
end
|
46
82
|
|
47
|
-
|
48
|
-
|
83
|
+
##
|
84
|
+
# Returns whether this process is running within a TravisCI build.
|
85
|
+
#
|
86
|
+
def travis?
|
87
|
+
!!ENV['TRAVIS']
|
49
88
|
end
|
50
89
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
90
|
+
##
|
91
|
+
# Creates an hash that enumerates entries in order of insertion.
|
92
|
+
#
|
93
|
+
# @!visibility private
|
94
|
+
#
|
95
|
+
def new_ordered_hash
|
96
|
+
# We use it when ActiveSupport is activated
|
97
|
+
if ruby?('>= 1.9')
|
98
|
+
{}
|
99
|
+
elsif gem?('activesupport')
|
100
|
+
require 'active_support/ordered_hash'
|
101
|
+
ActiveSupport::OrderedHash.new
|
56
102
|
else
|
57
|
-
|
103
|
+
# We give up
|
104
|
+
{}
|
58
105
|
end
|
59
106
|
end
|
60
107
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
108
|
+
private
|
109
|
+
|
110
|
+
def bundler?
|
111
|
+
!gemfile.nil? && gemfile != ''
|
65
112
|
end
|
66
113
|
|
67
|
-
def
|
68
|
-
|
69
|
-
'spec'
|
70
|
-
else
|
71
|
-
'rspec'
|
72
|
-
end
|
114
|
+
def process_gemfile?(given_gemfile)
|
115
|
+
bundler? && File.expand_path(gemfile) == File.expand_path(given_gemfile)
|
73
116
|
end
|
74
117
|
|
75
|
-
def
|
118
|
+
def gem_activated?(name, requirement)
|
76
119
|
gem = Gem.loaded_specs[name]
|
77
120
|
if gem
|
78
|
-
if
|
79
|
-
requirement = Gem::Requirement.new(requirement_string)
|
121
|
+
if requirement
|
80
122
|
version = gem.version
|
81
|
-
|
123
|
+
requirement_satisfied?(requirement, version)
|
82
124
|
else
|
83
125
|
true
|
84
126
|
end
|
@@ -87,29 +129,39 @@ module Gemika
|
|
87
129
|
end
|
88
130
|
end
|
89
131
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
132
|
+
def gem_in_gemfile?(gemfile, name, requirement = nil)
|
133
|
+
lockfile = lockfile_contents(gemfile)
|
134
|
+
if lockfile =~ /\b#{Regexp.escape(name)}\s*\((#{VERSION_PATTERN})\)/
|
135
|
+
version = $1
|
136
|
+
if requirement
|
137
|
+
requirement_satisfied?(requirement, version)
|
138
|
+
else
|
139
|
+
true
|
140
|
+
end
|
97
141
|
else
|
98
|
-
|
142
|
+
false
|
99
143
|
end
|
100
144
|
end
|
101
145
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
if
|
146
|
+
def requirement_satisfied?(requirement, version)
|
147
|
+
requirement = Gem::Requirement.new(requirement) if requirement.is_a?(String)
|
148
|
+
version = Gem::Version.new(version) if version.is_a?(String)
|
149
|
+
if requirement.respond_to?(:satisfied_by?) # Ruby 1.9.3+
|
150
|
+
requirement.satisfied_by?(version)
|
151
|
+
else
|
106
152
|
ops = Gem::Requirement::OPS
|
107
153
|
requirement.requirements.all? { |op, rv| (ops[op] || ops["="]).call version, rv }
|
108
|
-
else
|
109
|
-
requirement.satisfied_by?(version)
|
110
154
|
end
|
111
155
|
end
|
112
156
|
|
157
|
+
def lockfile_contents(gemfile)
|
158
|
+
lockfile = "#{gemfile}.lock"
|
159
|
+
File.exists?(lockfile) or raise MissingLockfile, "Lockfile not found: #{lockfile}"
|
160
|
+
File.read(lockfile)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Make all methods available as static module methods
|
113
164
|
extend self
|
165
|
+
|
114
166
|
end
|
115
167
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Gemika
|
2
|
+
class Error < StandardError; end
|
3
|
+
class MissingGemfile < Error; end
|
4
|
+
class MissingLockfile < Error; end
|
5
|
+
class UnusableGemfile < Error; end
|
6
|
+
class UnsupportedRuby < Error; end
|
7
|
+
class MatrixFailed < Error; end
|
8
|
+
class RSpecFailed < Error; end
|
9
|
+
end
|
data/lib/gemika/matrix.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'gemika/errors'
|
2
3
|
require 'gemika/env'
|
3
4
|
|
4
5
|
module Gemika
|
5
6
|
class Matrix
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
##
|
9
|
+
# Load `.travis.yml` files.
|
10
|
+
#
|
11
|
+
# @!visibility private
|
12
|
+
#
|
12
13
|
class TravisConfig
|
13
14
|
class << self
|
14
15
|
|
@@ -37,6 +38,9 @@ module Gemika
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
41
|
+
##
|
42
|
+
# A row in the test matrix
|
43
|
+
#
|
40
44
|
class Row
|
41
45
|
|
42
46
|
def initialize(attrs)
|
@@ -44,16 +48,32 @@ module Gemika
|
|
44
48
|
@gemfile = attrs.fetch(:gemfile)
|
45
49
|
end
|
46
50
|
|
47
|
-
|
51
|
+
##
|
52
|
+
# The Ruby version for the row.
|
53
|
+
#
|
54
|
+
attr_reader :ruby
|
55
|
+
|
56
|
+
##
|
57
|
+
# The path to the gemfile for the row.
|
58
|
+
#
|
59
|
+
attr_reader :gemfile
|
48
60
|
|
49
|
-
|
61
|
+
##
|
62
|
+
# Returns whether this row can be run with the given Ruby version.
|
63
|
+
#
|
64
|
+
def compatible_with_ruby?(current_ruby = Env.ruby)
|
50
65
|
ruby == current_ruby
|
51
66
|
end
|
52
67
|
|
68
|
+
##
|
69
|
+
# Raises an error if this row is invalid.
|
70
|
+
#
|
71
|
+
# @!visibility private
|
72
|
+
#
|
53
73
|
def validate!
|
54
|
-
File.exists?(gemfile) or raise
|
74
|
+
File.exists?(gemfile) or raise MissingGemfile, "Gemfile not found: #{gemfile}"
|
55
75
|
contents = File.read(gemfile)
|
56
|
-
contents.include?('gemika') or raise
|
76
|
+
contents.include?('gemika') or raise UnusableGemfile, "Gemfile is missing gemika dependency: #{gemfile}"
|
57
77
|
end
|
58
78
|
|
59
79
|
end
|
@@ -77,6 +97,13 @@ module Gemika
|
|
77
97
|
@current_ruby = options.fetch(:current_ruby, RUBY_VERSION)
|
78
98
|
end
|
79
99
|
|
100
|
+
##
|
101
|
+
# Runs the given `block` for each matrix row that is compatible with the current Ruby.
|
102
|
+
#
|
103
|
+
# The row's gemfile will be set as an environment variable, so Bundler will use that gemfile if you shell out in `block`.
|
104
|
+
#
|
105
|
+
# At the end it will print a summary of which rows have passed, failed or were skipped (due to incompatible Ruby version).
|
106
|
+
#
|
80
107
|
def each(&block)
|
81
108
|
@all_passed = true
|
82
109
|
rows.each do |row|
|
@@ -98,6 +125,12 @@ module Gemika
|
|
98
125
|
print_summary
|
99
126
|
end
|
100
127
|
|
128
|
+
##
|
129
|
+
# Builds a {Matrix} from the given `.travis.yml` file.
|
130
|
+
#
|
131
|
+
# @param [Hash] options
|
132
|
+
# @option options [String] Path to the `.travis.yml` file.
|
133
|
+
#
|
101
134
|
def self.from_travis_yml(options = {})
|
102
135
|
rows = TravisConfig.load_rows(options)
|
103
136
|
new(options.merge(:rows => rows))
|
@@ -143,7 +176,7 @@ module Gemika
|
|
143
176
|
message = "No gemfiles were compatible with Ruby #{RUBY_VERSION}"
|
144
177
|
puts tint(message, COLOR_FAILURE)
|
145
178
|
puts
|
146
|
-
raise
|
179
|
+
raise UnsupportedRuby, message
|
147
180
|
elsif @all_passed
|
148
181
|
puts tint("All gemfiles succeeded for Ruby #{RUBY_VERSION}", COLOR_SUCCESS)
|
149
182
|
puts
|
@@ -151,7 +184,7 @@ module Gemika
|
|
151
184
|
message = 'Some gemfiles failed'
|
152
185
|
puts tint(message, COLOR_FAILURE)
|
153
186
|
puts
|
154
|
-
raise
|
187
|
+
raise MatrixFailed, message
|
155
188
|
end
|
156
189
|
end
|
157
190
|
|
data/lib/gemika/rspec.rb
CHANGED
@@ -1,52 +1,95 @@
|
|
1
|
+
require 'gemika/errors'
|
2
|
+
require 'gemika/env'
|
3
|
+
|
1
4
|
module Gemika
|
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
|
-
|
5
|
+
module RSpec
|
6
|
+
|
7
|
+
##
|
8
|
+
# Runs the RSpec binary.
|
9
|
+
#
|
10
|
+
def run_specs(options = nil)
|
11
|
+
options ||= {}
|
12
|
+
files = options.fetch(:files, 'spec')
|
13
|
+
rspec_options = options.fetch(:options, '--color')
|
14
|
+
# We need to override the gemfile explicitely, since we have a default Gemfile in the project root
|
15
|
+
gemfile = options.fetch(:gemfile, Gemika::Env.gemfile)
|
16
|
+
fatal = options.fetch(:fatal, true)
|
17
|
+
runner = binary(:gemfile => gemfile)
|
18
|
+
command = "bundle exec #{runner} #{rspec_options} #{files}"
|
19
|
+
result = shell_out(command)
|
20
|
+
if result
|
21
|
+
true
|
22
|
+
elsif fatal
|
23
|
+
raise RSpecFailed, "RSpec failed: #{command}"
|
24
|
+
else
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Returns the binary name for the current RSpec version.
|
31
|
+
#
|
32
|
+
def binary(options = {})
|
33
|
+
if Env.gem?('rspec', '< 2', options)
|
34
|
+
'spec'
|
35
|
+
else
|
36
|
+
'rspec'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# Configures RSpec.
|
42
|
+
#
|
43
|
+
# Works with both RSpec 1 and RSpec 2.
|
44
|
+
#
|
45
|
+
def configure(&block)
|
46
|
+
configurator.configure(&block)
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Configures RSpec to clean out the database before each example.
|
51
|
+
#
|
52
|
+
# Requires the `database_cleaner` gem to be added to your development dependencies.
|
53
|
+
#
|
54
|
+
def configure_clean_database_before_example
|
55
|
+
require 'database_cleaner' # optional dependency
|
56
|
+
configure do |config|
|
57
|
+
config.before(:each) do
|
58
|
+
# Truncation works across most database adapters; I had issues with :deletion and pg
|
59
|
+
DatabaseCleaner.clean_with(:truncation)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
46
63
|
|
64
|
+
##
|
65
|
+
# Configures RSpec so it allows the `should` syntax that works across all RSpec versions.
|
66
|
+
#
|
67
|
+
def configure_should_syntax
|
68
|
+
if Env.gem?('rspec', '>= 2.11')
|
69
|
+
configure do |config|
|
70
|
+
config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
|
71
|
+
config.mock_with(:rspec) { |c| c.syntax = [:should, :expect] }
|
47
72
|
end
|
73
|
+
else
|
74
|
+
# We have an old RSpec that only understands should syntax
|
48
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
49
79
|
|
80
|
+
def shell_out(command)
|
81
|
+
system(command)
|
50
82
|
end
|
83
|
+
|
84
|
+
def configurator
|
85
|
+
if Env.gem?('rspec', '<2')
|
86
|
+
Spec::Runner
|
87
|
+
else
|
88
|
+
::RSpec
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
extend self
|
93
|
+
|
51
94
|
end
|
52
95
|
end
|
data/lib/gemika/tasks/matrix.rb
CHANGED
@@ -1,46 +1,40 @@
|
|
1
|
+
require 'gemika/env'
|
1
2
|
require 'gemika/matrix'
|
3
|
+
require 'gemika/rspec'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
5
|
+
##
|
6
|
+
# Rake tasks to run commands for each compatible row in the test matrix.
|
7
|
+
#
|
9
8
|
namespace :matrix do
|
10
9
|
|
11
10
|
desc "Run specs for all Ruby #{RUBY_VERSION} gemfiles"
|
12
|
-
task :spec do
|
11
|
+
task :spec, :files do |t, options|
|
13
12
|
Gemika::Matrix.from_travis_yml.each do |row|
|
14
|
-
|
15
|
-
|
16
|
-
system("bundle exec #{rspec_binary} #{args}")
|
13
|
+
options = options.to_hash.merge(:gemfile => row.gemfile, :fatal => false)
|
14
|
+
Gemika::RSpec.run_specs(options)
|
17
15
|
end
|
18
16
|
end
|
19
17
|
|
20
18
|
desc "Install all Ruby #{RUBY_VERSION} gemfiles"
|
21
19
|
task :install do
|
22
20
|
Gemika::Matrix.from_travis_yml.each do |row|
|
21
|
+
puts "Calling `bundle install` with #{ENV['BUNDLE_GEMFILE']}"
|
23
22
|
system('bundle install')
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
|
-
desc "
|
28
|
-
task :
|
26
|
+
desc "List dependencies for all Ruby #{RUBY_VERSION} gemfiles"
|
27
|
+
task :list do
|
29
28
|
Gemika::Matrix.from_travis_yml.each do |row|
|
30
|
-
system(
|
29
|
+
system('bundle list')
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
# (spec in RSpec 1, rspec in RSpec 2+)
|
40
|
-
task :spec do
|
41
|
-
rspec_binary = Gemika::Env.rspec_binary
|
42
|
-
args = Gemika::Tasks::RSPEC_ARGS
|
43
|
-
system("bundle exec #{rspec_binary} #{args}")
|
33
|
+
desc "Update all Ruby #{RUBY_VERSION} gemfiles"
|
34
|
+
task :update, :gems do |t, options|
|
35
|
+
Gemika::Matrix.from_travis_yml.each do |row|
|
36
|
+
system("bundle update #{options[:gems]}")
|
37
|
+
end
|
44
38
|
end
|
45
39
|
|
46
40
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'gemika/rspec'
|
2
|
+
|
3
|
+
# Private task to pick the correct RSpec binary for the currently activated
|
4
|
+
# RSpec version (`spec` in RSpec 1, `rspec` in RSpec 2+)
|
5
|
+
desc 'Run specs with the current RSpec version'
|
6
|
+
task :current_rspec, :files do |t, options|
|
7
|
+
options = options.to_hash
|
8
|
+
Gemika::RSpec.run_specs(options)
|
9
|
+
end
|
data/lib/gemika/tasks.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'gemika/tasks/matrix'
|
2
|
-
require 'gemika/tasks/
|
2
|
+
require 'gemika/tasks/rspec'
|
data/lib/gemika/version.rb
CHANGED