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.
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: []