rvm-tester 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.md +53 -0
  2. data/lib/rvm-tester.rb +126 -0
  3. 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: []