cukeq 0.0.1.dev → 0.0.1.dev2
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/.gitignore +3 -21
- data/Gemfile +4 -0
- data/Rakefile +5 -32
- data/cukeq.gemspec +34 -0
- data/features/step_definitions/cukeq_steps.rb +1 -1
- data/features/support/cukeq_helper.rb +23 -2
- data/features/support/env.rb +7 -3
- data/features/support/rabbit_control.rb +53 -0
- data/features/support/report_app.rb +2 -0
- data/features/support/test_environment.rb +19 -0
- data/lib/cukeq/async_job.rb +94 -0
- data/lib/cukeq/master.rb +2 -1
- data/lib/cukeq/scenario_runner.rb +7 -94
- data/lib/cukeq/scm.rb +4 -5
- data/lib/cukeq/slave.rb +5 -1
- data/lib/cukeq/version.rb +3 -0
- data/lib/cukeq.rb +4 -0
- data/spec/cukeq/scenario_runner_spec.rb +3 -1
- data/spec/cukeq/slave_spec.rb +10 -0
- metadata +76 -21
- data/.autotest +0 -1
- data/VERSION +0 -1
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,34 +1,9 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |g|
|
7
|
-
g.name = "cukeq"
|
8
|
-
g.summary = %Q{Distributed cucumbers}
|
9
|
-
g.description = %Q{Cucumber features distributed using AMQP.}
|
10
|
-
g.email = "jari.bakken@gmail.com"
|
11
|
-
g.homepage = "http://github.com/jarib/cukeq"
|
12
|
-
g.authors = ["Jari Bakken"]
|
13
|
-
|
14
|
-
g.add_dependency "amqp"
|
15
|
-
g.add_dependency "thin"
|
16
|
-
g.add_dependency "json"
|
17
|
-
g.add_dependency "git"
|
18
|
-
|
19
|
-
g.add_development_dependency "rspec", ">= 2.0.0"
|
20
|
-
g.add_development_dependency "yard", ">= 0"
|
21
|
-
g.add_development_dependency "cucumber", ">= 0"
|
22
|
-
g.add_development_dependency "rack-test", ">= 0"
|
23
|
-
end
|
24
|
-
Jeweler::GemcutterTasks.new
|
25
|
-
rescue LoadError
|
26
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
27
|
-
end
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
28
3
|
|
29
4
|
require 'rspec/core/rake_task'
|
30
5
|
|
31
|
-
task :default => [
|
6
|
+
task :default => [:spec, :features]
|
32
7
|
|
33
8
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
34
9
|
t.rspec_opts = ["--color", "--format", "progress"]
|
@@ -45,13 +20,11 @@ namespace :spec do
|
|
45
20
|
end
|
46
21
|
end
|
47
22
|
|
48
|
-
task :spec => :check_dependencies
|
49
|
-
|
50
23
|
begin
|
51
24
|
require 'cucumber/rake/task'
|
52
25
|
Cucumber::Rake::Task.new(:features)
|
53
26
|
|
54
|
-
task :features
|
27
|
+
task :features
|
55
28
|
rescue LoadError
|
56
29
|
task :features do
|
57
30
|
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
@@ -65,4 +38,4 @@ rescue LoadError
|
|
65
38
|
task :yardoc do
|
66
39
|
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
67
40
|
end
|
68
|
-
end
|
41
|
+
end
|
data/cukeq.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cukeq/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cukeq"
|
7
|
+
s.version = CukeQ::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jari Bakken"]
|
10
|
+
s.email = ["jari.bakken@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/jarib/cukeq"
|
12
|
+
s.summary = %Q{Distributed cucumbers}
|
13
|
+
s.description = %Q{Cucumber features distributed using AMQP.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "cukeq"
|
16
|
+
|
17
|
+
s.add_runtime_dependency "amqp", ">= 0"
|
18
|
+
s.add_runtime_dependency "thin", ">= 0"
|
19
|
+
s.add_runtime_dependency "json", ">= 0"
|
20
|
+
s.add_runtime_dependency "git", ">= 0"
|
21
|
+
s.add_runtime_dependency "nokogiri", ">= 0"
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec", ">= 2.0.0"
|
24
|
+
s.add_development_dependency "yard", ">= 0"
|
25
|
+
s.add_development_dependency "cucumber", ">= 0"
|
26
|
+
s.add_development_dependency "rack-test", ">= 0"
|
27
|
+
s.add_development_dependency "childprocess", ">= 0.1.4"
|
28
|
+
s.add_development_dependency "ruby-debug19"
|
29
|
+
|
30
|
+
s.files = `git ls-files`.split("\n")
|
31
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
32
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
end
|
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
Given /^I POST the following list to the master web service:$/ do |table|
|
11
11
|
features = table.raw.flatten
|
12
|
-
post(master_url, features.to_json)
|
12
|
+
post(master_url, {:features => features}.to_json)
|
13
13
|
end
|
14
14
|
|
15
15
|
Then /^the report app should know when the run has finished$/ do
|
@@ -12,6 +12,7 @@ module CukeQHelper
|
|
12
12
|
def start_master
|
13
13
|
pids << fork { CukeQ::Master.execute(MASTER_ARGS) }
|
14
14
|
ensure_running
|
15
|
+
ensure_listening(master_url)
|
15
16
|
end
|
16
17
|
|
17
18
|
def start_slave
|
@@ -23,7 +24,9 @@ module CukeQHelper
|
|
23
24
|
app = report_app()
|
24
25
|
|
25
26
|
pids << fork { app.start }
|
27
|
+
|
26
28
|
ensure_running
|
29
|
+
ensure_listening(app.url)
|
27
30
|
end
|
28
31
|
|
29
32
|
def post(url, data)
|
@@ -51,6 +54,16 @@ module CukeQHelper
|
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
57
|
+
def ensure_listening(url)
|
58
|
+
max_time = Time.now + 10
|
59
|
+
until listening?(url)
|
60
|
+
if Time.now > max_time
|
61
|
+
raise "timed out waiting for #{url} to respond"
|
62
|
+
end
|
63
|
+
sleep 0.1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
54
67
|
def report_app
|
55
68
|
@report_app ||= ReportApp.new
|
56
69
|
end
|
@@ -60,7 +73,7 @@ module CukeQHelper
|
|
60
73
|
end
|
61
74
|
|
62
75
|
def execute_request(url, req)
|
63
|
-
res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
|
76
|
+
res = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
|
64
77
|
|
65
78
|
case res
|
66
79
|
when Net::HTTPSuccess
|
@@ -70,4 +83,12 @@ module CukeQHelper
|
|
70
83
|
end
|
71
84
|
end
|
72
85
|
|
73
|
-
|
86
|
+
def listening?(url)
|
87
|
+
uri = URI.parse(url)
|
88
|
+
TCPSocket.new(uri.host, uri.port).close
|
89
|
+
true
|
90
|
+
rescue
|
91
|
+
false
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -2,12 +2,16 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'cukeq'
|
5
|
-
require '
|
6
|
-
require File.
|
7
|
-
require File.
|
5
|
+
require 'rspec/expectations'
|
6
|
+
require File.expand_path("../report_app", __FILE__)
|
7
|
+
require File.expand_path("../cukeq_helper", __FILE__)
|
8
|
+
require File.expand_path("../test_environment", __FILE__)
|
9
|
+
require File.expand_path("../rabbit_control", __FILE__)
|
8
10
|
|
9
11
|
World(CukeQHelper)
|
10
12
|
|
13
|
+
TestEnvironment.launch
|
14
|
+
|
11
15
|
After do
|
12
16
|
cleanup
|
13
17
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "tempfile"
|
2
|
+
require "childprocess"
|
3
|
+
|
4
|
+
class RabbitControl
|
5
|
+
|
6
|
+
TIMEOUT = 10
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@tmp = Tempfile.new("rabbit-control")
|
10
|
+
@process = ChildProcess.build("rabbitmq-server")
|
11
|
+
|
12
|
+
@process.io.stdout = @tmp
|
13
|
+
@process.io.stderr = @tmp
|
14
|
+
end
|
15
|
+
|
16
|
+
def start
|
17
|
+
@process.start
|
18
|
+
|
19
|
+
max_time = Time.now + TIMEOUT
|
20
|
+
|
21
|
+
until running?
|
22
|
+
if Time.now > max_time
|
23
|
+
raise "timed out waiting for rabbitmq-server"
|
24
|
+
end
|
25
|
+
sleep 0.1
|
26
|
+
end
|
27
|
+
|
28
|
+
system "rabbitmqctl list_users 2>&1"
|
29
|
+
raise "rabbit error: #{out}" unless $?.success?
|
30
|
+
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def stop
|
35
|
+
@process.stop
|
36
|
+
@tmp.close!
|
37
|
+
end
|
38
|
+
|
39
|
+
def running?
|
40
|
+
@tmp.rewind
|
41
|
+
output = @tmp.read
|
42
|
+
puts output if $DEBUG
|
43
|
+
output =~ /broker running/
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
if __FILE__ == $0
|
49
|
+
rabbitctl = RabbitControl.new
|
50
|
+
trap("INT") { rabbitctl.stop }
|
51
|
+
rabbitctl.start
|
52
|
+
sleep
|
53
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module CukeQ
|
2
|
+
class AsyncJob
|
3
|
+
|
4
|
+
def initialize(working_copy, job, callback)
|
5
|
+
@job = job
|
6
|
+
@callback = callback
|
7
|
+
@result = {:success => true, :slave => CukeQ.identifier}
|
8
|
+
@invoked = false
|
9
|
+
@working_copy = working_copy
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
parse_job
|
14
|
+
|
15
|
+
EventMachine.system3 command, &method(:child_finished)
|
16
|
+
rescue => ex
|
17
|
+
handle_exception(ex)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def handle_exception(ex)
|
23
|
+
@result.merge!(:success => false, :error => ex.message, :backtrace => ex.backtrace, :cwd => Dir.pwd)
|
24
|
+
cleanup
|
25
|
+
invoke_callback
|
26
|
+
end
|
27
|
+
|
28
|
+
def invoke_callback
|
29
|
+
if @invoked
|
30
|
+
$stderr.puts "#{self} tried to invoke callback twice"
|
31
|
+
return
|
32
|
+
end
|
33
|
+
|
34
|
+
@invoked = true
|
35
|
+
@callback.call @result
|
36
|
+
end
|
37
|
+
|
38
|
+
def cleanup
|
39
|
+
FileUtils.rm_rf(output_file) if File.exist?(output_file)
|
40
|
+
end
|
41
|
+
|
42
|
+
def command
|
43
|
+
"cucumber -rfeatures --format Cucumber::Formatter::Json --out #{output_file} #{@feature_file}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def child_finished(stdout, stderr, status)
|
47
|
+
output = <<-OUT
|
48
|
+
stdout:
|
49
|
+
#{stdout}
|
50
|
+
|
51
|
+
stderr:
|
52
|
+
#{stderr}
|
53
|
+
OUT
|
54
|
+
|
55
|
+
@result.merge!(
|
56
|
+
:output => output,
|
57
|
+
:stderr => stderr,
|
58
|
+
:stdout => stdout,
|
59
|
+
:success => status.success?,
|
60
|
+
:exitcode => status.exitstatus,
|
61
|
+
:results => fetch_results,
|
62
|
+
:cwd => Dir.pwd
|
63
|
+
)
|
64
|
+
cleanup
|
65
|
+
invoke_callback
|
66
|
+
rescue => ex
|
67
|
+
handle_exception ex
|
68
|
+
end
|
69
|
+
|
70
|
+
def fetch_results
|
71
|
+
return unless File.exist?(output_file)
|
72
|
+
|
73
|
+
content = File.read(output_file)
|
74
|
+
begin
|
75
|
+
JSON.parse(content)
|
76
|
+
rescue JSON::ParserError => ex
|
77
|
+
raise JSON::ParserError, "#{ex.message} (#{content.inspect})"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def parse_job
|
82
|
+
@feature_file = @job['unit']['file']
|
83
|
+
@run = @job['run']
|
84
|
+
@scm = @job['scm']
|
85
|
+
|
86
|
+
@result.merge!(:feature_file => @feature_file, :run => @run, :scm => @scm)
|
87
|
+
end
|
88
|
+
|
89
|
+
def output_file
|
90
|
+
@output_file ||= "#{CukeQ.identifier}-#{@run['id']}.json"
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
data/lib/cukeq/master.rb
CHANGED
@@ -86,7 +86,7 @@ module CukeQ
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def ping(&blk)
|
89
|
-
log
|
89
|
+
log self.class, :ping
|
90
90
|
@broker.subscribe :pong, &blk
|
91
91
|
@broker.publish :ping, '{}'
|
92
92
|
end
|
@@ -139,6 +139,7 @@ module CukeQ
|
|
139
139
|
end
|
140
140
|
|
141
141
|
def start_webapp
|
142
|
+
log self.class, :start_webapp
|
142
143
|
@webapp.run method(:run)
|
143
144
|
end
|
144
145
|
|
@@ -6,11 +6,16 @@ require "fileutils"
|
|
6
6
|
module CukeQ
|
7
7
|
class ScenarioRunner
|
8
8
|
|
9
|
+
attr_reader :repos
|
10
|
+
|
11
|
+
def initialize(repo_directory = nil)
|
12
|
+
@repos = repo_directory || CukeQ.root
|
13
|
+
end
|
14
|
+
|
9
15
|
def run(job, &callback)
|
10
16
|
scm = scm_for job
|
11
17
|
|
12
18
|
Dir.chdir scm.working_copy
|
13
|
-
|
14
19
|
run_job(scm.working_copy, job, callback)
|
15
20
|
rescue => ex
|
16
21
|
yield :success => false,
|
@@ -23,7 +28,7 @@ module CukeQ
|
|
23
28
|
url = job['scm']['url']
|
24
29
|
rev = job['scm']['revision']
|
25
30
|
|
26
|
-
scm = Scm.new(url)
|
31
|
+
scm = Scm.new(@repos, url)
|
27
32
|
unless scm.current_revision.to_s == rev.to_s
|
28
33
|
# TODO(jari): this doesn't ensure that current_revision == rev - it
|
29
34
|
# would also make sense to move the logic to Scm
|
@@ -40,95 +45,3 @@ module CukeQ
|
|
40
45
|
end # ScenarioRunner
|
41
46
|
end # CukeQ
|
42
47
|
|
43
|
-
class AsyncJob
|
44
|
-
|
45
|
-
def initialize(working_copy, job, callback)
|
46
|
-
@job = job
|
47
|
-
@callback = callback
|
48
|
-
@result = {:success => true, :slave => CukeQ.identifier}
|
49
|
-
@invoked = false
|
50
|
-
@working_copy = working_copy
|
51
|
-
end
|
52
|
-
|
53
|
-
def run
|
54
|
-
parse_job
|
55
|
-
|
56
|
-
EventMachine.system3 command, &method(:child_finished)
|
57
|
-
rescue => ex
|
58
|
-
handle_exception(ex)
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def handle_exception(ex)
|
64
|
-
@result.merge!(:success => false, :error => ex.message, :backtrace => ex.backtrace, :cwd => Dir.pwd)
|
65
|
-
cleanup
|
66
|
-
invoke_callback
|
67
|
-
end
|
68
|
-
|
69
|
-
def invoke_callback
|
70
|
-
if @invoked
|
71
|
-
$stderr.puts "#{self} tried to invoke callback twice"
|
72
|
-
return
|
73
|
-
end
|
74
|
-
|
75
|
-
@invoked = true
|
76
|
-
@callback.call @result
|
77
|
-
end
|
78
|
-
|
79
|
-
def cleanup
|
80
|
-
FileUtils.rm_rf(output_file) if File.exist?(output_file)
|
81
|
-
end
|
82
|
-
|
83
|
-
def command
|
84
|
-
"cucumber -rfeatures --format Cucumber::Formatter::Json --out #{output_file} #{@feature_file}"
|
85
|
-
end
|
86
|
-
|
87
|
-
def child_finished(stdout, stderr, status)
|
88
|
-
output = <<-OUT
|
89
|
-
stdout:
|
90
|
-
#{stdout}
|
91
|
-
|
92
|
-
stderr:
|
93
|
-
#{stderr}
|
94
|
-
OUT
|
95
|
-
|
96
|
-
@result.merge!(
|
97
|
-
:output => output,
|
98
|
-
:stderr => stderr,
|
99
|
-
:stdout => stdout,
|
100
|
-
:success => status.success?,
|
101
|
-
:exitcode => status.exitstatus,
|
102
|
-
:results => fetch_results,
|
103
|
-
:cwd => Dir.pwd
|
104
|
-
)
|
105
|
-
cleanup
|
106
|
-
invoke_callback
|
107
|
-
rescue => ex
|
108
|
-
handle_exception ex
|
109
|
-
end
|
110
|
-
|
111
|
-
def fetch_results
|
112
|
-
return unless File.exist?(output_file)
|
113
|
-
|
114
|
-
content = File.read(output_file)
|
115
|
-
begin
|
116
|
-
JSON.parse(content)
|
117
|
-
rescue JSON::ParserError => ex
|
118
|
-
raise JSON::ParserError, "#{ex.message} (#{content.inspect})"
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def parse_job
|
123
|
-
@feature_file = @job['unit']['file']
|
124
|
-
@run = @job['run']
|
125
|
-
@scm = @job['scm']
|
126
|
-
|
127
|
-
@result.merge!(:feature_file => @feature_file, :run => @run, :scm => @scm)
|
128
|
-
end
|
129
|
-
|
130
|
-
def output_file
|
131
|
-
@output_file ||= "#{CukeQ.identifier}-#{@run['id']}.json"
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
data/lib/cukeq/scm.rb
CHANGED
@@ -5,14 +5,13 @@ module CukeQ
|
|
5
5
|
autoload :GitBridge, "cukeq/scm/git_bridge"
|
6
6
|
autoload :SvnBridge, "cukeq/scm/svn_bridge"
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
def initialize(url)
|
8
|
+
def initialize(url, root_dir = CukeQ.root)
|
9
|
+
@root_dir = root_dir
|
11
10
|
@url = url.kind_of?(String) ? URI.parse(url) : url
|
12
11
|
end
|
13
12
|
|
14
13
|
def working_copy
|
15
|
-
@working_copy ||= "#{
|
14
|
+
@working_copy ||= "#{@root_dir}/repos/#{url.host}/#{url.path.gsub(/[^A-z]+/, '_')}"
|
16
15
|
end
|
17
16
|
|
18
17
|
def current_revision
|
@@ -33,7 +32,7 @@ module CukeQ
|
|
33
32
|
when "svn"
|
34
33
|
SvnBridge.new url, working_copy
|
35
34
|
when "http", "https"
|
36
|
-
|
35
|
+
# TODO: fix heuristic for http scm urls
|
37
36
|
if url.to_s.include?("svn")
|
38
37
|
SvnBridge.new url, working_copy
|
39
38
|
elsif url.to_s.include?("git")
|
data/lib/cukeq/slave.rb
CHANGED
@@ -24,7 +24,7 @@ module CukeQ
|
|
24
24
|
|
25
25
|
new(
|
26
26
|
Broker.new(opts[:broker]),
|
27
|
-
ScenarioRunner.new
|
27
|
+
ScenarioRunner.new(opts[:repos])
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
@@ -36,6 +36,10 @@ module CukeQ
|
|
36
36
|
opts.on("-b", "--broker URI (default: #{DEFAULT_BROKER_URI})") do |b|
|
37
37
|
options[:broker] = URI.parse(b)
|
38
38
|
end
|
39
|
+
|
40
|
+
opts.on("-r", "--repos DIRECTORY (default: #{CukeQ.root})") do |dir|
|
41
|
+
options[:repos] = dir
|
42
|
+
end
|
39
43
|
end.parse!
|
40
44
|
|
41
45
|
options
|
data/lib/cukeq.rb
CHANGED
@@ -17,7 +17,9 @@ describe CukeQ::ScenarioRunner do
|
|
17
17
|
it "creates a configured and updated Scm instance" do
|
18
18
|
job = {'scm' => {'url' => 'git://example.com/foo/bar', 'revision' => 'some-revision'}}
|
19
19
|
|
20
|
-
CukeQ::Scm.should_receive(:new).with(job['scm']['url']).
|
20
|
+
CukeQ::Scm.should_receive(:new).with(CukeQ.root, job['scm']['url']).
|
21
|
+
and_return(mock_scm = mock("scm"))
|
22
|
+
|
21
23
|
mock_scm.should_receive(:current_revision).and_return 'another-revision'
|
22
24
|
mock_scm.should_receive(:update).and_yield
|
23
25
|
|
data/spec/cukeq/slave_spec.rb
CHANGED
@@ -36,6 +36,16 @@ describe CukeQ::Slave do
|
|
36
36
|
slave.broker.pass.should == 'cukeq123'
|
37
37
|
slave.broker.vhost.should == '/cukeq'
|
38
38
|
end
|
39
|
+
|
40
|
+
it "uses the given repo directory" do
|
41
|
+
CukeQ::ScenarioRunner.should_receive(:new).with("/tmp/foo")
|
42
|
+
CukeQ::Slave.configured_instance(%w[--repos /tmp/foo])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "uses the default repo directory" do
|
46
|
+
slave = CukeQ::Slave.configured_instance
|
47
|
+
slave.scenario_runner.repos.should == CukeQ.root
|
48
|
+
end
|
39
49
|
end
|
40
50
|
|
41
51
|
describe ".execute" do
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.0.1.
|
9
|
+
- dev2
|
10
|
+
version: 0.0.1.dev2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jari Bakken
|
@@ -15,8 +15,8 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
19
|
-
default_executable:
|
18
|
+
date: 2010-12-06 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: amqp
|
@@ -71,9 +71,22 @@ dependencies:
|
|
71
71
|
type: :runtime
|
72
72
|
version_requirements: *id004
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
74
|
+
name: nokogiri
|
75
75
|
prerelease: false
|
76
76
|
requirement: &id005 !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
type: :runtime
|
85
|
+
version_requirements: *id005
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rspec
|
88
|
+
prerelease: false
|
89
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
77
90
|
none: false
|
78
91
|
requirements:
|
79
92
|
- - ">="
|
@@ -84,11 +97,11 @@ dependencies:
|
|
84
97
|
- 0
|
85
98
|
version: 2.0.0
|
86
99
|
type: :development
|
87
|
-
version_requirements: *
|
100
|
+
version_requirements: *id006
|
88
101
|
- !ruby/object:Gem::Dependency
|
89
102
|
name: yard
|
90
103
|
prerelease: false
|
91
|
-
requirement: &
|
104
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
92
105
|
none: false
|
93
106
|
requirements:
|
94
107
|
- - ">="
|
@@ -97,11 +110,11 @@ dependencies:
|
|
97
110
|
- 0
|
98
111
|
version: "0"
|
99
112
|
type: :development
|
100
|
-
version_requirements: *
|
113
|
+
version_requirements: *id007
|
101
114
|
- !ruby/object:Gem::Dependency
|
102
115
|
name: cucumber
|
103
116
|
prerelease: false
|
104
|
-
requirement: &
|
117
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
105
118
|
none: false
|
106
119
|
requirements:
|
107
120
|
- - ">="
|
@@ -110,11 +123,11 @@ dependencies:
|
|
110
123
|
- 0
|
111
124
|
version: "0"
|
112
125
|
type: :development
|
113
|
-
version_requirements: *
|
126
|
+
version_requirements: *id008
|
114
127
|
- !ruby/object:Gem::Dependency
|
115
128
|
name: rack-test
|
116
129
|
prerelease: false
|
117
|
-
requirement: &
|
130
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
118
131
|
none: false
|
119
132
|
requirements:
|
120
133
|
- - ">="
|
@@ -123,33 +136,64 @@ dependencies:
|
|
123
136
|
- 0
|
124
137
|
version: "0"
|
125
138
|
type: :development
|
126
|
-
version_requirements: *
|
139
|
+
version_requirements: *id009
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: childprocess
|
142
|
+
prerelease: false
|
143
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
segments:
|
149
|
+
- 0
|
150
|
+
- 1
|
151
|
+
- 4
|
152
|
+
version: 0.1.4
|
153
|
+
type: :development
|
154
|
+
version_requirements: *id010
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: ruby-debug19
|
157
|
+
prerelease: false
|
158
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
159
|
+
none: false
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
segments:
|
164
|
+
- 0
|
165
|
+
version: "0"
|
166
|
+
type: :development
|
167
|
+
version_requirements: *id011
|
127
168
|
description: Cucumber features distributed using AMQP.
|
128
|
-
email:
|
169
|
+
email:
|
170
|
+
- jari.bakken@gmail.com
|
129
171
|
executables:
|
130
172
|
- cukeq
|
131
173
|
extensions: []
|
132
174
|
|
133
|
-
extra_rdoc_files:
|
134
|
-
|
135
|
-
- README.rdoc
|
175
|
+
extra_rdoc_files: []
|
176
|
+
|
136
177
|
files:
|
137
|
-
- .autotest
|
138
178
|
- .document
|
139
179
|
- .gitignore
|
180
|
+
- Gemfile
|
140
181
|
- LICENSE
|
141
182
|
- README.rdoc
|
142
183
|
- Rakefile
|
143
|
-
- VERSION
|
144
184
|
- bin/cukeq
|
185
|
+
- cukeq.gemspec
|
145
186
|
- features/cukeq.feature
|
146
187
|
- features/example1.feature
|
147
188
|
- features/example2.feature
|
148
189
|
- features/step_definitions/cukeq_steps.rb
|
149
190
|
- features/support/cukeq_helper.rb
|
150
191
|
- features/support/env.rb
|
192
|
+
- features/support/rabbit_control.rb
|
151
193
|
- features/support/report_app.rb
|
194
|
+
- features/support/test_environment.rb
|
152
195
|
- lib/cukeq.rb
|
196
|
+
- lib/cukeq/async_job.rb
|
153
197
|
- lib/cukeq/broker.rb
|
154
198
|
- lib/cukeq/em/system3.rb
|
155
199
|
- lib/cukeq/job_clearer.rb
|
@@ -163,6 +207,7 @@ files:
|
|
163
207
|
- lib/cukeq/scm/shell_svn_bridge.rb
|
164
208
|
- lib/cukeq/scm/svn_bridge.rb
|
165
209
|
- lib/cukeq/slave.rb
|
210
|
+
- lib/cukeq/version.rb
|
166
211
|
- lib/cukeq/webapp.rb
|
167
212
|
- spec/cukeq/broker_spec.rb
|
168
213
|
- spec/cukeq/cukeq_spec.rb
|
@@ -183,8 +228,8 @@ homepage: http://github.com/jarib/cukeq
|
|
183
228
|
licenses: []
|
184
229
|
|
185
230
|
post_install_message:
|
186
|
-
rdoc_options:
|
187
|
-
|
231
|
+
rdoc_options: []
|
232
|
+
|
188
233
|
require_paths:
|
189
234
|
- lib
|
190
235
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -207,12 +252,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
252
|
version: 1.3.1
|
208
253
|
requirements: []
|
209
254
|
|
210
|
-
rubyforge_project:
|
255
|
+
rubyforge_project: cukeq
|
211
256
|
rubygems_version: 1.3.7
|
212
257
|
signing_key:
|
213
258
|
specification_version: 3
|
214
259
|
summary: Distributed cucumbers
|
215
260
|
test_files:
|
261
|
+
- features/cukeq.feature
|
262
|
+
- features/example1.feature
|
263
|
+
- features/example2.feature
|
264
|
+
- features/step_definitions/cukeq_steps.rb
|
265
|
+
- features/support/cukeq_helper.rb
|
266
|
+
- features/support/env.rb
|
267
|
+
- features/support/rabbit_control.rb
|
268
|
+
- features/support/report_app.rb
|
269
|
+
- features/support/test_environment.rb
|
216
270
|
- spec/cukeq/broker_spec.rb
|
217
271
|
- spec/cukeq/cukeq_spec.rb
|
218
272
|
- spec/cukeq/master_spec.rb
|
@@ -225,4 +279,5 @@ test_files:
|
|
225
279
|
- spec/cukeq/scm_spec.rb
|
226
280
|
- spec/cukeq/slave_spec.rb
|
227
281
|
- spec/cukeq/webapp_spec.rb
|
282
|
+
- spec/spec.opts
|
228
283
|
- spec/spec_helper.rb
|
data/.autotest
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "autotest/redgreen"
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.1.dev
|