rvm-tester 1.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.
- data/README.md +53 -0
- data/lib/rvm-tester.rb +126 -0
- metadata +70 -0
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# RVM Tester
|
2
|
+
|
3
|
+
Runs tests across Ruby installations in RVM using concurrent worker processes.
|
4
|
+
This library does not sandbox installations, and requires that you have already
|
5
|
+
installed the necessary Ruby installations under RVM.
|
6
|
+
|
7
|
+
## Installing
|
8
|
+
|
9
|
+
In addition to installing this library with `gem install rvm-tester`, you will also need
|
10
|
+
to setup
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
You can either use this library via the Rake task or directly via the Runner class:
|
15
|
+
|
16
|
+
### Rake Task
|
17
|
+
|
18
|
+
Place the following in your `Rakefile`:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
require 'rvm-tester'
|
22
|
+
RVM::Tester::TesterTask.new(:suite) do |t|
|
23
|
+
t.rubies = %w(1.8.6 1.8.7 1.9.2 1.9.3) # which versions to test (required!)
|
24
|
+
t.bundle_install = true # updates Gemfile.lock, default is true
|
25
|
+
t.command = "bundle exec rake test" # runs plain "rake" by default
|
26
|
+
t.env = {"VERBOSE" => "1"} # set any ENV vars
|
27
|
+
t.num_workers = 5 # defaults to 3
|
28
|
+
t.verbose = true # shows more output, off by default
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
And simply run the task with `rake suite`.
|
33
|
+
|
34
|
+
### Runner Class
|
35
|
+
|
36
|
+
You can also run the runner directly. The "t" object passed in the task above
|
37
|
+
is the runner class, so you would set it up in the same way. You can also pass
|
38
|
+
all attributes via the options hash.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
runner = RVM::Tester::Runner.new(:rubies => %w(rbx 1.9.3), :verbose => true)
|
42
|
+
runner.run
|
43
|
+
```
|
44
|
+
|
45
|
+
## Dependencies
|
46
|
+
|
47
|
+
This library depends on [RVM](http://rvm.beginrescueend.com) to control
|
48
|
+
Ruby installations and [mob_spawner](http://github.com/lsegal/mob_spawner) to
|
49
|
+
spawn worker processes.
|
50
|
+
|
51
|
+
## License & Copyright
|
52
|
+
|
53
|
+
MobSpawner is licensed under the MIT license, © 2012 Loren Segal
|
data/lib/rvm-tester.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require 'mob_spawner'
|
4
|
+
|
5
|
+
module RVM
|
6
|
+
module Tester
|
7
|
+
VERSION = '1.0.0'
|
8
|
+
|
9
|
+
class TesterTask < ::Rake::TaskLib
|
10
|
+
def initialize(name = :suite)
|
11
|
+
runner = Runner.new
|
12
|
+
yield(runner) if block_given?
|
13
|
+
desc "Runs tests across RVM Rubies: #{runner.rubies.join(",")}"
|
14
|
+
task(name) { exit runner.run }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Runner
|
19
|
+
attr_accessor :num_workers
|
20
|
+
attr_accessor :rubies
|
21
|
+
attr_accessor :env
|
22
|
+
attr_accessor :command
|
23
|
+
attr_accessor :verbose
|
24
|
+
attr_accessor :bundle_install
|
25
|
+
|
26
|
+
def initialize(opts = {})
|
27
|
+
super()
|
28
|
+
self.command = "rake"
|
29
|
+
self.num_workers = 3
|
30
|
+
self.env = {}
|
31
|
+
self.rubies = []
|
32
|
+
self.verbose = false
|
33
|
+
self.bundle_install = true
|
34
|
+
opts.each {|k,v| meth = "#{k}="; send(meth, v) if respond_to?(meth) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def run
|
38
|
+
exit_status = 0
|
39
|
+
outputs = []
|
40
|
+
use_gemfile if bundle_install
|
41
|
+
commands = rubies.map do |ruby|
|
42
|
+
MobSpawner::Command.new(
|
43
|
+
:command => "rvm #{ruby} do #{command}",
|
44
|
+
:env => env, :data => {:ruby => ruby, :time => nil})
|
45
|
+
|
46
|
+
end
|
47
|
+
spawner = MobSpawner.new
|
48
|
+
spawner.commands = commands
|
49
|
+
spawner.num_workers = num_workers
|
50
|
+
spawner.before_worker do |data|
|
51
|
+
worker, cmd = data[:worker], data[:command]
|
52
|
+
debug "Worker #{worker} running tests in #{cmd.data[:ruby]}"
|
53
|
+
data[:command].data[:time] = Time.now
|
54
|
+
end
|
55
|
+
spawner.after_worker do |data|
|
56
|
+
worker, cmd = data[:worker], data[:command]
|
57
|
+
next(outputs << data) if data[:output].nil?
|
58
|
+
testinfo = data[:output][/(\d+ examples, \d+ failures)/, 1]
|
59
|
+
testinfo += ", " if testinfo
|
60
|
+
time = Time.now - data[:command].data[:time]
|
61
|
+
passfail = data[:status] == 0 ? "passed" : "failed"
|
62
|
+
msg = "Tests #{passfail} in #{cmd.data[:ruby]} (#{testinfo}#{"%.2f" % time}sec)"
|
63
|
+
if data[:status] == 0
|
64
|
+
outputs << data if verbose
|
65
|
+
success(msg)
|
66
|
+
else
|
67
|
+
outputs << data
|
68
|
+
exit_status = 255
|
69
|
+
fail(msg)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
spawner.run
|
73
|
+
|
74
|
+
return(exit_status) if outputs.size == 0
|
75
|
+
puts
|
76
|
+
outputs.each do |data|
|
77
|
+
if data[:exception]
|
78
|
+
bright "Exception while running #{data[:command].data[:ruby]}:"
|
79
|
+
puts data[:exception].message
|
80
|
+
puts data[:exception].backtrace
|
81
|
+
else
|
82
|
+
bright "Output for #{data[:command].data[:ruby]} " +
|
83
|
+
"(#{data[:status]}, cmd=#{data[:command].command}):"
|
84
|
+
puts data[:output]
|
85
|
+
end
|
86
|
+
puts
|
87
|
+
end
|
88
|
+
|
89
|
+
exit_status
|
90
|
+
end
|
91
|
+
|
92
|
+
def use_gemfile
|
93
|
+
return unless File.file?("Gemfile")
|
94
|
+
print "Installing Bundler and dependencies on #{rubies.join(",")}..."
|
95
|
+
cmds = rubies.map do |r|
|
96
|
+
ver = r == '1.8.6' ? '-v 1.0.22' : '' # Bundler compat for 1.8.6
|
97
|
+
"rvm #{r} do gem install bundler #{ver} && rvm #{r} do bundle update"
|
98
|
+
end
|
99
|
+
MobSpawner.new(cmds).run
|
100
|
+
puts "Done."
|
101
|
+
end
|
102
|
+
|
103
|
+
def debug(info)
|
104
|
+
return unless verbose
|
105
|
+
puts(info)
|
106
|
+
end
|
107
|
+
|
108
|
+
def success(msg)
|
109
|
+
puts "\e[32;1m#{msg}\e[0m"
|
110
|
+
end
|
111
|
+
|
112
|
+
def fail(msg)
|
113
|
+
puts "\e[31;1m#{msg}\e[0m"
|
114
|
+
end
|
115
|
+
|
116
|
+
def bright(msg)
|
117
|
+
puts "\e[1m#{msg}\e[0m"
|
118
|
+
end
|
119
|
+
|
120
|
+
def puts(msg = '')
|
121
|
+
super(msg)
|
122
|
+
$stdout.flush
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rvm-tester
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Loren Segal
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-09 00:00:00.000000000 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
requirement: &70254285984200 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70254285984200
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: mob_spawner
|
28
|
+
requirement: &70254285983500 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70254285983500
|
37
|
+
description:
|
38
|
+
email: lsegal@soen.ca
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- lib/rvm-tester.rb
|
44
|
+
- README.md
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: http://github.com/lsegal/rvm-tester
|
47
|
+
licenses: []
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 1.3.9.5
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Runs tests across Ruby installations in RVM
|
70
|
+
test_files: []
|