work_queue 0.1.2 → 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.
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'rake/clean'
4
+ require 'lib/work_queue'
4
5
 
5
6
  # Load all rakefile extensions
6
7
  Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].each { |ext| load ext }
data/lib/work_queue.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # This file contains an implementation of a work queue structure.
7
7
  #
8
8
  # == Version
9
- # 0.1.2
9
+ # 1.0.0
10
10
  #
11
11
  # == Author
12
12
  # Miguel Fonseca <fmmfonseca@gmail.com>
@@ -33,211 +33,211 @@ require 'timeout'
33
33
  # wq.join
34
34
  #
35
35
  class WorkQueue
36
-
37
- VERSION = "0.1.2"
38
-
39
- ##
40
- # Creates a new work queue with the desired parameters.
41
- #
42
- # wq = WorkQueue.new(5,10,20)
43
- #
44
- def initialize(max_threads=nil, max_tasks=nil, keep_alive=60)
45
- self.max_threads = max_threads
46
- self.max_tasks = max_tasks
47
- self.keep_alive = keep_alive
48
- @threads = []
49
- @threads_lock = Mutex.new
50
- @tasks = max_tasks ? SizedQueue.new(max_tasks) : Queue.new
51
- @threads.taint
52
- @tasks.taint
53
- self.taint
54
- end
55
-
56
- ##
57
- # Returns the maximum number of worker threads.
58
- # This value is set upon initialization and cannot be changed afterwards.
59
- #
60
- # wq = WorkQueue.new()
61
- # wq.max_threads #=> Infinity
62
- # wq = WorkQueue.new(1)
63
- # wq.max_threads #=> 1
64
- #
65
- def max_threads
66
- @max_threads
67
- end
68
-
69
- ##
70
- # Returns the current number of worker threads.
71
- # This value is just a snapshot, and may change immediately upon returning.
72
- #
73
- # wq = WorkQueue.new(10)
74
- # wq.cur_threads #=> 0
75
- # wq.enqueue_b {}
76
- # wq.cur_threads #=> 1
77
- #
78
- def cur_threads
79
- @threads.size
80
- end
81
-
82
- ##
83
- # Returns the maximum number of queued tasks.
84
- # This value is set upon initialization and cannot be changed afterwards.
85
- #
86
- # wq = WorkQueue.new()
87
- # wq.max_tasks #=> Infinity
88
- # wq = WorkQueue.new(nil,1)
89
- # wq.max_tasks #=> 1
90
- #
91
- def max_tasks
92
- @max_tasks
93
- end
94
-
95
- ##
96
- # Returns the current number of queued tasks.
97
- # This value is just a snapshot, and may change immediately upon returning.
98
- #
99
- # wq = WorkQueue.new(1)
100
- # wq.enqueue_b { sleep(1) }
101
- # wq.cur_tasks #=> 0
102
- # wq.enqueue_b {}
103
- # wq.cur_tasks #=> 1
104
- #
105
- def cur_tasks
106
- @tasks.size
107
- end
108
-
109
- ##
110
- # Returns the number of seconds to keep worker threads alive waiting for new tasks.
111
- # This value is set upon initialization and cannot be changed afterwards.
112
- #
113
- # wq = WorkQueue.new()
114
- # wq.keep_alive #=> 60
115
- # wq = WorkQueue.new(nil,nil,1)
116
- # wq.keep_alive #=> 1
117
- #
118
- def keep_alive
119
- @keep_alive
120
- end
121
-
122
- ##
123
- # Schedules the given Proc for future execution by a worker thread.
124
- # If there is no space left in the queue, waits until space becomes available.
125
- #
126
- # wq = WorkQueue.new(1)
127
- # wq.enqueue_p(Proc.new {})
128
- #
129
- def enqueue_p(proc, *args)
130
- @tasks << [proc,args]
131
- spawn_thread
132
- self
133
- end
134
-
135
- ##
136
- # Schedules the given Block for future execution by a worker thread.
137
- # If there is no space left in the queue, waits until space becomes available.
138
- #
139
- # wq = WorkQueue.new(1)
140
- # wq.enqueue_b {}
141
- #
142
- def enqueue_b(*args, &block)
143
- @tasks << [block,args]
144
- spawn_thread
145
- self
146
- end
147
-
148
- ##
149
- # Waits until the tasks queue is empty and all worker threads have finished.
150
- #
151
- # wq = WorkQueue.new(1)
152
- # wq.enqueue_b { sleep(1) }
153
- # wq.join
154
- #
155
- def join
156
- cur_threads.times { dismiss_thread }
157
- @threads.dup.each { |thread| thread.join }
158
- self
159
- end
160
-
161
- ##
162
- # Stops all worker threads immediately, aborting any ongoing tasks.
163
- #
164
- # wq = WorkQueue.new(1)
165
- # wq.enqueue_b { sleep(1) }
166
- # wq.stop
167
- #
168
- def stop
169
- @threads.dup.each { |thread| thread.exit.join }
170
- @tasks.clear
171
- self
172
- end
173
-
174
- private
175
-
176
- ##
177
- # Sets the maximum number of worker threads.
178
- #
179
- def max_threads=(value)
180
- raise ArgumentError, "the maximum number of threads must be positive" if value and value <= 0
181
- @max_threads = value || 1.0/0
182
- end
183
-
184
- ##
185
- # Sets the maximum number of queued tasks.
186
- #
187
- def max_tasks=(value)
188
- raise ArgumentError, "the maximum number of tasks must be positive" if value and value <= 0
189
- @max_tasks = value || 1.0/0
190
- end
191
-
192
- ##
193
- # Sets the maximum time to keep worker threads alive waiting for new tasks.
194
- #
195
- def keep_alive=(value)
196
- raise ArgumentError, "the keep-alive time must be positive" if value and value <= 0
197
- @keep_alive = value || 1.0/0
198
- end
199
-
200
- ##
201
- # Enrolls a new worker thread.
202
- # The request is only carried out if necessary.
203
- #
204
- def spawn_thread
205
- if cur_threads < max_threads and @tasks.num_waiting <= 0 and cur_tasks > 0
206
- @threads_lock.synchronize {
207
- @threads << Thread.new do
208
- begin
209
- work()
210
- ensure
211
- @threads_lock.synchronize { @threads.delete(Thread.current) }
212
- end
213
- end
214
- }
215
- end
216
- end
217
-
218
- ##
219
- # Instructs an idle worker thread to exit.
220
- # The request is only carried out if necessary.
221
- #
222
- def dismiss_thread
223
- @tasks << [Proc.new { Thread.exit }, nil] if cur_threads > 0
224
- end
225
-
226
- ##
227
- # Repeatedly process the tasks queue.
228
- #
229
- def work
230
- loop do
231
- begin
232
- proc, args = timeout(keep_alive) { @tasks.pop }
233
- proc.call(*args)
234
- rescue Timeout::Error
235
- break
236
- rescue Exception
237
- # suppress exception
238
- end
239
- break if cur_threads > max_threads
240
- end
241
- end
242
-
36
+
37
+ VERSION = "1.0.0"
38
+
39
+ ##
40
+ # Creates a new work queue with the desired parameters.
41
+ #
42
+ # wq = WorkQueue.new(5,10,20)
43
+ #
44
+ def initialize(max_threads=nil, max_tasks=nil, keep_alive=60)
45
+ self.max_threads = max_threads
46
+ self.max_tasks = max_tasks
47
+ self.keep_alive = keep_alive
48
+ @threads = []
49
+ @threads_lock = Mutex.new
50
+ @tasks = max_tasks ? SizedQueue.new(max_tasks) : Queue.new
51
+ @threads.taint
52
+ @tasks.taint
53
+ self.taint
54
+ end
55
+
56
+ ##
57
+ # Returns the maximum number of worker threads.
58
+ # This value is set upon initialization and cannot be changed afterwards.
59
+ #
60
+ # wq = WorkQueue.new()
61
+ # wq.max_threads #=> Infinity
62
+ # wq = WorkQueue.new(1)
63
+ # wq.max_threads #=> 1
64
+ #
65
+ def max_threads
66
+ @max_threads
67
+ end
68
+
69
+ ##
70
+ # Returns the current number of worker threads.
71
+ # This value is just a snapshot, and may change immediately upon returning.
72
+ #
73
+ # wq = WorkQueue.new(10)
74
+ # wq.cur_threads #=> 0
75
+ # wq.enqueue_b {}
76
+ # wq.cur_threads #=> 1
77
+ #
78
+ def cur_threads
79
+ @threads.size
80
+ end
81
+
82
+ ##
83
+ # Returns the maximum number of queued tasks.
84
+ # This value is set upon initialization and cannot be changed afterwards.
85
+ #
86
+ # wq = WorkQueue.new()
87
+ # wq.max_tasks #=> Infinity
88
+ # wq = WorkQueue.new(nil,1)
89
+ # wq.max_tasks #=> 1
90
+ #
91
+ def max_tasks
92
+ @max_tasks
93
+ end
94
+
95
+ ##
96
+ # Returns the current number of queued tasks.
97
+ # This value is just a snapshot, and may change immediately upon returning.
98
+ #
99
+ # wq = WorkQueue.new(1)
100
+ # wq.enqueue_b { sleep(1) }
101
+ # wq.cur_tasks #=> 0
102
+ # wq.enqueue_b {}
103
+ # wq.cur_tasks #=> 1
104
+ #
105
+ def cur_tasks
106
+ @tasks.size
107
+ end
108
+
109
+ ##
110
+ # Returns the number of seconds to keep worker threads alive waiting for new tasks.
111
+ # This value is set upon initialization and cannot be changed afterwards.
112
+ #
113
+ # wq = WorkQueue.new()
114
+ # wq.keep_alive #=> 60
115
+ # wq = WorkQueue.new(nil,nil,1)
116
+ # wq.keep_alive #=> 1
117
+ #
118
+ def keep_alive
119
+ @keep_alive
120
+ end
121
+
122
+ ##
123
+ # Schedules the given Proc for future execution by a worker thread.
124
+ # If there is no space left in the queue, waits until space becomes available.
125
+ #
126
+ # wq = WorkQueue.new(1)
127
+ # wq.enqueue_p(Proc.new {})
128
+ #
129
+ def enqueue_p(proc, *args)
130
+ @tasks << [proc,args]
131
+ spawn_thread
132
+ self
133
+ end
134
+
135
+ ##
136
+ # Schedules the given Block for future execution by a worker thread.
137
+ # If there is no space left in the queue, waits until space becomes available.
138
+ #
139
+ # wq = WorkQueue.new(1)
140
+ # wq.enqueue_b {}
141
+ #
142
+ def enqueue_b(*args, &block)
143
+ @tasks << [block,args]
144
+ spawn_thread
145
+ self
146
+ end
147
+
148
+ ##
149
+ # Waits until the tasks queue is empty and all worker threads have finished.
150
+ #
151
+ # wq = WorkQueue.new(1)
152
+ # wq.enqueue_b { sleep(1) }
153
+ # wq.join
154
+ #
155
+ def join
156
+ cur_threads.times { dismiss_thread }
157
+ @threads.dup.each { |thread| thread.join }
158
+ self
159
+ end
160
+
161
+ ##
162
+ # Stops all worker threads immediately, aborting any ongoing tasks.
163
+ #
164
+ # wq = WorkQueue.new(1)
165
+ # wq.enqueue_b { sleep(1) }
166
+ # wq.stop
167
+ #
168
+ def stop
169
+ @threads.dup.each { |thread| thread.exit.join }
170
+ @tasks.clear
171
+ self
172
+ end
173
+
174
+ private
175
+
176
+ ##
177
+ # Sets the maximum number of worker threads.
178
+ #
179
+ def max_threads=(value)
180
+ raise ArgumentError, "the maximum number of threads must be positive" if value and value <= 0
181
+ @max_threads = value || 1.0/0
182
+ end
183
+
184
+ ##
185
+ # Sets the maximum number of queued tasks.
186
+ #
187
+ def max_tasks=(value)
188
+ raise ArgumentError, "the maximum number of tasks must be positive" if value and value <= 0
189
+ @max_tasks = value || 1.0/0
190
+ end
191
+
192
+ ##
193
+ # Sets the maximum time to keep worker threads alive waiting for new tasks.
194
+ #
195
+ def keep_alive=(value)
196
+ raise ArgumentError, "the keep-alive time must be positive" if value and value <= 0
197
+ @keep_alive = value || 1.0/0
198
+ end
199
+
200
+ ##
201
+ # Enrolls a new worker thread.
202
+ # The request is only carried out if necessary.
203
+ #
204
+ def spawn_thread
205
+ if cur_threads < max_threads and @tasks.num_waiting <= 0 and cur_tasks > 0
206
+ @threads_lock.synchronize {
207
+ @threads << Thread.new do
208
+ begin
209
+ work()
210
+ ensure
211
+ @threads_lock.synchronize { @threads.delete(Thread.current) }
212
+ end
213
+ end
214
+ }
215
+ end
216
+ end
217
+
218
+ ##
219
+ # Instructs an idle worker thread to exit.
220
+ # The request is only carried out if necessary.
221
+ #
222
+ def dismiss_thread
223
+ @tasks << [Proc.new { Thread.exit }, nil] if cur_threads > 0
224
+ end
225
+
226
+ ##
227
+ # Repeatedly process the tasks queue.
228
+ #
229
+ def work
230
+ loop do
231
+ begin
232
+ proc, args = timeout(keep_alive) { @tasks.pop }
233
+ proc.call(*args)
234
+ rescue Timeout::Error
235
+ break
236
+ rescue Exception
237
+ # suppress exception
238
+ end
239
+ break if cur_threads > max_threads
240
+ end
241
+ end
242
+
243
243
  end
data/tasks/test.rake CHANGED
@@ -2,21 +2,21 @@ require 'rake/testtask'
2
2
 
3
3
  namespace(:test) do
4
4
 
5
- # For a list of all attributes refer to http://rake.rubyforge.org/classes/Rake/TestTask.html
6
- Rake::TestTask.new(:unit) do |t|
7
- t.libs << "test"
8
- t.test_files = FileList['test/tc_*.rb']
9
- t.verbose = true
10
- t.warning = true
11
- end
5
+ # For a list of all attributes refer to http://rake.rubyforge.org/classes/Rake/TestTask.html
6
+ Rake::TestTask.new(:unit) do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/tc_*.rb']
9
+ t.verbose = true
10
+ t.warning = true
11
+ end
12
12
 
13
- desc "Run tests on multiple ruby versions"
14
- task(:compatibility) do
15
- versions = %w[1.8.6 1.8.7 1.9.1 jruby]
16
- system <<-CMD
17
- bash -c 'source ~/.rvm/scripts/rvm;
18
- rvm #{versions.join(',')} rake test:unit'
19
- CMD
20
- end
13
+ desc "Run tests on multiple ruby versions"
14
+ task(:compatibility) do
15
+ versions = %w[1.8.6 1.8.7 1.9.1 jruby]
16
+ system <<-CMD
17
+ bash -c 'source ~/.rvm/scripts/rvm;
18
+ rvm #{versions.join(',')} rake test:unit'
19
+ CMD
20
+ end
21
21
 
22
22
  end
@@ -18,75 +18,75 @@ require 'test/unit'
18
18
  require 'lib/work_queue'
19
19
 
20
20
  class TC_WorkQueue < Test::Unit::TestCase
21
-
22
- # def setup
23
- # end
24
-
25
- # def teardown
26
- # end
27
-
28
- def test_enqueue
29
- s = String.new
30
- wq = WorkQueue.new
31
- # using proc
32
- wq.enqueue_p(Proc.new { |str| str.replace("Hello #1") }, s)
33
- wq.join
34
- assert_equal(s, "Hello #1")
35
- # using block
36
- wq.enqueue_b(s) { |str| str.replace("Hello #2") }
37
- wq.join
38
- assert_equal(s, "Hello #2")
39
- end
40
-
41
- def test_max_threads
42
- assert_raise(ArgumentError) { WorkQueue.new(0) }
43
- assert_raise(ArgumentError) { WorkQueue.new(-1) }
44
- wq = WorkQueue.new(1)
45
- assert_equal(wq.cur_threads, 0)
46
- wq.enqueue_b { sleep(0.01) }
47
- assert_equal(wq.cur_threads, 1)
48
- wq.enqueue_b { sleep(0.01) }
49
- assert_equal(wq.cur_threads, 1)
50
- sleep(0.1)
51
- assert_equal(wq.cur_threads, 1)
52
- wq.join
53
- end
54
-
55
- def test_max_tasks
56
- assert_raise(ArgumentError) { WorkQueue.new(nil,0) }
57
- assert_raise(ArgumentError) { WorkQueue.new(nil,-1) }
58
- wq = WorkQueue.new(1,1)
59
- wq.enqueue_b { sleep(0.01) }
60
- wq.enqueue_b { sleep(0.01) }
61
- assert_equal(wq.cur_tasks, 1)
62
- wq.enqueue_b { sleep(0.01) }
63
- assert_equal(wq.cur_tasks, 1)
64
- wq.join
65
- end
66
-
67
- def test_keep_alive
68
- assert_raise(ArgumentError) { WorkQueue.new(nil,nil,0) }
69
- assert_raise(ArgumentError) { WorkQueue.new(nil,nil,-1) }
70
- wq = WorkQueue.new(1,1,0.01)
71
- wq.enqueue_b { sleep(0.01) }
72
- assert_equal(wq.cur_threads, 1)
73
- sleep(0.1)
74
- assert_equal(wq.cur_threads, 0)
75
- wq.join
76
- end
77
-
78
- def test_stress
79
- a = []
80
- m = Mutex.new
81
- wq = WorkQueue.new(100,200,0.1)
82
- (1..1000).each do
83
- wq.enqueue_b(a,m) { |str,mut|
84
- sleep(0.01)
85
- mut.synchronize { a.push nil }
86
- }
87
- end
88
- wq.join
89
- assert_equal(a.size, 1000)
90
- end
91
-
21
+
22
+ # def setup
23
+ # end
24
+
25
+ # def teardown
26
+ # end
27
+
28
+ def test_enqueue
29
+ s = String.new
30
+ wq = WorkQueue.new
31
+ # using proc
32
+ wq.enqueue_p(Proc.new { |str| str.replace("Hello #1") }, s)
33
+ wq.join
34
+ assert_equal(s, "Hello #1")
35
+ # using block
36
+ wq.enqueue_b(s) { |str| str.replace("Hello #2") }
37
+ wq.join
38
+ assert_equal(s, "Hello #2")
39
+ end
40
+
41
+ def test_max_threads
42
+ assert_raise(ArgumentError) { WorkQueue.new(0) }
43
+ assert_raise(ArgumentError) { WorkQueue.new(-1) }
44
+ wq = WorkQueue.new(1)
45
+ assert_equal(wq.cur_threads, 0)
46
+ wq.enqueue_b { sleep(0.01) }
47
+ assert_equal(wq.cur_threads, 1)
48
+ wq.enqueue_b { sleep(0.01) }
49
+ assert_equal(wq.cur_threads, 1)
50
+ sleep(0.1)
51
+ assert_equal(wq.cur_threads, 1)
52
+ wq.join
53
+ end
54
+
55
+ def test_max_tasks
56
+ assert_raise(ArgumentError) { WorkQueue.new(nil,0) }
57
+ assert_raise(ArgumentError) { WorkQueue.new(nil,-1) }
58
+ wq = WorkQueue.new(1,1)
59
+ wq.enqueue_b { sleep(0.01) }
60
+ wq.enqueue_b { sleep(0.01) }
61
+ assert_equal(wq.cur_tasks, 1)
62
+ wq.enqueue_b { sleep(0.01) }
63
+ assert_equal(wq.cur_tasks, 1)
64
+ wq.join
65
+ end
66
+
67
+ def test_keep_alive
68
+ assert_raise(ArgumentError) { WorkQueue.new(nil,nil,0) }
69
+ assert_raise(ArgumentError) { WorkQueue.new(nil,nil,-1) }
70
+ wq = WorkQueue.new(1,1,0.01)
71
+ wq.enqueue_b { sleep(0.01) }
72
+ assert_equal(wq.cur_threads, 1)
73
+ sleep(0.1)
74
+ assert_equal(wq.cur_threads, 0)
75
+ wq.join
76
+ end
77
+
78
+ def test_stress
79
+ a = []
80
+ m = Mutex.new
81
+ wq = WorkQueue.new(100,200,0.1)
82
+ (1..1000).each do
83
+ wq.enqueue_b(a,m) { |str,mut|
84
+ sleep(0.01)
85
+ mut.synchronize { a.push nil }
86
+ }
87
+ end
88
+ wq.join
89
+ assert_equal(a.size, 1000)
90
+ end
91
+
92
92
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: work_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Fonseca
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-28 00:00:00 +00:00
12
+ date: 2010-02-17 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -21,13 +21,11 @@ extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
23
  - README.rdoc
24
+ - LICENSE
24
25
  files:
25
26
  - LICENSE
26
27
  - Rakefile
27
28
  - README.rdoc
28
- - tasks/ftp.rake
29
- - tasks/gem.rake
30
- - tasks/rdoc.rake
31
29
  - tasks/test.rake
32
30
  - lib/work_queue.rb
33
31
  - test/tc_work_queue.rb
@@ -39,8 +37,6 @@ post_install_message:
39
37
  rdoc_options:
40
38
  - --line-numbers
41
39
  - --inline-source
42
- - --title
43
- - WorkQueue
44
40
  - --main
45
41
  - README.rdoc
46
42
  require_paths:
data/tasks/ftp.rake DELETED
@@ -1,177 +0,0 @@
1
- require 'net/ftp'
2
- require 'pathname'
3
- require 'yaml'
4
- require 'rubygems'
5
- require 'rake'
6
- require 'rake/tasklib'
7
-
8
- module Rake
9
-
10
- # = FTPTask
11
- #
12
- # == Description
13
- # A Rake task that transfers local files to an FTP server.
14
- #
15
- # == Usage
16
- # Rake::FTPTask.new do |t|
17
- # t.host = "ftp.example.com"
18
- # t.user_name = "user"
19
- # t.password = "pass"
20
- # t.path = "public_html/"
21
- # t.upload_files = FileList["doc/**/*"].to_a
22
- # end
23
- #
24
- # To avoid hard-coding the connection configuration into the source code, the task can obtain that data from a YAML file.
25
- #
26
- # Rake::FTPTask.new("ftp.yml") do |t|
27
- # t.path = "public_html/"
28
- # t.upload_files = FileList["doc/**/*"].to_a
29
- # end
30
- #
31
- # # ftp.yml
32
- # host = ftp.example.com
33
- # user_name = user
34
- # password = pass
35
- # path = public_html/
36
- #
37
- class FTPTask < TaskLib
38
-
39
- ##
40
- # The address of the server (default is nil).
41
- #
42
- attr_accessor :host
43
-
44
- ##
45
- # The user name required to log into the server (default is "anonymous").
46
- #
47
- attr_accessor :user_name
48
-
49
- ##
50
- # The password required for the selected user name (default is nil).
51
- #
52
- attr_accessor :password
53
-
54
- ##
55
- # The (remote) base directory (default is "").
56
- #
57
- attr_accessor :path
58
-
59
- ##
60
- # The array of files to be included in the FTP upload (default is []).
61
- #
62
- attr_accessor :upload_files
63
-
64
- ##
65
- # The boolean to enable progress messages when true (default is false).
66
- #
67
- attr_accessor :verbose
68
-
69
- ##
70
- # Creates a new FTP task.
71
- #
72
- def initialize(config_file=nil)
73
- @host = nil
74
- @user_name = "anonymous"
75
- @password = nil
76
- @path = ""
77
- @upload_files = []
78
- @verbose = false
79
- @ftp = nil
80
- @history = {}
81
- load_config(config_file) unless config_file.nil?
82
- yield self if block_given?
83
- define
84
- end
85
-
86
- ##
87
- # Creates the tasks defined by this task lib.
88
- #
89
- def define
90
- desc "Upload files to an FTP account"
91
- task(:upload) do
92
- connect
93
- upload
94
- disconnect
95
- end
96
- end
97
-
98
- private
99
-
100
- ##
101
- # Reads configuration values from a YAML file.
102
- #
103
- def load_config(file)
104
- config = YAML::load_file(file)
105
- @host = config["host"] || @host
106
- @user_name = config["user_name"] || @user_name
107
- @password = config["password"] || @password
108
- @path = config["path"] || @path
109
- end
110
-
111
- ##
112
- # Establishes the FTP connection.
113
- #
114
- def connect
115
- @ftp = Net::FTP.new(@host, @user_name, @password)
116
- puts "Connected to #{@host}" if @verbose
117
- puts "Using #{@ftp.binary ? "binary" : "text"} mode to transfer files" if @verbose
118
- unless @path.nil? or @path.empty?
119
- make_dirs(@path)
120
- @ftp.chdir(@path)
121
- puts "The working directory is now #{@ftp.getdir}" if @verbose
122
- end
123
- end
124
-
125
- ##
126
- # Closes the FTP connection. Further remote operations are impossible.
127
- #
128
- def disconnect
129
- @ftp.close
130
- puts "Disconnected" if @verbose
131
- end
132
-
133
- ##
134
- # Iterates through the array of files.
135
- #
136
- def upload
137
- puts "Uploading #{@upload_files.length} files..." if @verbose
138
- @upload_files.each do |entry|
139
- if File.directory?(entry)
140
- make_dirs(entry)
141
- else
142
- put_file(entry)
143
- end
144
- end
145
- end
146
-
147
- ##
148
- # Transfers a local file to the server, relative to the current working directory.
149
- #
150
- def put_file(name)
151
- puts "Uploading file #{name}" if @verbose
152
- path = File.dirname(name)
153
- make_dirs(path)
154
- @ftp.put(name,name)
155
- end
156
-
157
- ##
158
- # Creates a directory and all its parent directories in the server, relative to the current working directory.
159
- #
160
- def make_dirs(name)
161
- Pathname.new(name).descend do |dir|
162
- if @history[dir].nil?
163
- @history[dir] = true
164
- puts "Creating directory #{dir}" if @verbose
165
- @ftp.mkdir(dir) rescue nil
166
- end
167
- end
168
- end
169
-
170
- end
171
-
172
- end
173
-
174
- Rake::FTPTask.new("config/ftp.yml") do |ftp|
175
- ftp.upload_files = FileList["doc/**/*"].to_a
176
- ftp.verbose = true
177
- end
data/tasks/gem.rake DELETED
@@ -1,26 +0,0 @@
1
- require 'rake/gempackagetask'
2
- require 'lib/work_queue'
3
-
4
- CLEAN.include("pkg")
5
-
6
- # For a list of all attributes refer to http://docs.rubygems.org/read/chapter/20
7
- spec = Gem::Specification.new do |s|
8
- s.name = "work_queue"
9
- s.version = WorkQueue::VERSION
10
- s.summary = "A tunable work queue, designed to coordinate work between a producer and a pool of worker threads."
11
- s.homepage = "http://github.com/fmmfonseca/work_queue"
12
- s.author = "Miguel Fonseca"
13
- s.email = "fmmfonseca@gmail.com"
14
-
15
- s.required_ruby_version = ">= 1.8.6"
16
- s.files = FileList["LICENSE", "Rakefile", "README.rdoc", "tasks/*.rake", "lib/**/*.rb", "test/tc_*.rb"].to_a
17
- s.test_files = Dir.glob("test/tc_*.rb")
18
- s.has_rdoc = true
19
- s.extra_rdoc_files = %w[README.rdoc]
20
- s.rdoc_options = %w[--line-numbers --inline-source --title WorkQueue --main README.rdoc]
21
- end
22
-
23
- # For a list of all attributes refer to http://rake.rubyforge.org/classes/Rake/PackageTask.html
24
- Rake::GemPackageTask.new(spec) do |p|
25
- p.need_zip = true
26
- end
data/tasks/rdoc.rake DELETED
@@ -1,11 +0,0 @@
1
- require 'rake/rdoctask'
2
-
3
- CLEAN.include("doc")
4
-
5
- # For a list of all attributes refer to http://rake.rubyforge.org/classes/Rake/RDocTask.html
6
- Rake::RDocTask.new do |rd|
7
- rd.title = "WorkQueue"
8
- rd.main = "README.rdoc"
9
- rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
10
- rd.rdoc_dir = "doc"
11
- end