simple_worker 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/simple_worker/base.rb +87 -64
- data/lib/simple_worker/config.rb +5 -0
- data/lib/simple_worker/runner.rb +1 -0
- data/lib/simple_worker/service.rb +26 -16
- metadata +3 -2
data/lib/simple_worker/base.rb
CHANGED
@@ -9,21 +9,21 @@ module SimpleWorker
|
|
9
9
|
|
10
10
|
class << self
|
11
11
|
attr_accessor :subclass, :caller_file
|
12
|
-
@merged =
|
13
|
-
@merged_workers =
|
12
|
+
@merged = {}
|
13
|
+
@merged_workers = {}
|
14
14
|
@merged_gems = []
|
15
15
|
@merged_mailers = []
|
16
16
|
@merged_folders = {}
|
17
|
-
@unmerged =
|
17
|
+
@unmerged = {}
|
18
18
|
@unmerged_gems = []
|
19
19
|
|
20
20
|
def reset!
|
21
|
-
@merged =
|
22
|
-
@merged_workers =
|
21
|
+
@merged = {}
|
22
|
+
@merged_workers = {}
|
23
23
|
@merged_gems = []
|
24
24
|
@merged_mailers = []
|
25
25
|
@merged_folders = {}
|
26
|
-
@unmerged =
|
26
|
+
@unmerged = {}
|
27
27
|
@unmerged_gems = []
|
28
28
|
end
|
29
29
|
|
@@ -45,6 +45,7 @@ module SimpleWorker
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def check_for_file(f)
|
48
|
+
SimpleWorker.logger.debug 'Checking for ' + f.to_s
|
48
49
|
f = f.to_str
|
49
50
|
unless ends_with?(f, ".rb")
|
50
51
|
f << ".rb"
|
@@ -56,7 +57,7 @@ module SimpleWorker
|
|
56
57
|
# try relative
|
57
58
|
# p caller
|
58
59
|
f2 = File.join(File.dirname(caller[3]), f)
|
59
|
-
|
60
|
+
puts 'f2=' + f2
|
60
61
|
if File.exist? f2
|
61
62
|
exists = true
|
62
63
|
f = f2
|
@@ -70,7 +71,7 @@ module SimpleWorker
|
|
70
71
|
f
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
|
+
# merges the specified gem.
|
74
75
|
def merge_gem(gem_name, options={})
|
75
76
|
gem_info = {:name=>gem_name, :merge=>true}
|
76
77
|
if options.is_a?(Hash)
|
@@ -85,9 +86,12 @@ module SimpleWorker
|
|
85
86
|
end
|
86
87
|
gem_info[:path] = path
|
87
88
|
@merged_gems << gem_info
|
88
|
-
puts 'before require ' + (options[:require] || gem_name)
|
89
|
-
|
90
|
-
|
89
|
+
#puts 'before require ' + (options[:require] || gem_name)
|
90
|
+
begin
|
91
|
+
require options[:require] || gem_name
|
92
|
+
rescue LoadError=>ex
|
93
|
+
raise "Gem #{gem_name} was found, but we could not load the file '#{options[:require] || gem_name}.rb'. You may need to use :require=>x.........."
|
94
|
+
end
|
91
95
|
end
|
92
96
|
|
93
97
|
|
@@ -96,7 +100,7 @@ module SimpleWorker
|
|
96
100
|
@unmerged_gems << gem_info
|
97
101
|
end
|
98
102
|
|
99
|
-
|
103
|
+
#merge action_mailer mailers
|
100
104
|
def merge_mailer(mailer, params={})
|
101
105
|
check_for_file mailer
|
102
106
|
basename = File.basename(mailer, File.extname(mailer))
|
@@ -106,29 +110,45 @@ module SimpleWorker
|
|
106
110
|
|
107
111
|
def merge_folder(path)
|
108
112
|
files = []
|
109
|
-
|
110
|
-
|
111
|
-
|
113
|
+
#puts "caller_file=" + caller_file
|
114
|
+
if path[0, 1] == '/'
|
115
|
+
abs_dir = path
|
116
|
+
else # relative
|
117
|
+
abs_dir = File.join(File.dirname(caller_file), path)
|
118
|
+
end
|
119
|
+
#puts 'abs_dir=' + abs_dir
|
120
|
+
raise "Folder not found for merge_folder #{path}!" unless File.directory?(abs_dir)
|
121
|
+
rbfiles = File.join(abs_dir, "*.rb")
|
122
|
+
Dir[rbfiles].each do |f|
|
123
|
+
#f2 = check_for_file(f)
|
124
|
+
#puts "f2=#{f2}"
|
125
|
+
merge(f)
|
126
|
+
#files << f
|
127
|
+
#@merged[f]
|
112
128
|
end
|
113
|
-
|
114
|
-
SimpleWorker.logger.info "Merged folders! #{@merged_folders.inspect}"
|
129
|
+
#@merged_folders[path] = files unless files.empty?
|
130
|
+
#SimpleWorker.logger.info "Merged folders! #{@merged_folders.inspect}"
|
115
131
|
end
|
116
132
|
|
117
|
-
|
118
|
-
|
133
|
+
# merges the specified file.
|
134
|
+
#
|
135
|
+
# Example: merge 'models/my_model'
|
119
136
|
def merge(*files)
|
137
|
+
ret = nil
|
120
138
|
files.each do |f|
|
121
|
-
|
122
|
-
|
139
|
+
f2 = check_for_file(f)
|
140
|
+
ret = {:name=>f, :path=>f2}
|
141
|
+
@merged[File.basename(f2)] = ret
|
123
142
|
end
|
143
|
+
ret
|
124
144
|
end
|
125
145
|
|
126
|
-
|
127
|
-
|
146
|
+
# Opposite of merge, this will omit the files you specify from being merged in. Useful in Rails apps
|
147
|
+
# where a lot of things are auto-merged by default like your models.
|
128
148
|
def unmerge(*files)
|
129
149
|
files.each do |f|
|
130
|
-
|
131
|
-
@unmerged
|
150
|
+
f2 = check_for_file(f)
|
151
|
+
@unmerged[File.basename(f2)] = {:name=>f, :path=>f2}
|
132
152
|
end
|
133
153
|
end
|
134
154
|
|
@@ -137,15 +157,18 @@ module SimpleWorker
|
|
137
157
|
s[-suffix.length, suffix.length] == suffix
|
138
158
|
end
|
139
159
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
160
|
+
# Use this to merge in other workers. These are treated differently the normal merged files because
|
161
|
+
# they will be uploaded separately and treated as distinctly separate workers.
|
162
|
+
#
|
163
|
+
# file: This is the path to the file, just like merge.
|
164
|
+
# class_name: eg: 'MyWorker'.
|
145
165
|
def merge_worker(file, class_name)
|
146
166
|
# puts 'merge_worker in ' + self.name
|
147
|
-
merge(file)
|
148
|
-
|
167
|
+
ret = merge(file)
|
168
|
+
ret[:class_name] = class_name
|
169
|
+
#[File.expand_path(file), class_name]
|
170
|
+
@merged_workers[file] = ret
|
171
|
+
ret
|
149
172
|
end
|
150
173
|
end
|
151
174
|
|
@@ -170,7 +193,7 @@ module SimpleWorker
|
|
170
193
|
self.class.instance_variable_defined?(:@uploaded) && self.class.instance_variable_get(:@uploaded)
|
171
194
|
end
|
172
195
|
|
173
|
-
|
196
|
+
# Call this if you want to run locally and get some extra features from this gem like global attributes.
|
174
197
|
def run_local
|
175
198
|
# puts 'run_local'
|
176
199
|
set_auto_attributes
|
@@ -216,11 +239,11 @@ module SimpleWorker
|
|
216
239
|
queue(options)
|
217
240
|
end
|
218
241
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
242
|
+
# Call this to queue up your job to SimpleWorker cloud.
|
243
|
+
# options:
|
244
|
+
# :priority => 0, 1 or 2. Default is 0.
|
245
|
+
# :recursive => true/false. Default is false. If you queue up a worker that is the same class as the currently
|
246
|
+
# running worker, it will be rejected unless you set this explicitly so we know you meant to do it.
|
224
247
|
def queue(options={})
|
225
248
|
# puts 'in queue'
|
226
249
|
set_auto_attributes
|
@@ -257,9 +280,9 @@ module SimpleWorker
|
|
257
280
|
false
|
258
281
|
end
|
259
282
|
|
260
|
-
|
261
|
-
|
262
|
-
|
283
|
+
# will return after job has completed or errored out.
|
284
|
+
# Returns status.
|
285
|
+
# todo: add a :timeout option
|
263
286
|
def wait_until_complete
|
264
287
|
check_service
|
265
288
|
tries = 0
|
@@ -281,17 +304,17 @@ module SimpleWorker
|
|
281
304
|
upload_if_needed
|
282
305
|
end
|
283
306
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
307
|
+
#
|
308
|
+
# schedule: hash of scheduling options that can include:
|
309
|
+
# Required:
|
310
|
+
# - start_at: Time of first run - DateTime or Time object.
|
311
|
+
# Optional:
|
312
|
+
# - run_every: Time in seconds between runs. If ommitted, task will only run once.
|
313
|
+
# - delay_type: Fixed Rate or Fixed Delay. Default is fixed_delay.
|
314
|
+
# - end_at: Scheduled task will stop running after this date (optional, if ommitted, runs forever or until cancelled)
|
315
|
+
# - run_times: Task will run exactly :run_times. For instance if :run_times is 5, then the task will run 5 times.
|
316
|
+
# - name: Provide a name for the schedule, defaults to class name. Use this if you want more than one schedule per worker class.
|
317
|
+
#
|
295
318
|
def schedule(schedule)
|
296
319
|
set_global_attributes
|
297
320
|
upload_if_needed(schedule)
|
@@ -306,12 +329,12 @@ module SimpleWorker
|
|
306
329
|
SimpleWorker.service.schedule_status(schedule_id)
|
307
330
|
end
|
308
331
|
|
309
|
-
|
332
|
+
# Retrieves the log for this worker from the SimpleWorker service.
|
310
333
|
def get_log
|
311
334
|
SimpleWorker.service.log(task_id)
|
312
335
|
end
|
313
336
|
|
314
|
-
|
337
|
+
# Callbacks for developer
|
315
338
|
def before_upload
|
316
339
|
|
317
340
|
end
|
@@ -358,7 +381,7 @@ module SimpleWorker
|
|
358
381
|
#puts 'superclass=' + superclass.name
|
359
382
|
break if superclass.name == SimpleWorker::Base.name
|
360
383
|
super_merged = superclass.instance_variable_get(:@merged)
|
361
|
-
|
384
|
+
#puts 'merging caller file: ' + superclass.instance_variable_get(:@caller_file).inspect
|
362
385
|
super_merged << superclass.instance_variable_get(:@caller_file)
|
363
386
|
merged = super_merged + merged
|
364
387
|
#puts 'merged with superclass=' + merged.inspect
|
@@ -369,11 +392,11 @@ module SimpleWorker
|
|
369
392
|
def self.extract_merged_workers(worker)
|
370
393
|
merged_workers = worker.class.instance_variable_get(:@merged_workers)
|
371
394
|
SimpleWorker.logger.debug "Looking for merged_workers in #{worker.class.name}: #{merged_workers.inspect}"
|
372
|
-
ret =
|
395
|
+
ret = {}
|
373
396
|
if merged_workers && merged_workers.size > 0
|
374
397
|
merged_workers.each do |mw|
|
375
398
|
SimpleWorker.logger.debug "merged worker found in #{worker.class.name}: #{mw.inspect}"
|
376
|
-
ret
|
399
|
+
ret[mw[:name]] = mw
|
377
400
|
end
|
378
401
|
end
|
379
402
|
ret
|
@@ -387,17 +410,17 @@ module SimpleWorker
|
|
387
410
|
|
388
411
|
merged = self.class.instance_variable_get(:@merged)
|
389
412
|
|
390
|
-
|
413
|
+
# do merged_workers first because we need to get their subclasses and what not too
|
391
414
|
merged_workers = self.class.instance_variable_get(:@merged_workers)
|
392
415
|
if merged_workers && merged_workers.size > 0
|
393
416
|
SimpleWorker.logger.debug 'now uploading merged workers ' + merged_workers.inspect
|
394
|
-
merged_workers.
|
395
|
-
SimpleWorker.logger.debug 'Instantiating and uploading ' +
|
396
|
-
mw_instantiated = Kernel.const_get(
|
417
|
+
merged_workers.each_pair do |mw, v|
|
418
|
+
SimpleWorker.logger.debug 'Instantiating and uploading ' + v.inspect
|
419
|
+
mw_instantiated = Kernel.const_get(v[:class_name]).new
|
397
420
|
mw_instantiated.upload
|
398
421
|
|
399
422
|
merged, rfile, subclass = SimpleWorker::Base.extract_superclasses_merges(mw_instantiated, merged)
|
400
|
-
merged
|
423
|
+
merged.merge!(SimpleWorker::Base.extract_merged_workers(mw_instantiated))
|
401
424
|
|
402
425
|
end
|
403
426
|
end
|
@@ -424,7 +447,7 @@ module SimpleWorker
|
|
424
447
|
merged_gems = gems_to_merge(merged_gems)
|
425
448
|
merged_gems.uniq!
|
426
449
|
end
|
427
|
-
merged.uniq!
|
450
|
+
#merged.uniq!
|
428
451
|
merged_mailers.uniq!
|
429
452
|
options_for_upload = {:merge=>merged, :unmerge=>unmerged, :merged_gems=>merged_gems, :merged_mailers=>merged_mailers, :merged_folders=>merged_folders}
|
430
453
|
options_for_upload[:name] = options[:name] if options[:name]
|
@@ -442,7 +465,7 @@ module SimpleWorker
|
|
442
465
|
data = {}
|
443
466
|
|
444
467
|
payload = {}
|
445
|
-
|
468
|
+
# todo: should put these down a layer, eg: payload[:attributes]
|
446
469
|
self.instance_variables.each do |iv|
|
447
470
|
payload[iv] = instance_variable_get(iv)
|
448
471
|
end
|
data/lib/simple_worker/config.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
# This is the file that gets executed on the server.
|
@@ -40,7 +40,7 @@ module SimpleWorker
|
|
40
40
|
if File.exists?(f)
|
41
41
|
existing_md5 = IO.read(f)
|
42
42
|
end
|
43
|
-
|
43
|
+
# Check for code changes.
|
44
44
|
md5 = Digest::MD5.hexdigest(File.read(filename))
|
45
45
|
new_code = false
|
46
46
|
if md5 != existing_md5
|
@@ -60,7 +60,7 @@ module SimpleWorker
|
|
60
60
|
options = {
|
61
61
|
"class_name"=>class_name,
|
62
62
|
"name"=>name,
|
63
|
-
"file_name"=> File.basename(filename)
|
63
|
+
"file_name"=> "runner.rb" # File.basename(filename)
|
64
64
|
}
|
65
65
|
#puts 'options for upload=' + options.inspect
|
66
66
|
SimpleWorker.logger.info "Uploading now..."
|
@@ -84,7 +84,7 @@ module SimpleWorker
|
|
84
84
|
gem_name =(gem_info[:name].match(/^[a-zA-Z0-9\-_]+/)[0])
|
85
85
|
#puts "Searching for #{gem_name}..."
|
86
86
|
gems= Gem::Specification.respond_to?(:each) ? Gem::Specification.find_all_by_name(gem_name) : Gem::GemPathSearcher.new.find_all(gem_name)
|
87
|
-
# gems = searcher.init_gemspecs.select { |gem| gem.name==gem_name }
|
87
|
+
# gems = searcher.init_gemspecs.select { |gem| gem.name==gem_name }
|
88
88
|
logger.debug 'gems found=' + gems.inspect
|
89
89
|
gems = gems.select { |g| g.version.version==gem_info[:version] } if gem_info[:version]
|
90
90
|
if !gems.empty?
|
@@ -100,17 +100,24 @@ module SimpleWorker
|
|
100
100
|
# unless (merge && merge.size > 0) || (rged_gems && merged_gems.size > 0)
|
101
101
|
# return filename
|
102
102
|
# end
|
103
|
-
merge = merge.nil? ?
|
103
|
+
merge = merge.nil? ? {} : merge.dup
|
104
|
+
SimpleWorker.logger.debug "merge"
|
104
105
|
if unmerge
|
105
|
-
unmerge.
|
106
|
+
unmerge.each_pair do |x, y|
|
106
107
|
deleted = merge.delete x
|
107
|
-
|
108
|
+
SimpleWorker.logger.debug "Unmerging #{x}. Success? #{deleted}"
|
108
109
|
end
|
109
110
|
end
|
110
|
-
|
111
|
-
tmp_file = File.join(Dir.tmpdir(),
|
111
|
+
#tmp_file = File.join(Dir.tmpdir(), File.basename(filename))
|
112
|
+
tmp_file = File.join(Dir.tmpdir(), 'runner.rb')
|
112
113
|
File.open(tmp_file, "w") do |f|
|
113
114
|
# add some rails stuff if using Rails
|
115
|
+
|
116
|
+
merge.each_pair do |k,v|
|
117
|
+
SimpleWorker.logger.debug "merging #{k} into #{filename}"
|
118
|
+
f.write("require_relative '#{k}'\n") # add(File.basename(m), m)
|
119
|
+
end
|
120
|
+
|
114
121
|
if defined?(Rails)
|
115
122
|
f.write "module Rails
|
116
123
|
def self.version
|
@@ -121,7 +128,6 @@ module SimpleWorker
|
|
121
128
|
end
|
122
129
|
end
|
123
130
|
"
|
124
|
-
|
125
131
|
end
|
126
132
|
if SimpleWorker.config.extra_requires
|
127
133
|
SimpleWorker.config.extra_requires.each do |r|
|
@@ -164,9 +170,13 @@ end
|
|
164
170
|
end
|
165
171
|
end
|
166
172
|
end
|
167
|
-
f.write File.open(filename, 'r') { |mo| mo.read }
|
173
|
+
#f.write File.open(filename, 'r') { |mo| mo.read }
|
174
|
+
f.write("require_relative '#{File.basename(filename)}'")
|
168
175
|
end
|
169
|
-
|
176
|
+
#puts 'funner.rb=' + tmp_file
|
177
|
+
merge['runner.rb'] = {:path=>tmp_file}
|
178
|
+
#puts 'filename=' + filename
|
179
|
+
merge[File.basename(filename)] = {:path=>filename}
|
170
180
|
#puts "merge before uniq! " + merge.inspect
|
171
181
|
# puts "merge after uniq! " + merge.inspect
|
172
182
|
|
@@ -185,11 +195,11 @@ end
|
|
185
195
|
SimpleWorker.logger.debug "Collecting gem #{path}"
|
186
196
|
Dir["#{path}/*", "#{path}/lib/**/**"].each do |file|
|
187
197
|
# todo: could check if directory and it not lib, skip it
|
188
|
-
|
198
|
+
SimpleWorker.logger.debug 'file for gem=' + file.inspect
|
189
199
|
# puts 'gem2=' + gem.inspect
|
190
200
|
zdest = "gems/#{gem[:name]}/#{file.sub(path+'/', '')}"
|
191
201
|
# puts 'gem file=' + file.to_s
|
192
|
-
|
202
|
+
SimpleWorker.logger.debug 'zip dest=' + zdest
|
193
203
|
f.add(zdest, file)
|
194
204
|
end
|
195
205
|
else
|
@@ -209,16 +219,16 @@ end
|
|
209
219
|
if files and files.size>0
|
210
220
|
files.each do |file|
|
211
221
|
zdest = "#{Digest::MD5.hexdigest(folder)}/#{file.sub(':', '_').sub('/', '_')}"
|
212
|
-
|
222
|
+
SimpleWorker.logger.debug 'put file to=' + zdest
|
213
223
|
f.add(zdest, file)
|
214
224
|
end
|
215
225
|
end
|
216
226
|
end
|
217
227
|
end
|
218
228
|
|
219
|
-
merge.
|
229
|
+
merge.each_pair do |k,v|
|
220
230
|
# puts "merging #{m} into #{filename}"
|
221
|
-
f.add(File.basename(
|
231
|
+
f.add(File.basename(v[:path]), v[:path])
|
222
232
|
end
|
223
233
|
if merged_mailers && merged_mailers.size > 0
|
224
234
|
# puts " MERGED MAILERS" + merged_mailers.inspect
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: simple_worker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.7.
|
5
|
+
version: 0.7.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Travis Reeder
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-08-01 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: zip
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- lib/simple_worker/api.rb
|
50
50
|
- lib/simple_worker/base.rb
|
51
51
|
- lib/simple_worker/config.rb
|
52
|
+
- lib/simple_worker/runner.rb
|
52
53
|
- lib/simple_worker/service.rb
|
53
54
|
- lib/simple_worker/used_in_worker.rb
|
54
55
|
- rails/init.rb
|