patella 0.0.3 → 0.9.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/LICENSE +1 -1
- data/README.md +25 -7
- data/Rakefile +0 -0
- data/config/tddium.yml +5 -0
- data/lib/patella.rb +8 -1
- data/lib/patella/patella.rb +0 -130
- data/lib/patella/send_later.rb +26 -5
- data/lib/patella/send_later_worker.rb +12 -12
- data/lib/patella/version.rb +1 -1
- data/patella.gemspec +11 -8
- data/test/patella_test.rb +64 -111
- data/test/test_helper.rb +10 -24
- metadata +42 -71
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 898fb00ebab781d6f6555848aa4989d1b98b3df8
         | 
| 4 | 
            +
              data.tar.gz: 0a498e97477cbe9a2e0acb93d233c65069421682
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 75684d6e4e9b761b3dbf67e0aaf56e236cc42ce69352c416b97a12f4c5fe8e8cae111c628cbe8ce86fc598976bd171d3b12034c48c4497fb0fe52dd1be52fafa
         | 
| 7 | 
            +
              data.tar.gz: cf372a903fcf87d0a669f802961b0bf036c2e1f1d18ee8ca74d0e6c4a458bc3a37d6d8a5749ada59951ee5434243e955d606565917a5d706743dec70dc78ead0
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,7 +1,15 @@ | |
| 1 1 | 
             
            # Patella
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
            Patella is a robust implementation of send_later for Rails applications using Resque.  It supports:
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Sending to specific queues on a per-call basis
         | 
| 6 | 
            +
            * A global on/off switch for send_later
         | 
| 7 | 
            +
            * Sensible defaults for the default Rails environments (send_later is disabled in development and test)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # What happened to memoization into memcached etc?
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            Patella was originally a gem for memoizing expensive method calls in Rails apps in the background and loading them
         | 
| 12 | 
            +
            asynchronously.  Jeff Dwyer did a RailsConf 2012 talk about it: [www.slideshare.net/jdwyah/patella-railsconf-2012](http://www.slideshare.net/jdwyah/patella-railsconf-2012)
         | 
| 5 13 |  | 
| 6 14 | 
             
            ## Installation
         | 
| 7 15 |  | 
| @@ -20,13 +28,23 @@ Or install it yourself as: | |
| 20 28 | 
             
            ## Usage
         | 
| 21 29 |  | 
| 22 30 | 
             
            ```ruby
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 31 | 
            +
            post = Post.find(params[:id])
         | 
| 32 | 
            +
            post.send_later(:slow_calculation)
         | 
| 33 | 
            +
            post.send_later(:slow_calculation_with_two_parameters, 5, "jdwyah!")
         | 
| 34 | 
            +
            post.send_later_on_queue(:hashing, :hash_content, 8675309)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            Post.send_later(:class_method)
         | 
| 37 | 
            +
            Post.send_later_on_queue(:high_priority, :class_method_with_a_parameter, 50)
         | 
| 27 38 | 
             
            ```
         | 
| 28 39 |  | 
| 29 | 
            -
             | 
| 40 | 
            +
            `Patella::SendLater` is the module that provides the `send_later` and `send_later_on_queue` methods.  It's included by default
         | 
| 41 | 
            +
            in all `ActiveRecord::Base` subclasses, but you can include it in any class that implements the `#id` and `.find` methods.
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            By default, `send_later` will enqueue jobs on a queue called "send_later".  You can alter this default:
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            ```ruby
         | 
| 46 | 
            +
            Patella::SendLaterWorker.default_queue = :my_custom_queue
         | 
| 47 | 
            +
            ```
         | 
| 30 48 |  | 
| 31 49 | 
             
            ## Contributing
         | 
| 32 50 |  | 
    
        data/Rakefile
    CHANGED
    
    | 
            File without changes
         | 
    
        data/config/tddium.yml
    ADDED
    
    
    
        data/lib/patella.rb
    CHANGED
    
    | @@ -1,8 +1,15 @@ | |
| 1 1 | 
             
            require "patella/version"
         | 
| 2 | 
            -
            require "patella/patella"
         | 
| 3 2 | 
             
            require "patella/send_later"
         | 
| 4 3 | 
             
            require "patella/send_later_worker"
         | 
| 4 | 
            +
            require "active_record"
         | 
| 5 5 |  | 
| 6 6 | 
             
            module Patella
         | 
| 7 | 
            +
              ::Patella::SendLater.send_now = case ::Rails.env.try(:to_s)
         | 
| 8 | 
            +
              when 'development', 'test'
         | 
| 9 | 
            +
                true
         | 
| 10 | 
            +
              else
         | 
| 11 | 
            +
                false
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
              
         | 
| 7 14 | 
             
              ActiveRecord::Base.send :include, ::Patella::SendLater
         | 
| 8 15 | 
             
            end
         | 
    
        data/lib/patella/patella.rb
    CHANGED
    
    | @@ -1,130 +0,0 @@ | |
| 1 | 
            -
            require 'active_support'
         | 
| 2 | 
            -
            require 'json'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module Patella::Patella
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              def self.included(base)
         | 
| 7 | 
            -
                base.extend ClassMethods
         | 
| 8 | 
            -
                base.send :include, Patella::SendLater
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              def patella_key(symbol, args)
         | 
| 12 | 
            -
                id_param = respond_to?(:id) ? self.id : nil
         | 
| 13 | 
            -
                "patella/#{self.class.to_s}/#{id_param}/#{symbol}/#{Digest::MD5.hexdigest(args.to_json)}"
         | 
| 14 | 
            -
              end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              module ClassMethods
         | 
| 17 | 
            -
                def patella_key(symbol, args)
         | 
| 18 | 
            -
                  "patella/#{self.to_s}//#{symbol}/#{Digest::MD5.hexdigest(args.to_json)}"
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                def patella_reflex(symbol, options = {})      
         | 
| 22 | 
            -
                  options[:expires_in] ||= 30*60
         | 
| 23 | 
            -
                  options[:soft_expiration] ||= 0
         | 
| 24 | 
            -
                  options[:no_backgrounding] ||= false
         | 
| 25 | 
            -
                  is_class = options[:class_method]
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  original_method = :"_unpatellaed_#{symbol}"
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  method_definitions = <<-EOS, __FILE__, __LINE__ + 1
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                    if method_defined?(:#{original_method})
         | 
| 32 | 
            -
                      raise "Already patella'd #{symbol}"
         | 
| 33 | 
            -
                    end
         | 
| 34 | 
            -
                    alias #{original_method} #{symbol}
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                    def caching_#{symbol}(args)
         | 
| 37 | 
            -
                      cache_key = self.patella_key('#{symbol}',args)
         | 
| 38 | 
            -
                      result = args.any? ? #{original_method}(*args) : #{original_method}()
         | 
| 39 | 
            -
                      json = {'result' => result, 'soft_expiration' => Time.now + #{options[:expires_in]} - #{ options[:soft_expiration]}}.to_json
         | 
| 40 | 
            -
                      Rails.cache.write(cache_key, json, :expires_in => #{options[:expires_in]})
         | 
| 41 | 
            -
                      result
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                    def clear_#{symbol}(*args)
         | 
| 45 | 
            -
                      cache_key = self.patella_key('#{symbol}',args)
         | 
| 46 | 
            -
                      Rails.cache.delete(cache_key)
         | 
| 47 | 
            -
                    end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                    def #{symbol}(*args)
         | 
| 50 | 
            -
                      patella_#{symbol}(args, {:no_backgrounding => #{options[:no_backgrounding]}})
         | 
| 51 | 
            -
                    end 
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                    def patella_#{symbol}(args, opts)
         | 
| 54 | 
            -
                      cache_key = self.patella_key('#{symbol}',args)
         | 
| 55 | 
            -
                      promise = { 'promise' => true }
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                      json = Rails.cache.fetch(cache_key, :expires_in => #{options[:expires_in]}, :force => !Rails.caching?) do
         | 
| 58 | 
            -
                        if opts[:no_backgrounding]
         | 
| 59 | 
            -
                          promise['result'] = self.send(:caching_#{symbol}, args)
         | 
| 60 | 
            -
                          promise.delete('promise')
         | 
| 61 | 
            -
                        else
         | 
| 62 | 
            -
                          promise['result'] = self.send_later(:caching_#{symbol}, args)   #send_later sends_later when Rails.caching? otherwise sends_now
         | 
| 63 | 
            -
                          promise.delete('promise') unless Rails.caching?
         | 
| 64 | 
            -
                        end
         | 
| 65 | 
            -
                        promise.to_json
         | 
| 66 | 
            -
                      end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                      if promise['promise'] && opts[:no_backgrounding]
         | 
| 69 | 
            -
                        promise['result'] = self.send(:caching_#{symbol}, args)
         | 
| 70 | 
            -
                        promise.delete('promise')
         | 
| 71 | 
            -
                        json = promise.to_json
         | 
| 72 | 
            -
                      end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                      val = JSON.parse(json)
         | 
| 75 | 
            -
                      if val and !val['promise']
         | 
| 76 | 
            -
                        loading = false
         | 
| 77 | 
            -
                        soft_expiration = Time.parse(val['soft_expiration']) rescue nil
         | 
| 78 | 
            -
                        json_val = val
         | 
| 79 | 
            -
                        val = val['result']
         | 
| 80 | 
            -
                      else
         | 
| 81 | 
            -
                        val = promise
         | 
| 82 | 
            -
                        loading = true
         | 
| 83 | 
            -
                      end
         | 
| 84 | 
            -
             | 
| 85 | 
            -
                      if !loading and soft_expiration and Time.now > soft_expiration
         | 
| 86 | 
            -
                        expires = #{options[:soft_expiration]} + 10*60
         | 
| 87 | 
            -
                        json_val['soft_expiration'] = (Time.now - expires).to_s
         | 
| 88 | 
            -
                        Rails.cache.write(cache_key, json_val, :expires_in => expires)
         | 
| 89 | 
            -
                        self.send_later(:caching_#{symbol}, args)
         | 
| 90 | 
            -
                      end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                      PatellaResult.new val, loading
         | 
| 93 | 
            -
                    end
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                    if private_method_defined?(#{original_method.inspect})                   # if private_method_defined?(:_unmemoized_mime_type)
         | 
| 96 | 
            -
                      private #{symbol.inspect}                                              #   private :mime_type
         | 
| 97 | 
            -
                    elsif protected_method_defined?(#{original_method.inspect})              # elsif protected_method_defined?(:_unmemoized_mime_type)
         | 
| 98 | 
            -
                      protected #{symbol.inspect}                                            #   protected :mime_type
         | 
| 99 | 
            -
                    end                                                                      # end
         | 
| 100 | 
            -
                  EOS
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                  if is_class
         | 
| 103 | 
            -
                    (class << self; self; end).class_eval *method_definitions
         | 
| 104 | 
            -
                  else
         | 
| 105 | 
            -
                    class_eval *method_definitions
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
                end
         | 
| 108 | 
            -
              end
         | 
| 109 | 
            -
            end
         | 
| 110 | 
            -
             | 
| 111 | 
            -
            class PatellaResult < ActiveSupport::BasicObject
         | 
| 112 | 
            -
             | 
| 113 | 
            -
              def initialize(target=nil, loading=false)
         | 
| 114 | 
            -
                @target = target
         | 
| 115 | 
            -
                @loading = loading
         | 
| 116 | 
            -
              end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
              def loading?
         | 
| 119 | 
            -
                @loading
         | 
| 120 | 
            -
              end
         | 
| 121 | 
            -
             | 
| 122 | 
            -
              def loaded?
         | 
| 123 | 
            -
                !@loading
         | 
| 124 | 
            -
              end
         | 
| 125 | 
            -
             | 
| 126 | 
            -
              def method_missing(method, *args, &block)
         | 
| 127 | 
            -
                @target.send(method, *args, &block)
         | 
| 128 | 
            -
              end
         | 
| 129 | 
            -
            end
         | 
| 130 | 
            -
             | 
    
        data/lib/patella/send_later.rb
    CHANGED
    
    | @@ -1,24 +1,45 @@ | |
| 1 | 
            +
            require 'active_support/core_ext'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Patella::SendLater
         | 
| 2 4 |  | 
| 5 | 
            +
              # If send_now is true, Object.send_later will run the command in-process rather than
         | 
| 6 | 
            +
              # putting it on the queue.
         | 
| 7 | 
            +
              mattr_accessor :send_now
         | 
| 8 | 
            +
             | 
| 3 9 | 
             
              def self.included(base)
         | 
| 4 10 | 
             
                base.extend ClassMethods
         | 
| 5 11 | 
             
              end
         | 
| 6 12 |  | 
| 7 13 | 
             
              def send_later method_name, *args
         | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                  Patella::SendLaterWorker.perform_later self.class.to_s, self.id, method_name, *args
         | 
| 14 | 
            +
                if ::Patella::SendLater.send_now      
         | 
| 15 | 
            +
                  self.send method_name, *args
         | 
| 11 16 | 
             
                else
         | 
| 17 | 
            +
                  Patella::SendLaterWorker.perform_later self.class.to_s, self.id, method_name, *args
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
              
         | 
| 21 | 
            +
              def send_later_on_queue queue, method_name, *args
         | 
| 22 | 
            +
                if ::Patella::SendLater.send_now      
         | 
| 12 23 | 
             
                  self.send method_name, *args
         | 
| 24 | 
            +
                else
         | 
| 25 | 
            +
                  Patella::SendLaterWorker.perform_later_on_queue queue, self.class.to_s, self.id, method_name, *args
         | 
| 13 26 | 
             
                end
         | 
| 14 27 | 
             
              end
         | 
| 15 28 |  | 
| 16 29 | 
             
              module ClassMethods
         | 
| 17 30 | 
             
                def send_later method_name, *args
         | 
| 18 | 
            -
                  if  | 
| 19 | 
            -
                     | 
| 31 | 
            +
                  if ::Patella::SendLater.send_now
         | 
| 32 | 
            +
                    self.send method_name, *args
         | 
| 20 33 | 
             
                  else
         | 
| 34 | 
            +
                    Patella::SendLaterWorker.perform_later self.to_s, nil, method_name, *args
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                
         | 
| 38 | 
            +
                def send_later_on_queue queue, method_name, *args
         | 
| 39 | 
            +
                  if ::Patella::SendLater.send_now
         | 
| 21 40 | 
             
                    self.send method_name, *args
         | 
| 41 | 
            +
                  else
         | 
| 42 | 
            +
                    Patella::SendLaterWorker.perform_later_on_queue queue, self.to_s, nil, method_name, *args
         | 
| 22 43 | 
             
                  end
         | 
| 23 44 | 
             
                end
         | 
| 24 45 | 
             
              end
         | 
| @@ -1,27 +1,27 @@ | |
| 1 | 
            +
            require 'resque'
         | 
| 2 | 
            +
            require 'resque/plugins/meta'
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            module Patella
         | 
| 2 5 | 
             
              class SendLaterWorker
         | 
| 3 6 | 
             
                extend ::Resque::Plugins::Meta
         | 
| 4 | 
            -
                 | 
| 5 | 
            -
                 | 
| 6 | 
            -
                @@queues = {}
         | 
| 7 | 
            +
                cattr_accessor :default_queue
         | 
| 8 | 
            +
                self.default_queue = :send_later
         | 
| 7 9 |  | 
| 8 | 
            -
                def self.perform_later(*args)
         | 
| 9 | 
            -
                   | 
| 10 | 
            -
                  queue = self.queue_for(args[0], args[2])
         | 
| 11 | 
            -
                  Resque::Job.create(queue, 'Patella::SendLaterWorker', *args)
         | 
| 10 | 
            +
                def self.perform_later(class_name, instance_id, method_name, *args)
         | 
| 11 | 
            +
                  perform_later_on_queue default_queue, class_name, instance_id, method_name, *args
         | 
| 12 12 | 
             
                end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                def self. | 
| 15 | 
            -
                   | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                def self.perform_later_on_queue(queue, class_name, instance_id, method_name, *args)
         | 
| 15 | 
            +
                  Resque::Job.create(queue, 'Patella::SendLaterWorker', class_name, instance_id, method_name, *args)      
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 18 | 
             
                def self.perform(class_name, instance_id, method_name, *args)
         | 
| 19 19 | 
             
                  o = class_name.constantize
         | 
| 20 | 
            -
                  o = o. | 
| 20 | 
            +
                  o = o.find(instance_id) if instance_id
         | 
| 21 21 |  | 
| 22 22 | 
             
                  o.send(method_name, *args)
         | 
| 23 23 | 
             
                rescue => e
         | 
| 24 24 | 
             
                  raise e, "#{e.message} \nWith SendLater: #{class_name}#{':'+instance_id.to_s if instance_id}##{method_name}(#{args.map(&:to_s).join(',')})", e.backtrace
         | 
| 25 25 | 
             
                end
         | 
| 26 26 | 
             
              end
         | 
| 27 | 
            -
            end
         | 
| 27 | 
            +
            end
         | 
    
        data/lib/patella/version.rb
    CHANGED
    
    
    
        data/patella.gemspec
    CHANGED
    
    | @@ -2,10 +2,14 @@ | |
| 2 2 | 
             
            require File.expand_path('../lib/patella/version', __FILE__)
         | 
| 3 3 |  | 
| 4 4 | 
             
            Gem::Specification.new do |gem|
         | 
| 5 | 
            -
              gem.authors       = ["Jeff Dwyer"]
         | 
| 6 | 
            -
              gem.email         = ["jdwyer@patientslikeme.com"]
         | 
| 7 | 
            -
              gem.description   = " | 
| 8 | 
            -
              gem.summary       =  | 
| 5 | 
            +
              gem.authors       = ["Jeff Dwyer", "Nat Budin"]
         | 
| 6 | 
            +
              gem.email         = ["jdwyer@patientslikeme.com", "nbudin@patientslikeme.com"]
         | 
| 7 | 
            +
              gem.description   = "A robust implementation of send_later for Rails apps using Resque."
         | 
| 8 | 
            +
              gem.summary       = <<-EOF
         | 
| 9 | 
            +
              Patella provides an ActiveRecord-friendly send_later implementation for Resque that allows sending
         | 
| 10 | 
            +
              to specific queues as well as a global on/off switch for send_later, and sensible defaults for
         | 
| 11 | 
            +
              the default Rails environments.
         | 
| 12 | 
            +
              EOF
         | 
| 9 13 | 
             
              gem.homepage      = "https://github.com/patientslikeme/patella"
         | 
| 10 14 |  | 
| 11 15 | 
             
              gem.files         = `git ls-files`.split($\)
         | 
| @@ -16,11 +20,10 @@ Gem::Specification.new do |gem| | |
| 16 20 | 
             
              gem.version       = Patella::VERSION
         | 
| 17 21 | 
             
              gem.add_dependency 'resque', '~>1.16'
         | 
| 18 22 | 
             
              gem.add_dependency 'resque-meta', '~>1.0.0'
         | 
| 19 | 
            -
              gem.add_dependency ' | 
| 20 | 
            -
              gem.add_dependency 'rails', '~>2.3' #, :require => 'active_support'
         | 
| 21 | 
            -
              gem.add_dependency 'json'
         | 
| 23 | 
            +
              gem.add_dependency 'rails', '>= 2.3'
         | 
| 22 24 | 
             
              gem.add_development_dependency 'bundler'
         | 
| 23 25 | 
             
              gem.add_development_dependency 'rake'
         | 
| 24 | 
            -
              gem.add_development_dependency 'mocha', " | 
| 26 | 
            +
              gem.add_development_dependency 'mocha', ">= 0.9.8"
         | 
| 25 27 | 
             
              gem.add_development_dependency 'bourne'
         | 
| 28 | 
            +
              gem.add_development_dependency 'pry'
         | 
| 26 29 | 
             
            end
         | 
    
        data/test/patella_test.rb
    CHANGED
    
    | @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class Dummy
         | 
| 4 | 
            -
              include Patella::Patella
         | 
| 5 4 | 
             
              include Patella::SendLater
         | 
| 6 5 |  | 
| 7 6 | 
             
              attr_accessor :id
         | 
| @@ -9,136 +8,90 @@ class Dummy | |
| 9 8 | 
             
                self.id = id
         | 
| 10 9 | 
             
              end
         | 
| 11 10 |  | 
| 12 | 
            -
              def self. | 
| 11 | 
            +
              def self.find id
         | 
| 13 12 | 
             
                new id
         | 
| 14 13 | 
             
              end
         | 
| 14 | 
            +
            end
         | 
| 15 15 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 16 | 
            +
            class PatellaTest < ActiveSupport::TestCase
         | 
| 17 | 
            +
              setup do
         | 
| 18 | 
            +
                @dummy = Dummy.new(5)
         | 
| 18 19 | 
             
              end
         | 
| 19 | 
            -
               | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                a+b
         | 
| 20 | 
            +
              
         | 
| 21 | 
            +
              teardown do
         | 
| 22 | 
            +
                Resque.redis.flushall
         | 
| 23 23 | 
             
              end
         | 
| 24 | 
            -
               | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                self.id + add
         | 
| 24 | 
            +
              
         | 
| 25 | 
            +
              def test_send_now_to_instance
         | 
| 26 | 
            +
                assert_equal 5, @dummy.send_later(:id)
         | 
| 28 27 | 
             
              end
         | 
| 29 | 
            -
               | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
                3
         | 
| 28 | 
            +
              
         | 
| 29 | 
            +
              def test_send_now_to_class
         | 
| 30 | 
            +
                assert_equal 6, Dummy.send_later(:find, 6).id
         | 
| 33 31 | 
             
              end
         | 
| 34 | 
            -
               | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
              end
         | 
| 39 | 
            -
              patella_reflex :no_background_add, :no_backgrounding => true
         | 
| 40 | 
            -
            end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            class PatellaTest < ActiveSupport::TestCase
         | 
| 43 | 
            -
             | 
| 44 | 
            -
              def test_patella_basics
         | 
| 45 | 
            -
                # foreground
         | 
| 46 | 
            -
                f = Dummy.new 6
         | 
| 47 | 
            -
                f.stubs :caching_foo => 5
         | 
| 48 | 
            -
                assert_equal 5, f.foo
         | 
| 49 | 
            -
                assert_received(f, :caching_foo)
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                #background
         | 
| 52 | 
            -
                with_caching do
         | 
| 53 | 
            -
                  Patella::SendLaterWorker.stubs :perform_later => 'loading'
         | 
| 54 | 
            -
                  f1 = Dummy.new 5
         | 
| 55 | 
            -
                  assert f1.foo.loading?
         | 
| 56 | 
            -
                  assert_received(Patella::SendLaterWorker, :perform_later) do |ex|
         | 
| 57 | 
            -
                    ex.once
         | 
| 58 | 
            -
                    ex.with 'Dummy', f1.id, :caching_foo, []
         | 
| 59 | 
            -
                  end
         | 
| 32 | 
            +
              
         | 
| 33 | 
            +
              def test_send_later_to_instance
         | 
| 34 | 
            +
                sending_later do
         | 
| 35 | 
            +
                  @dummy.send_later(:id)
         | 
| 60 36 | 
             
                end
         | 
| 61 | 
            -
              end
         | 
| 62 37 |  | 
| 63 | 
            -
             | 
| 64 | 
            -
                 | 
| 65 | 
            -
                with_caching do
         | 
| 66 | 
            -
                  Patella::SendLaterWorker.expects(:perform_later).never
         | 
| 67 | 
            -
                  Dummy.any_instance.expects('caching_no_background_add').once.returns(9)
         | 
| 68 | 
            -
                  d = Dummy.new(1)
         | 
| 69 | 
            -
                  result = d.no_background_add(4,5)
         | 
| 70 | 
            -
                  assert result.loaded?
         | 
| 71 | 
            -
                  assert_equal 9, result
         | 
| 72 | 
            -
                end
         | 
| 38 | 
            +
                assert job = Resque.peek(:send_later)
         | 
| 39 | 
            +
                assert_equal ["Dummy", 5, "id"], job["args"]
         | 
| 73 40 | 
             
              end
         | 
| 74 | 
            -
             | 
| 75 | 
            -
              def  | 
| 76 | 
            -
                 | 
| 77 | 
            -
             | 
| 78 | 
            -
                assert result.loaded?
         | 
| 79 | 
            -
                assert_equal 9, result
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                with_caching do
         | 
| 82 | 
            -
                  result = d.bar(4,5)  #still here
         | 
| 83 | 
            -
                  assert result.loaded?
         | 
| 84 | 
            -
                  assert_equal 9, result
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                  d.clear_bar(4,5)
         | 
| 87 | 
            -
                  result = d.bar(4,5)  #cleared
         | 
| 88 | 
            -
                  assert result.loading?
         | 
| 89 | 
            -
             | 
| 41 | 
            +
              
         | 
| 42 | 
            +
              def test_send_later_on_queue_to_instance
         | 
| 43 | 
            +
                sending_later do
         | 
| 44 | 
            +
                  @dummy.send_later_on_queue(:unimportant, :id)
         | 
| 90 45 | 
             
                end
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
              def test_patella_for_instance_objs
         | 
| 94 | 
            -
                four = Dummy.new 4
         | 
| 95 | 
            -
                assert_equal(8, four.baz(4))
         | 
| 96 | 
            -
                assert_equal(13, four.baz(9))
         | 
| 97 | 
            -
              end
         | 
| 98 46 |  | 
| 99 | 
            -
             | 
| 100 | 
            -
                 | 
| 101 | 
            -
                assert_equal(3, Dummy.bing)
         | 
| 47 | 
            +
                assert job = Resque.peek(:unimportant)
         | 
| 48 | 
            +
                assert_equal ["Dummy", 5, "id"], job["args"]
         | 
| 102 49 | 
             
              end
         | 
| 103 | 
            -
             | 
| 104 | 
            -
              def  | 
| 105 | 
            -
                 | 
| 106 | 
            -
             | 
| 107 | 
            -
                 | 
| 108 | 
            -
                 | 
| 109 | 
            -
                 | 
| 110 | 
            -
                assert_equal " | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
                 | 
| 115 | 
            -
             | 
| 116 | 
            -
                 | 
| 50 | 
            +
              
         | 
| 51 | 
            +
              def test_send_later_to_class
         | 
| 52 | 
            +
                sending_later do
         | 
| 53 | 
            +
                  Dummy.send_later(:find, 6)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                
         | 
| 56 | 
            +
                assert job = Resque.peek(:send_later)
         | 
| 57 | 
            +
                assert_equal ["Dummy", nil, "find", 6], job["args"]
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
              
         | 
| 60 | 
            +
              def test_send_later_on_queue_to_class
         | 
| 61 | 
            +
                sending_later do
         | 
| 62 | 
            +
                  Dummy.send_later_on_queue(:object_finding, :find, 6)
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                
         | 
| 65 | 
            +
                assert job = Resque.peek(:object_finding)
         | 
| 66 | 
            +
                assert_equal ["Dummy", nil, "find", 6], job["args"]
         | 
| 117 67 | 
             
              end
         | 
| 118 | 
            -
             | 
| 119 | 
            -
              def  | 
| 120 | 
            -
                 | 
| 121 | 
            -
                 | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 68 | 
            +
              
         | 
| 69 | 
            +
              def test_changing_default_queue
         | 
| 70 | 
            +
                default_queue = Patella::SendLaterWorker.default_queue
         | 
| 71 | 
            +
                begin
         | 
| 72 | 
            +
                  Patella::SendLaterWorker.default_queue = :new_default
         | 
| 73 | 
            +
                  
         | 
| 74 | 
            +
                  sending_later do
         | 
| 75 | 
            +
                    @dummy.send_later(:id)
         | 
| 76 | 
            +
                    Dummy.send_later(:find, 6)
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                  
         | 
| 79 | 
            +
                  job1, job2 = Resque.pop(:new_default), Resque.pop(:new_default)
         | 
| 80 | 
            +
                  assert_equal ["Dummy", 5, "id"], job1["args"]
         | 
| 81 | 
            +
                  assert_equal ["Dummy", nil, "find", 6], job2["args"]
         | 
| 82 | 
            +
                ensure
         | 
| 83 | 
            +
                  Patella::SendLaterWorker.default_queue = default_queue
         | 
| 84 | 
            +
                end
         | 
| 127 85 | 
             
              end
         | 
| 128 86 |  | 
| 129 87 | 
             
            private
         | 
| 130 | 
            -
              def  | 
| 131 | 
            -
                 | 
| 132 | 
            -
              end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
              def with_caching(&block)
         | 
| 135 | 
            -
                #previous_caching = ActionController::Base.perform_caching
         | 
| 88 | 
            +
              def sending_later(&block)
         | 
| 89 | 
            +
                previous_send_now = Patella::SendLater.send_now
         | 
| 136 90 | 
             
                begin
         | 
| 137 | 
            -
                   | 
| 138 | 
            -
                  #ActionController::Base.perform_caching = true
         | 
| 91 | 
            +
                  Patella::SendLater.send_now = false
         | 
| 139 92 | 
             
                  yield
         | 
| 140 93 | 
             
                ensure
         | 
| 141 | 
            -
                   | 
| 94 | 
            +
                  Patella::SendLater.send_now = previous_send_now
         | 
| 142 95 | 
             
                end
         | 
| 143 96 | 
             
              end
         | 
| 144 97 | 
             
            end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -1,34 +1,20 @@ | |
| 1 1 | 
             
            require 'rubygems'
         | 
| 2 2 | 
             
            require 'bundler/setup'
         | 
| 3 3 |  | 
| 4 | 
            +
            module Rails
         | 
| 5 | 
            +
              def self.env
         | 
| 6 | 
            +
                'test'
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
             | 
| 4 10 | 
             
            Bundler.require
         | 
| 5 11 | 
             
            require 'patella'
         | 
| 6 | 
            -
            require ' | 
| 12 | 
            +
            require 'minitest'
         | 
| 7 13 | 
             
            require 'active_support'
         | 
| 8 14 | 
             
            require 'active_support/test_case'
         | 
| 9 15 | 
             
            require 'json'
         | 
| 10 | 
            -
            require 'mocha'
         | 
| 16 | 
            +
            require 'mocha/setup'
         | 
| 11 17 | 
             
            require 'bourne'
         | 
| 18 | 
            +
            require 'pry'
         | 
| 12 19 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
            module Rails
         | 
| 15 | 
            -
              class MockCache
         | 
| 16 | 
            -
                def fetch(*args)
         | 
| 17 | 
            -
                  yield
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
                def write(*args)
         | 
| 20 | 
            -
                end
         | 
| 21 | 
            -
              end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
              def self.caching=(value)
         | 
| 24 | 
            -
                @caching=value
         | 
| 25 | 
            -
              end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
              def self.caching?
         | 
| 28 | 
            -
                @caching
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
              def self.cache
         | 
| 31 | 
            -
                @cache ||= MockCache.new
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
            end
         | 
| 34 | 
            -
            end
         | 
| 20 | 
            +
            Minitest.autorun
         | 
    
        metadata
    CHANGED
    
    | @@ -1,172 +1,142 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: patella
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 5 | 
            -
              prerelease: 
         | 
| 4 | 
            +
              version: 0.9.0
         | 
| 6 5 | 
             
            platform: ruby
         | 
| 7 6 | 
             
            authors:
         | 
| 8 7 | 
             
            - Jeff Dwyer
         | 
| 8 | 
            +
            - Nat Budin
         | 
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2014-05-13 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: resque
         | 
| 16 16 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            -
                none: false
         | 
| 18 17 | 
             
                requirements:
         | 
| 19 | 
            -
                - - ~>
         | 
| 18 | 
            +
                - - "~>"
         | 
| 20 19 | 
             
                  - !ruby/object:Gem::Version
         | 
| 21 20 | 
             
                    version: '1.16'
         | 
| 22 21 | 
             
              type: :runtime
         | 
| 23 22 | 
             
              prerelease: false
         | 
| 24 23 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            -
                none: false
         | 
| 26 24 | 
             
                requirements:
         | 
| 27 | 
            -
                - - ~>
         | 
| 25 | 
            +
                - - "~>"
         | 
| 28 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 27 | 
             
                    version: '1.16'
         | 
| 30 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 31 29 | 
             
              name: resque-meta
         | 
| 32 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 33 | 
            -
                none: false
         | 
| 34 31 | 
             
                requirements:
         | 
| 35 | 
            -
                - - ~>
         | 
| 32 | 
            +
                - - "~>"
         | 
| 36 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 37 34 | 
             
                    version: 1.0.0
         | 
| 38 35 | 
             
              type: :runtime
         | 
| 39 36 | 
             
              prerelease: false
         | 
| 40 37 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            -
                none: false
         | 
| 42 38 | 
             
                requirements:
         | 
| 43 | 
            -
                - - ~>
         | 
| 39 | 
            +
                - - "~>"
         | 
| 44 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 45 41 | 
             
                    version: 1.0.0
         | 
| 46 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 47 | 
            -
              name: activesupport
         | 
| 48 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 49 | 
            -
                none: false
         | 
| 50 | 
            -
                requirements:
         | 
| 51 | 
            -
                - - ~>
         | 
| 52 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: '2.3'
         | 
| 54 | 
            -
              type: :runtime
         | 
| 55 | 
            -
              prerelease: false
         | 
| 56 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 | 
            -
                none: false
         | 
| 58 | 
            -
                requirements:
         | 
| 59 | 
            -
                - - ~>
         | 
| 60 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '2.3'
         | 
| 62 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 63 43 | 
             
              name: rails
         | 
| 64 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 65 | 
            -
                none: false
         | 
| 66 45 | 
             
                requirements:
         | 
| 67 | 
            -
                - -  | 
| 46 | 
            +
                - - ">="
         | 
| 68 47 | 
             
                  - !ruby/object:Gem::Version
         | 
| 69 48 | 
             
                    version: '2.3'
         | 
| 70 49 | 
             
              type: :runtime
         | 
| 71 50 | 
             
              prerelease: false
         | 
| 72 51 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 73 | 
            -
                none: false
         | 
| 74 52 | 
             
                requirements:
         | 
| 75 | 
            -
                - -  | 
| 53 | 
            +
                - - ">="
         | 
| 76 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 77 55 | 
             
                    version: '2.3'
         | 
| 78 56 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 79 | 
            -
              name:  | 
| 57 | 
            +
              name: bundler
         | 
| 80 58 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 81 | 
            -
                none: false
         | 
| 82 59 | 
             
                requirements:
         | 
| 83 | 
            -
                - -  | 
| 60 | 
            +
                - - ">="
         | 
| 84 61 | 
             
                  - !ruby/object:Gem::Version
         | 
| 85 62 | 
             
                    version: '0'
         | 
| 86 | 
            -
              type: : | 
| 63 | 
            +
              type: :development
         | 
| 87 64 | 
             
              prerelease: false
         | 
| 88 65 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 89 | 
            -
                none: false
         | 
| 90 66 | 
             
                requirements:
         | 
| 91 | 
            -
                - -  | 
| 67 | 
            +
                - - ">="
         | 
| 92 68 | 
             
                  - !ruby/object:Gem::Version
         | 
| 93 69 | 
             
                    version: '0'
         | 
| 94 70 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 95 | 
            -
              name:  | 
| 71 | 
            +
              name: rake
         | 
| 96 72 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 97 | 
            -
                none: false
         | 
| 98 73 | 
             
                requirements:
         | 
| 99 | 
            -
                - -  | 
| 74 | 
            +
                - - ">="
         | 
| 100 75 | 
             
                  - !ruby/object:Gem::Version
         | 
| 101 76 | 
             
                    version: '0'
         | 
| 102 77 | 
             
              type: :development
         | 
| 103 78 | 
             
              prerelease: false
         | 
| 104 79 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 105 | 
            -
                none: false
         | 
| 106 80 | 
             
                requirements:
         | 
| 107 | 
            -
                - -  | 
| 81 | 
            +
                - - ">="
         | 
| 108 82 | 
             
                  - !ruby/object:Gem::Version
         | 
| 109 83 | 
             
                    version: '0'
         | 
| 110 84 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 111 | 
            -
              name:  | 
| 85 | 
            +
              name: mocha
         | 
| 112 86 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 113 | 
            -
                none: false
         | 
| 114 87 | 
             
                requirements:
         | 
| 115 | 
            -
                - -  | 
| 88 | 
            +
                - - ">="
         | 
| 116 89 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version:  | 
| 90 | 
            +
                    version: 0.9.8
         | 
| 118 91 | 
             
              type: :development
         | 
| 119 92 | 
             
              prerelease: false
         | 
| 120 93 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 | 
            -
                none: false
         | 
| 122 94 | 
             
                requirements:
         | 
| 123 | 
            -
                - -  | 
| 95 | 
            +
                - - ">="
         | 
| 124 96 | 
             
                  - !ruby/object:Gem::Version
         | 
| 125 | 
            -
                    version:  | 
| 97 | 
            +
                    version: 0.9.8
         | 
| 126 98 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 127 | 
            -
              name:  | 
| 99 | 
            +
              name: bourne
         | 
| 128 100 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 129 | 
            -
                none: false
         | 
| 130 101 | 
             
                requirements:
         | 
| 131 | 
            -
                - -  | 
| 102 | 
            +
                - - ">="
         | 
| 132 103 | 
             
                  - !ruby/object:Gem::Version
         | 
| 133 | 
            -
                    version: 0 | 
| 104 | 
            +
                    version: '0'
         | 
| 134 105 | 
             
              type: :development
         | 
| 135 106 | 
             
              prerelease: false
         | 
| 136 107 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 137 | 
            -
                none: false
         | 
| 138 108 | 
             
                requirements:
         | 
| 139 | 
            -
                - -  | 
| 109 | 
            +
                - - ">="
         | 
| 140 110 | 
             
                  - !ruby/object:Gem::Version
         | 
| 141 | 
            -
                    version: 0 | 
| 111 | 
            +
                    version: '0'
         | 
| 142 112 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 143 | 
            -
              name:  | 
| 113 | 
            +
              name: pry
         | 
| 144 114 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 145 | 
            -
                none: false
         | 
| 146 115 | 
             
                requirements:
         | 
| 147 | 
            -
                - -  | 
| 116 | 
            +
                - - ">="
         | 
| 148 117 | 
             
                  - !ruby/object:Gem::Version
         | 
| 149 118 | 
             
                    version: '0'
         | 
| 150 119 | 
             
              type: :development
         | 
| 151 120 | 
             
              prerelease: false
         | 
| 152 121 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 153 | 
            -
                none: false
         | 
| 154 122 | 
             
                requirements:
         | 
| 155 | 
            -
                - -  | 
| 123 | 
            +
                - - ">="
         | 
| 156 124 | 
             
                  - !ruby/object:Gem::Version
         | 
| 157 125 | 
             
                    version: '0'
         | 
| 158 | 
            -
            description:  | 
| 126 | 
            +
            description: A robust implementation of send_later for Rails apps using Resque.
         | 
| 159 127 | 
             
            email:
         | 
| 160 128 | 
             
            - jdwyer@patientslikeme.com
         | 
| 129 | 
            +
            - nbudin@patientslikeme.com
         | 
| 161 130 | 
             
            executables: []
         | 
| 162 131 | 
             
            extensions: []
         | 
| 163 132 | 
             
            extra_rdoc_files: []
         | 
| 164 133 | 
             
            files:
         | 
| 165 | 
            -
            - .gitignore
         | 
| 134 | 
            +
            - ".gitignore"
         | 
| 166 135 | 
             
            - Gemfile
         | 
| 167 136 | 
             
            - LICENSE
         | 
| 168 137 | 
             
            - README.md
         | 
| 169 138 | 
             
            - Rakefile
         | 
| 139 | 
            +
            - config/tddium.yml
         | 
| 170 140 | 
             
            - lib/patella.rb
         | 
| 171 141 | 
             
            - lib/patella/patella.rb
         | 
| 172 142 | 
             
            - lib/patella/send_later.rb
         | 
| @@ -177,29 +147,30 @@ files: | |
| 177 147 | 
             
            - test/test_helper.rb
         | 
| 178 148 | 
             
            homepage: https://github.com/patientslikeme/patella
         | 
| 179 149 | 
             
            licenses: []
         | 
| 150 | 
            +
            metadata: {}
         | 
| 180 151 | 
             
            post_install_message: 
         | 
| 181 152 | 
             
            rdoc_options: []
         | 
| 182 153 | 
             
            require_paths:
         | 
| 183 154 | 
             
            - lib
         | 
| 184 155 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 185 | 
            -
              none: false
         | 
| 186 156 | 
             
              requirements:
         | 
| 187 | 
            -
              - -  | 
| 157 | 
            +
              - - ">="
         | 
| 188 158 | 
             
                - !ruby/object:Gem::Version
         | 
| 189 159 | 
             
                  version: '0'
         | 
| 190 160 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 191 | 
            -
              none: false
         | 
| 192 161 | 
             
              requirements:
         | 
| 193 | 
            -
              - -  | 
| 162 | 
            +
              - - ">="
         | 
| 194 163 | 
             
                - !ruby/object:Gem::Version
         | 
| 195 164 | 
             
                  version: '0'
         | 
| 196 165 | 
             
            requirements: []
         | 
| 197 166 | 
             
            rubyforge_project: 
         | 
| 198 | 
            -
            rubygems_version:  | 
| 167 | 
            +
            rubygems_version: 2.2.0
         | 
| 199 168 | 
             
            signing_key: 
         | 
| 200 | 
            -
            specification_version:  | 
| 201 | 
            -
            summary:  | 
| 202 | 
            -
               | 
| 169 | 
            +
            specification_version: 4
         | 
| 170 | 
            +
            summary: Patella provides an ActiveRecord-friendly send_later implementation for Resque
         | 
| 171 | 
            +
              that allows sending to specific queues as well as a global on/off switch for send_later,
         | 
| 172 | 
            +
              and sensible defaults for the default Rails environments.
         | 
| 203 173 | 
             
            test_files:
         | 
| 204 174 | 
             
            - test/patella_test.rb
         | 
| 205 175 | 
             
            - test/test_helper.rb
         | 
| 176 | 
            +
            has_rdoc: 
         |