/
config.rb
287 lines (259 loc) · 10.3 KB
/
config.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
module IronWorker
# Config is used to setup the IronWorker client.
# You must set the access_key and secret_key.
#
# config.global_attributes allows you to specify attributes that will automatically be set on every worker,
# this is good for database connection information or things that will be used across the board.
#
# config.database configures a database connection. If specified like ActiveRecord, IronWorker will automatically establish a connection
# for you before running your worker.
class Config
attr_accessor :token,
:project_id,
:scheme,
:host,
:port,
:global_attributes,
:models,
:mailers,
#:gems, # todo: move anything that uses this to merged_gems
:database,
:mailer,
:extra_requires,
#:auto_merge,
:server_gems,
:merged,
:unmerged,
:merged_gems,
:unmerged_gems,
:force_upload, :no_upload,
:beta, # for setting beta feature flags
:skip_auto_dependencies
def self.system_gems
['yajl-ruby', 'bson_ext', 'curb', 'em-http-request', 'eventmachine', 'mysql2', 'net-scp', 'net-sftp', 'net-ssh', 'nokogiri', 'rmagick', 'sqlite3', 'typhoeus']
end
def initialize
@global_attributes = {}
@extra_requires = []
@merged = {}
@unmerged = {}
@merged_gems = {}
@unmerged_gems = {}
@mailers = {}
@beta = {}
end
def access_key=(x)
raise "IronWorker Config Error: access_key and secret_key are no longer used. The new IronWorker gem requires a couple of small configuration changes, please see: http://docs.IronWorker.com/ruby/new-gem-v2-update-guide for information."
end
def secret_key=(x)
raise "IronWorker Config Error: access_key and secret_key are no longer used. The new IronWorker gem requires a couple of small configuration changes, please see: http://docs.IronWorker.com/ruby/new-gem-v2-update-guide for information."
end
#@gems_to_skip = ['actionmailer', 'actionpack', 'activemodel', 'activeresource', 'activesupport',
# 'bundler',
# 'mail',
# 'mysql2',
# 'rails',
# 'tzinfo' # HUGE!
#]
#def self.gems_to_skip
# @gems_to_skip
#end
def bundle=(activate)
if activate
IronWorker.logger.info "Initializing IronWorker for Bundler..."
IronWorker.configure do |c2|
c2.merged_gems.merge!(get_required_gems)
IronWorker.logger.debug "List of gems from bundler:#{c2.merged_gems.inspect}"
end
end
end
def auto_merge=(b)
if b
IronWorker.logger.info "Initializing IronWorker for Rails 3..."
start_time = Time.now
IronWorker.configure do |c2|
models_path = File.join(Rails.root, 'app/models/*.rb')
models = Dir.glob(models_path)
c2.models = models
models.each { |model| c2.merge(model) }
mailers_path = File.join(Rails.root, 'app/mailers/*.rb')
Dir.glob(mailers_path).collect { |m| c2.mailers[File.basename(m)] = {:filename=>m, :name => File.basename(m), :path_to_layouts => File.join(Rails.root, "app/views/layouts"), :path_to_templates=>File.join(Rails.root, "app/views/#{File.basename(m, File.extname(m))}")} }
c2.extra_requires += ['active_support/core_ext', 'action_mailer']
#puts 'DB FILE=' + File.join(Rails.root, 'config', 'database.yml').to_s
if defined?(ActiveRecord) && File.exist?(File.join(Rails.root, 'config', 'database.yml'))
c2.extra_requires += ['active_record']
c2.database = Rails.configuration.database_configuration[Rails.env]
else
#puts 'NOT DOING ACTIVERECORD'
end
if defined?(ActionMailer) && ActionMailer::Base.smtp_settings
c2.mailer = ActionMailer::Base.smtp_settings
end
c2.merged_gems.merge!(get_required_gems)
IronWorker.logger.debug "MODELS " + c2.models.inspect
IronWorker.logger.debug "MAILERS " + c2.mailers.inspect
IronWorker.logger.debug "DATABASE " + c2.database.inspect
#IronWorker.logger.debug "GEMS " + c2.gems.inspect
end
end_time = Time.now
IronWorker.logger.info "IronWorker initialized. Duration: #{((end_time.to_f-start_time.to_f) * 1000.0).to_i} ms"
end
end
def get_required_gems
#skipping if bundler not defined or not initialized
return {} unless defined?(Bundler) && Bundler.instance_variables.include?(:@setup)
gems_in_gemfile = Bundler.environment.dependencies.select { |d| d.groups.include?(:default) }
IronWorker.logger.debug 'gems in gemfile=' + gems_in_gemfile.inspect
gems = {}
specs = Bundler.load.specs
IronWorker.logger.debug 'Bundler specs=' + specs.inspect
#IronWorker.logger.debug "gems_to_skip=" + self.class.gems_to_skip.inspect
specs.each do |spec|
IronWorker.logger.debug 'spec.name=' + spec.name.inspect
IronWorker.logger.debug 'spec=' + spec.inspect
#if self.class.gems_to_skip.include?(spec.name)
# IronWorker.logger.debug "Skipping #{spec.name}"
# next
#end
# next if dep.name=='rails' #monkey patch
gem_info = {:name=>spec.name, :version=>spec.version}
gem_info[:auto_merged] = true
gem_info[:merge] = spec.extensions.length == 0 #merging only non binary gems
gem_info[:bypass_require] = true #don't require gem'
# Now find dependency in gemfile in case user set the require
dep = gems_in_gemfile.find { |g| g.name == gem_info[:name] }
if dep
IronWorker.logger.debug 'dep found in gemfile: ' + dep.inspect
IronWorker.logger.debug 'autorequire=' + dep.autorequire.inspect
gem_info[:require] = dep.autorequire if dep.autorequire
# spec = specs.find { |g| g.name==gem_info[:name] }
end
gem_info[:version] = spec.version.to_s
gems[gem_info[:name]] = gem_info
gemspec, path = IronWorker::Service.get_gem_path(gem_info)
if path
gem_info[:gemspec] = gemspec
gem_info[:path] = path
if gem_info[:require].nil? && dep
# see if we should try to require this in our worker
require_path = gem_info[:path] + "/lib/#{gem_info[:name]}.rb"
IronWorker.logger.debug "require_path=" + require_path
if File.exists?(require_path)
IronWorker.logger.debug "File exists for require"
gem_info[:require] = gem_info[:name]
else
IronWorker.logger.debug "no require"
# gem_info[:no_require] = true
end
end
else
IronWorker.logger.warn "Could not find '#{gem_info[:name]}' specified in Bundler, continuing anyways."
end
# else
# IronWorker.logger.warn "Could not find gem spec for #{gem_info[:name]}"
# raise "Could not find gem spec for #{gem_info[:name]}"
# end
end
gems
end
def get_server_gems
return []
# skipping this now, don't want any server dependencies if possible
self.server_gems = IronWorker.service.get_server_gems unless self.server_gems
self.server_gems
end
def get_atts_to_send
config_data = {}
config_data['token'] = token
config_data['project_id'] = project_id
config_data['database'] = self.database if self.database
config_data['mailer'] = self.mailer if self.mailer
config_data['global_attributes'] = self.global_attributes if self.global_attributes
config_data['scheme'] = self.scheme if self.scheme
config_data['host'] = self.host if self.host
config_data['port'] = self.port if self.port
config_data
end
def merge(file)
f2 = IronWorker::MergeHelper.check_for_file(file, caller[2])
fbase = f2[:basename]
ret = f2
@merged[fbase] = ret
ret
end
def unmerge(file)
f2 = IronWorker::MergeHelper.check_for_file(file, caller[2])
fbase = f2[:basename]
@unmerged[fbase] =f2
@merged.delete(fbase)
end
# Merge a gem globally here
def merge_gem(gem_name, options={})
merged_gems[gem_name.to_s] = IronWorker::MergeHelper.create_gem_info(gem_name, options)
end
# Unmerge a global gem
def unmerge_gem(gem_name)
gs = gem_name.to_s
gem_info = {:name=>gs}
unmerged_gems[gs] = gem_info
merged_gems.delete(gs)
end
end
class MergeHelper
# callerr is original file that is calling the merge function, ie: your worker.
# See Base for examples.
def self.check_for_file(f, callerr)
IronWorker.logger.debug 'Checking for ' + f.to_s
f = f.to_str
f_ext = File.extname(f)
if f_ext.empty?
f_ext = ".rb"
f << f_ext
end
exists = false
if File.exist? f
exists = true
else
# try relative
# p caller
f2 = File.join(File.dirname(callerr), f)
#puts 'f2=' + f2
if File.exist? f2
exists = true
f = f2
end
end
unless exists
raise "File not found: " + f
end
f = File.expand_path(f)
require f if f_ext == '.rb'
ret = {}
ret[:path] = f
ret[:extname] = f_ext
ret[:basename] = File.basename(f)
ret[:name] = ret[:basename]
ret
end
def self.create_gem_info(gem_name, options={})
gem_info = {:name=>gem_name, :merge=>true}
if options.is_a?(Hash)
gem_info.merge!(options)
if options[:include_dirs]
gem_info[:include_dirs] = options[:include_dirs].is_a?(Array) ? options[:include_dirs] : [options[:include_dirs]]
end
else
gem_info[:version] = options
end
gemspec, path = IronWorker::Service.get_gem_path(gem_info)
IronWorker.logger.debug "Gem path=#{path}"
if !path
raise "Gem '#{gem_name}' not found."
end
gem_info[:gemspec] = gemspec
gem_info[:path] = path
gem_info[:require] ||= gem_name
gem_info
end
end
end