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:
|