drbqs 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  Task queuing system over network that is implemented by dRuby.
4
4
 
5
+ == Requirements
6
+
7
+ DRbQS uses Fiber, so ruby requires version 1.9.
8
+
5
9
  == Usage
6
10
 
7
11
  === Preparation
@@ -30,21 +34,68 @@ We make server.rb as the following.
30
34
 
31
35
  require_relative 'sum.rb'
32
36
 
33
- DRbQS.define_server do |server, argv, opts|
37
+ DRbQS.define_server(:finish_exit => true) do |server, argv, opts|
34
38
  10.step(100, 10) do |i|
35
39
  task = DRbQS::Task.new(Sum.new(i - 10, i), :exec)
36
40
  server.queue.add(task)
37
41
  end
38
-
39
- server.set_finish_hook do |serv|
40
- serv.exit
41
- end
42
42
  end
43
43
 
44
44
  In terminal, we load server.rb and execute server of drbqs.
45
45
 
46
46
  drbqs-server server.rb -p 13500
47
47
 
48
+ === Hook of server
49
+
50
+ We can use two hooks of server: 'empty_queue' and 'finish'.
51
+
52
+ DRbQS.define_server do |server, argv, opts|
53
+ server.add_hook(:empty_queue) do |srv|
54
+ srm.queue.add( ... )
55
+ end
56
+
57
+ server.add_hook(:finish) do |srv|
58
+ srm.exit
59
+ end
60
+ end
61
+
62
+ 'finish' hook usually exit server program, but
63
+ an option :finish_exit for DRbQS.define_server or DRbQS.new
64
+ is nearly same.
65
+
66
+ We can use 'empty_queue' hook for adding tasks
67
+ when task queue is empty.
68
+
69
+ === Task generator
70
+
71
+ Arguments of DRbQS::TaskGenerator.new define instance variables.
72
+
73
+ task_generator = DRbQS::TaskGenerator.new(:abc => 'ABC', :def => 123, :data => [1, 2, 3])
74
+
75
+ The above example defines the following instance variables.
76
+
77
+ @abc = 'ABC'
78
+ @def = 123
79
+ @data = [1, 2, 3]
80
+
81
+ Then, DRbQS::TaskGenerator#set method defines generation of tasks.
82
+ The block of the method is evaluated in the context of task_generator.
83
+ For the above example we can use @abc, @def, and @data.
84
+
85
+ task_generator.set do
86
+ @data.each do |i|
87
+ create_add_task(i, :to_s)
88
+ end
89
+ end
90
+
91
+ DRbQS::TaskGenerator#create_add_task creates a task
92
+ and the task is returned by DRbQS::TaskGenerator#new_tasks.
93
+ The arguments of DRbQS::TaskGenerator#create_add_task is
94
+ the same as DRbQS::Task.new.
95
+
96
+ To use the generator in DRbQS::Server,
97
+ we set the generator by DRbQS::Server#add_task_generator.
98
+
48
99
  === Start node and connect server
49
100
 
50
101
  Because nodes needs class Sum,
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.0.7
data/drbqs.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{drbqs}
8
- s.version = "0.0.6"
8
+ s.version = "0.0.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Takayuki YAMAGUCHI"]
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
33
33
  "example/drbqs-manage-test.rb",
34
34
  "example/drbqs-node-test.rb",
35
35
  "example/drbqs-server-test.rb",
36
+ "example/server/server_def.rb",
36
37
  "example/sum/server_def.rb",
37
38
  "example/sum/sum.rb",
38
39
  "lib/drbqs.rb",
@@ -45,6 +46,7 @@ Gem::Specification.new do |s|
45
46
  "lib/drbqs/queue.rb",
46
47
  "lib/drbqs/server.rb",
47
48
  "lib/drbqs/server_define.rb",
49
+ "lib/drbqs/server_hook.rb",
48
50
  "lib/drbqs/task.rb",
49
51
  "lib/drbqs/task_client.rb",
50
52
  "lib/drbqs/task_generator.rb",
@@ -56,6 +58,7 @@ Gem::Specification.new do |s|
56
58
  "spec/node_list_spec.rb",
57
59
  "spec/queue_spec.rb",
58
60
  "spec/server_define_spec.rb",
61
+ "spec/server_hook_spec.rb",
59
62
  "spec/server_spec.rb",
60
63
  "spec/spec_helper.rb",
61
64
  "spec/task_client_spec.rb",
@@ -68,7 +71,7 @@ Gem::Specification.new do |s|
68
71
  s.homepage = %q{http://github.com/ytaka/drbqs}
69
72
  s.licenses = ["GPL3"]
70
73
  s.require_paths = ["lib"]
71
- s.rubygems_version = %q{1.3.7}
74
+ s.rubygems_version = %q{1.6.1}
72
75
  s.summary = %q{dRuby Queueing System}
73
76
  s.test_files = [
74
77
  "spec/acl_file_spec.rb",
@@ -78,6 +81,7 @@ Gem::Specification.new do |s|
78
81
  "spec/node_list_spec.rb",
79
82
  "spec/queue_spec.rb",
80
83
  "spec/server_define_spec.rb",
84
+ "spec/server_hook_spec.rb",
81
85
  "spec/server_spec.rb",
82
86
  "spec/spec_helper.rb",
83
87
  "spec/task_client_spec.rb",
@@ -89,7 +93,6 @@ Gem::Specification.new do |s|
89
93
  ]
90
94
 
91
95
  if s.respond_to? :specification_version then
92
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
93
96
  s.specification_version = 3
94
97
 
95
98
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -0,0 +1,12 @@
1
+ task_generator = DRbQS::TaskGenerator.new(:iterate => 3)
2
+ task_generator.set do
3
+ 5.times do |i|
4
+ create_add_task(i, :to_s)
5
+ end
6
+ end
7
+
8
+ server = DRbQS::Server.new(:port => 13501, :finish_exit => true)
9
+ server.add_task_generator(task_generator)
10
+ server.set_signal_trap
11
+ server.start
12
+ server.wait
@@ -21,7 +21,7 @@ DRbQS.define_server do |server, argv, opts|
21
21
  server.queue.add(task)
22
22
  end
23
23
 
24
- server.set_finish_hook do |serv|
24
+ server.add_hook(:finish) do |serv|
25
25
  serv.exit
26
26
  end
27
27
  end
data/lib/drbqs/server.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'drbqs/message'
2
2
  require 'drbqs/queue'
3
3
  require 'drbqs/acl_file'
4
+ require 'drbqs/server_hook'
4
5
 
5
6
  module DRbQS
6
7
  class CheckAlive
@@ -24,10 +25,19 @@ module DRbQS
24
25
  attr_reader :queue
25
26
 
26
27
  # :port
28
+ # Set the port of server.
27
29
  # :acl
30
+ # Set the ACL instance.
28
31
  # :log_file
32
+ # Set the path of log files.
29
33
  # :log_level
34
+ # Set the level of logging.
30
35
  # :check_alive
36
+ # Set the time interval of checking alive nodes.
37
+ # :finish_exit
38
+ # Exit programs in finish_hook.
39
+ # :signal_trap
40
+ # Set trapping signal.
31
41
  def initialize(opts = {})
32
42
  @port = opts[:port] || ROOT_DEFAULT_PORT
33
43
  @acl = acl_init(opts[:acl])
@@ -46,7 +56,8 @@ module DRbQS
46
56
  @queue= QueueServer.new(@ts[:queue], @ts[:result], @logger)
47
57
  @check_alive = CheckAlive.new(opts[:check_alive])
48
58
  @task_generator = []
49
- @empty_queue_hook = nil
59
+ hook_init(opts[:finish_exit])
60
+ set_signal_trap if opts[:signal_trap]
50
61
  end
51
62
 
52
63
  def acl_init(acl_arg)
@@ -61,6 +72,12 @@ module DRbQS
61
72
  end
62
73
  private :acl_init
63
74
 
75
+ def hook_init(finish_exit)
76
+ @hook = DRbQS::ServerHook.new
77
+ @hook.set_finish_exit { self.exit } if finish_exit
78
+ end
79
+ private :hook_init
80
+
64
81
  def start
65
82
  DRb.install_acl(@acl) if @acl
66
83
  uri = "druby://:#{@port}"
@@ -77,7 +94,7 @@ module DRbQS
77
94
  end
78
95
  private :check_connection
79
96
 
80
- def set_task_generator(task_generator)
97
+ def add_task_generator(task_generator)
81
98
  @task_generator << task_generator
82
99
  end
83
100
 
@@ -101,33 +118,25 @@ module DRbQS
101
118
  @message.set_initialization(task)
102
119
  end
103
120
 
121
+ # +key+ is :empty_queue or :finish_exit.
104
122
  # &block takes self as an argument.
105
- def set_empty_queue_hook(&block)
106
- if block_given?
107
- @empty_queue_hook = block
108
- else
109
- @empty_queue_hook = nil
110
- end
123
+ def add_hook(key, name = nil, &block)
124
+ @hook.add(key, name, &block)
111
125
  end
112
126
 
113
- # &block takes self as an argument.
114
- def set_finish_hook(&block)
115
- if block_given?
116
- @finish_hook = block
117
- else
118
- @finish_hook = nil
119
- end
127
+ def delete_hook(key, name = nil)
128
+ @hook.delete(key, name)
120
129
  end
121
130
 
122
131
  def exec_hook
123
- if @empty_queue_hook && @queue.empty?
132
+ if @queue.empty?
124
133
  @logger.info("Execute empty queue hook.") if @logger
125
- @empty_queue_hook.call(self)
134
+ @hook.exec(:empty_queue, self)
126
135
  end
127
136
  add_tasks_from_generator
128
- if @finish_hook && @queue.finished?
137
+ if @queue.finished?
129
138
  @logger.info("Execute finish hook.") if @logger
130
- @finish_hook.call(self)
139
+ @hook.exec(:finish, self)
131
140
  end
132
141
  end
133
142
  private :exec_hook
@@ -0,0 +1,67 @@
1
+ module DRbQS
2
+ class ServerHook
3
+ def initialize
4
+ @hook = Hash.new { |h, k| h[k] = Array.new }
5
+ @argument_number = {}
6
+ @finish_exit = nil
7
+ set_argument_number(:empty_queue, 1)
8
+ set_argument_number(:finish, 1)
9
+ end
10
+
11
+ def set_argument_number(key, num)
12
+ @argument_number[key] = num
13
+ end
14
+ private :set_argument_number
15
+
16
+ def create_proc_name(key)
17
+ name = "#{key.to_s}#{rand(1000)}"
18
+ if @hook.has_key?(name)
19
+ create_proc_name(key)
20
+ else
21
+ name
22
+ end
23
+ end
24
+ private :create_proc_name
25
+
26
+ def add(key, name = nil, &block)
27
+ if (n = @argument_number[key]) && (block.arity != n)
28
+ raise ArgumentError, "Invalid argument number of hook of #{key.inspect}."
29
+ end
30
+ name ||= create_proc_name(key)
31
+ @hook[key] << [name, block]
32
+ name
33
+ end
34
+
35
+ def delete(key, name = nil)
36
+ if name
37
+ @hook[key].delete_if { |ary| ary[0] == name }
38
+ else
39
+ @hook[key].clear
40
+ end
41
+ end
42
+
43
+ def specific_proc(key)
44
+ case key
45
+ when :finish
46
+ @finish_exit.call if @finish_exit
47
+ end
48
+ end
49
+ private :specific_proc
50
+
51
+ def hook_names(key)
52
+ @hook[key].map { |a| a[0] }
53
+ end
54
+
55
+ def exec(key, *args)
56
+ @hook[key].each do |ary|
57
+ ary[1].call(*args)
58
+ end
59
+ specific_proc(key)
60
+ end
61
+
62
+ def set_finish_exit(&block)
63
+ @finish_exit = block
64
+ end
65
+ end
66
+
67
+ end
@@ -13,6 +13,17 @@ module DRbQS
13
13
  !!@__fiber__
14
14
  end
15
15
 
16
+ def add_task(arg)
17
+ case arg
18
+ when DRbQS::Task
19
+ Fiber.yield(arg)
20
+ when Array
21
+ arg.each { |t| Fiber.yield(t) }
22
+ else
23
+ raise "Invalid type of an argument."
24
+ end
25
+ end
26
+
16
27
  def create_add_task(*args, &block)
17
28
  Fiber.yield(DRbQS::Task.new(*args, &block))
18
29
  end
@@ -28,7 +39,7 @@ module DRbQS
28
39
  end
29
40
 
30
41
  def init
31
- @__fiber_init__.call
42
+ @__fiber_init__.call if @__fiber_init__
32
43
  end
33
44
 
34
45
  # Return an array of new tasks.
@@ -57,18 +68,20 @@ module DRbQS
57
68
  nil
58
69
  end
59
70
 
60
- # Create all tasks for test and return true if all tasks created properly.
71
+ # Create all tasks for test and return [group_number, task_number] if all tasks created properly.
61
72
  def debug_all_tasks(limit = nil)
62
- i = 0
73
+ group_number = 0
74
+ task_number = 0
63
75
  while ary = new_tasks
64
- ary.each? do |t|
65
- unless DRbQS::TaskGenerator === t
66
- raise "Invalid task by #{i}th generation: #{t.inspect}"
76
+ ary.each do |t|
77
+ unless DRbQS::Task === t
78
+ raise "Invalid #{i}th task: #{t.inspect}"
67
79
  end
80
+ task_number += 1
68
81
  end
69
- i += 1
82
+ group_number += 1
70
83
  end
71
- true
84
+ [group_number, task_number]
72
85
  end
73
86
  end
74
87
  end
data/spec/manage_spec.rb CHANGED
@@ -15,7 +15,7 @@ describe DRbQS do
15
15
  server.queue.add(task)
16
16
  end
17
17
 
18
- server.set_finish_hook do |serv|
18
+ server.add_hook(:finish) do |serv|
19
19
  serv.exit
20
20
  end
21
21
 
@@ -9,7 +9,7 @@ describe DRbQS::ServerDefinition do
9
9
  it "should define server" do
10
10
  @server_definition.should_receive(:define_server)
11
11
  DRbQS.define_server do |server, argv, opts|
12
- server.set_finish_hook do |serv|
12
+ server.add_hook(:finish) do |serv|
13
13
  serv.exit
14
14
  end
15
15
  end
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'drbqs/server_hook'
4
+
5
+ describe DRbQS::ServerHook do
6
+ subject { DRbQS::ServerHook.new }
7
+
8
+ it "should add hook" do
9
+ subject.add(:finish) do |server|
10
+ 3 + 4
11
+ end.should match(/^finish\d+/)
12
+ end
13
+
14
+ it "should add hook with name" do
15
+ name = 'hello'
16
+ subject.add(:finish, name) do |server|
17
+ 3 + 4
18
+ end.should == name
19
+ end
20
+
21
+ it "should raise error" do
22
+ lambda do
23
+ subject.add(:finish) do |a, b|
24
+ a + b
25
+ end
26
+ end.should raise_error
27
+ end
28
+
29
+ it "should delete hook" do
30
+ name = subject.add(:finish) do |server|
31
+ 3 + 4
32
+ end
33
+ subject.hook_names(:finish).should have(1).items
34
+ subject.hook_names(:finish).should include(name)
35
+ subject.delete(:finish, name)
36
+ subject.hook_names(:finish).should be_empty
37
+ end
38
+
39
+ it "should delete all hooks" do
40
+ name = subject.add(:finish) do |server|
41
+ 3 + 4
42
+ end
43
+ name = subject.add(:finish) do |server|
44
+ 5 + 6
45
+ end
46
+ subject.hook_names(:finish).should have(2).items
47
+ subject.delete(:finish)
48
+ subject.hook_names(:finish).should be_empty
49
+ end
50
+
51
+ it "should execute hooks" do
52
+ exec_flag = {}
53
+ subject.add(:finish) do |server|
54
+ exec_flag[:first] = true
55
+ end
56
+ subject.add(:finish) do |server|
57
+ exec_flag[:second] = true
58
+ end
59
+ subject.exec(:finish)
60
+ exec_flag[:first].should be_true
61
+ exec_flag[:second].should be_true
62
+ end
63
+
64
+ it "should execute finish_exit" do
65
+ execute = nil
66
+ subject.set_finish_exit do
67
+ execute = true
68
+ end
69
+ subject.exec(:finish)
70
+ execute.should be_true
71
+ end
72
+ end
@@ -21,12 +21,21 @@ describe DRbQS::TaskGenerator do
21
21
  create_add_task(i, :to_s)
22
22
  end
23
23
  end
24
+ subject.init
24
25
  check_task_ary(subject.new_tasks, 2)
25
26
  check_task_ary(subject.new_tasks, 1)
26
27
  subject.new_tasks.should be_nil
27
28
  end
28
29
 
29
30
  it "should debug generator" do
30
- subject.debug_all_tasks.should be_true
31
+ subject.set(2) do
32
+ @data.each do |i|
33
+ create_add_task(i, :to_s)
34
+ end
35
+ end
36
+ subject.init
37
+ group_number, task_number = subject.debug_all_tasks
38
+ group_number.should == 2
39
+ task_number.should == 3
31
40
  end
32
41
  end
data/spec/test1_spec.rb CHANGED
@@ -16,7 +16,7 @@ describe DRbQS do
16
16
  server.queue.add(task)
17
17
  end
18
18
 
19
- server.set_finish_hook do |serv|
19
+ server.add_hook(:finish) do |serv|
20
20
  serv.exit
21
21
  end
22
22
 
data/spec/test2_spec.rb CHANGED
@@ -13,14 +13,8 @@ describe DRbQS do
13
13
  end
14
14
  end
15
15
  @process_id = fork do
16
- server = DRbQS::Server.new(:port => 13501)
17
-
18
- server.set_task_generator(@task_generator)
19
-
20
- server.set_finish_hook do |serv|
21
- serv.exit
22
- end
23
-
16
+ server = DRbQS::Server.new(:port => 13501, :finish_exit => true)
17
+ server.add_task_generator(@task_generator)
24
18
  server.set_signal_trap
25
19
  server.start
26
20
  server.wait
metadata CHANGED
@@ -1,94 +1,72 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drbqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
5
- segments:
6
- - 0
7
- - 0
8
- - 6
9
- prerelease: false
4
+ version: 0.0.7
5
+ prerelease:
10
6
  platform: ruby
11
7
  authors:
12
8
  - Takayuki YAMAGUCHI
13
- autorequire: !!null
9
+ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
  date: 2011-03-08 00:00:00.000000000 +09:00
17
- default_executable: !!null
13
+ default_executable:
18
14
  dependencies:
19
15
  - !ruby/object:Gem::Dependency
20
16
  name: rspec
21
- requirement: &80686930 !ruby/object:Gem::Requirement
17
+ requirement: &84782980 !ruby/object:Gem::Requirement
22
18
  none: false
23
19
  requirements:
24
20
  - - ! '>='
25
21
  - !ruby/object:Gem::Version
26
22
  version: 2.5.0
27
- segments:
28
- - 2
29
- - 5
30
- - 0
31
23
  type: :development
32
24
  prerelease: false
33
- version_requirements: *80686930
25
+ version_requirements: *84782980
34
26
  - !ruby/object:Gem::Dependency
35
27
  name: yard
36
- requirement: &80685380 !ruby/object:Gem::Requirement
28
+ requirement: &84782720 !ruby/object:Gem::Requirement
37
29
  none: false
38
30
  requirements:
39
31
  - - ~>
40
32
  - !ruby/object:Gem::Version
41
33
  version: 0.6.0
42
- segments:
43
- - 0
44
- - 6
45
- - 0
46
34
  type: :development
47
35
  prerelease: false
48
- version_requirements: *80685380
36
+ version_requirements: *84782720
49
37
  - !ruby/object:Gem::Dependency
50
38
  name: bundler
51
- requirement: &80628260 !ruby/object:Gem::Requirement
39
+ requirement: &84782460 !ruby/object:Gem::Requirement
52
40
  none: false
53
41
  requirements:
54
42
  - - ~>
55
43
  - !ruby/object:Gem::Version
56
44
  version: 1.0.0
57
- segments:
58
- - 1
59
- - 0
60
- - 0
61
45
  type: :development
62
46
  prerelease: false
63
- version_requirements: *80628260
47
+ version_requirements: *84782460
64
48
  - !ruby/object:Gem::Dependency
65
49
  name: jeweler
66
- requirement: &80626510 !ruby/object:Gem::Requirement
50
+ requirement: &84782210 !ruby/object:Gem::Requirement
67
51
  none: false
68
52
  requirements:
69
53
  - - ~>
70
54
  - !ruby/object:Gem::Version
71
55
  version: 1.5.2
72
- segments:
73
- - 1
74
- - 5
75
- - 2
76
56
  type: :development
77
57
  prerelease: false
78
- version_requirements: *80626510
58
+ version_requirements: *84782210
79
59
  - !ruby/object:Gem::Dependency
80
60
  name: rcov
81
- requirement: &80624530 !ruby/object:Gem::Requirement
61
+ requirement: &84781940 !ruby/object:Gem::Requirement
82
62
  none: false
83
63
  requirements:
84
64
  - - ! '>='
85
65
  - !ruby/object:Gem::Version
86
66
  version: '0'
87
- segments:
88
- - 0
89
67
  type: :development
90
68
  prerelease: false
91
- version_requirements: *80624530
69
+ version_requirements: *84781940
92
70
  description: Task queuing system over network that is implemented by dRuby.
93
71
  email: d@ytak.info
94
72
  executables:
@@ -115,6 +93,7 @@ files:
115
93
  - example/drbqs-manage-test.rb
116
94
  - example/drbqs-node-test.rb
117
95
  - example/drbqs-server-test.rb
96
+ - example/server/server_def.rb
118
97
  - example/sum/server_def.rb
119
98
  - example/sum/sum.rb
120
99
  - lib/drbqs.rb
@@ -127,6 +106,7 @@ files:
127
106
  - lib/drbqs/queue.rb
128
107
  - lib/drbqs/server.rb
129
108
  - lib/drbqs/server_define.rb
109
+ - lib/drbqs/server_hook.rb
130
110
  - lib/drbqs/task.rb
131
111
  - lib/drbqs/task_client.rb
132
112
  - lib/drbqs/task_generator.rb
@@ -138,6 +118,7 @@ files:
138
118
  - spec/node_list_spec.rb
139
119
  - spec/queue_spec.rb
140
120
  - spec/server_define_spec.rb
121
+ - spec/server_hook_spec.rb
141
122
  - spec/server_spec.rb
142
123
  - spec/spec_helper.rb
143
124
  - spec/task_client_spec.rb
@@ -150,7 +131,7 @@ has_rdoc: true
150
131
  homepage: http://github.com/ytaka/drbqs
151
132
  licenses:
152
133
  - GPL3
153
- post_install_message: !!null
134
+ post_install_message:
154
135
  rdoc_options: []
155
136
  require_paths:
156
137
  - lib
@@ -162,19 +143,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
143
  version: '0'
163
144
  segments:
164
145
  - 0
165
- hash: 394819887
146
+ hash: -184598193
166
147
  required_rubygems_version: !ruby/object:Gem::Requirement
167
148
  none: false
168
149
  requirements:
169
150
  - - ! '>='
170
151
  - !ruby/object:Gem::Version
171
152
  version: '0'
172
- segments:
173
- - 0
174
153
  requirements: []
175
- rubyforge_project: !!null
176
- rubygems_version: 1.3.7
177
- signing_key: !!null
154
+ rubyforge_project:
155
+ rubygems_version: 1.6.1
156
+ signing_key:
178
157
  specification_version: 3
179
158
  summary: dRuby Queueing System
180
159
  test_files:
@@ -185,6 +164,7 @@ test_files:
185
164
  - spec/node_list_spec.rb
186
165
  - spec/queue_spec.rb
187
166
  - spec/server_define_spec.rb
167
+ - spec/server_hook_spec.rb
188
168
  - spec/server_spec.rb
189
169
  - spec/spec_helper.rb
190
170
  - spec/task_client_spec.rb