governor_background 0.2.2 → 0.3.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/Gemfile CHANGED
@@ -16,6 +16,7 @@ group :development, :test do
16
16
  gem 'factory_girl', '~> 2.0.0.beta'
17
17
  gem 'factory_girl_rails', '~> 1.1.beta'
18
18
  gem 'activerecord-nulldb-adapter'
19
+ gem 'json'
19
20
 
20
21
  gem 'will_paginate', '~> 3.0.beta'
21
22
  gem 'devise'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ./
3
3
  specs:
4
- governor_background (0.2.2)
4
+ governor_background (0.3.0)
5
5
  governor
6
6
 
7
7
  GEM
@@ -154,6 +154,7 @@ DEPENDENCIES
154
154
  governor
155
155
  governor_background!
156
156
  jeweler (~> 1.5.2)
157
+ json
157
158
  mocha
158
159
  resque
159
160
  resque-status
@@ -5,14 +5,15 @@ Blagojevich) is the pluggable blogging platform for Rails, built for people
5
5
  who want to build their blog into their website, not build their website into
6
6
  their blog.
7
7
 
8
- *governor_background* is a middle-tier plugin for Governor, allowing you to
9
- tie in additional services that might want to perform blog-related services in
10
- the background. For example, you may want to copy your articles to another
11
- blog service, like Blogger.
8
+ *governor_background* plays nicely with Governor, allowing you to tie in
9
+ additional services that might want to perform blog-related services in the
10
+ background. For example, you may want to tweet a link to your article when
11
+ publishing.
12
12
 
13
13
  == Dependencies
14
14
 
15
- * Governor[http://carpeliam.github.com/governor/]
15
+ * Governor[http://carpeliam.github.com/governor/], although this dependency
16
+ might be removed. GovernorBackground is pretty independent.
16
17
  * Either Delayed_Job[https://github.com/collectiveidea/delayed_job] or
17
18
  Resque[https://github.com/defunkt/resque]. If you use Resque, it's highly
18
19
  recommended that you use
@@ -47,31 +48,40 @@ class, and within that div will be one or more divs with either a 'completed',
47
48
 
48
49
  == Usage
49
50
 
50
- *governor_background* adds a method <code>#run_in_background</code> to your
51
- resource class (by default, the +Article+ class, but this will be any resource
52
- class). To do the same thing from outside of your resource instance, you can
53
- call <code>GovernorBackground::Handler.run_in_background(object,
54
- :method_name)</code>. In order to build on top of *governor_background*,
55
- you'll need to do one of two things:
56
-
57
- 1. Call +run_in_background+, either from your resource instance or on
58
- <code>GovernorBackground::Handler</code>. Pass it an object and the name of the
59
- method (as a symbol) that you wish to call on that object. Arguments to
60
- this method are not currently supported.
61
- 2. In your I18n settings, define entries for your method, for each finished
62
- status (completed, failed, and killed). You'll have access in your entry to
63
- the resource as well as any message passed from the background service.
64
- (The default <code>#to_s</code> for Article displays the title, as of
65
- Governor 0.3.1.) For example, if your method were 'post_to_blogger', you
66
- might have the following in your <code>config/locales/en.yml</code> file:
67
-
68
- en:
69
- governor_background:
70
- post_to_blogger_completed: '"%{resource}" was completed successfully.'
71
- post_to_blogger_failed: '"%{resource}" could not be created: %{message}.'
72
- post_to_blogger_killed: '"%{resource}" was interrupted: %{message}.'
73
-
74
- Please see governor_blogger[https://github.com/carpeliam/governor_blogger] as
51
+ Background jobs happen in two stages in governor_background: first, they get
52
+ *registered*, then they get *run*.
53
+
54
+ 1. *register*: To register a job, you give it a name and call
55
+ <code>GovernorBackground.register</code>:
56
+
57
+ GovernorBackground.register('twitter_post') do |content|
58
+ Twitter.update(content)
59
+ end
60
+
61
+ You'll want to do this once when the application is first started.
62
+ 2. *run*: When you're ready to run your background task, call
63
+ <code>GovernorBackground.run</code>:
64
+
65
+ GovernorBackground.run('twitter_post', 'I am so awesome')
66
+
67
+ GovernorBackground will look for a task registered as +twitter_post+ and
68
+ run its associated block, including any arguments you passed to +run+.
69
+
70
+ Job names have to be _globally unique_; a good practice can be to preface your
71
+ job name with the name of your plugin and an underscore.
72
+
73
+ In your I18n settings, add an entry for your job name for each finished status
74
+ (completed, failed, and killed). You'll have access in your entry to any
75
+ message passed from the background service. For the above example, you might
76
+ have the following in your <code>config/locales/en.yml</code> file:
77
+
78
+ en:
79
+ governor_background:
80
+ twitter_post_completed: 'Your article was successfully posted to Twitter.'
81
+ twitter_post_failed: 'Unable to tweet your article: %{message}.'
82
+ twitter_post_killed: 'Your tweet was interrupted: %{message}.'
83
+
84
+ Please see governor_twitter[https://github.com/carpeliam/governor_twitter] as
75
85
  an example usage of *governor_background*.
76
86
 
77
87
  == Contributing to governor_background
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{governor_background}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Liam Morley"]
12
- s.date = %q{2011-05-13}
12
+ s.date = %q{2011-05-15}
13
13
  s.description = %q{A middle-tier plugin for the Rails 3-based Governor blogging system, allowing you to tie in additional services that might want to perform blog-related services in the background.}
14
14
  s.email = %q{liam@carpeliam.com}
15
15
  s.extra_rdoc_files = [
@@ -37,11 +37,13 @@ Gem::Specification.new do |s|
37
37
  "lib/governor_background/resque/job.rb",
38
38
  "lib/governor_background/resque/performer.rb",
39
39
  "lib/governor_background/resque/performer_with_state.rb",
40
+ "lib/governor_background/resque/resource.rb",
40
41
  "spec/governor_background/delayed/job_spec.rb",
41
42
  "spec/governor_background/handler_spec.rb",
42
43
  "spec/governor_background/job_manager_spec.rb",
43
44
  "spec/governor_background/resque/performer_spec.rb",
44
45
  "spec/governor_background/resque/performer_with_state_spec.rb",
46
+ "spec/governor_background/resque/resource_spec.rb",
45
47
  "spec/governor_background_spec.rb",
46
48
  "spec/rails_app/.gitignore",
47
49
  "spec/rails_app/Gemfile",
@@ -114,6 +116,7 @@ Gem::Specification.new do |s|
114
116
  "spec/governor_background/job_manager_spec.rb",
115
117
  "spec/governor_background/resque/performer_spec.rb",
116
118
  "spec/governor_background/resque/performer_with_state_spec.rb",
119
+ "spec/governor_background/resque/resource_spec.rb",
117
120
  "spec/governor_background_spec.rb",
118
121
  "spec/rails_app/app/controllers/application_controller.rb",
119
122
  "spec/rails_app/app/controllers/home_controller.rb",
@@ -158,6 +161,7 @@ Gem::Specification.new do |s|
158
161
  s.add_development_dependency(%q<factory_girl>, ["~> 2.0.0.beta"])
159
162
  s.add_development_dependency(%q<factory_girl_rails>, ["~> 1.1.beta"])
160
163
  s.add_development_dependency(%q<activerecord-nulldb-adapter>, [">= 0"])
164
+ s.add_development_dependency(%q<json>, [">= 0"])
161
165
  s.add_development_dependency(%q<will_paginate>, ["~> 3.0.beta"])
162
166
  s.add_development_dependency(%q<devise>, [">= 0"])
163
167
  s.add_development_dependency(%q<governor_background>, [">= 0"])
@@ -175,6 +179,7 @@ Gem::Specification.new do |s|
175
179
  s.add_dependency(%q<factory_girl>, ["~> 2.0.0.beta"])
176
180
  s.add_dependency(%q<factory_girl_rails>, ["~> 1.1.beta"])
177
181
  s.add_dependency(%q<activerecord-nulldb-adapter>, [">= 0"])
182
+ s.add_dependency(%q<json>, [">= 0"])
178
183
  s.add_dependency(%q<will_paginate>, ["~> 3.0.beta"])
179
184
  s.add_dependency(%q<devise>, [">= 0"])
180
185
  s.add_dependency(%q<governor_background>, [">= 0"])
@@ -193,6 +198,7 @@ Gem::Specification.new do |s|
193
198
  s.add_dependency(%q<factory_girl>, ["~> 2.0.0.beta"])
194
199
  s.add_dependency(%q<factory_girl_rails>, ["~> 1.1.beta"])
195
200
  s.add_dependency(%q<activerecord-nulldb-adapter>, [">= 0"])
201
+ s.add_dependency(%q<json>, [">= 0"])
196
202
  s.add_dependency(%q<will_paginate>, ["~> 3.0.beta"])
197
203
  s.add_dependency(%q<devise>, [">= 0"])
198
204
  s.add_dependency(%q<governor_background>, [">= 0"])
@@ -5,18 +5,47 @@ require 'governor_background/delayed/job'
5
5
  require 'governor_background/delayed/performer'
6
6
  require 'governor_background/resque/job'
7
7
  require 'governor_background/resque/performer'
8
+ require 'governor_background/resque/resource'
8
9
  require 'governor_background/controllers/methods'
9
10
 
10
- background = Governor::Plugin.new('background')
11
-
12
- background.register_model_callback do |base|
13
- module InstanceMethods
14
- private
15
- def run_in_background(method, *arguments)
16
- GovernorBackground::Handler.run_in_background self, method, *arguments
17
- end
18
- end
19
- base.send :include, InstanceMethods
11
+ begin
12
+ require 'governor_background/resque/performer_with_state'
13
+ rescue LoadError
14
+ $stderr.puts 'resque-status gem not installed, GovernorBackground resque jobs unable to report status'
20
15
  end
21
16
 
22
- Governor::PluginManager.register background
17
+ module GovernorBackground
18
+ @@blocks = {}
19
+ # Registers this job to be run later. Must be called upon application
20
+ # initialization.
21
+ #
22
+ # Example:
23
+ #
24
+ # GovernorBackground.register('twitter_post') do |content|
25
+ # Twitter.update(content)
26
+ # end
27
+ #
28
+ # Job names must be globally unique. It's recommended that you preface the
29
+ # job name with the name of the containing plugin.
30
+ def self.register(job_name, &block)
31
+ @@blocks[job_name.to_s] = block
32
+ end
33
+
34
+ # Runs the job with the supplied arguments.
35
+ #
36
+ # Example:
37
+ #
38
+ # GovernorBackground.run('twitter_post', 'I am so awesome')
39
+ #
40
+ # +job_name+ refers to the identifier for a previously registered job.
41
+ def self.run(job_name, *arguments)
42
+ GovernorBackground::Handler.run_in_background job_name, *arguments
43
+ end
44
+
45
+ # Retrieves the block for a +job_name+, which must have been previously
46
+ # registered. This will return a Proc object if the job is found, or +nil+
47
+ # if no job was registered under this name.
48
+ def self.retrieve(job_name)
49
+ @@blocks[job_name.to_s]
50
+ end
51
+ end
@@ -9,7 +9,7 @@ module GovernorBackground
9
9
  finished_jobs = GovernorBackground::JobManager.finished_jobs
10
10
  unless finished_jobs.blank?
11
11
  flash[:governor_background] = finished_jobs.map do |job|
12
- [job.status, t("#{job.method_name}_#{job.status}", :resource => job.resource, :message => job.message, :default => [job.status, job.status.to_sym], :scope => :governor_background)]
12
+ [job.status, t("#{job.name}_#{job.status}", :message => job.message, :default => [job.status, job.status.to_sym], :scope => :governor_background)]
13
13
  end
14
14
  end
15
15
  end
@@ -1,44 +1,58 @@
1
1
  module GovernorBackground
2
2
  module Delayed
3
+ # A wrapper around ::Delayed::Job.
3
4
  class Job
4
- attr_reader :resource, :method_name, :created_at
5
- def initialize(resource, method_name, job)
6
- @resource = resource
7
- @method_name = method_name
5
+ attr_reader :name, :created_at
6
+ # Initializes the job with a job name (passed from
7
+ # <code>GovernorBackground.run</code>) and the original delayed_job job.
8
+ def initialize(name, job)
9
+ @name = name
8
10
  @id = job.try(:id)
9
11
  @created_at = Time.now
10
12
  end
11
13
 
14
+ # Returns true if this job is currently waiting in the queue, false
15
+ # otherwise.
12
16
  def queued?
13
17
  job_queued?
14
18
  end
15
19
 
20
+ # Returns true if this job is currently being processed, false
21
+ # otherwise.
16
22
  def working?
17
23
  job_working?
18
24
  end
19
25
 
26
+ # Returns true if this job has been completed, false otherwise.
20
27
  def completed?
21
28
  job_completed?
22
29
  end
23
30
 
31
+ # Returns true if this job has failed, false otherwise.
24
32
  def failed?
25
33
  job_failed?
26
34
  end
27
35
 
36
+ # Always returns false; as far as I know, you can't tell if a job has
37
+ # been killed.
28
38
  def killed?
29
- # as far as i know, you can't tell if a job has been killed
30
39
  false
31
40
  end
32
41
 
42
+ # Returns the status of the job, which can be any of the boolean methods
43
+ # or +unknown+.
33
44
  def status
34
45
  job = delayed_job
35
46
  return 'queued' if job_queued?(job)
36
47
  return 'working' if job_working?(job)
37
48
  return 'completed' if job_completed?(job)
38
49
  return 'failed' if job_failed?(job)
39
- raise 'Status unknown.' # we should never get here.
50
+ return 'unknown'
40
51
  end
41
52
 
53
+ # Returns a human readable message describing the status. If the job has
54
+ # failed, this will include the error message, otherwise the status
55
+ # itself will be returned.
42
56
  def message
43
57
  (job = delayed_job) && job.failed? ?
44
58
  job.last_error.lines.first.chomp.gsub(/^\{/, '') :
@@ -1,16 +1,8 @@
1
1
  module GovernorBackground
2
2
  module Delayed
3
- class Performer < Struct.new(:article, :method_name, :arguments)
3
+ class Performer < Struct.new(:job_name, :arguments)
4
4
  def perform
5
- if arguments.blank?
6
- article.send(method_name)
7
- else
8
- article.send(method_name, *arguments)
9
- end
10
- end
11
-
12
- def error(job, exception)
13
- # handle failure
5
+ GovernorBackground.retrieve(job_name).call(*arguments)
14
6
  end
15
7
  end
16
8
  end
@@ -1,20 +1,23 @@
1
1
  module GovernorBackground
2
2
  class Handler
3
3
  class << self
4
- def run_in_background(object, method, *arguments)
4
+ # Handles incoming jobs, routes them to Delayed_Job or Resque (whichever
5
+ # one is installed within the app), and adds them to the +JobManager+.
6
+ def run_in_background(job_name, *arguments)
5
7
  job = if delayed_job?
6
- Delayed::Job.new(object, method, ::Delayed::Job.enqueue(Delayed::Performer.new(object, method, arguments)))
8
+ Delayed::Job.new(job_name, ::Delayed::Job.enqueue(Delayed::Performer.new(job_name, arguments)))
7
9
  elsif resque?
8
- resource_key, id = object.class.name.tableize.to_sym, object.id
10
+ resque_args = arguments.map do |arg|
11
+ arg.is_a?(ActiveRecord::Base) ? Resque::Resource.new(arg) : arg
12
+ end
9
13
  if resque_with_status?
10
- require File.expand_path('../resque/performer_with_state', __FILE__)
11
- Resque::Job.new(object, method, Resque::PerformerWithState.create(:resource => resource_key, :id => id, :method_name => method, :arguments => arguments))
14
+ Resque::Job.new(job_name, Resque::PerformerWithState.create(:job_name => job_name, :arguments => resque_args))
12
15
  else
13
- ::Resque.enqueue(Resque::Performer, resource_key, id, method, arguments)
16
+ ::Resque.enqueue(Resque::Performer, job_name, *resque_args)
14
17
  nil # not much use in holding on to state if we can't track it
15
18
  end
16
19
  end
17
- JobManager.add(job) unless job.blank?
20
+ JobManager.add(job) if job
18
21
  end
19
22
 
20
23
  private
@@ -1,17 +1,25 @@
1
1
  module GovernorBackground
2
+ # Tracks the progress of jobs, enables reporting of finished jobs, and
3
+ # cleans stale jobs.
2
4
  class JobManager
3
5
  @@finished_statuses = %w(completed failed killed).freeze
4
6
  cattr_reader :jobs
5
7
  class << self
6
8
  @@jobs = []
9
+ # Adds a job to the queue.
7
10
  def add(job)
8
11
  @@jobs << job
9
12
  end
10
13
 
14
+ # Purges any jobs that are older than the specified time. This only
15
+ # removes the job wrapper from memory, it does not cancel a job if it is
16
+ # still running.
11
17
  def clean(time = 1.day.ago)
12
18
  @@jobs.reject!{|j| j.created_at < time}
13
19
  end
14
20
 
21
+ # Returns and purges any jobs that have either been completed, failed,
22
+ # or killed.
15
23
  def finished_jobs
16
24
  finished_jobs = @@jobs.select{|j| @@finished_statuses.include? j.status }
17
25
  @@jobs -= finished_jobs
@@ -1,46 +1,58 @@
1
- module Governor
1
+ module GovernorBackground
2
2
  module Resque
3
+ # A wrapper around a Resque job.
3
4
  class Job
4
- attr_reader :resource, :method_name, :created_at
5
- def initialize(resource, method_name, job_id)
6
- @resource = resource
7
- @method_name = method_name
5
+ attr_reader :name, :created_at
6
+ # Initializes the job with a job name (passed from
7
+ # <code>GovernorBackground.run</code>) and a unique identifier for the
8
+ # Resque job.
9
+ def initialize(name, job_id)
10
+ @name = name
8
11
  @id = job_id
9
12
  @created_at = Time.now
10
13
  end
11
14
 
15
+ # Returns the status of the job, which can be any of the boolean methods
16
+ # or +unknown+.
12
17
  def status
13
- # if we can't find it, assume it's been killed (not really sure if this is the proper assumption)
14
- (job = resque_status) ? job.status : 'killed'
18
+ (job = resque_status) ? job.status : 'unknown'
15
19
  end
16
20
 
21
+ # Returns true if this job is currently waiting in the queue, false
22
+ # otherwise.
17
23
  def queued?
18
24
  proxy :queued?
19
25
  end
20
26
 
27
+ # Returns true if this job is currently being processed, false
28
+ # otherwise.
21
29
  def working?
22
30
  proxy :working?
23
31
  end
24
32
 
33
+ # Returns true if this job has been completed, false otherwise.
25
34
  def completed?
26
35
  proxy :completed?
27
36
  end
28
37
 
38
+ # Returns true if this job has failed, false otherwise.
29
39
  def failed?
30
40
  proxy :failed?
31
41
  end
32
42
 
43
+ # Returns true if this job has been killed, false otherwise.
33
44
  def killed?
34
45
  proxy :killed?
35
46
  end
36
47
 
48
+ # Returns a human readable message describing the status.
37
49
  def message
38
50
  proxy :message, ''
39
51
  end
40
52
 
41
53
  private
42
54
  def resque_status
43
- Resque::Status.get(@id)
55
+ ::Resque::Status.get(@id)
44
56
  end
45
57
 
46
58
  def proxy(method, default=false)
@@ -1,15 +1,14 @@
1
1
  module GovernorBackground
2
2
  module Resque
3
+ # Used when the resque-status gem hasn't been installed. If resque-status
4
+ # hasn't been installed, jobs won't be added to the JobManager, as there
5
+ # won't be any way to track the state, and so progress will not be
6
+ # reported.
3
7
  class Performer
4
8
  @queue = :governor
5
9
 
6
- def self.perform(resource, id, method_name, *arguments)
7
- article = Governor.resources[resource].to.find(id)
8
- if arguments.blank?
9
- article.send(method_name)
10
- else
11
- article.send(method_name, arguments)
12
- end
10
+ def self.perform(job_name, *arguments)
11
+ GovernorBackground.retrieve(job_name).call(*arguments)
13
12
  end
14
13
  end
15
14
  end
@@ -1,20 +1,16 @@
1
+ require 'resque/job_with_status'
1
2
  module GovernorBackground
2
3
  module Resque
4
+ # Used when the resque-status gem has been installed.
3
5
  class PerformerWithState < ::Resque::JobWithStatus
4
6
  def self.queue
5
7
  :governor
6
8
  end
7
9
 
8
10
  def perform
9
- resource = options['resource']
10
- id = options['id']
11
- method_name = options['method_name']
12
- article = Governor.resources[resource].to.find(id)
13
- if options.has_key?('arguments') && options['arguments'].present?
14
- article.send(method_name, arguments)
15
- else
16
- article.send(method_name)
17
- end
11
+ job_name = options['job_name']
12
+ arguments = options['arguments']
13
+ GovernorBackground.retrieve(job_name).call(*arguments)
18
14
  end
19
15
  end
20
16
  end
@@ -0,0 +1,26 @@
1
+ module GovernorBackground
2
+ module Resque
3
+ # Provides a way for ActiveRecord objects to be serialized to Resque.
4
+ # ActiveRecord objects can't be sent directly to Resque, as Resque
5
+ # serializes everything to JSON. +Resource+ provides an intermediate step.
6
+ # Resources are serialized to a JSON representation of the resource type
7
+ # (as registered in Governor) and the ID. When resources are deserialized,
8
+ # they are automatically converted into the ActiveRecord objects they
9
+ # represent.
10
+ class Resource
11
+ attr_reader :resource_key, :id
12
+ def initialize(ar_resource)
13
+ @resource_key = ar_resource.class.name.tableize
14
+ @id = ar_resource.id
15
+ end
16
+
17
+ def to_hash
18
+ self.instance_values.merge('json_class' => self.class.name)
19
+ end
20
+
21
+ def self.json_create(o)
22
+ Governor.resources[o['resource_key'].to_sym].to.find(o['id'])
23
+ end
24
+ end
25
+ end
26
+ end
@@ -18,7 +18,7 @@ module GovernorBackground
18
18
 
19
19
  it "has a status of completed if it can't be found" do
20
20
  ::Delayed::Job.expects(:find_by_id).with(article.id).at_least_once.returns nil
21
- job = Job.new(article, :post, stub(:id => article.id))
21
+ job = Job.new(:job_name, stub(:id => article.id))
22
22
  job.should be_completed
23
23
  job.status.should == 'completed'
24
24
  end
@@ -40,7 +40,7 @@ module GovernorBackground
40
40
  private
41
41
  def get_job_for(delayed_job)
42
42
  ::Delayed::Job.expects(:find_by_id).with(delayed_job.id).at_least_once.returns delayed_job
43
- Job.new(article, :post, delayed_job)
43
+ Job.new(:job_name, delayed_job)
44
44
  end
45
45
  end
46
46
  end
@@ -14,13 +14,7 @@ module GovernorBackground
14
14
 
15
15
  module Resque
16
16
  class Job
17
- attr_reader :resource, :method_name, :id, :created_at # make ID accessible for testing
18
- def initialize(resource, method_name, job_id)
19
- @resource = resource
20
- @method_name = method_name
21
- @id = job_id
22
- @created_at = Time.now
23
- end
17
+ attr_reader :name, :id, :created_at # make ID accessible for testing
24
18
  end
25
19
  end
26
20
 
@@ -33,12 +27,12 @@ module GovernorBackground
33
27
  context "delayed_job" do
34
28
  it "adds jobs successfully" do
35
29
  expect {
36
- Handler.run_in_background(@article, :post)
30
+ Handler.run_in_background(:job_name)
37
31
  }.to change { ::Delayed::Job.count }.by 1
38
32
  end
39
33
 
40
34
  it "handles any number of arguments" do
41
- Handler.run_in_background(@article, :post, 1, 2, 3)
35
+ Handler.run_in_background(:job_name, 1, 2, 3)
42
36
  performer = YAML.load ::Delayed::Job.first.handler
43
37
  performer.arguments.should == [1, 2, 3]
44
38
  end
@@ -47,16 +41,16 @@ module GovernorBackground
47
41
  context "resque" do
48
42
  it "adds jobs successfully" do
49
43
  Handler.use_resque = true
50
- Handler.run_in_background(@article, :post)
44
+ Handler.run_in_background(:job_name)
51
45
  id = JobManager.jobs.first.id
52
- Resque::PerformerWithState.should have_queued(id, {:resource => :articles, :id => @article.id, :method_name => :post, :arguments => []}).in(:governor)
46
+ Resque::PerformerWithState.should have_queued(id, {:job_name => :job_name, :arguments => []}).in(:governor)
53
47
  end
54
48
 
55
49
  it "can accept any number of arguments" do
56
50
  Handler.use_resque = true
57
- Handler.run_in_background(@article, :post, 1, 2, 3)
51
+ Handler.run_in_background(:job_name, 1, 2, 3)
58
52
  id = JobManager.jobs.first.id
59
- Resque::PerformerWithState.should have_queued(id, {:resource => :articles, :id => @article.id, :method_name => :post, :arguments => [1, 2, 3]}).in(:governor)
53
+ Resque::PerformerWithState.should have_queued(id, {:job_name => :job_name, :arguments => [1, 2, 3]}).in(:governor)
60
54
  end
61
55
  end
62
56
  end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module GovernorBackground
4
+ module Resque
5
+ describe Resource do
6
+ before do
7
+ @article = Factory(:article, :author => Factory(:user))
8
+ @resource = Resource.new(@article)
9
+ end
10
+
11
+ it "deserializing from JSON returns original article" do
12
+ JSON.parse(@resource.to_json).should == @article
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,8 +2,14 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe GovernorBackground do
4
4
  it "passes arguments to the handler" do
5
- @article = Factory(:article, :author => Factory(:user))
6
- GovernorBackground::Handler.expects(:run_in_background).with(@article, :some_method, 1, 2, 3)
7
- @article.send(:run_in_background, :some_method, 1, 2, 3)
5
+ GovernorBackground::Handler.expects(:run_in_background).with(:job_name, 1, 2, 3)
6
+ GovernorBackground.run(:job_name, 1, 2, 3)
7
+ end
8
+
9
+ it "registers jobs" do
10
+ block = Proc.new do |a, b, c|
11
+ end
12
+ GovernorBackground.register(:job_name, &block)
13
+ GovernorBackground.retrieve(:job_name).should == block
8
14
  end
9
15
  end
@@ -2,9 +2,6 @@ source 'http://rubygems.org'
2
2
 
3
3
  gem 'rails', '3.0.5'
4
4
 
5
- # Bundle edge Rails instead:
6
- # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
-
8
5
  gem 'sqlite3'
9
6
 
10
7
  gem 'devise'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- governor_background (0.2.2)
4
+ governor_background (0.3.0)
5
5
  governor
6
6
 
7
7
  GEM
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Liam Morley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-13 00:00:00 -04:00
18
+ date: 2011-05-15 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -140,37 +140,37 @@ dependencies:
140
140
  - !ruby/object:Gem::Dependency
141
141
  type: :development
142
142
  prerelease: false
143
- name: will_paginate
143
+ name: json
144
144
  version_requirements: &id009 !ruby/object:Gem::Requirement
145
145
  none: false
146
146
  requirements:
147
- - - ~>
147
+ - - ">="
148
148
  - !ruby/object:Gem::Version
149
- hash: 31098121
149
+ hash: 3
150
150
  segments:
151
- - 3
152
151
  - 0
153
- - beta
154
- version: 3.0.beta
152
+ version: "0"
155
153
  requirement: *id009
156
154
  - !ruby/object:Gem::Dependency
157
155
  type: :development
158
156
  prerelease: false
159
- name: devise
157
+ name: will_paginate
160
158
  version_requirements: &id010 !ruby/object:Gem::Requirement
161
159
  none: false
162
160
  requirements:
163
- - - ">="
161
+ - - ~>
164
162
  - !ruby/object:Gem::Version
165
- hash: 3
163
+ hash: 31098121
166
164
  segments:
165
+ - 3
167
166
  - 0
168
- version: "0"
167
+ - beta
168
+ version: 3.0.beta
169
169
  requirement: *id010
170
170
  - !ruby/object:Gem::Dependency
171
171
  type: :development
172
172
  prerelease: false
173
- name: governor_background
173
+ name: devise
174
174
  version_requirements: &id011 !ruby/object:Gem::Requirement
175
175
  none: false
176
176
  requirements:
@@ -184,7 +184,7 @@ dependencies:
184
184
  - !ruby/object:Gem::Dependency
185
185
  type: :development
186
186
  prerelease: false
187
- name: delayed_job
187
+ name: governor_background
188
188
  version_requirements: &id012 !ruby/object:Gem::Requirement
189
189
  none: false
190
190
  requirements:
@@ -198,7 +198,7 @@ dependencies:
198
198
  - !ruby/object:Gem::Dependency
199
199
  type: :development
200
200
  prerelease: false
201
- name: resque
201
+ name: delayed_job
202
202
  version_requirements: &id013 !ruby/object:Gem::Requirement
203
203
  none: false
204
204
  requirements:
@@ -212,7 +212,7 @@ dependencies:
212
212
  - !ruby/object:Gem::Dependency
213
213
  type: :development
214
214
  prerelease: false
215
- name: resque-status
215
+ name: resque
216
216
  version_requirements: &id014 !ruby/object:Gem::Requirement
217
217
  none: false
218
218
  requirements:
@@ -226,7 +226,7 @@ dependencies:
226
226
  - !ruby/object:Gem::Dependency
227
227
  type: :development
228
228
  prerelease: false
229
- name: resque_spec
229
+ name: resque-status
230
230
  version_requirements: &id015 !ruby/object:Gem::Requirement
231
231
  none: false
232
232
  requirements:
@@ -240,7 +240,7 @@ dependencies:
240
240
  - !ruby/object:Gem::Dependency
241
241
  type: :development
242
242
  prerelease: false
243
- name: dynamic_form
243
+ name: resque_spec
244
244
  version_requirements: &id016 !ruby/object:Gem::Requirement
245
245
  none: false
246
246
  requirements:
@@ -251,6 +251,20 @@ dependencies:
251
251
  - 0
252
252
  version: "0"
253
253
  requirement: *id016
254
+ - !ruby/object:Gem::Dependency
255
+ type: :development
256
+ prerelease: false
257
+ name: dynamic_form
258
+ version_requirements: &id017 !ruby/object:Gem::Requirement
259
+ none: false
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ hash: 3
264
+ segments:
265
+ - 0
266
+ version: "0"
267
+ requirement: *id017
254
268
  description: A middle-tier plugin for the Rails 3-based Governor blogging system, allowing you to tie in additional services that might want to perform blog-related services in the background.
255
269
  email: liam@carpeliam.com
256
270
  executables: []
@@ -281,11 +295,13 @@ files:
281
295
  - lib/governor_background/resque/job.rb
282
296
  - lib/governor_background/resque/performer.rb
283
297
  - lib/governor_background/resque/performer_with_state.rb
298
+ - lib/governor_background/resque/resource.rb
284
299
  - spec/governor_background/delayed/job_spec.rb
285
300
  - spec/governor_background/handler_spec.rb
286
301
  - spec/governor_background/job_manager_spec.rb
287
302
  - spec/governor_background/resque/performer_spec.rb
288
303
  - spec/governor_background/resque/performer_with_state_spec.rb
304
+ - spec/governor_background/resque/resource_spec.rb
289
305
  - spec/governor_background_spec.rb
290
306
  - spec/rails_app/.gitignore
291
307
  - spec/rails_app/Gemfile
@@ -386,6 +402,7 @@ test_files:
386
402
  - spec/governor_background/job_manager_spec.rb
387
403
  - spec/governor_background/resque/performer_spec.rb
388
404
  - spec/governor_background/resque/performer_with_state_spec.rb
405
+ - spec/governor_background/resque/resource_spec.rb
389
406
  - spec/governor_background_spec.rb
390
407
  - spec/rails_app/app/controllers/application_controller.rb
391
408
  - spec/rails_app/app/controllers/home_controller.rb