patella 0.0.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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: