simple_worker 0.1.2 → 0.3.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/lib/simple_worker/base.rb +114 -0
- data/lib/simple_worker/config.rb +9 -0
- data/lib/simple_worker.rb +56 -5
- data/test/test_inheritance.rb +7 -0
- data/test/test_simple_worker.rb +47 -1
- data/test/test_worker.rb +10 -2
- data/test/test_worker_2.rb +32 -0
- metadata +8 -5
- data/lib/worker.rb +0 -14
@@ -0,0 +1,114 @@
|
|
1
|
+
# This is an abstract module that developers creating works can mixin/include to use the SimpleWorker special functions.
|
2
|
+
|
3
|
+
require 'digest/md5'
|
4
|
+
|
5
|
+
module SimpleWorker
|
6
|
+
|
7
|
+
class Base
|
8
|
+
|
9
|
+
attr_accessor :task_set_id, :task_id, :schedule_id
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :subclass, :caller_file
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.inherited(subclass)
|
16
|
+
puts "New subclass: #{subclass}"
|
17
|
+
puts "subclass.inspect=" + subclass.inspect
|
18
|
+
puts 'existing caller=' + (subclass.class_variable_defined?(:@@caller_file) ? subclass.class_variable_get(:@@caller_file).inspect : "nil")
|
19
|
+
puts "caller=" + caller.inspect
|
20
|
+
splits = caller[0].split(":")
|
21
|
+
caller_file = splits[0] + ":" + splits[1]
|
22
|
+
puts 'caller_file=' + caller_file
|
23
|
+
# don't need these class_variables anymore probably
|
24
|
+
subclass.class_variable_set(:@@caller_file, caller_file)
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def log(str)
|
30
|
+
puts str.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_progress(hash)
|
34
|
+
puts 'set_progress: ' + hash.inspect
|
35
|
+
end
|
36
|
+
|
37
|
+
def who_am_i?
|
38
|
+
return self.class.name
|
39
|
+
end
|
40
|
+
|
41
|
+
def uploaded?
|
42
|
+
self.class.class_variable_defined?(:@@uploaded) && self.class.class_variable_get(:@@uploaded)
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Will send in all instance_variables.
|
47
|
+
def queue
|
48
|
+
upload_if_needed
|
49
|
+
|
50
|
+
response = SimpleWorker.service.queue(self.class.name, sw_get_data)
|
51
|
+
puts 'queue response=' + response.inspect
|
52
|
+
@task_set_id = response["task_set_id"]
|
53
|
+
@task_id = response["tasks"][0]["task_id"]
|
54
|
+
response
|
55
|
+
end
|
56
|
+
|
57
|
+
def status
|
58
|
+
SimpleWorker.service.status(task_id)
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def schedule(schedule)
|
63
|
+
upload_if_needed
|
64
|
+
|
65
|
+
response = SimpleWorker.service.schedule(self.class.name, sw_get_data, schedule)
|
66
|
+
puts 'schedule response=' + response.inspect
|
67
|
+
@schedule_id = response["schedule_id"]
|
68
|
+
response
|
69
|
+
end
|
70
|
+
|
71
|
+
def schedule_status
|
72
|
+
SimpleWorker.service.schedule_status(schedule_id)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# def queue_other(class_name, data)
|
77
|
+
# SimpleWorker.service.queue(class_name, data)
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# def schedule_other(class_name, data, schedule)
|
81
|
+
# SimpleWorker.service.schedule(class_name, data, schedule)
|
82
|
+
# end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def upload_if_needed
|
87
|
+
|
88
|
+
# $LOADED_FEATURES.each_with_index { |feature, idx|
|
89
|
+
# puts "#{ sprintf("%2s", idx) } #{feature}"
|
90
|
+
# if feature[feature.rindex("/")..feature.length] ==
|
91
|
+
#}
|
92
|
+
unless uploaded?
|
93
|
+
subclass = self.class
|
94
|
+
rfile = subclass.class_variable_get(:@@caller_file) # Base.caller_file # File.expand_path(Base.subclass)
|
95
|
+
puts 'rfile=' + rfile.inspect
|
96
|
+
puts 'self.class.name=' + subclass.name
|
97
|
+
SimpleWorker.service.upload(rfile, subclass.name)
|
98
|
+
self.class.class_variable_set(:@@uploaded, true)
|
99
|
+
else
|
100
|
+
puts 'already uploaded for ' + self.class.name
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def sw_get_data
|
105
|
+
data = {}
|
106
|
+
self.instance_variables.each do |iv|
|
107
|
+
data[iv] = instance_variable_get(iv)
|
108
|
+
end
|
109
|
+
return data
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
data/lib/simple_worker.rb
CHANGED
@@ -1,19 +1,57 @@
|
|
1
1
|
require 'appoxy_api'
|
2
|
-
require File.join(File.dirname(__FILE__), '
|
3
|
-
|
2
|
+
require File.join(File.dirname(__FILE__), 'simple_worker', 'base')
|
3
|
+
require File.join(File.dirname(__FILE__), 'simple_worker', 'config')
|
4
4
|
|
5
5
|
module SimpleWorker
|
6
6
|
|
7
|
+
class << self
|
8
|
+
attr_accessor :config,
|
9
|
+
:service
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configure()
|
14
|
+
SimpleWorker.config ||= Config.new
|
15
|
+
yield(config)
|
16
|
+
SimpleWorker.service = Service.new(config.access_key, config.secret_key, :config=>config)
|
17
|
+
end
|
18
|
+
|
7
19
|
class Service < Appoxy::Api::Client
|
8
20
|
|
21
|
+
attr_accessor :config
|
22
|
+
|
9
23
|
def initialize(access_key, secret_key, options={})
|
10
24
|
puts 'Starting SimpleWorker::Service...'
|
25
|
+
self.config = options[:config] if options[:config]
|
11
26
|
super("http://api.simpleworkr.com/api/", access_key, secret_key, options)
|
27
|
+
self.host = self.config.host if self.config && self.config.host
|
12
28
|
end
|
13
29
|
|
14
30
|
# Options:
|
15
31
|
# - :callback_url
|
16
32
|
def upload(filename, class_name, options={})
|
33
|
+
|
34
|
+
# check whether it should upload again
|
35
|
+
tmp = Dir.tmpdir()
|
36
|
+
puts 'tmp=' + tmp.to_s
|
37
|
+
md5file = "simple_workr_#{class_name.gsub("::", ".")}.md5"
|
38
|
+
existing_md5 = nil
|
39
|
+
f = File.join(tmp, md5file)
|
40
|
+
if File.exists?(f)
|
41
|
+
existing_md5 = IO.read(f)
|
42
|
+
puts 'existing_md5=' + existing_md5
|
43
|
+
end
|
44
|
+
# sys.classes[subclass].__file__
|
45
|
+
# puts '__FILE__=' + Base.subclass.__file__.to_s
|
46
|
+
md5 = Digest::MD5.hexdigest(File.read(filename))
|
47
|
+
puts "new md5=" + md5
|
48
|
+
if md5 != existing_md5
|
49
|
+
puts 'new code, so uploading'
|
50
|
+
File.open(f, 'w') { |f| f.write(md5) }
|
51
|
+
else
|
52
|
+
puts 'same code, not uploading'
|
53
|
+
end
|
54
|
+
|
17
55
|
mystring = nil
|
18
56
|
file = File.open(filename, "r") do |f|
|
19
57
|
mystring = f.read
|
@@ -23,8 +61,13 @@ module SimpleWorker
|
|
23
61
|
ret
|
24
62
|
end
|
25
63
|
|
26
|
-
|
27
|
-
|
64
|
+
def add_sw_params(hash_to_send)
|
65
|
+
hash_to_send["sw_access_key"] = self.access_key
|
66
|
+
hash_to_send["sw_secret_key"] = self.secret_key
|
67
|
+
end
|
68
|
+
|
69
|
+
# class_name: The class name of a previously upload class, eg: MySuperWorker
|
70
|
+
# data: Arbitrary hash of your own data that your task will need to run.
|
28
71
|
def queue(class_name, data={})
|
29
72
|
if !data.is_a?(Array)
|
30
73
|
data = [data]
|
@@ -32,6 +75,7 @@ module SimpleWorker
|
|
32
75
|
hash_to_send = {}
|
33
76
|
hash_to_send["payload"] = data
|
34
77
|
hash_to_send["class_name"] = class_name
|
78
|
+
add_sw_params(hash_to_send)
|
35
79
|
if defined?(RAILS_ENV)
|
36
80
|
hash_to_send["rails_env"] = RAILS_ENV
|
37
81
|
end
|
@@ -68,7 +112,8 @@ module SimpleWorker
|
|
68
112
|
hash_to_send["payload"] = data
|
69
113
|
hash_to_send["class_name"] = class_name
|
70
114
|
hash_to_send["schedule"] = schedule
|
71
|
-
|
115
|
+
add_sw_params(hash_to_send)
|
116
|
+
# puts 'about to send ' + hash_to_send.inspect
|
72
117
|
ret = post("scheduler/schedule", hash_to_send)
|
73
118
|
ret
|
74
119
|
end
|
@@ -93,6 +138,12 @@ module SimpleWorker
|
|
93
138
|
ret
|
94
139
|
end
|
95
140
|
|
141
|
+
def schedule_status(schedule_id)
|
142
|
+
data = {"schedule_id"=>schedule_id}
|
143
|
+
ret = get("scheduler/status", data)
|
144
|
+
ret
|
145
|
+
end
|
146
|
+
|
96
147
|
def log(task_id)
|
97
148
|
data = {"task_id"=>task_id}
|
98
149
|
ret = get("task/log", data)
|
data/test/test_simple_worker.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'yaml'
|
3
|
-
|
3
|
+
begin
|
4
|
+
require File.join(File.dirname(__FILE__), '../lib/simple_worker')
|
5
|
+
rescue
|
6
|
+
require 'simple_worker'
|
7
|
+
end
|
8
|
+
require File.join(File.dirname(__FILE__), "./test_worker")
|
9
|
+
require File.join(File.dirname(__FILE__), "./test_worker_2")
|
4
10
|
|
5
11
|
class SimpleWorkerTests < Test::Unit::TestCase
|
6
12
|
|
@@ -12,12 +18,51 @@ class SimpleWorkerTests < Test::Unit::TestCase
|
|
12
18
|
|
13
19
|
@worker = SimpleWorker::Service.new(@access_key, @secret_key)
|
14
20
|
@worker.host = "http://localhost:3000/api/"
|
21
|
+
|
22
|
+
# new style
|
23
|
+
SimpleWorker.configure do |config|
|
24
|
+
config.access_key = @access_key
|
25
|
+
config.secret_key = @secret_key
|
26
|
+
config.host = "http://localhost:3000/api/"
|
27
|
+
end
|
15
28
|
end
|
16
29
|
|
17
30
|
def teardown
|
18
31
|
|
19
32
|
end
|
20
33
|
|
34
|
+
def test_new_worker_style
|
35
|
+
# Add something to queue, get task ID back
|
36
|
+
tw = TestWorker2.new
|
37
|
+
tw.s3_key = "active style runner"
|
38
|
+
tw.times = 3
|
39
|
+
tw.x = true
|
40
|
+
|
41
|
+
# schedule up a task
|
42
|
+
start_at = 10.seconds.since
|
43
|
+
response_hash_single = tw.schedule(:start_at=>start_at, :run_every=>30, :run_times=>3)
|
44
|
+
puts 'response_hash=' + response_hash_single.inspect
|
45
|
+
|
46
|
+
10.times do |i|
|
47
|
+
puts "status #{i}: " + tw.schedule_status.inspect
|
48
|
+
end
|
49
|
+
|
50
|
+
# queue up a task
|
51
|
+
response_hash_single = tw.queue
|
52
|
+
puts 'response_hash=' + response_hash_single.inspect
|
53
|
+
puts 'task_set_id=' + tw.task_set_id
|
54
|
+
puts 'task_id=' + tw.task_id
|
55
|
+
10.times do |i|
|
56
|
+
puts "status #{i}: " + tw.status.inspect
|
57
|
+
break if tw.status["status"] == "complete"
|
58
|
+
sleep 2
|
59
|
+
end
|
60
|
+
|
61
|
+
assert tw.status["status"] == "complete"
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
21
66
|
def test_queue
|
22
67
|
|
23
68
|
|
@@ -74,5 +119,6 @@ class SimpleWorkerTests < Test::Unit::TestCase
|
|
74
119
|
puts 'response_hash=' + response_hash.inspect
|
75
120
|
|
76
121
|
end
|
122
|
+
|
77
123
|
end
|
78
124
|
|
data/test/test_worker.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
begin
|
2
|
+
require File.join(File.dirname(__FILE__), '../lib/simple_worker')
|
3
|
+
rescue Exception
|
4
|
+
require 'simple_worker'
|
5
|
+
end
|
3
6
|
# Bump for new checksum.
|
4
7
|
class TestWorker < SimpleWorker::Base
|
5
8
|
|
9
|
+
attr_accessor :s3_key, :times
|
10
|
+
|
6
11
|
def run(data=nil)
|
7
12
|
log 'running the runner for leroy '.upcase + ' with data: ' + data.inspect
|
13
|
+
|
14
|
+
log 's3_key instance_variable = ' + self.s3_key
|
15
|
+
|
8
16
|
@times = data["times"].to_i
|
9
17
|
@times.times do |i|
|
10
18
|
log 'running at ' + i.to_s
|
@@ -0,0 +1,32 @@
|
|
1
|
+
begin
|
2
|
+
require File.join(File.dirname(__FILE__), '../lib/simple_worker')
|
3
|
+
rescue Exception
|
4
|
+
require 'simple_worker'
|
5
|
+
end
|
6
|
+
|
7
|
+
# Bump for new checksum.
|
8
|
+
class TestWorker2 < SimpleWorker::Base
|
9
|
+
|
10
|
+
attr_accessor :s3_key, :times, :x
|
11
|
+
|
12
|
+
def who_am_i2?
|
13
|
+
return self.class.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(data=nil)
|
17
|
+
log 'running the runner for leroy '.upcase + ' with data: ' + data.inspect
|
18
|
+
|
19
|
+
log 's3_key instance_variable = ' + self.s3_key
|
20
|
+
times.times do |i|
|
21
|
+
log 'running at ' + i.to_s
|
22
|
+
sleep 1
|
23
|
+
set_progress(:percent=> (i / times * 100))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_complete(params=nil)
|
28
|
+
log 'SET COMPLETE YAY!' + params[:task_set_id]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Travis Reeder
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-05-12 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -39,7 +39,8 @@ extra_rdoc_files:
|
|
39
39
|
- README.markdown
|
40
40
|
files:
|
41
41
|
- lib/simple_worker.rb
|
42
|
-
- lib/
|
42
|
+
- lib/simple_worker/base.rb
|
43
|
+
- lib/simple_worker/config.rb
|
43
44
|
- README.markdown
|
44
45
|
has_rdoc: true
|
45
46
|
homepage: http://github.com/appoxy/simple_worker
|
@@ -73,5 +74,7 @@ specification_version: 3
|
|
73
74
|
summary: Classified
|
74
75
|
test_files:
|
75
76
|
- test/scheduled_worker.rb
|
77
|
+
- test/test_inheritance.rb
|
76
78
|
- test/test_simple_worker.rb
|
77
79
|
- test/test_worker.rb
|
80
|
+
- test/test_worker_2.rb
|
data/lib/worker.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This is an abstract module that developers creating works can mixin/include to use the SimpleWorker special functions.
|
2
|
-
module SimpleWorker
|
3
|
-
|
4
|
-
class Base
|
5
|
-
|
6
|
-
def log(str)
|
7
|
-
puts str.to_s
|
8
|
-
end
|
9
|
-
|
10
|
-
def set_progress(hash)
|
11
|
-
puts 'set_progress: ' + hash.inspect
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|