work_queue 0.1.1 → 0.1.2
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/LICENSE +1 -1
- data/README.rdoc +10 -1
- data/lib/work_queue.rb +5 -5
- data/tasks/ftp.rake +177 -0
- data/test/tc_work_queue.rb +1 -1
- metadata +3 -2
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -24,4 +24,13 @@ Run the code:
|
|
24
24
|
require 'work_queue'
|
25
25
|
wq = WorkQueue.new
|
26
26
|
wq.enqueue_b { puts "Hello from the WorkQueue" }
|
27
|
-
wq.join
|
27
|
+
wq.join
|
28
|
+
|
29
|
+
Note that you generally want to bound the resources used:
|
30
|
+
|
31
|
+
# Limit the maximum number of simultaneous worker threads
|
32
|
+
WorkQueue.new(10)
|
33
|
+
# Limit the maximum number of queued tasks
|
34
|
+
WorkQueue.new(nil,20)
|
35
|
+
# Limit the maximum time to preserve idle worker threads
|
36
|
+
WorkQueue.new(nil,nil,10)
|
data/lib/work_queue.rb
CHANGED
@@ -6,13 +6,13 @@
|
|
6
6
|
# This file contains an implementation of a work queue structure.
|
7
7
|
#
|
8
8
|
# == Version
|
9
|
-
# 0.1.
|
9
|
+
# 0.1.2
|
10
10
|
#
|
11
11
|
# == Author
|
12
12
|
# Miguel Fonseca <fmmfonseca@gmail.com>
|
13
13
|
#
|
14
14
|
# == Copyright
|
15
|
-
# Copyright 2009 Miguel Fonseca
|
15
|
+
# Copyright 2009-2010 Miguel Fonseca
|
16
16
|
#
|
17
17
|
# == License
|
18
18
|
# MIT (see LICENSE file)
|
@@ -34,7 +34,7 @@ require 'timeout'
|
|
34
34
|
#
|
35
35
|
class WorkQueue
|
36
36
|
|
37
|
-
VERSION = "0.1.
|
37
|
+
VERSION = "0.1.2"
|
38
38
|
|
39
39
|
##
|
40
40
|
# Creates a new work queue with the desired parameters.
|
@@ -154,7 +154,7 @@ class WorkQueue
|
|
154
154
|
#
|
155
155
|
def join
|
156
156
|
cur_threads.times { dismiss_thread }
|
157
|
-
@threads.dup.each { |
|
157
|
+
@threads.dup.each { |thread| thread.join }
|
158
158
|
self
|
159
159
|
end
|
160
160
|
|
@@ -166,7 +166,7 @@ class WorkQueue
|
|
166
166
|
# wq.stop
|
167
167
|
#
|
168
168
|
def stop
|
169
|
-
@threads.dup.each { |
|
169
|
+
@threads.dup.each { |thread| thread.exit.join }
|
170
170
|
@tasks.clear
|
171
171
|
self
|
172
172
|
end
|
data/tasks/ftp.rake
ADDED
@@ -0,0 +1,177 @@
|
|
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/test/tc_work_queue.rb
CHANGED
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.
|
4
|
+
version: 0.1.2
|
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
|
+
date: 2009-12-28 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,6 +25,7 @@ files:
|
|
25
25
|
- LICENSE
|
26
26
|
- Rakefile
|
27
27
|
- README.rdoc
|
28
|
+
- tasks/ftp.rake
|
28
29
|
- tasks/gem.rake
|
29
30
|
- tasks/rdoc.rake
|
30
31
|
- tasks/test.rake
|