backgrounded-resque 2.0.0.pre1

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/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ .document
2
+ *.sw?
3
+ .DS_Store
4
+ coverage
5
+ rdoc
6
+ pkg
7
+ *.sqlite3
8
+ *.log
9
+
10
+ *.gem
11
+ .bundle
12
+ Gemfile.lock
13
+ pkg/*
data/.rvmrc ADDED
@@ -0,0 +1,5 @@
1
+ rvm use 1.9.3@backgrounded --create
2
+ if ! command -v bundle ; then
3
+ gem install bundler
4
+ bundle install --local
5
+ fi
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in backgrounded.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Ryan Sonnek
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,37 @@
1
+ = Backgrounded
2
+
3
+ The cleanest way to integrate background processing into your application.
4
+
5
+ Backgrounded provides a thin wrapper around any background processing framework that implements the Backgrounded handler API which makes it trivial to swap out processing frameworks with no impact to your code.
6
+
7
+ This library is an extension which add support for the Resque job processing framework
8
+ see http://github.com/defunkt/resque/
9
+
10
+ = Features
11
+ * execute class or instance level methods within resque background workers
12
+ * supports enqueing jobs into custom queues
13
+
14
+ = Installation
15
+
16
+ Bundler Gemfile configuration
17
+
18
+ gem 'backgrounded-resque'
19
+
20
+ Backgrounded Configuration
21
+
22
+ # config/initializers/backgrounded.rb
23
+ require 'backgrounded/handler/resque_handler'
24
+ Backgrounded.handler = Backgrounded::Handler::ResqueHandler.new
25
+
26
+ = Usage
27
+ user = User.new
28
+
29
+ # perform work on the default backgrounded queue
30
+ user.backgrounded.do_something
31
+
32
+ # perform work on a custom queue
33
+ user.backgrounded(:queue => 'custom').do_something_else
34
+
35
+ == Copyright
36
+
37
+ Copyright (c) 2012 Ryan Sonnek. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/*_test.rb'
8
+ test.verbose = true
9
+ end
10
+ task :default => :test
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "backgrounded/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "backgrounded-resque"
7
+ s.version = Backgrounded::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ryan Sonnek"]
10
+ s.email = ["ryan@codecrate.com"]
11
+ s.homepage = "http://github.com/wireframe/backgrounded"
12
+ s.summary = %q{Simple API to perform work in the background}
13
+ s.description = %q{Execute any ActiveRecord Model method in the background}
14
+
15
+ s.rubyforge_project = "backgrounded"
16
+
17
+ s.add_runtime_dependency(%q<backgrounded>, [">= 2.0.0.pre1"])
18
+ s.add_runtime_dependency(%q<resque>, [">= 0.17.1"])
19
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
20
+ s.add_development_dependency(%q<resque_unit>, [">= 0.3.7"])
21
+ s.add_development_dependency(%q<resque_unit>, [">= 0.3.7"])
22
+ s.add_development_dependency(%q<mocha>, [">= 0"])
23
+ s.add_development_dependency(%q<sqlite3-ruby>, [">= 1.3.2"])
24
+ s.add_development_dependency(%q<rake>, [">= 0.9.2.2"])
25
+
26
+ s.files = `git ls-files`.split("\n")
27
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
28
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
29
+ s.require_paths = ["lib"]
30
+ end
@@ -0,0 +1,14 @@
1
+ require 'resque'
2
+
3
+ # handler that acts like the in process handler but marshalls the arguments
4
+ # this simulates how resque encodes/decodes values to/from redis
5
+ # useful when passing symbols to arguments and they end up being processed as strings
6
+ module Backgrounded
7
+ module Handler
8
+ class PseudoResqueHandler
9
+ def request(object, method, args, options={})
10
+ object.send method, *Resque.decode(Resque.encode(args))
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'resque'
2
+
3
+ module Backgrounded
4
+ module Handler
5
+ #enque requests in resque
6
+ class ResqueHandler
7
+ DEFAULT_QUEUE = 'backgrounded'
8
+ INVALID_ID = -1
9
+ @@queue = DEFAULT_QUEUE
10
+
11
+ def request(object, method, args, options={})
12
+ @@queue = options[:queue] || DEFAULT_QUEUE
13
+ instance, id = instance_identifiers(object)
14
+ Resque.enqueue(ResqueHandler, instance, id, method, *args)
15
+ end
16
+ def self.queue
17
+ @@queue
18
+ end
19
+ def self.perform(clazz, id, method, *args)
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
+ id.to_i == INVALID_ID ? clazz : clazz.find(id)
27
+ end
28
+ def instance_identifiers(object)
29
+ instance, id = if object.is_a?(Class)
30
+ [object.name, INVALID_ID]
31
+ else
32
+ [object.class.name, object.id]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Backgrounded
2
+ VERSION = "2.0.0.pre1"
3
+ end
@@ -0,0 +1,120 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+ require 'backgrounded/handler/resque_handler'
3
+ require 'resque_unit'
4
+
5
+ ActiveRecord::Schema.define(:version => 1) do
6
+ create_table :blogs, :force => true do |t|
7
+ t.column :name, :string
8
+ end
9
+
10
+ create_table :users, :force => true do |t|
11
+ t.column :name, :string
12
+ end
13
+
14
+ create_table :posts, :force => true do |t|
15
+ t.column :title, :string
16
+ end
17
+ end
18
+
19
+ class ResqueHandlerTest < Test::Unit::TestCase
20
+ class User < ActiveRecord::Base
21
+ def do_stuff
22
+ end
23
+ end
24
+
25
+ class Post < ActiveRecord::Base
26
+ def do_stuff
27
+ end
28
+ end
29
+
30
+ class Blog < ActiveRecord::Base
31
+ class << self
32
+ def do_stuff
33
+ end
34
+ end
35
+ def do_stuff
36
+ end
37
+ end
38
+
39
+ context 'when backgrounded is configured with resque' do
40
+ setup do
41
+ Resque.reset!
42
+ @handler = Backgrounded::Handler::ResqueHandler.new
43
+ Backgrounded.handler = @handler
44
+ end
45
+
46
+ context 'a class level backgrounded method' do
47
+ context "invoking backgrounded method" do
48
+ setup do
49
+ Blog.backgrounded.do_stuff
50
+ end
51
+ should "enqueue job to resque" do
52
+ assert_queued Backgrounded::Handler::ResqueHandler, [Blog.to_s, -1, 'do_stuff']
53
+ assert_equal Backgrounded::Handler::ResqueHandler::DEFAULT_QUEUE, Resque.queue_from_class(Backgrounded::Handler::ResqueHandler)
54
+ end
55
+ context "running background job" do
56
+ setup do
57
+ Blog.expects(:do_stuff)
58
+ Resque.run!
59
+ end
60
+ should "invoke method on class" do end #see expectations
61
+ end
62
+ end
63
+ context 'with an instance level backgrounded method of the same name' do
64
+ setup do
65
+ @blog = Blog.create
66
+ @blog.backgrounded.do_stuff
67
+ end
68
+ should "enqueue instance method job to resque" do
69
+ assert_queued Backgrounded::Handler::ResqueHandler, [Blog.to_s, @blog.id, 'do_stuff']
70
+ assert_equal Backgrounded::Handler::ResqueHandler::DEFAULT_QUEUE, Resque.queue_from_class(Backgrounded::Handler::ResqueHandler)
71
+ end
72
+ context "running background job" do
73
+ setup do
74
+ Blog.expects(:do_stuff).never
75
+ Blog.any_instance.expects(:do_stuff)
76
+ Resque.run!
77
+ end
78
+ should "invoke method on instance" do end #see expectations
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'a persisted object with a single backgrounded method' do
84
+ setup do
85
+ @user = User.create
86
+ end
87
+ context "invoking backgrounded method" do
88
+ setup do
89
+ @user.backgrounded.do_stuff
90
+ end
91
+ should "enqueue job to resque" do
92
+ assert_queued Backgrounded::Handler::ResqueHandler, [User.to_s, @user.id, 'do_stuff']
93
+ assert_equal Backgrounded::Handler::ResqueHandler::DEFAULT_QUEUE, Resque.queue_from_class(Backgrounded::Handler::ResqueHandler)
94
+ end
95
+ context "running background job" do
96
+ should "invoke method on user object" do
97
+ User.any_instance.expects(:do_stuff)
98
+ Resque.run!
99
+ end
100
+ end
101
+ end
102
+
103
+ context 'a persisted object with backgrounded method with options' do
104
+ setup do
105
+ @post = Post.create
106
+ end
107
+ context "invoking backgrounded method" do
108
+ setup do
109
+ @post.backgrounded(:queue => 'important').do_stuff
110
+ end
111
+ should "use configured queue" do
112
+ assert_equal 'important', Backgrounded::Handler::ResqueHandler.queue
113
+ assert_equal 'important', Resque.queue_from_class(Backgrounded::Handler::ResqueHandler)
114
+ assert_equal 1, Resque.queue('important').length
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
data/test/database.yml ADDED
@@ -0,0 +1,3 @@
1
+ sqlite:
2
+ adapter: sqlite3
3
+ database: test/backgrounded.sqlite3
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+ require 'mocha'
13
+ require 'active_record'
14
+
15
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
16
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
17
+ require 'backgrounded'
18
+
19
+ Backgrounded.logger.level = Logger::DEBUG
20
+
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
+ class Test::Unit::TestCase
26
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: backgrounded-resque
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0.pre1
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Sonnek
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: backgrounded
16
+ requirement: &2179202580 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.0.pre1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2179202580
25
+ - !ruby/object:Gem::Dependency
26
+ name: resque
27
+ requirement: &2179202060 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.17.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2179202060
36
+ - !ruby/object:Gem::Dependency
37
+ name: shoulda
38
+ requirement: &2179201580 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2179201580
47
+ - !ruby/object:Gem::Dependency
48
+ name: resque_unit
49
+ requirement: &2179201100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.7
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2179201100
58
+ - !ruby/object:Gem::Dependency
59
+ name: resque_unit
60
+ requirement: &2179200620 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 0.3.7
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2179200620
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: &2179200140 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2179200140
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3-ruby
82
+ requirement: &2179199660 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: 1.3.2
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2179199660
91
+ - !ruby/object:Gem::Dependency
92
+ name: rake
93
+ requirement: &2179199180 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: 0.9.2.2
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2179199180
102
+ description: Execute any ActiveRecord Model method in the background
103
+ email:
104
+ - ryan@codecrate.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - .gitignore
110
+ - .rvmrc
111
+ - Gemfile
112
+ - LICENSE
113
+ - README.rdoc
114
+ - Rakefile
115
+ - backgrounded.gemspec
116
+ - lib/backgrounded/handler/pseudo_resque_handler.rb
117
+ - lib/backgrounded/handler/resque_handler.rb
118
+ - lib/backgrounded/version.rb
119
+ - test/backgrounded/handler/resque_handler_test.rb
120
+ - test/database.yml
121
+ - test/test_helper.rb
122
+ homepage: http://github.com/wireframe/backgrounded
123
+ licenses: []
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ segments:
135
+ - 0
136
+ hash: 3144533850957425411
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>'
141
+ - !ruby/object:Gem::Version
142
+ version: 1.3.1
143
+ requirements: []
144
+ rubyforge_project: backgrounded
145
+ rubygems_version: 1.8.15
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Simple API to perform work in the background
149
+ test_files:
150
+ - test/backgrounded/handler/resque_handler_test.rb
151
+ - test/database.yml
152
+ - test/test_helper.rb