testbot 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 0.5.8
2
+
3
+ Now only running tests from one build on a runner at a time.
4
+
5
+ This is mostly usability. Testbot should behave like when you're running your tests locally.
6
+
1
7
  0.5.7
2
8
 
3
9
  Added @meeiw's patch to support ERB in config. Added test result summarization for RSpec and Cucumber.
@@ -64,7 +64,7 @@ Using testbot with Rails 2:
64
64
 
65
65
  # Add testbot to your Gemfile if you use bundler. You also need the plugin because
66
66
  # Rails 2 does not load raketasks from gems.
67
- ruby script/plugin install git://github.com/joakimk/testbot.git -r 'refs/tags/v0.5.7'
67
+ ruby script/plugin install git://github.com/joakimk/testbot.git -r 'refs/tags/v0.5.8'
68
68
  script/generate testbot --connect 192.168.0.100
69
69
 
70
70
  rake testbot:spec (or :rspec, :test, :features)
@@ -1,6 +1,5 @@
1
1
  require 'rubygems'
2
2
  require 'httparty'
3
- require 'macaddr'
4
3
  require 'ostruct'
5
4
  require 'erb'
6
5
  require File.dirname(__FILE__) + '/../shared/ssh_tunnel'
@@ -49,7 +48,6 @@ module Testbot::Requester
49
48
  build_id = HTTParty.post("#{server_uri}/builds", :body => { :root => root,
50
49
  :type => adapter.type.to_s,
51
50
  :project => config.project,
52
- :requester_mac => Mac.addr,
53
51
  :available_runner_usage => config.available_runner_usage,
54
52
  :files => files.join(' '),
55
53
  :sizes => sizes.join(' '),
@@ -2,11 +2,11 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'runner.rb'))
2
2
 
3
3
  module Testbot::Runner
4
4
  class Job
5
- attr_reader :root, :project, :requester_mac
5
+ attr_reader :root, :project, :build_id
6
6
 
7
- def initialize(runner, id, requester_mac, project, root, type, ruby_interpreter, files)
8
- @runner, @id, @requester_mac, @project, @root, @type, @ruby_interpreter, @files =
9
- runner, id, requester_mac, project, root, type, ruby_interpreter, files
7
+ def initialize(runner, id, build_id, project, root, type, ruby_interpreter, files)
8
+ @runner, @id, @build_id, @project, @root, @type, @ruby_interpreter, @files =
9
+ runner, id, build_id, project, root, type, ruby_interpreter, files
10
10
  end
11
11
 
12
12
  def jruby?
@@ -14,7 +14,7 @@ module Testbot::Runner
14
14
  end
15
15
 
16
16
  def run(instance)
17
- puts "Running job #{@id} from #{@requester_mac}... "
17
+ puts "Running job #{@id} (build #{@build_id})... "
18
18
  test_env_number = (instance == 0) ? '' : instance + 1
19
19
  result = "\n#{`hostname`.chomp}:#{Dir.pwd}\n"
20
20
  base_environment = "export RAILS_ENV=test; export TEST_ENV_NUMBER=#{test_env_number}; cd #{@project};"
@@ -33,7 +33,7 @@ module Testbot::Runner
33
33
 
34
34
  def initialize(config)
35
35
  @instances = []
36
- @last_requester_mac = nil
36
+ @last_build_id = nil
37
37
  @last_version_check = Time.now - TIME_BETWEEN_VERSION_CHECKS - 1
38
38
  @config = OpenStruct.new(config)
39
39
  @config.max_instances = @config.max_instances ? @config.max_instances.to_i : CPU.count
@@ -85,13 +85,13 @@ module Testbot::Runner
85
85
 
86
86
  check_for_update if !last_check_found_a_job && time_for_update?
87
87
 
88
- # Only get jobs from one requester at a time
88
+ # Only get jobs from one build at a time
89
89
  next_params = base_params
90
90
  if @instances.size > 0
91
- next_params.merge!({ :requester_mac => @last_requester_mac })
91
+ next_params.merge!({ :build_id => @last_build_id })
92
92
  next_params.merge!({ :no_jruby => true }) if max_jruby_instances?
93
93
  else
94
- @last_requester_mac = nil
94
+ @last_build_id = nil
95
95
  end
96
96
 
97
97
  # Makes sure all instances are listed as available after a run
@@ -102,14 +102,14 @@ module Testbot::Runner
102
102
  next unless last_check_found_a_job
103
103
 
104
104
  job = Job.new(*([ self, next_job.split(',') ].flatten))
105
- if first_job_from_requester?
105
+ if first_job_from_build?
106
106
  fetch_code(job)
107
107
  before_run(job) if File.exists?("#{job.project}/lib/tasks/testbot.rake")
108
108
  end
109
109
 
110
110
  @instances << [ Thread.new { job.run(free_instance_number) },
111
111
  free_instance_number, job ]
112
- @last_requester_mac = job.requester_mac
112
+ @last_build_id = job.build_id
113
113
  loop do
114
114
  clear_completed_instances
115
115
  break unless max_instances_running?
@@ -131,8 +131,8 @@ module Testbot::Runner
131
131
  system "export RAILS_ENV=test; export TEST_INSTANCES=#{@config.max_instances}; cd #{job.project}; #{bundler_cmd} rake testbot:before_run"
132
132
  end
133
133
 
134
- def first_job_from_requester?
135
- @last_requester_mac == nil
134
+ def first_job_from_build?
135
+ @last_build_id == nil
136
136
  end
137
137
 
138
138
  def time_for_update?
@@ -21,7 +21,6 @@ module Testbot::Server
21
21
  :root => self.root,
22
22
  :project => self.project,
23
23
  :type => self.type,
24
- :requester_mac => self.requester_mac,
25
24
  :build => self,
26
25
  :jruby => self.jruby)
27
26
  end
@@ -15,19 +15,19 @@ module Testbot::Server
15
15
  end
16
16
 
17
17
  def self.next(params, remove_addr)
18
- clean_params = params.reject { |k, v| [ "requester_mac", "no_jruby" ].include?(k) }
18
+ clean_params = params.reject { |k, v| k == "no_jruby" }
19
19
  runner = Runner.record! clean_params.merge({ :ip => remove_addr, :last_seen_at => Time.now })
20
20
  return unless Server.valid_version?(params[:version])
21
- [ next_job(params["requester_mac"], params["no_jruby"]), runner ]
21
+ [ next_job(params["build_id"], params["no_jruby"]), runner ]
22
22
  end
23
23
 
24
24
  private
25
25
 
26
- def self.next_job(requester_mac, no_jruby)
26
+ def self.next_job(build_id, no_jruby)
27
27
  release_jobs_taken_by_missing_runners!
28
28
  jobs = Job.all.find_all { |j|
29
29
  !j.taken_at &&
30
- (requester_mac ? j.requester_mac == requester_mac : true) &&
30
+ (build_id ? j.build.id.to_s == build_id : true) &&
31
31
  (no_jruby ? j.jruby != 1 : true)
32
32
  }
33
33
 
@@ -37,7 +37,7 @@ module Testbot::Server
37
37
  next_job, runner = Job.next(params, @env['REMOTE_ADDR'])
38
38
  if next_job
39
39
  next_job.update(:taken_at => Time.now, :taken_by => runner)
40
- [ next_job.id, next_job.requester_mac, next_job.project, next_job.root, next_job.type, (next_job.jruby == 1 ? 'jruby' : 'ruby'), next_job.files ].join(',')
40
+ [ next_job.id, next_job.build.id, next_job.project, next_job.root, next_job.type, (next_job.jruby == 1 ? 'jruby' : 'ruby'), next_job.files ].join(',')
41
41
  end
42
42
  end
43
43
 
@@ -1,7 +1,7 @@
1
1
  module Testbot
2
2
  # Don't forget to update readme and changelog
3
3
  def self.version
4
- version = "0.5.7"
4
+ version = "0.5.8"
5
5
  dev_version_file = File.join(File.dirname(__FILE__), '..', '..', 'DEV_VERSION')
6
6
  if File.exists?(dev_version_file)
7
7
  version += File.read(dev_version_file)
@@ -82,7 +82,6 @@ module Testbot::Requester
82
82
  context "run_tests" do
83
83
 
84
84
  should "should be able to create a build" do
85
- flexmock(Mac).should_receive(:addr).and_return('aa:aa:aa:aa:aa:aa')
86
85
  requester = Requester.new(:server_host => "192.168.1.100", :rsync_path => '/path', :available_runner_usage => '60%', :project => 'things', :server_user => "cruise")
87
86
  flexmock(RspecAdapter).should_receive(:test_files).with('spec').once.and_return([ 'spec/models/house_spec.rb', 'spec/models/car_spec.rb' ])
88
87
 
@@ -94,7 +93,6 @@ module Testbot::Requester
94
93
  :root => "cruise@192.168.1.100:/path",
95
94
  :project => "things",
96
95
  :available_runner_usage => "60%",
97
- :requester_mac => 'aa:aa:aa:aa:aa:aa',
98
96
  :files => "spec/models/house_spec.rb" +
99
97
  " spec/models/car_spec.rb",
100
98
  :sizes => "10 20",
@@ -346,12 +344,11 @@ module Testbot::Requester
346
344
  ENV['USE_JRUBY'] = "true"
347
345
  requester = Requester.new
348
346
  flexmock(requester).should_receive(:system)
349
- flexmock(Mac).should_receive(:addr).and_return("00:01:..")
350
347
 
351
348
  # This is quite ugly. I want something like hash_including instead...
352
349
  other_args = { :type=>"test", :available_runner_usage=>"100%",
353
350
  :root=>"testbot@:/tmp/testbot/#{ENV['USER']}", :files=>"test/some_test.rb",
354
- :requester_mac=>"00:01:..", :sizes=>"0", :project=>"project" }
351
+ :sizes=>"0", :project=>"project" }
355
352
 
356
353
  flexmock(TestUnitAdapter).should_receive(:test_files).and_return([ 'test/some_test.rb' ])
357
354
  flexmock(HTTParty).should_receive(:post).with(any, :body => other_args.merge({ :jruby => true })).and_return('5')
@@ -25,7 +25,7 @@ module Testbot::Server
25
25
 
26
26
  should "create a build and return its id" do
27
27
  flexmock(Runner).should_receive(:total_instances).and_return(2)
28
- post '/builds', :files => 'spec/models/car_spec.rb spec/models/house_spec.rb', :root => 'server:/path/to/project', :type => 'spec', :available_runner_usage => "100%", :requester_mac => "bb:bb:bb:bb:bb:bb", :project => 'things', :sizes => "10 20", :jruby => false
28
+ post '/builds', :files => 'spec/models/car_spec.rb spec/models/house_spec.rb', :root => 'server:/path/to/project', :type => 'spec', :available_runner_usage => "100%", :project => 'things', :sizes => "10 20", :jruby => false
29
29
 
30
30
  first_build = Build.all.first
31
31
  assert last_response.ok?
@@ -35,7 +35,6 @@ module Testbot::Server
35
35
  assert_equal '10 20', first_build.sizes
36
36
  assert_equal 'server:/path/to/project', first_build.root
37
37
  assert_equal 'spec', first_build.type
38
- assert_equal 'bb:bb:bb:bb:bb:bb', first_build.requester_mac
39
38
  assert_equal 'things', first_build.project
40
39
  assert_equal 0, first_build.jruby
41
40
  assert_equal '', first_build.results
@@ -49,7 +48,7 @@ module Testbot::Server
49
48
  ["spec/models/house_spec.rb", "spec/models/house2_spec.rb"]
50
49
  ])
51
50
 
52
- post '/builds', :files => 'spec/models/car_spec.rb spec/models/car2_spec.rb spec/models/house_spec.rb spec/models/house2_spec.rb', :root => 'server:/path/to/project', :type => 'spec', :available_runner_usage => "100%", :requester_mac => "bb:bb:bb:bb:bb:bb", :project => 'things', :sizes => "1 1 1 1", :jruby => true
51
+ post '/builds', :files => 'spec/models/car_spec.rb spec/models/car2_spec.rb spec/models/house_spec.rb spec/models/house2_spec.rb', :root => 'server:/path/to/project', :type => 'spec', :available_runner_usage => "100%", :project => 'things', :sizes => "1 1 1 1", :jruby => true
53
52
 
54
53
  assert_equal 2, Job.count
55
54
  first_job, last_job = Job.all
@@ -58,7 +57,6 @@ module Testbot::Server
58
57
 
59
58
  assert_equal 'server:/path/to/project', first_job.root
60
59
  assert_equal 'spec', first_job.type
61
- assert_equal 'bb:bb:bb:bb:bb:bb', first_job.requester_mac
62
60
  assert_equal 'things', first_job.project
63
61
  assert_equal 1, first_job.jruby
64
62
  assert_equal Build.all.first, first_job.build
@@ -103,21 +101,23 @@ module Testbot::Server
103
101
  context "GET /jobs/next" do
104
102
 
105
103
  should "be able to return a job and mark it as taken" do
106
- job1 = Job.create :files => 'spec/models/car_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb", :project => 'things', :jruby => 1
104
+ build = Build.create
105
+ job1 = Job.create :files => 'spec/models/car_spec.rb', :root => 'server:/project', :type => 'spec', :build => build, :project => 'things', :jruby => 1
107
106
 
108
107
  get '/jobs/next', :version => Testbot.version
109
108
  assert last_response.ok?
110
109
 
111
- assert_equal [ job1.id, "bb:bb:bb:bb:bb:bb", "things", "server:/project", "spec", "jruby", "spec/models/car_spec.rb" ].join(','), last_response.body
110
+ assert_equal [ job1.id, build.id, "things", "server:/project", "spec", "jruby", "spec/models/car_spec.rb" ].join(','), last_response.body
112
111
  assert job1.taken_at != nil
113
112
  end
114
113
 
115
114
  should "not return a job that has already been taken" do
116
- job1 = Job.create :files => 'spec/models/car_spec.rb', :taken_at => Time.now, :type => 'spec'
117
- job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "aa:aa:aa:aa:aa:aa", :project => 'things', :jruby => 0
115
+ build = Build.create
116
+ job1 = Job.create :files => 'spec/models/car_spec.rb', :taken_at => Time.now, :type => 'spec', :build => build
117
+ job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build, :project => 'things', :jruby => 0
118
118
  get '/jobs/next', :version => Testbot.version
119
119
  assert last_response.ok?
120
- assert_equal [ job2.id, "aa:aa:aa:aa:aa:aa", "things", "server:/project", "spec", "ruby", "spec/models/house_spec.rb" ].join(','), last_response.body
120
+ assert_equal [ job2.id, build.id, "things", "server:/project", "spec", "ruby", "spec/models/house_spec.rb" ].join(','), last_response.body
121
121
  assert job2.taken_at != nil
122
122
  end
123
123
 
@@ -128,7 +128,7 @@ module Testbot::Server
128
128
  end
129
129
 
130
130
  should "save which runner takes a job" do
131
- job = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "aa:aa:aa:aa:aa:aa"
131
+ job = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => Build.create
132
132
  get '/jobs/next', :version => Testbot.version
133
133
  assert_equal Runner.first, job.taken_by
134
134
  end
@@ -160,23 +160,25 @@ module Testbot::Server
160
160
  end
161
161
 
162
162
  should "only give jobs from the same source to a runner" do
163
- job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb"
164
- get '/jobs/next', :version => Testbot.version, :uid => "00:..."
163
+ build = Build.create
164
+ job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :build => build
165
+ get '/jobs/next', :version => Testbot.version, :uid => "00:...", :build_id => build.id
165
166
 
166
167
  # Creating the second job here because of the random lookup.
167
- job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "aa:aa:aa:aa:aa:aa"
168
- get '/jobs/next', :version => Testbot.version, :uid => "00:...", :requester_mac => "bb:bb:bb:bb:bb:bb"
168
+ job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build
169
+ get '/jobs/next', :version => Testbot.version, :uid => "00:...", :build_id => build.id + 1
169
170
 
170
171
  assert last_response.ok?
171
172
  assert_equal '', last_response.body
172
173
  end
173
174
 
174
175
  should "not give more jruby jobs to an instance that can't take more" do
175
- job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb", :jruby => 1
176
+ build = Build.create
177
+ job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :jruby => 1, :build => build
176
178
  get '/jobs/next', :version => Testbot.version, :uid => "00:..."
177
179
 
178
180
  # Creating the second job here because of the random lookup.
179
- job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :jruby => 1
181
+ job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :jruby => 1, :build => build
180
182
  get '/jobs/next', :version => Testbot.version, :uid => "00:...", :no_jruby => "true"
181
183
 
182
184
  assert last_response.ok?
@@ -184,38 +186,40 @@ module Testbot::Server
184
186
  end
185
187
 
186
188
  should "still return other jobs when the runner cant take more jruby jobs" do
187
- job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb", :jruby => 1
189
+ job1 = Job.create :files => 'spec/models/car_spec.rb', :type => 'spec', :jruby => 1, :build => Build.create
188
190
  get '/jobs/next', :version => Testbot.version, :uid => "00:..."
189
191
 
190
192
  # Creating the second job here because of the random lookup.
191
- job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :jruby => 0
193
+ job2 = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :jruby => 0, :build => Build.create
192
194
  get '/jobs/next', :version => Testbot.version, :uid => "00:...", :no_jruby => "true"
193
195
 
194
196
  assert last_response.ok?
195
197
  assert_equal job2.id.to_s, last_response.body.split(',')[0]
196
198
  end
197
199
 
198
- should "return the jobs in random order in order to start working for a new requester right away" do
199
- 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb" }
200
+ should "return the jobs in random order in order to start working for a new build right away" do
201
+ build1, build2 = Build.create, Build.create
202
+ 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build1 }
200
203
 
201
- 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "aa:aa:aa:aa:aa:aa" }
204
+ 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build2 }
202
205
 
203
- macs = (0...10).map {
206
+ build_ids = (0...10).map {
204
207
  get '/jobs/next', :version => Testbot.version, :uid => "00:..."
205
208
  last_response.body.split(',')[1]
206
209
  }
207
210
 
208
- assert macs.find { |mac| mac == 'bb:bb:bb:bb:bb:bb' }
209
- assert macs.find { |mac| mac == 'aa:aa:aa:aa:aa:aa' }
211
+ assert build_ids.find { |build_id| build_id == build1.id.to_s }
212
+ assert build_ids.find { |build_id| build_id == build2.id.to_s }
210
213
  end
211
214
 
212
- should "return the jobs randomly when passing requester" do
213
- 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb" }
215
+ should "return the jobs randomly when passing build_id" do
216
+ build = Build.create
217
+ 20.times { Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build }
214
218
 
215
- 20.times { Job.create :files => 'spec/models/car_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "bb:bb:bb:bb:bb:bb" }
219
+ 20.times { Job.create :files => 'spec/models/car_spec.rb', :root => 'server:/project', :type => 'spec', :build => build }
216
220
 
217
221
  files = (0...10).map {
218
- get '/jobs/next', :version => Testbot.version, :uid => "00:...", :requester_mac => "bb:bb:bb:bb:bb:bb"
222
+ get '/jobs/next', :version => Testbot.version, :uid => "00:...", :build_id => build.id
219
223
  last_response.body.split(',').last
220
224
  }
221
225
 
@@ -225,14 +229,15 @@ module Testbot::Server
225
229
 
226
230
  should "return taken jobs to other runners if the runner hasn't been seen for 10 seconds or more" do
227
231
  missing_runner = Runner.create(:last_seen_at => Time.now - 15)
228
- old_taken_job = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :requester_mac => "aa:aa:aa:aa:aa:aa", :taken_by => missing_runner, :taken_at => Time.now - 30, :project => 'things'
232
+ build = Build.create
233
+ old_taken_job = Job.create :files => 'spec/models/house_spec.rb', :root => 'server:/project', :type => 'spec', :build => build, :taken_by => missing_runner, :taken_at => Time.now - 30, :project => 'things'
229
234
 
230
235
  new_runner = Runner.create(:uid => "00:01")
231
236
  get '/jobs/next', :version => Testbot.version, :uid => "00:01"
232
237
  assert_equal new_runner, old_taken_job.taken_by
233
238
 
234
239
  assert last_response.ok?
235
- assert_equal [ old_taken_job.id, "aa:aa:aa:aa:aa:aa", "things", "server:/project", "spec", "ruby", "spec/models/house_spec.rb" ].join(','), last_response.body
240
+ assert_equal [ old_taken_job.id, build.id.to_s, "things", "server:/project", "spec", "ruby", "spec/models/house_spec.rb" ].join(','), last_response.body
236
241
  end
237
242
 
238
243
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: testbot
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 5
9
- - 7
10
- version: 0.5.7
9
+ - 8
10
+ version: 0.5.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Joakim Kolsj\xC3\xB6"
@@ -15,13 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-19 00:00:00 +02:00
18
+ date: 2011-06-29 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: sinatra
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
27
25
  - - "="
@@ -32,12 +30,12 @@ dependencies:
32
30
  - 0
33
31
  - 0
34
32
  version: 1.0.0
33
+ prerelease: false
34
+ name: sinatra
35
35
  type: :runtime
36
- version_requirements: *id001
36
+ requirement: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: httparty
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
41
  - - ">="
@@ -48,12 +46,12 @@ dependencies:
48
46
  - 6
49
47
  - 1
50
48
  version: 0.6.1
49
+ prerelease: false
50
+ name: httparty
51
51
  type: :runtime
52
- version_requirements: *id002
52
+ requirement: *id002
53
53
  - !ruby/object:Gem::Dependency
54
- name: macaddr
55
- prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
57
55
  none: false
58
56
  requirements:
59
57
  - - ">="
@@ -64,12 +62,12 @@ dependencies:
64
62
  - 0
65
63
  - 0
66
64
  version: 1.0.0
65
+ prerelease: false
66
+ name: macaddr
67
67
  type: :runtime
68
- version_requirements: *id003
68
+ requirement: *id003
69
69
  - !ruby/object:Gem::Dependency
70
- name: net-ssh
71
- prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
73
71
  none: false
74
72
  requirements:
75
73
  - - ">="
@@ -80,12 +78,12 @@ dependencies:
80
78
  - 0
81
79
  - 23
82
80
  version: 2.0.23
81
+ prerelease: false
82
+ name: net-ssh
83
83
  type: :runtime
84
- version_requirements: *id004
84
+ requirement: *id004
85
85
  - !ruby/object:Gem::Dependency
86
- name: json_pure
87
- prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
86
+ version_requirements: &id005 !ruby/object:Gem::Requirement
89
87
  none: false
90
88
  requirements:
91
89
  - - ">="
@@ -96,12 +94,12 @@ dependencies:
96
94
  - 4
97
95
  - 6
98
96
  version: 1.4.6
97
+ prerelease: false
98
+ name: json_pure
99
99
  type: :runtime
100
- version_requirements: *id005
100
+ requirement: *id005
101
101
  - !ruby/object:Gem::Dependency
102
- name: daemons
103
- prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
102
+ version_requirements: &id006 !ruby/object:Gem::Requirement
105
103
  none: false
106
104
  requirements:
107
105
  - - ">="
@@ -112,12 +110,12 @@ dependencies:
112
110
  - 0
113
111
  - 10
114
112
  version: 1.0.10
113
+ prerelease: false
114
+ name: daemons
115
115
  type: :runtime
116
- version_requirements: *id006
116
+ requirement: *id006
117
117
  - !ruby/object:Gem::Dependency
118
- name: acts_as_rails3_generator
119
- prerelease: false
120
- requirement: &id007 !ruby/object:Gem::Requirement
118
+ version_requirements: &id007 !ruby/object:Gem::Requirement
121
119
  none: false
122
120
  requirements:
123
121
  - - ">="
@@ -126,12 +124,12 @@ dependencies:
126
124
  segments:
127
125
  - 0
128
126
  version: "0"
127
+ prerelease: false
128
+ name: acts_as_rails3_generator
129
129
  type: :runtime
130
- version_requirements: *id007
130
+ requirement: *id007
131
131
  - !ruby/object:Gem::Dependency
132
- name: shoulda
133
- prerelease: false
134
- requirement: &id008 !ruby/object:Gem::Requirement
132
+ version_requirements: &id008 !ruby/object:Gem::Requirement
135
133
  none: false
136
134
  requirements:
137
135
  - - ">="
@@ -140,12 +138,12 @@ dependencies:
140
138
  segments:
141
139
  - 0
142
140
  version: "0"
141
+ prerelease: false
142
+ name: shoulda
143
143
  type: :development
144
- version_requirements: *id008
144
+ requirement: *id008
145
145
  - !ruby/object:Gem::Dependency
146
- name: rack-test
147
- prerelease: false
148
- requirement: &id009 !ruby/object:Gem::Requirement
146
+ version_requirements: &id009 !ruby/object:Gem::Requirement
149
147
  none: false
150
148
  requirements:
151
149
  - - ">="
@@ -154,12 +152,12 @@ dependencies:
154
152
  segments:
155
153
  - 0
156
154
  version: "0"
155
+ prerelease: false
156
+ name: rack-test
157
157
  type: :development
158
- version_requirements: *id009
158
+ requirement: *id009
159
159
  - !ruby/object:Gem::Dependency
160
- name: flexmock
161
- prerelease: false
162
- requirement: &id010 !ruby/object:Gem::Requirement
160
+ version_requirements: &id010 !ruby/object:Gem::Requirement
163
161
  none: false
164
162
  requirements:
165
163
  - - ">="
@@ -168,12 +166,12 @@ dependencies:
168
166
  segments:
169
167
  - 0
170
168
  version: "0"
169
+ prerelease: false
170
+ name: flexmock
171
171
  type: :development
172
- version_requirements: *id010
172
+ requirement: *id010
173
173
  - !ruby/object:Gem::Dependency
174
- name: cucumber
175
- prerelease: false
176
- requirement: &id011 !ruby/object:Gem::Requirement
174
+ version_requirements: &id011 !ruby/object:Gem::Requirement
177
175
  none: false
178
176
  requirements:
179
177
  - - ">="
@@ -182,12 +180,12 @@ dependencies:
182
180
  segments:
183
181
  - 0
184
182
  version: "0"
183
+ prerelease: false
184
+ name: cucumber
185
185
  type: :development
186
- version_requirements: *id011
186
+ requirement: *id011
187
187
  - !ruby/object:Gem::Dependency
188
- name: rvm
189
- prerelease: false
190
- requirement: &id012 !ruby/object:Gem::Requirement
188
+ version_requirements: &id012 !ruby/object:Gem::Requirement
191
189
  none: false
192
190
  requirements:
193
191
  - - ">="
@@ -196,12 +194,12 @@ dependencies:
196
194
  segments:
197
195
  - 0
198
196
  version: "0"
197
+ prerelease: false
198
+ name: rvm
199
199
  type: :development
200
- version_requirements: *id012
200
+ requirement: *id012
201
201
  - !ruby/object:Gem::Dependency
202
- name: rake
203
- prerelease: false
204
- requirement: &id013 !ruby/object:Gem::Requirement
202
+ version_requirements: &id013 !ruby/object:Gem::Requirement
205
203
  none: false
206
204
  requirements:
207
205
  - - ">="
@@ -210,12 +208,12 @@ dependencies:
210
208
  segments:
211
209
  - 0
212
210
  version: "0"
211
+ prerelease: false
212
+ name: rake
213
213
  type: :development
214
- version_requirements: *id013
214
+ requirement: *id013
215
215
  - !ruby/object:Gem::Dependency
216
- name: bundler
217
- prerelease: false
218
- requirement: &id014 !ruby/object:Gem::Requirement
216
+ version_requirements: &id014 !ruby/object:Gem::Requirement
219
217
  none: false
220
218
  requirements:
221
219
  - - ">="
@@ -224,12 +222,12 @@ dependencies:
224
222
  segments:
225
223
  - 0
226
224
  version: "0"
225
+ prerelease: false
226
+ name: bundler
227
227
  type: :development
228
- version_requirements: *id014
228
+ requirement: *id014
229
229
  - !ruby/object:Gem::Dependency
230
- name: guard
231
- prerelease: false
232
- requirement: &id015 !ruby/object:Gem::Requirement
230
+ version_requirements: &id015 !ruby/object:Gem::Requirement
233
231
  none: false
234
232
  requirements:
235
233
  - - ">="
@@ -238,12 +236,12 @@ dependencies:
238
236
  segments:
239
237
  - 0
240
238
  version: "0"
239
+ prerelease: false
240
+ name: guard
241
241
  type: :development
242
- version_requirements: *id015
242
+ requirement: *id015
243
243
  - !ruby/object:Gem::Dependency
244
- name: guard-test
245
- prerelease: false
246
- requirement: &id016 !ruby/object:Gem::Requirement
244
+ version_requirements: &id016 !ruby/object:Gem::Requirement
247
245
  none: false
248
246
  requirements:
249
247
  - - ">="
@@ -252,8 +250,10 @@ dependencies:
252
250
  segments:
253
251
  - 0
254
252
  version: "0"
253
+ prerelease: false
254
+ name: guard-test
255
255
  type: :development
256
- version_requirements: *id016
256
+ requirement: *id016
257
257
  description: Testbot is a test distribution tool that works with Rails, RSpec, RSpec2, Test::Unit and Cucumber.
258
258
  email:
259
259
  - joakim.kolsjo@gmail.com