backgrounded 0.6.2 → 0.7.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.
- data/VERSION.yml +2 -2
- data/backgrounded.gemspec +2 -2
- data/lib/backgrounded/class_methods.rb +5 -2
- data/lib/backgrounded/handler/resque_handler.rb +18 -3
- data/lib/backgrounded/handler/workling_handler.rb +21 -5
- data/test/backgrounded/handler/resque_handler_test.rb +28 -0
- data/test/backgrounded/handler/workling_handler_test.rb +20 -1
- data/test/backgrounded_test.rb +35 -3
- metadata +4 -4
data/VERSION.yml
CHANGED
data/backgrounded.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{backgrounded}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.7.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ryan Sonnek"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-30}
|
13
13
|
s.email = %q{ryan.sonnek@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -6,8 +6,11 @@ module Backgrounded
|
|
6
6
|
methods_with_options.merge! options
|
7
7
|
methods_with_options.each_pair do |method, options|
|
8
8
|
method_basename, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
|
9
|
-
|
10
|
-
|
9
|
+
backgrounded_method = "#{method_basename}_backgrounded#{punctuation}"
|
10
|
+
class_eval do
|
11
|
+
define_method backgrounded_method do |*args|
|
12
|
+
Backgrounded.handler.request(self, method, *args)
|
13
|
+
end
|
11
14
|
end
|
12
15
|
end
|
13
16
|
cattr_accessor :backgrounded_options
|
@@ -8,14 +8,29 @@ module Backgrounded
|
|
8
8
|
@@queue = DEFAULT_QUEUE
|
9
9
|
|
10
10
|
def request(object, method, *args)
|
11
|
-
|
12
|
-
|
11
|
+
options = object.backgrounded_options[method.to_sym]
|
12
|
+
@@queue = options[:queue] || DEFAULT_QUEUE
|
13
|
+
instance, id = instance_identifiers(object)
|
14
|
+
Resque.enqueue(ResqueHandler, instance, id, method, *args)
|
13
15
|
end
|
14
16
|
def self.queue
|
15
17
|
@@queue
|
16
18
|
end
|
17
19
|
def self.perform(clazz, id, method, *args)
|
18
|
-
clazz
|
20
|
+
find_instance(clazz, id, method).send(method, *args)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def self.find_instance(clazz, id, method)
|
25
|
+
clazz = clazz.constantize
|
26
|
+
clazz.respond_to?(method) ? clazz : clazz.find(id)
|
27
|
+
end
|
28
|
+
def instance_identifiers(object)
|
29
|
+
instance, id = if object.is_a?(Class)
|
30
|
+
[object.name, -1]
|
31
|
+
else
|
32
|
+
[object.class.name, object.id]
|
33
|
+
end
|
19
34
|
end
|
20
35
|
end
|
21
36
|
end
|
@@ -1,17 +1,33 @@
|
|
1
1
|
class Backgrounded::Handler::WorklingHandler
|
2
|
+
class BackgroundedWorker < Workling::Base
|
3
|
+
def perform(options = {})
|
4
|
+
find_instance(options[:class], options[:id], options[:method]).send(options[:method], *options[:params])
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
def find_instance(clazz, id, method)
|
9
|
+
clazz = clazz.constantize
|
10
|
+
clazz.respond_to?(method) ? clazz : clazz.find(id)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
2
14
|
def request(object, method, *args)
|
15
|
+
instance, id = instance_identifiers(object)
|
3
16
|
options = {
|
4
|
-
:class =>
|
5
|
-
:id =>
|
17
|
+
:class => instance,
|
18
|
+
:id => id,
|
6
19
|
:method => method,
|
7
20
|
:params => args
|
8
21
|
}
|
9
22
|
BackgroundedWorker.async_perform options
|
10
23
|
end
|
11
24
|
|
12
|
-
|
13
|
-
|
14
|
-
|
25
|
+
private
|
26
|
+
def instance_identifiers(object)
|
27
|
+
instance, id = if object.is_a?(Class)
|
28
|
+
[object.name, -1]
|
29
|
+
else
|
30
|
+
[object.class.name, object.id]
|
15
31
|
end
|
16
32
|
end
|
17
33
|
end
|
@@ -26,6 +26,15 @@ class ResqueHandlerTest < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
class Blog < ActiveRecord::Base
|
30
|
+
class << self
|
31
|
+
backgrounded :do_stuff
|
32
|
+
|
33
|
+
def do_stuff
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
29
38
|
context 'when backgrounded is configured with resque' do
|
30
39
|
setup do
|
31
40
|
Resque.reset!
|
@@ -33,6 +42,25 @@ class ResqueHandlerTest < Test::Unit::TestCase
|
|
33
42
|
Backgrounded.handler = @handler
|
34
43
|
end
|
35
44
|
|
45
|
+
context 'a class level backgrounded method' do
|
46
|
+
context "invoking backgrounded method" do
|
47
|
+
setup do
|
48
|
+
Blog.do_stuff_backgrounded
|
49
|
+
end
|
50
|
+
should "enqueue job to resque" do
|
51
|
+
assert_queued Backgrounded::Handler::ResqueHandler
|
52
|
+
assert_equal Backgrounded::Handler::ResqueHandler::DEFAULT_QUEUE, Resque.queue_from_class(Backgrounded::Handler::ResqueHandler)
|
53
|
+
end
|
54
|
+
context "running background job" do
|
55
|
+
setup do
|
56
|
+
Blog.expects(:do_stuff)
|
57
|
+
Resque.run!
|
58
|
+
end
|
59
|
+
should "invoke method on class" do end #see expectations
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
36
64
|
context 'a persisted object with a single backgrounded method' do
|
37
65
|
setup do
|
38
66
|
@user = User.create
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
-
RAILS_DEFAULT_LOGGER = Logger.new
|
2
|
+
RAILS_DEFAULT_LOGGER = Logger.new STDOUT
|
3
3
|
RAILS_ENV = 'test'
|
4
4
|
require 'newrelic_rpm'
|
5
5
|
require 'memcache'
|
@@ -26,6 +26,15 @@ class WorklingHandlerTest < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
class Post < ActiveRecord::Base
|
30
|
+
class << self
|
31
|
+
backgrounded :do_stuff
|
32
|
+
|
33
|
+
def do_stuff
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
29
38
|
context 'when backgrounded is configured with workling' do
|
30
39
|
setup do
|
31
40
|
@handler = Backgrounded::Handler::WorklingHandler.new
|
@@ -44,5 +53,15 @@ class WorklingHandlerTest < Test::Unit::TestCase
|
|
44
53
|
should 'dispatch through workling back to the object' do end #see expectations
|
45
54
|
end
|
46
55
|
end
|
56
|
+
|
57
|
+
context 'a class level backgrounded method' do
|
58
|
+
context "invoking backgrounded method" do
|
59
|
+
setup do
|
60
|
+
Post.expects(:do_stuff).with('a string')
|
61
|
+
Post.do_stuff_backgrounded 'a string'
|
62
|
+
end
|
63
|
+
should 'dispatch through workling back to the object' do end #see expectations
|
64
|
+
end
|
65
|
+
end
|
47
66
|
end
|
48
67
|
end
|
data/test/backgrounded_test.rb
CHANGED
@@ -49,14 +49,30 @@ class BackgroundedTest < Test::Unit::TestCase
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
class Blog
|
53
|
+
class << self
|
54
|
+
backgrounded :update_info
|
55
|
+
def update_info
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
52
59
|
|
53
60
|
context 'an object with a single backgrounded method' do
|
54
61
|
setup do
|
55
62
|
@user = User.new
|
56
63
|
end
|
57
|
-
should
|
58
|
-
@user.
|
59
|
-
|
64
|
+
should 'define backgrounded method' do
|
65
|
+
assert @user.respond_to?('do_stuff_backgrounded')
|
66
|
+
end
|
67
|
+
should 'save backgrounded options for method' do
|
68
|
+
assert_not_nil User.backgrounded_options[:do_stuff]
|
69
|
+
end
|
70
|
+
context 'executing backgrounded method' do
|
71
|
+
setup do
|
72
|
+
@user.expects(:do_stuff)
|
73
|
+
@user.do_stuff_backgrounded
|
74
|
+
end
|
75
|
+
should "execute method in background" do end #see expectations
|
60
76
|
end
|
61
77
|
end
|
62
78
|
|
@@ -110,4 +126,20 @@ class BackgroundedTest < Test::Unit::TestCase
|
|
110
126
|
assert_equal :low, @dog.backgrounded_options[:bark][:priority]
|
111
127
|
end
|
112
128
|
end
|
129
|
+
|
130
|
+
context 'a class with backgrounded method' do
|
131
|
+
should 'define backgrounded method' do
|
132
|
+
assert Blog.respond_to?('update_info_backgrounded')
|
133
|
+
end
|
134
|
+
should 'save backgrounded options for method' do
|
135
|
+
assert_not_nil Blog.backgrounded_options[:update_info]
|
136
|
+
end
|
137
|
+
context 'invoking backgrounded method' do
|
138
|
+
setup do
|
139
|
+
Blog.expects(:update_info)
|
140
|
+
Blog.update_info_backgrounded
|
141
|
+
end
|
142
|
+
should 'invoke class method' do end #see expectations
|
143
|
+
end
|
144
|
+
end
|
113
145
|
end
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Sonnek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-30 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|