class Kungfuig::Jobber

Generic helper for massive attaching aspects

Constants

RESPOND_TO

Public Class Methods

bottleneck(method: nil, receiver: nil, result: nil, **params) click to toggle source
# File lib/kungfuig/jobber.rb, line 77
def bottleneck(method: nil, receiver: nil, result: nil, **params)
  return unless (receiver_class = receiver.class.ancestors.detect do |c|
    @hash[c.name] && @hash[c.name][method]
  end)

  receiver, worker = patch_receiver(receiver, receiver_class.name, method)
  worker_params = { receiver: receiver, method: method, result: result, **params }
  if (delay = delay(receiver_class.name, method))
    Dummy.perform_async(
      digest: digest(receiver, receiver_class.name, method),
      delay: delay,
      worker: worker.to_s,
      worker_params: worker_params
    )
  else
    worker.perform_async(worker_params)
  end
rescue => e
  Kungfuig.(receiver: [
    "Fail [#{e.message}]",
    *e.backtrace.unshift("Backtrace:").join("#{$/}⮩  "),
    "while #{receiver}"
  ].join($/), method: method, result: result, args: params)
end
bulk(hos) click to toggle source

'Test':

'*': 'YoJob'
# File lib/kungfuig/jobber.rb, line 68
def bulk(hos)
  @hash = Kungfuig.load_stuff hos
  Kungfuig::Aspector.bulk(
    @hash.map do |klazz, hash|
      [klazz, { after: hash.map { |k, _| [k, 'Kungfuig::Jobber#bottleneck'] }.to_h }]
    end.to_h
  )
end
delay(target, name) click to toggle source
# File lib/kungfuig/jobber.rb, line 123
def delay target, name
  @hash[target][name].is_a?(Hash) && @hash[target][name]['delay'].to_i || nil
end
digest(result, target, name) click to toggle source
# File lib/kungfuig/jobber.rb, line 127
def digest result, target, name
  fields = @hash[target][name].is_a?(Hash) && @hash[target][name]['compare_by']
  Digest::SHA256.hexdigest(
    (fields.nil? ? result : fields.map { |f| result[f] }).inspect
  )
end
patch_receiver(receiver, target, name) click to toggle source
# File lib/kungfuig/jobber.rb, line 104
def patch_receiver(receiver, target, name)
  r =     case receiver
          when Hash, Array, String then receiver
          when RESPOND_TO.curry[:to_hash] then receiver.to_hash
          when RESPOND_TO.curry[:to_h] then receiver.to_h
          else receiver
          end

  klazz = case @hash[target][name]
          when String, Symbol then @hash[target][name]
          when Hash then @hash[target][name]['class']
          else return
          end

  [r, Kernel.const_get(klazz).tap do |c|
    c.send(:prepend, Kungfuig::Worker) unless c.ancestors.include? Kungfuig::Worker
  end]
end