Class: Dragonfly::Job

Inherits:
Object show all
Extended by:
Forwardable
Defined in:
lib/dragonfly/job.rb

Defined Under Namespace

Modules: OverrideInstanceMethods Classes: AppDoesNotMatch, Encode, Fetch, FetchFile, FetchUrl, Generate, IncorrectSHA, InvalidArray, JobAlreadyApplied, NoContent, NoSHAGiven, NothingToEncode, NothingToProcess, Process, Step

Constant Summary

STEPS =
[
  Fetch,
  Process,
  Encode,
  Generate,
  FetchFile,
  FetchUrl
]

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Job) initialize(app, content = nil, meta = {}, url_attrs = {})

A new instance of Job



221
222
223
224
225
226
227
228
# File 'lib/dragonfly/job.rb', line 221

def initialize(app, content=nil, meta={}, url_attrs={})
  @app = app
  @steps = []
  @next_step_index = 0
  @previous_temp_objects = []
  update(content, meta) if content
  self.url_attrs = url_attrs
end

Instance Attribute Details

- (Object) app (readonly)

Returns the value of attribute app



237
238
239
# File 'lib/dragonfly/job.rb', line 237

def app
  @app
end

- (Object) steps

Returns the value of attribute steps



237
238
239
# File 'lib/dragonfly/job.rb', line 237

def steps
  @steps
end

- (Object) temp_object

Returns the value of attribute temp_object



238
239
240
# File 'lib/dragonfly/job.rb', line 238

def temp_object
  @temp_object
end

- (Object) url_attrs

Returns the value of attribute url_attrs



330
331
332
# File 'lib/dragonfly/job.rb', line 330

def url_attrs
  @url_attrs
end

Class Method Details

+ (Object) deserialize(string, app)



174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/dragonfly/job.rb', line 174

def deserialize(string, app)
  array = begin
    Serializer.json_decode(string)
  rescue Serializer::BadString
    if app.allow_legacy_urls
      Serializer.marshal_decode(string, :check_malicious => true) # legacy strings
    else
      raise
    end
  end
  from_a(array, app)
end

+ (Object) from_a(steps_array, app)



161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/dragonfly/job.rb', line 161

def from_a(steps_array, app)
  unless steps_array.is_a?(Array) &&
         steps_array.all?{|s| s.is_a?(Array) && step_abbreviations[s.first.to_s] }
    raise InvalidArray, "can't define a job from #{steps_array.inspect}"
  end
  job = app.new_job
  steps_array.each do |step_array|
    step_class = step_abbreviations[step_array.shift.to_s]
    job.steps << step_class.new(job, *step_array)
  end
  job
end

+ (Object) step_abbreviations



187
188
189
# File 'lib/dragonfly/job.rb', line 187

def step_abbreviations
  @step_abbreviations ||= STEPS.inject({}){|hash, step_class| hash[step_class.abbreviation] = step_class; hash }
end

+ (Object) step_names



191
192
193
# File 'lib/dragonfly/job.rb', line 191

def step_names
  @step_names ||= STEPS.map{|step_class| step_class.step_name }
end

Instance Method Details

- (Object) analyse(method, *args)



261
262
263
# File 'lib/dragonfly/job.rb', line 261

def analyse(method, *args)
  analyser.analyse(result, method, *args)
end

- (Boolean) applied?

Returns:

  • (Boolean)


273
274
275
# File 'lib/dragonfly/job.rb', line 273

def applied?
  next_step_index == steps.length
end

- (Object) applied_steps



277
278
279
# File 'lib/dragonfly/job.rb', line 277

def applied_steps
  steps[0...next_step_index]
end

- (Object) apply

Applying, etc.



267
268
269
270
271
# File 'lib/dragonfly/job.rb', line 267

def apply
  pending_steps.each{|step| step.apply }
  self.next_step_index = steps.length
  self
end

- (Object) b64_data



332
333
334
# File 'lib/dragonfly/job.rb', line 332

def b64_data
  "data:#{mime_type};base64,#{Base64.encode64(data)}"
end

- (Object) close



407
408
409
410
# File 'lib/dragonfly/job.rb', line 407

def close
  previous_temp_objects.each{|temp_object| temp_object.close }
  temp_object.close if temp_object
end

- (Object) encode_step



380
381
382
# File 'lib/dragonfly/job.rb', line 380

def encode_step
  last_step_of_type(Encode)
end

- (Object) fetch_file_step



368
369
370
# File 'lib/dragonfly/job.rb', line 368

def fetch_file_step
  last_step_of_type(FetchFile)
end

- (Object) fetch_step



360
361
362
# File 'lib/dragonfly/job.rb', line 360

def fetch_step
  last_step_of_type(Fetch)
end

- (Object) fetch_url_step



372
373
374
# File 'lib/dragonfly/job.rb', line 372

def fetch_url_step
  last_step_of_type(FetchUrl)
end

- (Object) generate_step



364
365
366
# File 'lib/dragonfly/job.rb', line 364

def generate_step
  last_step_of_type(Generate)
end

- (Object) initialize_copy(other)

Used by 'dup' and 'clone'



231
232
233
234
235
# File 'lib/dragonfly/job.rb', line 231

def initialize_copy(other)
  self.steps = other.steps.map do |step|
    step.class.new(self, *step.args)
  end
end

- (Object) inspect



395
396
397
# File 'lib/dragonfly/job.rb', line 395

def inspect
  "<Dragonfly::Job app=#{app.name.inspect}, steps=#{steps.inspect}, temp_object=#{temp_object.inspect}, steps applied:#{applied_steps.length}/#{steps.length} >"
end

- (Object) pending_steps



281
282
283
# File 'lib/dragonfly/job.rb', line 281

def pending_steps
  steps[next_step_index..-1]
end

- (Object) process_steps



376
377
378
# File 'lib/dragonfly/job.rb', line 376

def process_steps
  steps.select{|s| s.is_a?(Process) }
end

- (Object) serialize



297
298
299
# File 'lib/dragonfly/job.rb', line 297

def serialize
  Serializer.json_encode(to_a)
end

- (Object) sha



305
306
307
# File 'lib/dragonfly/job.rb', line 305

def sha
  Digest::SHA1.hexdigest("#{to_unique_s}#{app.secret}")[0...8]
end

- (Object) step_types



384
385
386
# File 'lib/dragonfly/job.rb', line 384

def step_types
  steps.map{|s| s.class.step_name }
end

- (Object) store(opts = {})

Misc



390
391
392
393
# File 'lib/dragonfly/job.rb', line 390

def store(opts={})
  temp_object = result
  app.store(temp_object, opts_for_store.merge(opts).merge(:meta => temp_object.meta))
end

- (Object) to_a



285
286
287
288
289
# File 'lib/dragonfly/job.rb', line 285

def to_a
  steps.map{|step|
    [step.class.abbreviation, *step.args]
  }
end

- (Object) to_app

to_stuff...



338
339
340
# File 'lib/dragonfly/job.rb', line 338

def to_app
  JobEndpoint.new(self)
end

- (Object) to_fetched_job(uid)



346
347
348
349
350
351
# File 'lib/dragonfly/job.rb', line 346

def to_fetched_job(uid)
  new_job = self.class.new(app, temp_object, meta, url_attrs)
  new_job.fetch!(uid)
  new_job.next_step_index = 1
  new_job
end

- (Object) to_response(env = {"REQUEST_METHOD" => "GET"})



342
343
344
# File 'lib/dragonfly/job.rb', line 342

def to_response(env={"REQUEST_METHOD" => "GET"})
  to_app.call(env)
end

- (Object) to_unique_s

Serializing, etc.



293
294
295
# File 'lib/dragonfly/job.rb', line 293

def to_unique_s
  to_a.to_dragonfly_unique_s
end

- (Object) uid

Step inspection



355
356
357
358
# File 'lib/dragonfly/job.rb', line 355

def uid
  step = fetch_step
  step.uid if step
end

- (Object) unique_signature



301
302
303
# File 'lib/dragonfly/job.rb', line 301

def unique_signature
  Digest::SHA1.hexdigest(to_unique_s)
end

- (Object) update(content, new_meta)



399
400
401
402
403
404
405
# File 'lib/dragonfly/job.rb', line 399

def update(content, new_meta)
  if new_meta
    new_meta.merge!(new_meta.delete(:meta)) if new_meta[:meta] # legacy data etc. may have nested meta hash - deprecate gracefully here
  end
  old_meta = temp_object ? temp_object.meta : {}
  self.temp_object = TempObject.new(content, old_meta.merge(new_meta || {}))
end

- (Object) url(opts = {})

URLs, etc.



322
323
324
# File 'lib/dragonfly/job.rb', line 322

def url(opts={})
  app.url_for(self, attributes_for_url.merge(opts)) unless steps.empty?
end

- (Object) validate_sha!(sha)



309
310
311
312
313
314
315
316
317
318
# File 'lib/dragonfly/job.rb', line 309

def validate_sha!(sha)
  case sha
  when nil
    raise NoSHAGiven
  when self.sha
    self
  else
    raise IncorrectSHA, sha
  end
end