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 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
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .tddium*
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Keenan Brock
1
+ Copyright (c) 2012-2014 PatientsLikeMe, Inc.
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,7 +1,15 @@
1
1
  # Patella
2
2
 
3
- Gem for the RailsConf 2012 talk Patella: It's Memoization into Memcached calculated in the background with Resque.
4
- [www.slideshare.net/jdwyah/patella-railsconf-2012](http://www.slideshare.net/jdwyah/patella-railsconf-2012)
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
- def self.my_slow_method(user_id)
24
- all_notifications_for(User.find(user_id))
25
- end
26
- patella_reflex :notification_unread_count, :expires_in => 3.minutes, :class_method => true
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
- See the tests for more [examples](https://github.com/kbrock/patella/blob/master/test/patella_test.rb)
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
@@ -0,0 +1,5 @@
1
+ :tddium:
2
+ :ruby_version: ruby-1.9.3-p194
3
+ :test_pattern:
4
+ - test/*_test.rb
5
+ - test/**/*_test.rb
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
@@ -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
-
@@ -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
- #in dev mode, run the command in process
9
- if Rails.caching?
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 Rails.caching?
19
- Patella::SendLaterWorker.perform_later self.to_s, nil, method_name, *args
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
- @@default_queue = :send_later
5
- cattr_accessor :queues
6
- @@queues = {}
7
+ cattr_accessor :default_queue
8
+ self.default_queue = :send_later
7
9
 
8
- def self.perform_later(*args)
9
- # args[0] is class name of invoking class, args[2] is method
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.queue_for(class_name, method_name)
15
- @@queues[class_name.to_s].try(:[],method_name.to_s) || @@default_queue
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.find_by_id instance_id if instance_id
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
@@ -1,3 +1,3 @@
1
1
  module Patella
2
- VERSION = "0.0.3" unless defined?(Patella::VERSION)
2
+ VERSION = "0.9.0" unless defined?(Patella::VERSION)
3
3
  end
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 = "It's Memoization into Memcached calculated in the background with Resque."
8
- gem.summary = "DSL to add memoization on any method into Memcached calculated in the background with Resque."
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 'activesupport', '~>2.3' #, :require => 'active_support'
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', "~>0.9.8"
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.find_by_id id
11
+ def self.find id
13
12
  new id
14
13
  end
14
+ end
15
15
 
16
- def foo
17
- 5
16
+ class PatellaTest < ActiveSupport::TestCase
17
+ setup do
18
+ @dummy = Dummy.new(5)
18
19
  end
19
- patella_reflex :foo
20
-
21
- def bar(a,b)
22
- a+b
20
+
21
+ teardown do
22
+ Resque.redis.flushall
23
23
  end
24
- patella_reflex :bar
25
-
26
- def baz(add)
27
- self.id + add
24
+
25
+ def test_send_now_to_instance
26
+ assert_equal 5, @dummy.send_later(:id)
28
27
  end
29
- patella_reflex :baz
30
-
31
- def self.bing
32
- 3
28
+
29
+ def test_send_now_to_class
30
+ assert_equal 6, Dummy.send_later(:find, 6).id
33
31
  end
34
- patella_reflex :bing, :class_method => true
35
-
36
- def no_background_add(a,b)
37
- a + b
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
- def test_turning_off_background
64
- #background
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 cache_clearing
76
- d = Dummy.new(1)
77
- result = d.bar(4,5) #load it by turning caching off
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
- def test_patella_for_class_methods
100
- assert Dummy.bing.loaded?
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 test_keys
105
- d = Dummy.new 2
106
- assert_equal "patella/Dummy/2/foo/#{md5 [].to_json}", d.patella_key(:foo,[])
107
- assert_equal "patella/Dummy/2/foo/#{md5 [1].to_json}", d.patella_key(:foo,[1])
108
- assert_equal "patella/Dummy/2/foo/#{md5 [1,3].to_json}", d.patella_key(:foo,[1,3])
109
- assert_equal "patella/Dummy/2/foo/#{md5 [1,"asdf"].to_json}", d.patella_key(:foo,[1,"asdf"])
110
- assert_equal "patella/Dummy/2/foo/#{md5 [1,"asdf"*1000].to_json}", d.patella_key(:foo,[1, ("asdf"*1000)])
111
-
112
- d3 = Dummy.new 3
113
- assert_equal "patella/Dummy/3/foo/#{md5 [].to_json}", d3.patella_key(:foo,[])
114
- assert_equal "patella/Dummy/3/foo/#{md5 [1].to_json}", d3.patella_key(:foo,[1])
115
- assert_equal "patella/Dummy/3/foo/#{md5 [1,3].to_json}", d3.patella_key(:foo,[1,3])
116
- assert_equal "patella/Dummy/3/foo/#{md5 [1,"asdf" * 1000].to_json}", d3.patella_key(:foo,[1,"asdf" * 1000])
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 test_soft_expiration
120
- dummy = Dummy.new 1
121
- ::Rails.cache.stubs( :fetch => { 'result' => "loads of data", 'soft_expiration' => Time.now-1.minute }.to_json )
122
- ::Rails.cache.stubs( :write => true )
123
- dummy.stubs :send_later => 'loading'
124
- dummy.foo
125
- assert_received(Rails.cache, :write) { |ex| ex.once }
126
- assert_received(dummy, :send_later) { |ex| ex.once }
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 md5(str)
131
- Digest::MD5.hexdigest(str)
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
- Rails.stubs(:caching? => true)
138
- #ActionController::Base.perform_caching = true
91
+ Patella::SendLater.send_now = false
139
92
  yield
140
93
  ensure
141
- #ActionController::Base.perform_caching = previous_caching
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 'test/unit'
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
- unless defined?(Rails)
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.3
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: 2012-06-25 00:00:00.000000000 Z
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: json
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: :runtime
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: bundler
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: rake
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: '0'
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: '0'
97
+ version: 0.9.8
126
98
  - !ruby/object:Gem::Dependency
127
- name: mocha
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.9.8
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.9.8
111
+ version: '0'
142
112
  - !ruby/object:Gem::Dependency
143
- name: bourne
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: It's Memoization into Memcached calculated in the background with Resque.
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: 1.8.24
167
+ rubygems_version: 2.2.0
199
168
  signing_key:
200
- specification_version: 3
201
- summary: DSL to add memoization on any method into Memcached calculated in the background
202
- with Resque.
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: