iron_worker 2.4.3 → 3.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +352 -0
  4. data/iron_worker.gemspec +3 -8
  5. data/lib/iron_worker.rb +13 -51
  6. data/lib/iron_worker/api_client.rb +152 -0
  7. data/lib/iron_worker/version.rb +9 -1
  8. data/lib/iron_worker/worker_helper.rb +72 -0
  9. metadata +18 -183
  10. data/README.markdown +0 -73
  11. data/lib/generators/iron_worker/iron_worker_generator.rb +0 -13
  12. data/lib/generators/iron_worker/templates/template_worker.erb +0 -7
  13. data/lib/iron_worker/api.rb +0 -244
  14. data/lib/iron_worker/base.rb +0 -449
  15. data/lib/iron_worker/config.rb +0 -287
  16. data/lib/iron_worker/rails2_init.rb +0 -8
  17. data/lib/iron_worker/railtie.rb +0 -16
  18. data/lib/iron_worker/server/overrides.rb +0 -198
  19. data/lib/iron_worker/server/runner.rb +0 -82
  20. data/lib/iron_worker/service.rb +0 -644
  21. data/lib/iron_worker/used_in_worker.rb +0 -11
  22. data/lib/iron_worker/utils.rb +0 -11
  23. data/rails/init.rb +0 -0
  24. data/test/Gemfile +0 -36
  25. data/test/Gemfile.lock +0 -169
  26. data/test/README.md +0 -5
  27. data/test/batch_run.rb +0 -121
  28. data/test/config_sample.yml +0 -13
  29. data/test/models/cool_model.rb +0 -7
  30. data/test/models/db_model.rb +0 -6
  31. data/test/models/model_1.rb +0 -16
  32. data/test/models/model_2.rb +0 -16
  33. data/test/quick_run.rb +0 -36
  34. data/test/quick_schedule.rb +0 -18
  35. data/test/resources/something.yml +0 -4
  36. data/test/simple_script.rb +0 -11
  37. data/test/test_base.rb +0 -79
  38. data/test/test_database.rb +0 -31
  39. data/test/test_gems.rb +0 -31
  40. data/test/test_inheritance.rb +0 -25
  41. data/test/test_iron_worker.rb +0 -194
  42. data/test/test_merging.rb +0 -51
  43. data/test/test_non_worker_script.rb +0 -14
  44. data/test/test_rails.rb +0 -35
  45. data/test/test_scheduling.rb +0 -74
  46. data/test/test_scheduling_no_active_support.rb +0 -37
  47. data/test/test_service.rb +0 -28
  48. data/test/test_uploads.rb +0 -30
  49. data/test/test_webhooks.rb +0 -45
  50. data/test/v2quick.rb +0 -29
  51. data/test/workers/awesome_job.rb +0 -26
  52. data/test/workers/aws_s3_worker.rb +0 -10
  53. data/test/workers/big_data_worker.rb +0 -15
  54. data/test/workers/big_gems_worker.rb +0 -35
  55. data/test/workers/cool_worker.rb +0 -14
  56. data/test/workers/db_worker.rb +0 -27
  57. data/test/workers/fail_worker.rb +0 -10
  58. data/test/workers/gem_dependency_worker.rb +0 -20
  59. data/test/workers/hacker_worker.rb +0 -65
  60. data/test/workers/iw_test_worker.rb +0 -22
  61. data/test/workers/iw_test_worker_2.rb +0 -53
  62. data/test/workers/iw_test_worker_3.rb +0 -17
  63. data/test/workers/local_vs_remote_worker.rb +0 -9
  64. data/test/workers/merging_worker.rb +0 -40
  65. data/test/workers/mq_worker.rb +0 -21
  66. data/test/workers/one_line_worker.rb +0 -10
  67. data/test/workers/prawn_worker.rb +0 -32
  68. data/test/workers/progress_worker.rb +0 -26
  69. data/test/workers/qb_worker.rb +0 -17
  70. data/test/workers/rails_worker.rb +0 -24
  71. data/test/workers/rails_worker2.rb +0 -12
  72. data/test/workers/requiring_worker.rb +0 -4
  73. data/test/workers/running_back_worker.rb +0 -7
  74. data/test/workers/scheduled_worker.rb +0 -15
  75. data/test/workers/second_worker.rb +0 -16
  76. data/test/workers/third_worker.rb +0 -6
  77. data/test/workers/webhook_worker.rb +0 -7
  78. data/test/zip_vs_gzip.rb +0 -26
data/README.markdown DELETED
@@ -1,73 +0,0 @@
1
- Getting Started
2
- ===============
3
-
4
- [Sign up for a IronWorker account][1], it's free to try!
5
-
6
- [1]: http://www.iron.io/
7
-
8
- **WARNING**: THIS GEM IS DEPRECATED. Use the generation IronWorker gem, `iron_worker_ng`,
9
- at: https://github.com/iron-io/iron_worker_ruby_ng. It also includes our new IronWorker command line
10
- interface (CLI) which is... awesome. ;) You can [read more about that here](http://blog.iron.io/2012/05/new-ironworker-command-line-interface.html).
11
-
12
- Install IronWorker Gem
13
- ------------------------
14
-
15
- gem install iron_worker
16
-
17
- Configure IronWorker
18
- ----------------------
19
-
20
- You really just need your token, which you can get [here][2]
21
- [2]: http://hud.iron.io/tokens
22
-
23
- IronWorker.configure do |config|
24
- config.token = TOKEN
25
- config.project_id = MY_PROJECT_ID
26
- end
27
-
28
- Write a Worker
29
- --------------
30
-
31
- Here's an example worker that sends an email:
32
-
33
- require 'iron_worker'
34
-
35
- class HelloWorker < IronWorker::Base
36
-
37
- attr_accessor :name
38
-
39
- # This is the method that will be run
40
- def run
41
- puts "Hello #{name}!"
42
- end
43
- end
44
-
45
- Test It Locally
46
- ---------------
47
-
48
- Let's say someone does something in your app and you want to send an email about it.
49
-
50
- worker = HelloWorker.new
51
- worker.name = "Travis"
52
- worker.run_local
53
-
54
- Once you've got it working locally, the next step is to run it on the IronWorker cloud.
55
-
56
- Queue up your Worker on the IronWorker Cloud
57
- ----------------------------------------------
58
-
59
- Let's say someone does something in your app and you want to send an email about it.
60
-
61
- worker = HelloWorker.new
62
- worker.name = "Travis"
63
- worker.queue
64
-
65
- This will send it off to the IronWorker cloud.
66
-
67
- Full Documentation
68
- -----------------
69
-
70
- Now that you've got your first worker running, be sure to [check out the full documentation](https://github.com/iron-io/iron_worker_ruby/wiki).
71
- IronWorker can do so much more!
72
-
73
- And check out the [Iron.io Dev Center](http://dev.iron.io) for full IronWorker API documentation and and support for other languages.
@@ -1,13 +0,0 @@
1
- class IronWorkerGenerator < Rails::Generators::NamedBase
2
- source_root File.expand_path("../templates", __FILE__)
3
-
4
- desc "Creates a new skeleton worker - NAME is camelized"
5
- def create_worker_file
6
- # file_name needs to be classified
7
- @camel = file_name.camelize
8
- if not File.directory? "#{Rails.root}/app/workers"
9
- Dir.mkdir "#{Rails.root}/app/workers"
10
- end
11
- template "template_worker.erb", "app/workers/#{file_name}.rb"
12
- end
13
- end
@@ -1,7 +0,0 @@
1
- class <%= @camel %> < IronWorker::Base
2
-
3
- def run
4
- log "Your code goes in this bit"
5
- end
6
-
7
- end
@@ -1,244 +0,0 @@
1
- require 'rest'
2
-
3
- module IronWorker
4
-
5
- class RequestError < StandardError
6
- def initialize(msg, options={})
7
- super(msg)
8
- @options = options
9
- end
10
-
11
- def status
12
- @options[:status]
13
- end
14
- end
15
-
16
- module Api
17
-
18
- module Signatures
19
-
20
-
21
- def self.generate_timestamp(gmtime)
22
- return gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
23
- end
24
-
25
-
26
- def self.generate_signature(operation, timestamp, secret_key)
27
- my_sha_hmac = Digest::HMAC.digest(operation + timestamp, secret_key, Digest::SHA1)
28
- my_b64_hmac_digest = Base64.encode64(my_sha_hmac).strip
29
- return my_b64_hmac_digest
30
- end
31
-
32
-
33
- def self.hash_to_s(hash)
34
- str = ""
35
- hash.sort.each { |a| str+= "#{a[0]}#{a[1]}" }
36
- #removing all characters that could differ after parsing with rails
37
- return str.delete "\"\/:{}[]\' T"
38
- end
39
- end
40
-
41
- # Subclass must define:
42
- # host: endpoint url for service
43
- class Client
44
-
45
- attr_accessor :scheme, :host, :port, :token, :version, :config
46
-
47
- def initialize(host, token, options={})
48
- @config = options[:config]
49
- @scheme = options[:scheme] || @config.scheme || "https"
50
- @host = options[:host] || @config.host || host
51
- @port = options[:port] || @config.port || 443
52
- @token = options[:token] || @config.token || token
53
- @version = options[:version]
54
- #@logger = options[:logger]
55
-
56
- reset_base_url
57
-
58
- @uber_client = Rest::Client.new
59
-
60
- end
61
-
62
- def reset_base_url
63
- @base_url = "#{@scheme}://#{@host}:#{@port}/#{@version}"
64
- end
65
-
66
- def base_url
67
- @base_url
68
- end
69
-
70
- def url(command_path)
71
- # @logger.debug "url: " + url.to_s
72
- "/#{command_path}"
73
- end
74
-
75
- def url_full(command_path)
76
- url = "#{base_url}/#{command_path}"
77
- # @logger.debug "url: " + url.to_s
78
- url
79
- end
80
-
81
-
82
- def common_req_hash
83
- {
84
- :headers=>{"Content-Type" => 'application/json',
85
- "Authorization"=>"OAuth #{@token}",
86
- "User-Agent"=>"IronWorker Ruby Client"}
87
- }
88
- end
89
-
90
- def process_ex(ex)
91
- logger.error "EX #{ex.class.name}: #{ex.message}"
92
- body = ex.http_body
93
- logger.debug 'EX http_code: ' + ex.http_code.to_s
94
- logger.debug 'EX BODY=' + body.to_s
95
- decoded_ex = JSON.parse(body)
96
- exception = Exception.new(ex.message + ": " + decoded_ex["msg"])
97
- exception.set_backtrace(decoded_ex["backtrace"].split(",")) if decoded_ex["backtrace"]
98
- raise exception
99
- end
100
-
101
-
102
- def check_response(response, options={})
103
- # response.code # http status code
104
- #response.time # time in seconds the request took
105
- #response.headers # the http headers
106
- #response.headers_hash # http headers put into a hash
107
- #response.body # the response body
108
- status = response.code
109
- body = response.body
110
- # todo: check content-type == application/json before parsing
111
- logger.debug "response code=" + status.to_s
112
- logger.debug "response body=" + body.inspect
113
- res = nil
114
- unless options[:parse] == false
115
- res = JSON.parse(body)
116
- end
117
- if status < 400
118
-
119
- else
120
- raise IronWorker::RequestError.new((res ? "#{status}: #{res["msg"]}" : "#{status} Error! parse=false so no msg"), :status=>status)
121
- end
122
- res || body
123
- end
124
-
125
- def get(method, params={}, options={})
126
- full_url = url_full(method)
127
- #all_params = add_params(method, params)
128
- #url_plus_params = append_params(full_url, all_params)
129
- logger.debug 'get url=' + full_url
130
- req_hash = common_req_hash
131
- req_hash[:params] = params
132
- response = @uber_client.get(full_url, req_hash) # could let typhoeus add params, using :params=>x
133
- #response = @http_sess.request(:get, url_plus_params,
134
- # {},
135
- # {})
136
- check_response(response, options)
137
- body = response.body
138
- parse_response(body, options)
139
-
140
- end
141
-
142
- def post_file(method, file, params={}, options={})
143
- begin
144
- data = add_params(method, params).to_json
145
- url = url_full(method)
146
- logger.debug "post_file url = " + url
147
- logger.debug "data = " + data
148
- logger.debug "params = " + params.inspect
149
- logger.debug "options = " + options.inspect
150
- # todo: replace with uber_client
151
- parse_response(RestClient.post(append_params(url, add_params(method, params)), {:data => data, :file => file}, :content_type => 'application/json'), options)
152
- rescue RestClient::Exception => ex
153
- process_ex(ex)
154
- end
155
- end
156
-
157
- def post(method, params={}, options={})
158
- logger.debug "params = " + params.inspect
159
- logger.debug "options = " + options.inspect
160
- logger.debug "params.payload = " + params[:payload].inspect
161
- logger.debug "token = "+ token.inspect
162
- begin
163
- url = url_full(method)
164
- logger.debug 'post url=' + url
165
- json = add_params(method, params).to_json
166
- logger.debug 'body=' + json
167
- req_hash = common_req_hash
168
- req_hash[:body] = json
169
- response = @uber_client.post(url, req_hash)
170
- #response = @http_sess.post(url, json, {"Content-Type" => 'application/json'})
171
- check_response(response)
172
- logger.debug 'response: ' + response.inspect
173
- body = response.body
174
- parse_response(body, options)
175
- rescue IronWorker::RequestError => ex
176
- # let it throw, came from check_response
177
- raise ex
178
- rescue RestClient::Exception => ex
179
- logger.warn("Exception in post! #{ex.message}")
180
- logger.warn(ex.backtrace.join("\n"))
181
- process_ex(ex)
182
- end
183
- end
184
-
185
-
186
- def put(method, body, options={})
187
- begin
188
- # todo: replace with uber_client
189
- parse_response RestClient.put(url_full(method), add_params(method, body).to_json, headers), options
190
- rescue RestClient::Exception => ex
191
- process_ex(ex)
192
- end
193
- end
194
-
195
- def delete(method, params={}, options={})
196
- begin
197
- # todo: replace with uber_client
198
- parse_response RestClient.delete(append_params(url_full(method), add_params(method, params))), options
199
- rescue RestClient::Exception => ex
200
- process_ex(ex)
201
- end
202
- end
203
-
204
- def add_params(command_path, hash)
205
- extra_params = {'oauth' => token}
206
- hash.merge!(extra_params)
207
- end
208
-
209
- def append_params(host, params)
210
- host += "?"
211
- i = 0
212
- params.each_pair do |k, v|
213
- #puts "k=#{k} v=#{v}"
214
- host += "&" if i > 0
215
- host += k + "=" + (v.is_a?(String) ? CGI.escape(v) : v.to_s)
216
- i +=1
217
- end
218
- return host
219
- end
220
-
221
- def headers
222
- user_agent = "IronWorker Ruby Client"
223
- headers = {'User-Agent' => user_agent}
224
- end
225
-
226
- def parse_response(response, options={})
227
- #puts 'PARSE RESPONSE: ' + response.to_s
228
- unless options[:parse] == false
229
- begin
230
- return JSON.parse(response.to_s)
231
- rescue => ex
232
- puts 'parse_response: response that caused error = ' + response.to_s
233
- raise ex
234
- end
235
- else
236
- response
237
- end
238
- end
239
-
240
- end
241
-
242
- end
243
-
244
- end
@@ -1,449 +0,0 @@
1
- require 'digest/md5'
2
- require 'base64'
3
-
4
- module IronWorker
5
-
6
- class Base
7
-
8
- attr_accessor :task_set_id, :task_id, :schedule_id
9
- attr_reader :response
10
-
11
- class << self
12
- attr_accessor :subclass, :caller_file
13
- @merged = {}
14
- @merged_workers = {}
15
- @merged_gems = {}
16
- @merged_mailers = {}
17
- @merged_folders = {}
18
- @unmerged = {}
19
- @unmerged_gems = {}
20
-
21
- def reset!
22
- @merged = {}
23
- @merged_workers = {}
24
- @merged_gems = {}
25
- @merged_mailers = {}
26
- @merged_folders = {}
27
- @unmerged = {}
28
- @unmerged_gems = {}
29
- end
30
-
31
- def inherited(subclass)
32
- subclass.reset!
33
-
34
- caller_file = caller[0][0...(caller[0].index(":in"))]
35
- caller_file = caller_file[0...(caller_file.rindex(":"))]
36
- subclass.instance_variable_set(:@caller_file, caller_file)
37
-
38
- super
39
- end
40
-
41
- # merges the specified gem.
42
- def merge_gem(gem_name, options={})
43
- gem_info = IronWorker::MergeHelper.create_gem_info(gem_name, options)
44
- @merged_gems[gem_name.to_s] = gem_info
45
- reqs = gem_info[:require].is_a?(Array) ? gem_info[:require] : [gem_info[:require]]
46
- reqs.each do |r|
47
- r2 = "#{gem_info[:path]}/lib/#{r}"
48
- begin
49
- IronWorker.logger.debug 'requiring ' + r2
50
- require r2
51
- rescue LoadError=>ex
52
- IronWorker.logger.error "Error requiring gem #{r}: #{ex.message}"
53
- raise "Gem #{gem_name} was found, but we could not load the file '#{r2}'. You may need to use :require=>x.........."
54
- end
55
- end
56
- end
57
-
58
-
59
- def unmerge_gem(gem_name)
60
- #gem_info = {:name=>gem_name}
61
- #@unmerged_gems[gem_name.to_s] = gem_info
62
- gs = gem_name.to_s
63
- gem_info = {:name=>gs}
64
- @unmerged_gems[gs] = gem_info
65
- @merged_gems.delete(gs)
66
- end
67
-
68
- #merge action_mailer mailers
69
- def merge_mailer(mailer, params={})
70
- f2 = IronWorker::MergeHelper.check_for_file(mailer, @caller_file)
71
- basename = File.basename(mailer, f2[:extname])
72
- path_to_templates = params[:path_to_templates] || File.join(Rails.root, "app/views/#{basename}")
73
- path_to_layouts = params[:path_to_layouts] || File.join(Rails.root, "app/views/layouts")
74
- @merged_mailers[basename] = {:name => basename, :path_to_templates => path_to_templates, :path_to_layouts => path_to_layouts, :filename => f2[:path]}.merge!(params)
75
- end
76
-
77
-
78
- def merge_folder(path)
79
- files = []
80
- #puts "caller_file=" + caller_file
81
- if path[0, 1] == '/'
82
- abs_dir = path
83
- else # relative
84
- abs_dir = File.join(File.dirname(caller_file), path)
85
- end
86
- #puts 'abs_dir=' + abs_dir
87
- raise "Folder not found for merge_folder #{path}!" unless File.directory?(abs_dir)
88
- rbfiles = File.join(abs_dir, "*.rb")
89
- Dir[rbfiles].each do |f|
90
- #f2 = check_for_file(f)
91
- #puts "f2=#{f2}"
92
- merge(f)
93
- #files << f
94
- #@merged[f]
95
- end
96
- #@merged_folders[path] = files unless files.empty?
97
- #IronWorker.logger.info "Merged folders! #{@merged_folders.inspect}"
98
- end
99
-
100
- # merges the specified file.
101
- #
102
- # Example: merge 'models/my_model'
103
- def merge(f)
104
- f2 = IronWorker::MergeHelper.check_for_file(f, @caller_file)
105
- fbase = f2[:basename]
106
- ret = f2
107
- @merged[fbase] = ret
108
- ret
109
- end
110
-
111
- # Opposite of merge, this will omit the files you specify from being merged in. Useful in Rails apps
112
- # where a lot of things are auto-merged by default like your models.
113
- def unmerge(f)
114
- f2 = IronWorker::MergeHelper.check_for_file(f, @caller_file)
115
- fbase = f2[:basename]
116
- @unmerged[fbase] = f2
117
- @merged.delete(fbase)
118
- end
119
-
120
-
121
- # Use this to merge in other workers. These are treated differently the normal merged files because
122
- # they will be uploaded separately and treated as distinctly separate workers.
123
- #
124
- # @param file [String] This is the path to the file, just like merge.
125
- # @param class_name [String|Class] 'MyWorker' or just MyWorker.
126
- # @return [Hash]
127
- def merge_worker(file, class_name)
128
- ret = merge(file)
129
- ret[:class_name] = case class_name
130
- when String
131
- class_name.strip
132
- when Class
133
- class_name.name
134
- else
135
- IronWorker.service.logger.warn "merge_worker: only String or Class is expected as class_name"
136
- class_name # probably user does know what is he doing
137
- end
138
- @merged_workers[file] = ret
139
- ret
140
- end
141
- end
142
-
143
-
144
- def log(str)
145
- puts str.to_s
146
- end
147
-
148
- def user_dir
149
- "./"
150
- end
151
-
152
- def set_progress(hash)
153
- puts 'set_progress: ' + hash.inspect
154
- end
155
-
156
- def who_am_i?
157
- return self.class.name
158
- end
159
-
160
- def uploaded?
161
- self.class.instance_variable_defined?(:@uploaded) && self.class.instance_variable_get(:@uploaded)
162
- end
163
-
164
- # Call this if you want to run locally and get some extra features from this gem like global attributes.
165
- def run_local
166
- # puts 'run_local'
167
- set_auto_attributes
168
- init_database
169
- init_mailer
170
- begin
171
- run
172
- rescue => ex
173
- if self.respond_to?(:rescue_all)
174
- rescue_all(ex)
175
- else
176
- raise ex
177
- end
178
- end
179
- end
180
-
181
- def init_mailer
182
- if IronWorker.config.mailer
183
- require 'action_mailer'
184
- ActionMailer::Base.raise_delivery_errors = true
185
- ActionMailer::Base.smtp_settings = (IronWorker.config.mailer)
186
- end
187
- end
188
-
189
- def init_database
190
- if IronWorker.config.database
191
- require 'active_record'
192
- if !ActiveRecord::Base.connected?
193
- ActiveRecord::Base.establish_connection(IronWorker.config.database)
194
- end
195
- end
196
- end
197
-
198
- def set_auto_attributes
199
- set_global_attributes
200
- end
201
-
202
- def set_global_attributes
203
- return unless IronWorker.config
204
- ga = IronWorker.config.global_attributes
205
- if ga && ga.size > 0
206
- ga.each_pair do |k, v|
207
- # puts "k=#{k} v=#{v}"
208
- if self.respond_to?(k)
209
- self.send("#{k}=", v)
210
- end
211
- end
212
- end
213
- end
214
-
215
- def enqueue(options={})
216
- queue(options)
217
- end
218
-
219
- # Call this to queue up your job to IronWorker cloud.
220
- # options:
221
- # :priority => 0, 1 or 2. Default is 0.
222
- # :recursive => true/false. Default is false. If you queue up a worker that is the same class as the currently
223
- # running worker, it will be rejected unless you set this explicitly so we know you meant to do it.
224
- def queue(options={})
225
- # puts 'in queue'
226
-
227
- IronWorker.config.force_upload = IronWorker.config.force_upload && is_local?
228
- set_auto_attributes
229
- upload_if_needed(options)
230
- response = IronWorker.service.queue(self.class.name, sw_get_data, options)
231
- IronWorker.service.logger.debug 'queue response=' + response.inspect
232
- @response = response
233
- @task_id = response["tasks"][0]["id"]
234
- response
235
- end
236
-
237
- # Receive the status of your worker.
238
- def status
239
- check_service
240
- if task_id
241
- task_status
242
- elsif schedule_id
243
- schedule_status
244
- else
245
- raise "Queue or schedule before check status."
246
- end
247
- end
248
-
249
- def task_status
250
- IronWorker.service.status(task_id)
251
- end
252
-
253
- def is_local?
254
- IronWorker.is_local?
255
- end
256
-
257
- def is_remote?
258
- IronWorker.is_remote?
259
- end
260
-
261
- # will return after job has completed or errored out.
262
- # Returns status.
263
- # todo: add a :timeout option
264
- def wait_until_complete
265
- check_service
266
- raise "No ID for worker!" if self.task_id.nil? && self.schedule_id.nil?
267
- IronWorker.service.wait_until_complete(self.task_id || self.schedule_id, :schedule=>is_schedule?)
268
- end
269
-
270
- def is_schedule?
271
- !self.schedule_id.nil?
272
- end
273
-
274
- def upload
275
- upload_if_needed
276
- end
277
-
278
- #
279
- # schedule: hash of scheduling options that can include:
280
- # Required:
281
- # - start_at: Time of first run - DateTime or Time object.
282
- # Optional:
283
- # - run_every: Time in seconds between runs. If ommitted, task will only run once.
284
- # - delay_type: Fixed Rate or Fixed Delay. Default is fixed_delay.
285
- # - end_at: Scheduled task will stop running after this date (optional, if ommitted, runs forever or until cancelled)
286
- # - run_times: Task will run exactly :run_times. For instance if :run_times is 5, then the task will run 5 times.
287
- # - name: Provide a name for the schedule, defaults to class name. Use this if you want more than one schedule per worker class.
288
- #
289
- def schedule(schedule)
290
- set_global_attributes
291
- upload_if_needed(schedule)
292
-
293
- response = IronWorker.service.schedule(self.class.name, sw_get_data, schedule)
294
- IronWorker.service.logger.debug 'schedule response=' + response.inspect
295
- @schedule_id = response["schedules"][0]["id"]
296
- response
297
- end
298
-
299
- def schedule_status
300
- IronWorker.service.schedule_status(schedule_id)
301
- end
302
-
303
- # Retrieves the log for this worker from the IronWorker service.
304
- def get_log(options={})
305
- IronWorker.service.log(task_id, options)
306
- end
307
-
308
- # Callbacks for developer
309
- def before_upload
310
-
311
- end
312
-
313
- def after_upload
314
-
315
- end
316
-
317
- def before_run
318
-
319
- end
320
-
321
- def after_run
322
-
323
- end
324
-
325
- private
326
-
327
- def gems_to_merge(merged_gems)
328
- list_of_gems = {}
329
- if merged_gems && merged_gems.size > 0
330
- installed_gems = IronWorker.config.get_server_gems
331
- merged_gems.each_pair do |k, gem|
332
- gem.merge!({:merge=>(!installed_gems.find { |g| g["name"]==gem[:name] && g["version"]==gem[:version] })})
333
- list_of_gems[gem[:name]] = gem # don't' need this if (list_of_gems.select { |k,g| g[:name]==gem[:name] }).empty?
334
- end
335
- IronWorker.logger.debug "#{list_of_gems.inspect}"
336
- end
337
- list_of_gems
338
- end
339
-
340
- def check_service
341
- raise "IronWorker configuration not set." unless IronWorker.service
342
- end
343
-
344
- def self.extract_superclasses_merges(worker, merged)
345
- subclass = worker.class
346
- rfile = subclass.instance_variable_get(:@caller_file) # Base.caller_file # File.expand_path(Base.subclass)
347
- # puts 'subclass file=' + rfile.inspect
348
- # puts 'subclass.name=' + subclass.name
349
- superclass = subclass
350
- # Also get merged from subclasses up to IronWorker::Base
351
- while (superclass = superclass.superclass)
352
- #puts 'superclass=' + superclass.name
353
- break if superclass.name == IronWorker::Base.name
354
- super_merged = superclass.instance_variable_get(:@merged)
355
- #puts 'merging caller file: ' + superclass.instance_variable_get(:@caller_file).inspect
356
- caller_to_add = superclass.instance_variable_get(:@caller_file)
357
- fb = File.basename(caller_to_add)
358
- r = {:name=>fb, :path=>caller_to_add}
359
- super_merged[fb] = r
360
- merged.merge!(super_merged)
361
- #puts 'merged with superclass=' + merged.inspect
362
- end
363
- return merged, rfile, subclass
364
- end
365
-
366
- def self.extract_merged_workers(worker)
367
- merged_workers = worker.class.instance_variable_get(:@merged_workers)
368
- IronWorker.logger.debug "Looking for merged_workers in #{worker.class.name}: #{merged_workers.inspect}"
369
- ret = {}
370
- if merged_workers && merged_workers.size > 0
371
- merged_workers.each_pair do |k, mw|
372
- IronWorker.logger.debug "merged worker found in #{worker.class.name}: #{mw.inspect}"
373
- ret[mw[:name]] = mw
374
- end
375
- end
376
- ret
377
- end
378
-
379
- def upload_if_needed(options={})
380
- return if is_remote?
381
- check_service
382
- IronWorker.service.check_config
383
-
384
- before_upload
385
-
386
- merged = self.class.instance_variable_get(:@merged)
387
-
388
- # do merged_workers first because we need to get their subclasses and what not too
389
- merged_workers = self.class.instance_variable_get(:@merged_workers)
390
- if merged_workers && merged_workers.size > 0
391
- IronWorker.logger.debug 'now uploading merged workers ' + merged_workers.inspect
392
- merged_workers.each_pair do |mw, v|
393
- IronWorker.logger.debug 'Instantiating and uploading ' + v.inspect
394
- mw_instantiated = Kernel.const_get(v[:class_name]).new
395
- mw_instantiated.upload
396
-
397
- merged, rfile, subclass = IronWorker::Base.extract_superclasses_merges(mw_instantiated, merged)
398
- merged.merge!(IronWorker::Base.extract_merged_workers(mw_instantiated))
399
-
400
- end
401
- end
402
-
403
- if !uploaded?
404
- unmerged = self.class.instance_variable_get(:@unmerged)
405
- merged_gems = self.class.instance_variable_get(:@merged_gems)
406
- unmerged_gems = self.class.instance_variable_get(:@unmerged_gems)
407
- merged_mailers = self.class.instance_variable_get(:@merged_mailers)
408
- merged_folders = self.class.instance_variable_get(:@merged_folders)
409
- merged, rfile, subclass = IronWorker::Base.extract_superclasses_merges(self, merged)
410
- merged_mailers = merged_mailers.merge(IronWorker.config.mailers) if IronWorker.config.mailers
411
- unless merged_gems.size == 0
412
- merged_gems = gems_to_merge(merged_gems)
413
- end
414
-
415
- options_for_upload = {:merge=>merged, :unmerge=>unmerged, :merged_gems=>merged_gems, :unmerged_gems=>unmerged_gems, :merged_mailers=>merged_mailers, :merged_folders=>merged_folders}
416
- options_for_upload.merge!(options)
417
- IronWorker.service.upload(rfile, subclass.name, options_for_upload)
418
- self.class.instance_variable_set(:@uploaded, true)
419
- else
420
- IronWorker.logger.debug 'Already uploaded for ' + self.class.name
421
- end
422
-
423
- after_upload
424
- end
425
-
426
- def sw_get_data
427
- data = {}
428
-
429
- payload = {}
430
- # todo: should put these down a layer, eg: payload[:attributes]
431
- self.instance_variables.each do |iv|
432
- payload[iv] = instance_variable_get(iv)
433
- end
434
- data['class_name'] = self.class.name
435
- data[:attr_encoded] = Base64.encode64(payload.to_json)
436
- data[:file_name] = File.basename(self.class.instance_variable_get(:@caller_file))
437
- if defined?(Rails)
438
- data[:rails] = {}
439
- data[:rails]['env'] = Rails.env
440
- data[:rails]['version'] = Rails.version
441
- end
442
- config_data = IronWorker.config.get_atts_to_send
443
- data[:sw_config] = config_data
444
- return data
445
- end
446
-
447
-
448
- end
449
- end