Sha256: 7d28a0c5f48ce5c4b4d63cd6db6c778ce56f58dd0c1cff46664787e2c7aba9b3

Contents?: true

Size: 1.37 KB

Versions: 110

Compression:

Stored size: 1.37 KB

Contents

module Delayed
  class PerformableMethod < Struct.new(:object, :method, :args)
    CLASS_STRING_FORMAT = /^CLASS\:([A-Z][\w\:]+)$/
    AR_STRING_FORMAT    = /^AR\:([A-Z][\w\:]+)\:(\d+)$/

    def initialize(object, method, args)
      raise NoMethodError, "undefined method `#{method}' for #{self.inspect}" unless object.respond_to?(method)

      self.object = dump(object)
      self.args   = args.map { |a| dump(a) }
      self.method = method.to_sym
    end
    
    def display_name  
      case self.object
      when CLASS_STRING_FORMAT then "#{$1}.#{method}"
      when AR_STRING_FORMAT    then "#{$1}##{method}"
      else "Unknown##{method}"
      end      
    end    

    def perform
      load(object).send(method, *args.map{|a| load(a)})
    rescue ActiveRecord::RecordNotFound
      # We cannot do anything about objects which were deleted in the meantime
      true
    end

    private

    def load(arg)
      case arg
      when CLASS_STRING_FORMAT then $1.constantize
      when AR_STRING_FORMAT    then $1.constantize.find($2)
      else arg
      end
    end

    def dump(arg)
      case arg
      when Class              then class_to_string(arg)
      when ActiveRecord::Base then ar_to_string(arg)
      else arg
      end
    end

    def ar_to_string(obj)
      "AR:#{obj.class}:#{obj.id}"
    end

    def class_to_string(obj)
      "CLASS:#{obj.name}"
    end
  end
end

Version data entries

110 entries across 110 versions & 38 rubygems

Version Path
DrMark-thinking-sphinx-1.1.14 vendor/delayed_job/lib/delayed/performable_method.rb
DrMark-thinking-sphinx-1.1.15 vendor/delayed_job/lib/delayed/performable_method.rb
DrMark-thinking-sphinx-1.1.6 vendor/delayed_job/lib/delayed/performable_method.rb
DrMark-thinking-sphinx-1.2.5 vendor/delayed_job/lib/delayed/performable_method.rb
DrMark-thinking-sphinx-1.2.6 vendor/delayed_job/lib/delayed/performable_method.rb
betelgeuse-delayed_job-1.8.0 lib/delayed/performable_method.rb
blaxter-delayed_job-1.7.0 lib/delayed/performable_method.rb
blaxter-delayed_job-1.7.99 lib/delayed/performable_method.rb
bterlson-thinking-sphinx-1.2.8 vendor/delayed_job/lib/delayed/performable_method.rb
collectiveidea-delayed_job-1.8.0 lib/delayed/performable_method.rb
collectiveidea-delayed_job-1.8.1 lib/delayed/performable_method.rb
collectiveidea-delayed_job-1.8.2 lib/delayed/performable_method.rb
dburkes-delayed_job-1.7.0 lib/delayed/performable_method.rb
dpickett-thinking-sphinx-1.1.12 vendor/delayed_job/lib/delayed/performable_method.rb
dpickett-thinking-sphinx-1.1.23 vendor/delayed_job/lib/delayed/performable_method.rb
dpickett-thinking-sphinx-1.1.4 vendor/delayed_job/lib/delayed/performable_method.rb
dstrelau-delayed_job-1.7.0 lib/delayed/performable_method.rb
ebeigarts-thinking-sphinx-1.1.21 vendor/delayed_job/lib/delayed/performable_method.rb
ebeigarts-thinking-sphinx-1.1.22 vendor/delayed_job/lib/delayed/performable_method.rb
ebeigarts-thinking-sphinx-1.2.10 vendor/delayed_job/lib/delayed/performable_method.rb