backgrounded 0.3.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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