backgrounded 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -1
- data/README.rdoc +9 -4
- data/backgrounded.gemspec +2 -0
- data/lib/backgrounded/active_record_extension.rb +3 -2
- data/lib/backgrounded/concern.rb +2 -4
- data/lib/backgrounded/handler/inprocess_handler.rb +1 -3
- data/lib/backgrounded/handler/no_op_handler.rb +2 -4
- data/lib/backgrounded/proxy.rb +5 -3
- data/lib/backgrounded/version.rb +1 -1
- data/test/active_record_extension_test.rb +8 -8
- data/test/backgrounded_test.rb +9 -8
- data/test/proxy_test.rb +24 -13
- data/test/setup_database.rb +13 -0
- data/test/test_helper.rb +2 -4
- metadata +38 -5
- data/lib/backgrounded/handler/abstract_handler.rb +0 -11
data/.rvmrc
CHANGED
data/README.rdoc
CHANGED
@@ -28,7 +28,7 @@ Backgrounded provides a thin wrapper around any background processing framework
|
|
28
28
|
|
29
29
|
= after_commit_backgrounded Callback
|
30
30
|
|
31
|
-
Automatically execute a callback in the background after a model has been saved to the database. All of the standard after_commit options are
|
31
|
+
Automatically execute a callback in the background after a model has been saved to the database. All of the standard after_commit options are
|
32
32
|
available as well as an optional :backgrounded option which will be passed to the Backgrounded::Handler.
|
33
33
|
|
34
34
|
class User < ActiveRecord::Base
|
@@ -48,7 +48,7 @@ Bundler Gemfile configuration
|
|
48
48
|
|
49
49
|
= Configuration
|
50
50
|
|
51
|
-
Backgrounded
|
51
|
+
Backgrounded handlers are available for popular libraries in separate gems. Just drop in the gem for your particular framework or write your own!
|
52
52
|
|
53
53
|
== Resque
|
54
54
|
see http://github.com/wireframe/backgrounded-resque
|
@@ -57,11 +57,16 @@ see http://github.com/wireframe/backgrounded-resque
|
|
57
57
|
see http://github.com/jnstq/job_fu/tree
|
58
58
|
|
59
59
|
== Custom Handlers
|
60
|
+
Writing a custom handler is as simple as:
|
60
61
|
|
61
62
|
# config/initializers/backgrounded.rb
|
62
63
|
class MyHandler
|
63
|
-
|
64
|
-
|
64
|
+
# @param object is the target object to invoke the method upon
|
65
|
+
# @param method is the requested method to call
|
66
|
+
# @param args is the optional list of arguments to pass to the method
|
67
|
+
# @param options is the optional hash of options passed to the backgrounded call
|
68
|
+
def request(object, method, args, options={})
|
69
|
+
# process the call however you want!
|
65
70
|
end
|
66
71
|
end
|
67
72
|
Backgrounded.handler = MyHandler.new
|
data/backgrounded.gemspec
CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
21
21
|
s.add_development_dependency(%q<sqlite3-ruby>, [">= 1.3.2"])
|
22
22
|
s.add_development_dependency(%q<rake>, [">= 0.9.2.2"])
|
23
|
+
s.add_development_dependency(%q<pry>, [">= 0.9.12"])
|
24
|
+
s.add_development_dependency(%q<test_after_commit>, [">= 0"])
|
23
25
|
|
24
26
|
s.files = `git ls-files`.split("\n")
|
25
27
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -9,8 +9,9 @@ module Backgrounded
|
|
9
9
|
# @option options [Hash] :backgrounded (optional) options to pass into the backgrounded handler
|
10
10
|
# @see after_commit
|
11
11
|
def after_commit_backgrounded(method_name, options={})
|
12
|
-
|
13
|
-
|
12
|
+
self.after_commit options.except(:backgrounded) do |instance|
|
13
|
+
instance.backgrounded(options[:backgrounded]).send(method_name)
|
14
|
+
end
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
data/lib/backgrounded/concern.rb
CHANGED
@@ -7,15 +7,13 @@ module Backgrounded
|
|
7
7
|
module ClassMethods
|
8
8
|
# @see Backgrounded::Concern#backgrounded
|
9
9
|
def backgrounded(options={})
|
10
|
-
Backgrounded.
|
11
|
-
Backgrounded::Proxy.new self
|
10
|
+
Backgrounded::Proxy.new self, options
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
15
14
|
# @param options (optional) options to pass into the backgrounded handler
|
16
15
|
def backgrounded(options={})
|
17
|
-
Backgrounded.
|
18
|
-
Backgrounded::Proxy.new self
|
16
|
+
Backgrounded::Proxy.new self, options
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
@@ -1,10 +1,8 @@
|
|
1
|
-
require 'backgrounded/handler/abstract_handler'
|
2
|
-
|
3
1
|
module Backgrounded
|
4
2
|
module Handler
|
5
3
|
#simple handler to process synchronously and not actually in the background
|
6
4
|
#useful for testing
|
7
|
-
class InprocessHandler
|
5
|
+
class InprocessHandler
|
8
6
|
def request(object, method, args, options={})
|
9
7
|
object.send method, *args
|
10
8
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require 'backgrounded/handler/abstract_handler'
|
2
|
-
|
3
1
|
module Backgrounded
|
4
2
|
module Handler
|
5
3
|
# throw requests out the window
|
6
4
|
# useful for test environment to avoid any background work
|
7
|
-
class NoOpHandler
|
8
|
-
def request(object, method, args)
|
5
|
+
class NoOpHandler
|
6
|
+
def request(object, method, args, options={})
|
9
7
|
# do nothing
|
10
8
|
end
|
11
9
|
end
|
data/lib/backgrounded/proxy.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module Backgrounded
|
2
|
+
attr_reader :delegate, :options
|
2
3
|
class Proxy
|
3
|
-
def initialize(delegate)
|
4
|
+
def initialize(delegate, options={})
|
4
5
|
@delegate = delegate
|
6
|
+
@options = options || {}
|
5
7
|
end
|
6
8
|
|
7
9
|
def method_missing(method_name, *args)
|
8
|
-
Backgrounded.logger.debug("Requesting #{Backgrounded.handler} backgrounded method: #{method_name} for instance #{@delegate}")
|
9
|
-
Backgrounded.handler.request(@delegate, method_name, args)
|
10
|
+
Backgrounded.logger.debug("Requesting #{Backgrounded.handler} backgrounded method: #{method_name} for instance #{@delegate} with options: #{@options}")
|
11
|
+
Backgrounded.handler.request(@delegate, method_name, args, @options)
|
10
12
|
nil
|
11
13
|
end
|
12
14
|
end
|
data/lib/backgrounded/version.rb
CHANGED
@@ -17,21 +17,21 @@ class ActiveRecordExtensionTest < Test::Unit::TestCase
|
|
17
17
|
should 'be defined on ActiveRecord::Base' do
|
18
18
|
assert ActiveRecord::Base.respond_to?(:after_commit_backgrounded)
|
19
19
|
end
|
20
|
-
context '
|
20
|
+
context 'without options' do
|
21
21
|
setup do
|
22
22
|
@blog = Blog.new
|
23
|
-
|
24
|
-
@blog.save
|
23
|
+
Backgrounded.handler.expects(:request).with(@blog, :do_something_else, [], {})
|
24
|
+
@blog.save!
|
25
25
|
end
|
26
|
-
should '
|
26
|
+
should 'invoke Backgrounded.handler with no options' do end # see expectations
|
27
27
|
end
|
28
|
-
context '
|
28
|
+
context 'with options[:backgrounded]' do
|
29
29
|
setup do
|
30
|
-
Backgrounded.handler.expects(:options=).with(:priority => :high)
|
31
30
|
@user = User.new
|
32
|
-
@user
|
31
|
+
Backgrounded.handler.expects(:request).with(@user, :do_stuff, [], {:priority => :high})
|
32
|
+
@user.save!
|
33
33
|
end
|
34
|
-
should 'pass
|
34
|
+
should 'pass options[:backgrounded] to Backgrounded.handler' do end # see expectations
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
data/test/backgrounded_test.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
|
3
3
|
class BackgroundedTest < Test::Unit::TestCase
|
4
4
|
|
5
|
-
class
|
5
|
+
class Dog
|
6
6
|
def do_stuff
|
7
7
|
end
|
8
8
|
def self.do_something_else
|
@@ -11,14 +11,14 @@ class BackgroundedTest < Test::Unit::TestCase
|
|
11
11
|
|
12
12
|
context '#backgrounded' do
|
13
13
|
should 'be defined for class' do
|
14
|
-
assert
|
14
|
+
assert Dog.respond_to?(:backgrounded)
|
15
15
|
end
|
16
16
|
should 'be defined for instance' do
|
17
|
-
assert
|
17
|
+
assert Dog.new.respond_to?(:backgrounded)
|
18
18
|
end
|
19
19
|
context 'invoking on class' do
|
20
20
|
setup do
|
21
|
-
@result =
|
21
|
+
@result = Dog.backgrounded
|
22
22
|
end
|
23
23
|
should 'return instance of Backgrounded::Proxy' do
|
24
24
|
assert @result.is_a?(Backgrounded::Proxy)
|
@@ -26,8 +26,8 @@ class BackgroundedTest < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
context 'invoking on an instance' do
|
28
28
|
setup do
|
29
|
-
@
|
30
|
-
@result = @
|
29
|
+
@dog = Dog.new
|
30
|
+
@result = @dog.backgrounded
|
31
31
|
end
|
32
32
|
should 'return instance of Backgrounded::Proxy' do
|
33
33
|
assert @result.is_a?(Backgrounded::Proxy)
|
@@ -35,8 +35,9 @@ class BackgroundedTest < Test::Unit::TestCase
|
|
35
35
|
end
|
36
36
|
context 'invoking with options' do
|
37
37
|
setup do
|
38
|
-
|
39
|
-
@
|
38
|
+
@dog = Dog.new
|
39
|
+
Backgrounded.handler.expects(:request).with(@dog, :do_stuff, [], {:priority => :high})
|
40
|
+
@dog.backgrounded(:priority => :high).do_stuff
|
40
41
|
end
|
41
42
|
should 'pass options onto Backgrounded.handler' do end # see expectations
|
42
43
|
end
|
data/test/proxy_test.rb
CHANGED
@@ -1,40 +1,51 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
3
|
class ProxyTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class User
|
6
|
-
def do_stuff
|
7
|
-
end
|
4
|
+
class Person
|
8
5
|
def self.do_something_else
|
9
6
|
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Person
|
13
7
|
def do_stuff(name, place, location)
|
14
8
|
end
|
9
|
+
def do_stuff_without_arguments
|
10
|
+
end
|
15
11
|
end
|
16
12
|
|
17
13
|
context 'invoking delegate method' do
|
14
|
+
context 'with arguments and options' do
|
15
|
+
setup do
|
16
|
+
@delegate = Person.new
|
17
|
+
Backgrounded.handler.expects(:request).with(@delegate, :do_stuff, ['foo', 1, 'bar'], {:option_one => 'alpha'})
|
18
|
+
@proxy = Backgrounded::Proxy.new @delegate, :option_one => 'alpha'
|
19
|
+
@result = @proxy.do_stuff 'foo', 1, 'bar'
|
20
|
+
end
|
21
|
+
should "invokes Backgrounded.handler with delegate, method and args" do end #see expectations
|
22
|
+
should 'return nil' do
|
23
|
+
assert_nil @result
|
24
|
+
end
|
25
|
+
end
|
18
26
|
context 'with arguments' do
|
19
27
|
setup do
|
20
28
|
@delegate = Person.new
|
21
|
-
|
29
|
+
Backgrounded.handler.expects(:request).with(@delegate, :do_stuff, ['foo', 1, 'bar'], {})
|
22
30
|
@proxy = Backgrounded::Proxy.new @delegate
|
23
31
|
@result = @proxy.do_stuff 'foo', 1, 'bar'
|
24
32
|
end
|
25
|
-
should "
|
33
|
+
should "invokes Backgrounded.handler with delegate, method and args" do end #see expectations
|
26
34
|
should 'return nil' do
|
27
35
|
assert_nil @result
|
28
36
|
end
|
29
37
|
end
|
30
38
|
context 'with no arguments' do
|
31
39
|
setup do
|
32
|
-
@delegate =
|
33
|
-
|
40
|
+
@delegate = Person.new
|
41
|
+
Backgrounded.handler.expects(:request).with(@delegate, :do_stuff_without_arguments, [], {})
|
34
42
|
@proxy = Backgrounded::Proxy.new @delegate
|
35
|
-
@result = @proxy.
|
43
|
+
@result = @proxy.do_stuff_without_arguments
|
44
|
+
end
|
45
|
+
should "invokes Backgrounded.handler with delegate, method and args" do end #see expectations
|
46
|
+
should 'return nil' do
|
47
|
+
assert_nil @result
|
36
48
|
end
|
37
|
-
should "execute method on delegate" do end #see expectations
|
38
49
|
end
|
39
50
|
end
|
40
51
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
|
2
|
+
ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
|
3
|
+
ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite'])
|
4
|
+
|
5
|
+
ActiveRecord::Schema.define(:version => 1) do
|
6
|
+
create_table :blogs, :force => true do |t|
|
7
|
+
t.column :title, :string
|
8
|
+
t.column :body, :string
|
9
|
+
end
|
10
|
+
create_table :users, :force => true do |t|
|
11
|
+
t.column :name, :string
|
12
|
+
end
|
13
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -9,18 +9,16 @@ rescue Bundler::BundlerError => e
|
|
9
9
|
end
|
10
10
|
require 'test/unit'
|
11
11
|
require 'shoulda'
|
12
|
+
require 'pry'
|
12
13
|
require 'mocha'
|
13
14
|
require 'active_record'
|
14
15
|
|
15
16
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
17
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
17
18
|
require 'backgrounded'
|
19
|
+
require 'setup_database'
|
18
20
|
|
19
21
|
Backgrounded.logger.level = Logger::DEBUG
|
20
22
|
|
21
|
-
config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
|
22
|
-
ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
|
23
|
-
ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite'])
|
24
|
-
|
25
23
|
class Test::Unit::TestCase
|
26
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backgrounded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -107,6 +107,38 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: 0.9.2.2
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: pry
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.9.12
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.9.12
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: test_after_commit
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
110
142
|
description: Execute any ActiveRecord Model method in the background
|
111
143
|
email:
|
112
144
|
- ryan@codecrate.com
|
@@ -124,7 +156,6 @@ files:
|
|
124
156
|
- lib/backgrounded.rb
|
125
157
|
- lib/backgrounded/active_record_extension.rb
|
126
158
|
- lib/backgrounded/concern.rb
|
127
|
-
- lib/backgrounded/handler/abstract_handler.rb
|
128
159
|
- lib/backgrounded/handler/inprocess_handler.rb
|
129
160
|
- lib/backgrounded/handler/no_op_handler.rb
|
130
161
|
- lib/backgrounded/proxy.rb
|
@@ -133,6 +164,7 @@ files:
|
|
133
164
|
- test/backgrounded_test.rb
|
134
165
|
- test/database.yml
|
135
166
|
- test/proxy_test.rb
|
167
|
+
- test/setup_database.rb
|
136
168
|
- test/test_helper.rb
|
137
169
|
homepage: http://github.com/wireframe/backgrounded
|
138
170
|
licenses: []
|
@@ -148,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
180
|
version: '0'
|
149
181
|
segments:
|
150
182
|
- 0
|
151
|
-
hash: -
|
183
|
+
hash: -3451700657100239997
|
152
184
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
185
|
none: false
|
154
186
|
requirements:
|
@@ -157,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
189
|
version: '0'
|
158
190
|
segments:
|
159
191
|
- 0
|
160
|
-
hash: -
|
192
|
+
hash: -3451700657100239997
|
161
193
|
requirements: []
|
162
194
|
rubyforge_project: backgrounded
|
163
195
|
rubygems_version: 1.8.24
|
@@ -169,4 +201,5 @@ test_files:
|
|
169
201
|
- test/backgrounded_test.rb
|
170
202
|
- test/database.yml
|
171
203
|
- test/proxy_test.rb
|
204
|
+
- test/setup_database.rb
|
172
205
|
- test/test_helper.rb
|