resque-scheduler 1.8.0 → 1.8.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
@@ -1,3 +1,2 @@
1
- *.gemspec
2
1
  pkg
3
2
  nbproject
data/HISTORY.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 1.8.1 (TBD)
2
+
3
+ * Adding rails_env for scheduled jobs to support scoping jobs by
4
+ RAILS_ENV (gravis).
5
+ * Fixing ruby 1.8.6 compatibility issue.
6
+ * Adding gemspec for bundler support.
7
+
1
8
  ## 1.8.0 (2010-04-14)
2
9
 
3
10
  * Moving version to match corresponding resque version
data/README.markdown CHANGED
@@ -86,6 +86,42 @@ since the jobs are stored in a redis sorted set (zset). I can't imagine this
86
86
  being an issue for someone since redis is stupidly fast even at log(n), but full
87
87
  disclosure is always best.
88
88
 
89
+ ### Schedule jobs per environment
90
+
91
+ Resque-Scheduler allows to create schedule jobs for specific envs. The arg
92
+ `rails_env` (optional) can be used to determine which envs are concerned by the
93
+ job:
94
+
95
+ create_fake_leaderboards:
96
+ cron: "30 6 * * 1"
97
+ class: CreateFakeLeaderboards
98
+ queue: scoring
99
+ args:
100
+ rails_env: demo
101
+ description: "This job will auto-create leaderboards for our online demo"
102
+
103
+ The scheduled job create_fake_leaderboards will be created only if the
104
+ environment variable `RAILS_ENV` is set to demo:
105
+
106
+ $ RAILS_ENV=demo rake resque:scheduler
107
+
108
+ NOTE: If you have added the 2 lines bellow to your Rails Rakefile
109
+ (ie: lib/tasks/resque-scheduler.rake), the rails env is loaded automatically
110
+ and you don't have to specify RAILS_ENV if the var is correctly set in
111
+ environment.rb
112
+
113
+ Multiple envs are allowed, separated by commas:
114
+
115
+ create_fake_leaderboards:
116
+ cron: "30 6 * * 1"
117
+ class: CreateFakeLeaderboards
118
+ queue: scoring
119
+ args:
120
+ rails_env: demo, staging, production
121
+ description: "This job will auto-create leaderboards"
122
+
123
+ NOTE: If you specify the `rails_env` arg without setting RAILS_ENV as an
124
+ environment variable, the job won't be loaded.
89
125
 
90
126
  Resque-web additions
91
127
  --------------------
@@ -48,18 +48,30 @@ module Resque
48
48
  log! "Schedule empty! Set Resque.schedule" if Resque.schedule.empty?
49
49
 
50
50
  Resque.schedule.each do |name, config|
51
- log! "Scheduling #{name} "
52
- if !config['cron'].nil? && config['cron'].length > 0
53
- rufus_scheduler.cron config['cron'] do
54
- log! "queuing #{config['class']} (#{name})"
55
- enqueue_from_config(config)
51
+ # If rails_env is set in the config, enforce ENV['RAILS_ENV'] as
52
+ # required for the jobs to be scheduled. If rails_env is missing, the
53
+ # job should be scheduled regardless of what ENV['RAILS_ENV'] is set
54
+ # to.
55
+ if config['rails_env'].nil? || rails_env_matches?(config)
56
+ log! "Scheduling #{name} "
57
+ if !config['cron'].nil? && config['cron'].length > 0
58
+ rufus_scheduler.cron config['cron'] do
59
+ log! "queuing #{config['class']} (#{name})"
60
+ enqueue_from_config(config)
61
+ end
62
+ else
63
+ log! "no cron found for #{config['class']} (#{name}) - skipping"
56
64
  end
57
- else
58
- log! "no cron found for #{config['class']} (#{name}) - skipping"
59
65
  end
60
66
  end
61
67
  end
62
68
 
69
+ # Returns true if the given schedule config hash matches the current
70
+ # ENV['RAILS_ENV']
71
+ def rails_env_matches?(config)
72
+ config['rails_env'] && ENV['RAILS_ENV'] && config['rails_env'].gsub(/\s/,'').split(',').include?(ENV['RAILS_ENV'])
73
+ end
74
+
63
75
  # Handles queueing delayed items
64
76
  def handle_delayed_items
65
77
  item = nil
@@ -21,6 +21,7 @@ module ResqueScheduler
21
21
  # :class must be a resque worker class
22
22
  # :args can be any yaml which will be converted to a ruby literal and passed
23
23
  # in a params. (optional)
24
+ # :rails_envs is the list of envs where the job gets loaded. Envs are comma separated (optional)
24
25
  # :description is just that, a description of the job (optional). If params is
25
26
  # an array, each element in the array is passed as a separate param,
26
27
  # otherwise params is passed in as the only parameter to perform.
@@ -63,7 +64,7 @@ module ResqueScheduler
63
64
 
64
65
  # Returns an array of timestamps based on start and count
65
66
  def delayed_queue_peek(start, count)
66
- redis.zrange(:delayed_queue_schedule, start, start+count).collect(&:to_i)
67
+ redis.zrange(:delayed_queue_schedule, start, start+count).collect{|x| x.to_i}
67
68
  end
68
69
 
69
70
  # Returns the size of the delayed queue schedule
@@ -114,4 +115,4 @@ end
114
115
  Resque.extend ResqueScheduler
115
116
  Resque::Server.class_eval do
116
117
  include ResqueScheduler::Server
117
- end
118
+ end
@@ -1,3 +1,3 @@
1
1
  module ResqueScheduler
2
- Version = '1.8.0'
2
+ Version = '1.8.1'
3
3
  end
@@ -0,0 +1,80 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{resque-scheduler}
8
+ s.version = "1.8.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ben VandenBos"]
12
+ s.date = %q{2010-05-19}
13
+ s.description = %q{Light weight job scheduling on top of Resque.
14
+ Adds methods enqueue_at/enqueue_in to schedule jobs in the future.
15
+ Also supports queueing jobs on a fixed, cron-like schedule.}
16
+ s.email = %q{bvandenbos@gmail.com}
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.markdown"
20
+ ]
21
+ s.files = [
22
+ ".gitignore",
23
+ "HISTORY.md",
24
+ "LICENSE",
25
+ "README.markdown",
26
+ "Rakefile",
27
+ "lib/resque/scheduler.rb",
28
+ "lib/resque_scheduler.rb",
29
+ "lib/resque_scheduler/server.rb",
30
+ "lib/resque_scheduler/server/views/delayed.erb",
31
+ "lib/resque_scheduler/server/views/delayed_timestamp.erb",
32
+ "lib/resque_scheduler/server/views/scheduler.erb",
33
+ "lib/resque_scheduler/tasks.rb",
34
+ "lib/resque_scheduler/version.rb",
35
+ "resque-scheduler.gemspec",
36
+ "tasks/resque_scheduler.rake",
37
+ "test/delayed_queue_test.rb",
38
+ "test/redis-test.conf",
39
+ "test/resque-web_test.rb",
40
+ "test/scheduler_test.rb",
41
+ "test/test_helper.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/bvandenbos/resque-scheduler}
44
+ s.rdoc_options = ["--charset=UTF-8"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.5}
47
+ s.summary = %q{Light weight job scheduling on top of Resque}
48
+ s.test_files = [
49
+ "test/delayed_queue_test.rb",
50
+ "test/resque-web_test.rb",
51
+ "test/scheduler_test.rb",
52
+ "test/test_helper.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ s.add_runtime_dependency(%q<resque>, [">= 1.8.0"])
61
+ s.add_runtime_dependency(%q<rufus-scheduler>, [">= 0"])
62
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
63
+ s.add_development_dependency(%q<mocha>, [">= 0"])
64
+ s.add_development_dependency(%q<rack-test>, [">= 0"])
65
+ else
66
+ s.add_dependency(%q<resque>, [">= 1.8.0"])
67
+ s.add_dependency(%q<rufus-scheduler>, [">= 0"])
68
+ s.add_dependency(%q<jeweler>, [">= 0"])
69
+ s.add_dependency(%q<mocha>, [">= 0"])
70
+ s.add_dependency(%q<rack-test>, [">= 0"])
71
+ end
72
+ else
73
+ s.add_dependency(%q<resque>, [">= 1.8.0"])
74
+ s.add_dependency(%q<rufus-scheduler>, [">= 0"])
75
+ s.add_dependency(%q<jeweler>, [">= 0"])
76
+ s.add_dependency(%q<mocha>, [">= 0"])
77
+ s.add_dependency(%q<rack-test>, [">= 0"])
78
+ end
79
+ end
80
+
@@ -4,7 +4,7 @@ class Resque::DelayedQueueTest < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  Resque::Scheduler.mute = true
7
- Resque.redis.flush_all
7
+ Resque.redis.flushall
8
8
  end
9
9
 
10
10
  def test_enqueue_at_adds_correct_list_and_zset
@@ -129,4 +129,4 @@ class Resque::DelayedQueueTest < Test::Unit::TestCase
129
129
  Resque::Scheduler.handle_delayed_items
130
130
  end
131
131
 
132
- end
132
+ end
@@ -9,6 +9,21 @@ context "on GET to /schedule" do
9
9
  should_respond_with_success
10
10
  end
11
11
 
12
+ context "on GET to /schedule with scheduled jobs" do
13
+ setup do
14
+ ENV['rails_env'] = 'production'
15
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'production'}}
16
+ Resque::Scheduler.load_schedule!
17
+ get "/schedule"
18
+ end
19
+
20
+ should_respond_with_success
21
+
22
+ test 'see the scheduled job' do
23
+ assert last_response.body.include?('SomeIvarJob')
24
+ end
25
+ end
26
+
12
27
  context "on GET to /delayed" do
13
28
  setup { get "/delayed" }
14
29
 
@@ -16,6 +16,44 @@ class Resque::SchedulerTest < Test::Unit::TestCase
16
16
  Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp")
17
17
  end
18
18
 
19
+ def test_enqueue_from_config_puts_stuff_in_the_resque_queue_when_env_match
20
+ # The job should be loaded : its rails_env config matches the RAILS_ENV variable:
21
+ ENV['RAILS_ENV'] = 'production'
22
+ assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
23
+
24
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'production'}}
25
+ Resque::Scheduler.load_schedule!
26
+ assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
27
+
28
+ # we allow multiple rails_env definition, it should work also:
29
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging, production'}}
30
+ Resque::Scheduler.load_schedule!
31
+ assert_equal(2, Resque::Scheduler.rufus_scheduler.all_jobs.size)
32
+ end
33
+
34
+ def test_enqueue_from_config_dont_puts_stuff_in_the_resque_queue_when_env_doesnt_match
35
+ # RAILS_ENV is not set:
36
+ assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
37
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging'}}
38
+ Resque::Scheduler.load_schedule!
39
+ assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
40
+
41
+ # SET RAILS_ENV to a common value:
42
+ ENV['RAILS_ENV'] = 'production'
43
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging'}}
44
+ Resque::Scheduler.load_schedule!
45
+ assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
46
+ end
47
+
48
+ def test_enqueue_from_config_when_rails_env_arg_is_not_set
49
+ # The job should be loaded, since a missing rails_env means ALL envs.
50
+ ENV['RAILS_ENV'] = 'production'
51
+ assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
52
+ Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"}}
53
+ Resque::Scheduler.load_schedule!
54
+ assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
55
+ end
56
+
19
57
  def test_config_makes_it_into_the_rufus_scheduler
20
58
  assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
21
59
 
@@ -25,4 +63,4 @@ class Resque::SchedulerTest < Test::Unit::TestCase
25
63
  assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
26
64
  end
27
65
 
28
- end
66
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben VandenBos
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-14 00:00:00 -07:00
12
+ date: 2010-05-19 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -88,6 +88,7 @@ files:
88
88
  - lib/resque_scheduler/server/views/scheduler.erb
89
89
  - lib/resque_scheduler/tasks.rb
90
90
  - lib/resque_scheduler/version.rb
91
+ - resque-scheduler.gemspec
91
92
  - tasks/resque_scheduler.rake
92
93
  - test/delayed_queue_test.rb
93
94
  - test/redis-test.conf