backgrounded 0.3.1 → 0.4.1

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 CHANGED
@@ -3,3 +3,5 @@
3
3
  coverage
4
4
  rdoc
5
5
  pkg
6
+ *.sqlite3
7
+ *.log
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ Background processing done right.
5
5
  = Features
6
6
  * clean and concise API
7
7
  * testable
8
- * integrates with any background processing framework (DelayedJob, JobFu, Workling, etc)
8
+ * integrates with any background processing framework (DelayedJob, Resque, JobFu, Workling, etc)
9
9
 
10
10
  = Usage
11
11
 
@@ -25,11 +25,15 @@ Background processing done right.
25
25
 
26
26
  Command line installation
27
27
 
28
- sudo gem install wireframe-backgrounded
28
+ sudo gem install backgrounded
29
29
 
30
30
  Rails environment.rb configuration
31
31
 
32
- config.gem 'wireframe-backgrounded', :source => 'http://gems.github.com', :lib => 'backgrounded'
32
+ config.gem 'backgrounded'
33
+
34
+ Gemfile configuration
35
+
36
+ gem 'backgrounded'
33
37
 
34
38
  = Configuration
35
39
 
@@ -40,22 +44,32 @@ Backgrounded provides a thin wrapper around any background processing framework
40
44
  An implementation for DelayedJob is packaged directly with Backgrounded for a slick out of the box experience.
41
45
  see http://github.com/tobi/delayed_job/tree/master
42
46
 
43
- # rails config/initializers/backgrounded.rb
47
+ # config/initializers/backgrounded.rb
48
+ require 'backgrounded/handler/delayed_job_handler'
44
49
  Backgrounded.handler = Backgrounded::Handler::DelayedJobHandler.new
45
50
 
51
+ = Resque
52
+
53
+ An implementation for Resque is packaged directly with Backgrounded for a slick out of the box experience.
54
+ see http://github.com/defunkt/resque/
55
+
56
+ # config/initializers/backgrounded.rb
57
+ require 'backgrounded/handler/resque_handler'
58
+ Backgrounded.handler = Backgrounded::Handler::ResqueHandler.new
59
+
46
60
  = JobFu
47
61
 
48
62
  Developers using the JobFu library have it easy as well!
49
63
  see http://github.com/jnstq/job_fu/tree
50
64
 
51
- # rails config/initializers/backgrounded.rb
65
+ # config/initializers/backgrounded.rb
52
66
  Backgrounded.handler = JobFu::Backgrounded::Handler.new
53
67
 
54
68
  = Custom Handlers
55
69
 
56
70
  It's trivial to write your own plugin for processing Backgrounded events!
57
71
 
58
- # rails config/initializers/backgrounded.rb
72
+ # config/initializers/backgrounded.rb
59
73
  class MyHandler
60
74
  def request(object, method, *args)
61
75
  #process the call however you want!
data/Rakefile CHANGED
@@ -9,6 +9,10 @@ begin
9
9
  gem.email = "ryan.sonnek@gmail.com"
10
10
  gem.homepage = "http://github.com/wireframe/backgrounded"
11
11
  gem.authors = ["Ryan Sonnek"]
12
+ gem.add_runtime_dependency "activerecord", ">= 2.2.3"
13
+ gem.add_runtime_dependency "activesupport", ">= 2.2.3"
14
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
15
+ gem.add_development_dependency 'resque_unit', ">= 0"
12
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
13
17
  end
14
18
  Jeweler::GemcutterTasks.new
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
+ :minor: 4
3
4
  :build:
4
- :minor: 3
5
5
  :patch: 1
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.3.1"
8
+ s.version = "0.4.1"
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{2009-10-26}
12
+ s.date = %q{2010-09-27}
13
13
  s.email = %q{ryan.sonnek@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE",
@@ -24,19 +24,25 @@ Gem::Specification.new do |s|
24
24
  "VERSION.yml",
25
25
  "backgrounded.gemspec",
26
26
  "lib/backgrounded.rb",
27
- "lib/handler.rb",
28
- "lib/handler/delayed_job_handler.rb",
29
- "lib/handler/inprocess_handler.rb",
27
+ "lib/backgrounded/class_methods.rb",
28
+ "lib/backgrounded/handler/delayed_job_handler.rb",
29
+ "lib/backgrounded/handler/inprocess_handler.rb",
30
+ "lib/backgrounded/handler/resque_handler.rb",
31
+ "test/backgrounded/handler/delayed_job_handler_test.rb",
32
+ "test/backgrounded/handler/resque_handler_test.rb",
30
33
  "test/backgrounded_test.rb",
34
+ "test/database.yml",
31
35
  "test/test_helper.rb"
32
36
  ]
33
37
  s.homepage = %q{http://github.com/wireframe/backgrounded}
34
38
  s.rdoc_options = ["--charset=UTF-8"]
35
39
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.5}
40
+ s.rubygems_version = %q{1.3.7}
37
41
  s.summary = %q{Simple API to run Model methods in the background}
38
42
  s.test_files = [
39
- "test/backgrounded_test.rb",
43
+ "test/backgrounded/handler/delayed_job_handler_test.rb",
44
+ "test/backgrounded/handler/resque_handler_test.rb",
45
+ "test/backgrounded_test.rb",
40
46
  "test/test_helper.rb"
41
47
  ]
42
48
 
@@ -44,10 +50,22 @@ Gem::Specification.new do |s|
44
50
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
51
  s.specification_version = 3
46
52
 
47
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
53
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
+ s.add_runtime_dependency(%q<activerecord>, [">= 2.2.3"])
55
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.2.3"])
56
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
57
+ s.add_development_dependency(%q<resque_unit>, [">= 0"])
48
58
  else
59
+ s.add_dependency(%q<activerecord>, [">= 2.2.3"])
60
+ s.add_dependency(%q<activesupport>, [">= 2.2.3"])
61
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
62
+ s.add_dependency(%q<resque_unit>, [">= 0"])
49
63
  end
50
64
  else
65
+ s.add_dependency(%q<activerecord>, [">= 2.2.3"])
66
+ s.add_dependency(%q<activesupport>, [">= 2.2.3"])
67
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
68
+ s.add_dependency(%q<resque_unit>, [">= 0"])
51
69
  end
52
70
  end
53
71
 
data/lib/backgrounded.rb CHANGED
@@ -1,37 +1,14 @@
1
- require 'activesupport'
1
+ require 'active_support/all'
2
+
3
+ require File.join(File.dirname(__FILE__), 'backgrounded', 'class_methods')
4
+ require File.join(File.dirname(__FILE__), 'backgrounded', 'handler', 'inprocess_handler')
5
+
6
+ Object.send(:include, Backgrounded::ClassMethods)
2
7
 
3
8
  module Backgrounded
4
9
  mattr_accessor :handler
5
10
  def self.handler
6
11
  @@handler ||= Backgrounded::Handler::InprocessHandler.new
7
12
  end
8
-
9
- autoload :Handler, 'handler'
10
-
11
- module Model
12
- def self.included(base)
13
- base.extend(ClassMethods)
14
- end
15
-
16
- module ClassMethods
17
- def backgrounded(*methods)
18
- methods.each do |method|
19
- method_basename, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
20
- define_method :"#{method_basename}_backgrounded#{punctuation}" do |*args|
21
- Backgrounded.handler.request(self, method, *args)
22
- end
23
- end
24
- include Backgrounded::Model::InstanceMethods
25
- extend Backgrounded::Model::SingletonMethods
26
- end
27
- end
28
-
29
- module SingletonMethods
30
- end
31
-
32
- module InstanceMethods
33
- end
34
- end
35
13
  end
36
14
 
37
- Object.send(:include, Backgrounded::Model)
@@ -0,0 +1,12 @@
1
+ module Backgrounded
2
+ module ClassMethods
3
+ def backgrounded(*methods)
4
+ methods.each do |method|
5
+ method_basename, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
6
+ define_method "#{method_basename}_backgrounded#{punctuation}" do |*args|
7
+ Backgrounded.handler.request(self, method, *args)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ require 'resque'
2
+
3
+ module Backgrounded
4
+ module Handler
5
+ #enque requests in resque
6
+ class ResqueHandler
7
+ def request(object, method, *args)
8
+ Resque.enqueue(ResqueHandler, object.class.name, object.id, method, *args)
9
+ end
10
+ def self.queue
11
+ 'backgrounded'
12
+ end
13
+
14
+ def self.perform(clazz, id, method, *args)
15
+ clazz.constantize.find(id).send(method, *args)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+ require 'backgrounded/handler/delayed_job_handler'
3
+ require 'delayed/backend/active_record'
4
+
5
+ ActiveRecord::Schema.define(:version => 1) do
6
+ create_table :users, :force => true do |t|
7
+ t.column :name, :string
8
+ end
9
+ create_table :delayed_jobs, :force => true do |table|
10
+ table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
11
+ table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
12
+ table.text :handler # YAML-encoded string of the object that will do work
13
+ table.string :last_error # reason for last failure (See Note below)
14
+ table.datetime :run_at # When to run. Could be Time.now for immediately, or sometime in the future.
15
+ table.datetime :locked_at # Set when a client is working on this object
16
+ table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
17
+ table.string :locked_by # Who is working on this object (if locked)
18
+ table.timestamps
19
+ end
20
+ end
21
+
22
+ class User < ActiveRecord::Base
23
+ backgrounded :do_stuff
24
+
25
+ def do_stuff
26
+ end
27
+ end
28
+
29
+ class DelayedJobHandlerTest < Test::Unit::TestCase
30
+ context 'when backgrounded is configured with delayed_job' do
31
+ setup do
32
+ Delayed::Worker.backend = :active_record
33
+ @handler = Backgrounded::Handler::DelayedJobHandler.new
34
+ Backgrounded.handler = @handler
35
+ end
36
+
37
+ context 'a persisted object with a single backgrounded method' do
38
+ setup do
39
+ @user = User.create
40
+ end
41
+ context "invoking backgrounded method" do
42
+ setup do
43
+ @user.do_stuff_backgrounded
44
+ end
45
+ should_create Delayed::Job
46
+ should 'create delayed job' do
47
+ job = Delayed::Job.last
48
+ puts job.inspect
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,45 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+ require 'backgrounded/handler/resque_handler'
3
+
4
+ ActiveRecord::Schema.define(:version => 1) do
5
+ create_table :users, :force => true do |t|
6
+ t.column :name, :string
7
+ end
8
+ end
9
+
10
+ class User < ActiveRecord::Base
11
+ backgrounded :do_stuff
12
+
13
+ def do_stuff
14
+ end
15
+ end
16
+
17
+ class ResqueHandlerTest < Test::Unit::TestCase
18
+ context 'when backgrounded is configured with resque' do
19
+ setup do
20
+ Resque.reset!
21
+ @handler = Backgrounded::Handler::ResqueHandler.new
22
+ Backgrounded.handler = @handler
23
+ end
24
+
25
+ context 'a persisted object with a single backgrounded method' do
26
+ setup do
27
+ @user = User.create
28
+ end
29
+ context "invoking backgrounded method" do
30
+ setup do
31
+ @user.do_stuff_backgrounded
32
+ end
33
+ should "enqueue job to resque" do
34
+ assert_queued Backgrounded::Handler::ResqueHandler
35
+ end
36
+ context "running background job" do
37
+ should "invoke method on user object" do
38
+ User.any_instance.expects(:do_stuff)
39
+ Resque.run!
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
data/test/database.yml ADDED
@@ -0,0 +1,3 @@
1
+ sqlite:
2
+ adapter: sqlite3
3
+ database: test/backgrounded.sqlite3
data/test/test_helper.rb CHANGED
@@ -2,10 +2,16 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
4
  require 'mocha'
5
+ require 'active_record'
6
+ require 'resque_unit'
5
7
 
6
8
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
9
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
10
  require 'backgrounded'
9
11
 
12
+ config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
13
+ ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
14
+ ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite'])
15
+
10
16
  class Test::Unit::TestCase
11
17
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backgrounded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ hash: 13
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 1
10
+ version: 0.4.1
5
11
  platform: ruby
6
12
  authors:
7
13
  - Ryan Sonnek
@@ -9,10 +15,69 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-10-26 00:00:00 -05:00
18
+ date: 2010-09-27 00:00:00 -05:00
13
19
  default_executable:
14
- dependencies: []
15
-
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activerecord
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 1
30
+ segments:
31
+ - 2
32
+ - 2
33
+ - 3
34
+ version: 2.2.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: activesupport
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 1
46
+ segments:
47
+ - 2
48
+ - 2
49
+ - 3
50
+ version: 2.2.3
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: thoughtbot-shoulda
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: resque_unit
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id004
16
81
  description:
17
82
  email: ryan.sonnek@gmail.com
18
83
  executables: []
@@ -31,10 +96,14 @@ files:
31
96
  - VERSION.yml
32
97
  - backgrounded.gemspec
33
98
  - lib/backgrounded.rb
34
- - lib/handler.rb
35
- - lib/handler/delayed_job_handler.rb
36
- - lib/handler/inprocess_handler.rb
99
+ - lib/backgrounded/class_methods.rb
100
+ - lib/backgrounded/handler/delayed_job_handler.rb
101
+ - lib/backgrounded/handler/inprocess_handler.rb
102
+ - lib/backgrounded/handler/resque_handler.rb
103
+ - test/backgrounded/handler/delayed_job_handler_test.rb
104
+ - test/backgrounded/handler/resque_handler_test.rb
37
105
  - test/backgrounded_test.rb
106
+ - test/database.yml
38
107
  - test/test_helper.rb
39
108
  has_rdoc: true
40
109
  homepage: http://github.com/wireframe/backgrounded
@@ -46,24 +115,32 @@ rdoc_options:
46
115
  require_paths:
47
116
  - lib
48
117
  required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
49
119
  requirements:
50
120
  - - ">="
51
121
  - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
52
125
  version: "0"
53
- version:
54
126
  required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
55
128
  requirements:
56
129
  - - ">="
57
130
  - !ruby/object:Gem::Version
131
+ hash: 3
132
+ segments:
133
+ - 0
58
134
  version: "0"
59
- version:
60
135
  requirements: []
61
136
 
62
137
  rubyforge_project:
63
- rubygems_version: 1.3.5
138
+ rubygems_version: 1.3.7
64
139
  signing_key:
65
140
  specification_version: 3
66
141
  summary: Simple API to run Model methods in the background
67
142
  test_files:
143
+ - test/backgrounded/handler/delayed_job_handler_test.rb
144
+ - test/backgrounded/handler/resque_handler_test.rb
68
145
  - test/backgrounded_test.rb
69
146
  - test/test_helper.rb
data/lib/handler.rb DELETED
@@ -1,10 +0,0 @@
1
- require 'activesupport'
2
-
3
- module Backgrounded
4
- module Handler
5
- Dir["#{File.dirname(__FILE__)}/#{name.demodulize.underscore}/*.rb"].each do |handler_file|
6
- handler_name = File.basename(handler_file, '.rb').camelize.to_sym
7
- autoload handler_name, File.expand_path(handler_file)
8
- end
9
- end
10
- end