scheduler_daemon 1.1.3 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +0 -5
- data/Gemfile.lock +36 -19
- data/README.markdown +96 -79
- data/Rakefile +13 -11
- data/VERSION +1 -1
- data/bin/scheduler_daemon +6 -2
- data/lib/scheduler_daemon/base.rb +12 -11
- data/lib/scheduler_daemon/scheduler_task.rb +3 -3
- data/scheduler_daemon-1.1.5.gem +0 -0
- data/scheduler_daemon.gemspec +22 -49
- data/spec/command_line_args_to_hash_spec.rb +11 -11
- data/spec/scheduled_tasks/session_cleaner_task_spec.rb +6 -5
- data/spec/scheduler_spec.rb +4 -4
- metadata +33 -97
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 701f89d51ba0579a0b12a071b684d0510ae12d0efe2a37bae5ba028d6a30ecc4
|
4
|
+
data.tar.gz: 7e951ba8633e040ff58dfb69330556e1065ca22a2e42c427381e2c5c94e222f3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3111774072db7a5cae2351a677577871f0b649b2097cbaf2af64ae87f49a7385f75cc7bb6c5eaf14c5a133d80c2e4a0be080e2fd7816e67a01a7b9687bd55623
|
7
|
+
data.tar.gz: 9d3acc9ff3ac601f665e4e11f2ed31ba0f368e0212543867d2258bd346bf705969a5c1e65115ddc8c0d07714eae8c12c5d9ab432592b27fa9936715fc875dbc4
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,36 +1,53 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scheduler_daemon (1.1.
|
4
|
+
scheduler_daemon (1.1.6)
|
5
5
|
activesupport
|
6
6
|
chronic (>= 0.2.0)
|
7
|
-
chronic (>= 0.2.0)
|
8
|
-
daemons (>= 1.0.10)
|
9
7
|
daemons (>= 1.0.10)
|
10
8
|
eventmachine (>= 0.12.8)
|
11
|
-
|
12
|
-
rufus-scheduler (>= 2.0.1)
|
13
|
-
rufus-scheduler (>= 2.0.1)
|
14
|
-
scheduler_daemon
|
9
|
+
rufus-scheduler (~> 2.0.24)
|
15
10
|
|
16
11
|
GEM
|
17
12
|
remote: http://rubygems.org/
|
18
13
|
specs:
|
19
|
-
activesupport (
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
14
|
+
activesupport (7.0.4.2)
|
15
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
+
i18n (>= 1.6, < 2)
|
17
|
+
minitest (>= 5.1)
|
18
|
+
tzinfo (~> 2.0)
|
19
|
+
chronic (0.10.2)
|
20
|
+
concurrent-ruby (1.2.0)
|
21
|
+
daemons (1.4.1)
|
22
|
+
diff-lcs (1.5.0)
|
23
|
+
eventmachine (1.2.7)
|
24
|
+
i18n (1.12.0)
|
25
|
+
concurrent-ruby (~> 1.0)
|
26
|
+
minitest (5.17.0)
|
27
|
+
rspec (3.12.0)
|
28
|
+
rspec-core (~> 3.12.0)
|
29
|
+
rspec-expectations (~> 3.12.0)
|
30
|
+
rspec-mocks (~> 3.12.0)
|
31
|
+
rspec-core (3.12.0)
|
32
|
+
rspec-support (~> 3.12.0)
|
33
|
+
rspec-expectations (3.12.2)
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
+
rspec-support (~> 3.12.0)
|
36
|
+
rspec-mocks (3.12.3)
|
37
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
+
rspec-support (~> 3.12.0)
|
39
|
+
rspec-support (3.12.0)
|
40
|
+
rufus-scheduler (2.0.24)
|
41
|
+
tzinfo (>= 0.3.22)
|
42
|
+
tzinfo (2.0.6)
|
43
|
+
concurrent-ruby (~> 1.0)
|
26
44
|
|
27
45
|
PLATFORMS
|
28
46
|
ruby
|
29
47
|
|
30
48
|
DEPENDENCIES
|
31
|
-
|
32
|
-
chronic (>= 0.2.0)
|
33
|
-
daemons (>= 1.0.10)
|
34
|
-
eventmachine (>= 0.12.8)
|
35
|
-
rufus-scheduler (>= 2.0.1)
|
49
|
+
rspec (~> 3.12.0)
|
36
50
|
scheduler_daemon!
|
51
|
+
|
52
|
+
BUNDLED WITH
|
53
|
+
2.4.3
|
data/README.markdown
CHANGED
@@ -1,146 +1,163 @@
|
|
1
|
-
Scheduler Daemon
|
2
|
-
================
|
1
|
+
# Scheduler Daemon
|
3
2
|
|
4
3
|
Rails 3+ compatible scheduler daemon (see branches for older versions).
|
5
4
|
|
6
|
-
Replaces cron/rake pattern of periodically running rake tasks
|
7
|
-
|
8
|
-
|
5
|
+
Replaces cron/rake pattern of periodically running rake tasks to perform maintenance
|
6
|
+
tasks in Rails apps. Scheduler Daemon is made specifically for your Rails app, and only
|
7
|
+
loads the environment once, no matter how many tasks run.
|
9
8
|
|
10
|
-
What's so great about it?
|
9
|
+
What's so great about it? Well, I'm glad you asked!
|
11
10
|
|
12
11
|
- Only loads your Rails environment once on daemon start, not every time a task is run
|
13
|
-
- Allows you to easily deploy the scheduled tasks with your Rails app instead of depending on an
|
14
|
-
administrator to update crontab
|
12
|
+
- Allows you to easily deploy the scheduled tasks with your Rails app instead of depending on an administrator to update crontab
|
15
13
|
- Can be installed as a gem or a plugin (I suggest gem)
|
16
14
|
- It doesn't use rake or cron!
|
17
15
|
- Gets you up and running with your own daemon in under 2 minutes
|
18
16
|
- Specially designed to work with your rails app!
|
19
17
|
|
20
|
-
Setup
|
21
|
-
=====
|
18
|
+
## Setup
|
22
19
|
|
23
20
|
Install as a gem or plugin.
|
24
21
|
|
25
22
|
As a gem, the old-fashioned way:
|
26
23
|
|
27
|
-
|
24
|
+
```
|
25
|
+
gem install scheduler_daemon
|
26
|
+
```
|
28
27
|
|
29
|
-
As a gem with bundler, add to your
|
28
|
+
As a gem with bundler, add to your `./Gemfile`:
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
```
|
31
|
+
gem 'scheduler_daemon'
|
32
|
+
```
|
34
33
|
|
35
|
-
|
34
|
+
I pretty much assume you chose this option below and prefix most commands with `bundle exec`
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
As a plugin (deprecated): (might be awkward to call the binary to start up the daemon...)
|
37
|
+
|
38
|
+
```
|
39
|
+
rails plugin install git://github.com/ssoroka/scheduler_daemon.git
|
40
|
+
# Install required gems
|
41
|
+
gem install daemons rufus-scheduler eventmachine chronic -s http://gemcutter.org
|
42
|
+
```
|
40
43
|
|
41
44
|
Optionally generate the default scheduler daemon task for your rails app:
|
42
45
|
|
43
|
-
|
46
|
+
```
|
47
|
+
rails generate scheduler_task MyNewTask
|
48
|
+
```
|
44
49
|
|
45
|
-
which will create
|
50
|
+
which will create a task named:
|
46
51
|
|
47
|
-
|
52
|
+
```
|
53
|
+
scheduled_tasks/my_new_task.rb
|
54
|
+
```
|
48
55
|
|
49
|
-
Usage
|
50
|
-
=====
|
56
|
+
## Usage
|
51
57
|
|
52
58
|
generate a new scheduled task:
|
53
59
|
|
54
|
-
|
60
|
+
```
|
61
|
+
rails generate scheduler_task MyTaskName
|
62
|
+
```
|
63
|
+
|
64
|
+
If you have problems with that, the template for new tasks is [here](lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb)
|
55
65
|
|
56
|
-
|
57
|
-
|
58
|
-
lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb
|
59
|
-
|
60
|
-
you can always copy it and make modifications, or see "Manually create tasks" below.
|
66
|
+
You can always copy it and make modifications, or see [Manually create tasks](#manually-create-tasks)
|
61
67
|
|
62
68
|
Tasks support their own special DSL; commands are:
|
63
69
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
```rb
|
71
|
+
environments :production, :staging # run only in environments listed. (:all by default)
|
72
|
+
every '1d' # run every day
|
73
|
+
every '1d', :first_at => Chronic.parse("2 am") # run every day, starting at 2 am (see caveat below)
|
74
|
+
at Cronic.parse('5 pm') # run *once* at 5 pm today
|
75
|
+
# (relative to scheduler start/restart time )
|
76
|
+
# (happens every time scheduler starts/restarts)
|
77
|
+
# (see caveat below )
|
78
|
+
cron '* 4 * * *' # cron style (run every 4 am)
|
79
|
+
self.in '30s' # run once, 30 seconds from scheduler start/restart
|
80
|
+
# "self." is required--"in" is a keyword
|
81
|
+
```
|
73
82
|
|
74
83
|
fire up the daemon in console mode to test it out
|
75
84
|
|
76
|
-
|
85
|
+
```
|
86
|
+
bundle exec scheduler_daemon run
|
87
|
+
```
|
77
88
|
|
78
|
-
For production environments, add the daemon to the system start-up, and
|
79
|
-
|
89
|
+
For production environments, add the daemon to the system start-up, and capistrano
|
90
|
+
deploy scripts, etc. Something like:
|
80
91
|
|
81
|
-
|
82
|
-
|
92
|
+
```
|
93
|
+
export RAILS_ENV=production
|
94
|
+
bundle exec scheduler_daemon start
|
95
|
+
```
|
83
96
|
|
84
97
|
Selectively run tasks like so:
|
85
98
|
|
86
|
-
|
99
|
+
```
|
100
|
+
bundle exec scheduler_daemon start -- --only=task_name1,task_name2 --except=not_me
|
101
|
+
```
|
87
102
|
|
88
|
-
Manually create tasks
|
89
|
-
=====================
|
103
|
+
## Manually create tasks
|
90
104
|
|
91
|
-
If you don't want to use this gem with Rails, you can manually create tasks in a
|
105
|
+
If you don't want to use this gem with Rails, you can manually create tasks in a
|
106
|
+
`scheduled_tasks/` subdirectory and start the daemon with `--skip-rails` (though it'll
|
107
|
+
figure it out anyway if there's no `config/environment.rb` file in the launch directory
|
108
|
+
or `--dir=/path`)
|
92
109
|
|
93
110
|
Here's an example task file.
|
94
111
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
def run
|
99
|
-
do_something
|
100
|
-
log("I've done things")
|
101
|
-
end
|
102
|
-
end
|
112
|
+
```rb
|
113
|
+
class CleanUpTask < Scheduler::SchedulerTask
|
114
|
+
every '2m'
|
103
115
|
|
104
|
-
|
105
|
-
|
116
|
+
def run
|
117
|
+
do_something
|
118
|
+
log("I've done things")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
```
|
106
122
|
|
107
|
-
|
123
|
+
## Specs
|
108
124
|
|
109
|
-
|
110
|
-
|
125
|
+
See [this example spec](scheduler_daemon/spec/scheduled_tasks/session_cleaner_task_spec.rb)
|
126
|
+
for an idea on how to write specs for your tasks.
|
127
|
+
|
128
|
+
## To Do
|
111
129
|
|
112
130
|
Looking for suggestions!
|
113
131
|
|
114
132
|
Send requests to ssoroka78@gmail.com or on twitter, @ssoroka
|
115
133
|
|
116
|
-
Bugs
|
117
|
-
====
|
134
|
+
## Bugs
|
118
135
|
|
119
|
-
Submit bugs here
|
136
|
+
Submit bugs [here](http://github.com/ssoroka/scheduler_daemon/issues)
|
120
137
|
|
121
|
-
Caveats
|
122
|
-
=======
|
138
|
+
## Caveats
|
123
139
|
|
124
|
-
When using the cronic gem to parse dates, be careful of how it interprets your date,
|
125
|
-
|
140
|
+
When using the cronic gem to parse dates, be careful of how it interprets your date, for
|
141
|
+
example:
|
126
142
|
|
127
|
-
|
143
|
+
```
|
144
|
+
every '24h', :first_at => Chronic.parse('noon')
|
145
|
+
```
|
128
146
|
|
129
147
|
will be once a day at noon, but the first time the server starts up (or restarts), noon
|
130
|
-
is relative to the current time of day.
|
131
|
-
daemon starts up after lunch, the date is in the past, *and the task is immediately run*
|
132
|
-
because it thinks it missed its last execution time.
|
133
|
-
this may or may not be a problem.
|
134
|
-
with terms like "noon", "3 am" and "midnight", prepend "next" to it.
|
148
|
+
is relative to the current time of day. Before lunch, and it's in the future. If the
|
149
|
+
daemon starts up after lunch, the date is in the past, *and the task is immediately run*
|
150
|
+
because it thinks it missed its last execution time. Depending on what your task is,
|
151
|
+
this may or may not be a problem. If you always want the date to resolve in the future
|
152
|
+
with terms like "noon", "3 am" and "midnight", prepend "next" to it. ie:
|
135
153
|
|
136
|
-
|
154
|
+
```
|
155
|
+
every '24h', :first_at => Chronic.parse('next noon')
|
156
|
+
```
|
137
157
|
|
138
|
-
Author
|
139
|
-
======
|
158
|
+
## Author
|
140
159
|
|
141
160
|
Steven Soroka
|
142
161
|
|
143
162
|
* [@ssoroka](http://twitter.com/ssoroka)
|
144
163
|
* [My Github repo](http://github.com/ssoroka)
|
145
|
-
* [My blog](http://blog.stevensoroka.ca)
|
146
|
-
|
data/Rakefile
CHANGED
@@ -5,8 +5,8 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "scheduler_daemon"
|
8
|
-
gem.summary = %Q{Rails 3 compatible scheduler daemon. Replaces cron/rake pattern of periodically running rake tasks
|
9
|
-
to perform maintenance tasks in Rails apps. Scheduler Daemon is made specifically for your Rails app,
|
8
|
+
gem.summary = %Q{Rails 3 compatible scheduler daemon. Replaces cron/rake pattern of periodically running rake tasks
|
9
|
+
to perform maintenance tasks in Rails apps. Scheduler Daemon is made specifically for your Rails app,
|
10
10
|
and only loads the environment once, no matter how many tasks run.
|
11
11
|
|
12
12
|
What's so great about it? Well, I'm glad you asked!
|
@@ -22,16 +22,18 @@ begin
|
|
22
22
|
gem.email = "ssoroka78@gmail.com"
|
23
23
|
gem.homepage = "http://github.com/ssoroka/scheduler_daemon"
|
24
24
|
gem.authors = ["Steven Soroka"]
|
25
|
+
gem.add_dependency('activesupport')
|
25
26
|
gem.add_dependency('eventmachine', '>= 0.12.8')
|
26
27
|
gem.add_dependency('daemons', '>= 1.0.10')
|
27
|
-
gem.add_dependency('rufus-scheduler', '
|
28
|
+
gem.add_dependency('rufus-scheduler', '~> 2.0.24')
|
28
29
|
gem.add_dependency('chronic', '>= 0.2.0')
|
30
|
+
gem.add_development_dependency('rspec', '~> 3.12.0')
|
29
31
|
|
30
32
|
gem.executables = ['scheduler_daemon']
|
31
|
-
|
33
|
+
|
32
34
|
everything_from_dirs = %w(bin lib spec)
|
33
35
|
gem.files = everything_from_dirs.map{|d| Dir["#{d}/**/*"] }.flatten
|
34
|
-
gem.files += Dir['*'] - (everything_from_dirs +
|
36
|
+
gem.files += Dir['*'] - (everything_from_dirs + %w(pkg vendor))
|
35
37
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
36
38
|
end
|
37
39
|
|
@@ -44,16 +46,16 @@ end
|
|
44
46
|
# spec.libs << 'lib' << 'spec'
|
45
47
|
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
46
48
|
# end
|
47
|
-
#
|
49
|
+
#
|
48
50
|
# Spec::Rake::SpecTask.new(:rcov) do |spec|
|
49
51
|
# spec.libs << 'lib' << 'spec'
|
50
52
|
# spec.pattern = 'spec/**/*_spec.rb'
|
51
53
|
# spec.rcov = true
|
52
54
|
# end
|
53
|
-
#
|
54
|
-
#
|
55
|
+
#
|
56
|
+
#
|
55
57
|
# task :default => :spec
|
56
|
-
#
|
58
|
+
#
|
57
59
|
# require 'rake/rdoctask'
|
58
60
|
# Rake::RDocTask.new do |rdoc|
|
59
61
|
# if File.exist?('VERSION.yml')
|
@@ -62,10 +64,10 @@ end
|
|
62
64
|
# else
|
63
65
|
# version = ""
|
64
66
|
# end
|
65
|
-
#
|
67
|
+
#
|
66
68
|
# rdoc.rdoc_dir = 'rdoc'
|
67
69
|
# rdoc.title = "scheduler_daemon #{version}"
|
68
70
|
# rdoc.rdoc_files.include('README*')
|
69
71
|
# rdoc.rdoc_files.include('lib/**/*.rb')
|
70
72
|
# end
|
71
|
-
#
|
73
|
+
#
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.6
|
data/bin/scheduler_daemon
CHANGED
@@ -41,16 +41,20 @@ end
|
|
41
41
|
|
42
42
|
app_args[:dir] ||= Dir.pwd
|
43
43
|
app_args[:pid_dir] ||= File.expand_path(File.join(app_args[:dir], 'log'))
|
44
|
+
app_args[:log_dir] ||= File.expand_path(File.join(app_args[:dir], 'log'))
|
45
|
+
app_args[:multiple] ||= false
|
44
46
|
scheduler = File.join(File.dirname(__FILE__), %w(.. lib loader scheduler_loader.rb))
|
45
47
|
|
46
|
-
raise "#{pid_dir} does not exist" unless File.exist?(app_args[:pid_dir])
|
48
|
+
raise "#{app_args[:pid_dir]} does not exist" unless File.exist?(app_args[:pid_dir])
|
49
|
+
raise "#{app_args[:log_dir]} does not exist" unless File.exist?(app_args[:log_dir])
|
47
50
|
|
48
51
|
app_options = {
|
49
52
|
:app_name => 'scheduler_daemon',
|
50
53
|
:ARGV => launch_args(app_args),
|
51
54
|
:dir_mode => :normal,
|
52
55
|
:dir => app_args[:pid_dir],
|
53
|
-
:
|
56
|
+
:log_dir => app_args[:log_dir],
|
57
|
+
:multiple => app_args[:multiple],
|
54
58
|
:backtrace => true,
|
55
59
|
:log_output => true,
|
56
60
|
:monitor => true
|
@@ -39,7 +39,7 @@ module Scheduler
|
|
39
39
|
@env_name = @options['env_name'] || 'scheduler'
|
40
40
|
@rufus_scheduler = nil
|
41
41
|
@tasks = []
|
42
|
-
|
42
|
+
|
43
43
|
log("initialized with settings: #{@options.inspect}")
|
44
44
|
|
45
45
|
if !@options['skip_init']
|
@@ -48,14 +48,14 @@ module Scheduler
|
|
48
48
|
run_scheduler
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
# registers a task class with the scheduler
|
53
53
|
def register_task(task)
|
54
|
-
|
54
|
+
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def load_rails_env
|
58
|
-
if File.
|
58
|
+
if File.exist?('config/environment.rb') && !@options['skip_rails']
|
59
59
|
log("loading rails environment")
|
60
60
|
require File.expand_path('./config/environment')
|
61
61
|
@env_name = ::Rails.env
|
@@ -64,7 +64,7 @@ module Scheduler
|
|
64
64
|
log("Error loading rails environment; #{$!.class.name}: #{$!.message}")
|
65
65
|
raise $!
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
# time redefines itself with a faster implementation, since it gets called a lot.
|
69
69
|
def time
|
70
70
|
if Time.respond_to?(:zone) && Time.zone
|
@@ -74,7 +74,7 @@ module Scheduler
|
|
74
74
|
end
|
75
75
|
time
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def log(*args)
|
79
79
|
return if @options[:silent]
|
80
80
|
Kernel::puts(%([#{time}] #{args.join("\n")}))
|
@@ -92,12 +92,13 @@ module Scheduler
|
|
92
92
|
|
93
93
|
EventMachine::run {
|
94
94
|
@rufus_scheduler = Rufus::Scheduler::EmScheduler.start_new
|
95
|
+
@rufus_scheduler.singleton_class.send :define_method, :log, self.method(:log).to_proc
|
95
96
|
|
96
97
|
def @rufus_scheduler.handle_exception(job, exception)
|
97
|
-
msg = "[#{env_name}] scheduler job #{job.job_id} (#{job.tags * ' '}) caught exception #{exception.inspect}"
|
98
|
+
msg = "[#{@env_name}] scheduler job #{job.job_id} (#{job.tags * ' '}) caught exception #{exception.inspect}"
|
98
99
|
log msg
|
99
100
|
log exception.backtrace.join("\n")
|
100
|
-
Scheduler::ExceptionHandler.handle_exception(exception, job,
|
101
|
+
Scheduler::ExceptionHandler.handle_exception(exception, job, msg)
|
101
102
|
end
|
102
103
|
|
103
104
|
def @rufus_scheduler.daemon_scheduler
|
@@ -106,10 +107,10 @@ module Scheduler
|
|
106
107
|
|
107
108
|
# This is where the magic happens. tasks in scheduled_tasks/*.rb are loaded up.
|
108
109
|
tasks.each do |task|
|
109
|
-
if task.should_run_in_current_environment?(env_name)
|
110
|
+
if task.should_run_in_current_environment?(@env_name)
|
110
111
|
task.add_to(@rufus_scheduler)
|
111
112
|
else
|
112
|
-
log "[#{env_name}] #{task} not configured to run; skipping."
|
113
|
+
log "[#{@env_name}] #{task} not configured to run; skipping."
|
113
114
|
end
|
114
115
|
end
|
115
116
|
}
|
@@ -19,7 +19,7 @@ module Scheduler
|
|
19
19
|
ensure
|
20
20
|
# Note: AR's ActiveRecord::Base.connection_pool.with_connection(&block) seems broken;
|
21
21
|
# it doesn't release the connection properly.
|
22
|
-
ActiveRecord::Base.connection_pool.release_connection
|
22
|
+
ActiveRecord::Base.connection_pool.release_connection if defined?(ActiveRecord)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -67,9 +67,9 @@ module Scheduler
|
|
67
67
|
def run
|
68
68
|
nil
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def log(*args)
|
72
|
-
daemon_scheduler.log(*args)
|
72
|
+
daemon_scheduler.log(*args) if daemon_scheduler
|
73
73
|
end
|
74
74
|
alias :puts :log
|
75
75
|
end
|
Binary file
|
data/scheduler_daemon.gemspec
CHANGED
@@ -2,17 +2,19 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: scheduler_daemon 1.1.6 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
|
-
s.name = "scheduler_daemon"
|
8
|
-
s.version = "1.1.
|
8
|
+
s.name = "scheduler_daemon".freeze
|
9
|
+
s.version = "1.1.6"
|
9
10
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Steven Soroka".freeze]
|
14
|
+
s.date = "2023-01-29"
|
15
|
+
s.description = "a Rails 2.3, Rails 3, and Ruby compatible scheduler daemon. Replaces cron/rake pattern of periodically running rake tasks to perform maintenance tasks, only loading the environment ONCE.".freeze
|
16
|
+
s.email = "ssoroka78@gmail.com".freeze
|
17
|
+
s.executables = ["scheduler_daemon".freeze]
|
16
18
|
s.extra_rdoc_files = [
|
17
19
|
"README.markdown"
|
18
20
|
]
|
@@ -38,54 +40,25 @@ Gem::Specification.new do |s|
|
|
38
40
|
"lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb",
|
39
41
|
"lib/scheduler_daemon/rails/railtie.rb",
|
40
42
|
"lib/scheduler_daemon/scheduler_task.rb",
|
43
|
+
"scheduler_daemon-1.1.5.gem",
|
41
44
|
"scheduler_daemon.gemspec",
|
42
45
|
"spec/command_line_args_to_hash_spec.rb",
|
43
46
|
"spec/scheduled_tasks/session_cleaner_task_spec.rb",
|
44
47
|
"spec/scheduler_spec.rb",
|
45
48
|
"spec/spec_helper.rb"
|
46
49
|
]
|
47
|
-
s.homepage = "http://github.com/ssoroka/scheduler_daemon"
|
48
|
-
s.
|
49
|
-
s.
|
50
|
-
s.summary = "Rails 3 compatible scheduler daemon. Replaces cron/rake pattern of periodically running rake tasks to perform maintenance tasks in Rails apps. Scheduler Daemon is made specifically for your Rails app, and only loads the environment once, no matter how many tasks run. What's so great about it? Well, I'm glad you asked! - Only loads your Rails environment once on daemon start, not every time a task is run - Allows you to easily deploy the scheduled tasks with your Rails app instead of depending on an administrator to update crontab - It doesn't use rake or cron! - Gets you up and running with your own daemon in under 2 minutes"
|
50
|
+
s.homepage = "http://github.com/ssoroka/scheduler_daemon".freeze
|
51
|
+
s.rubygems_version = "3.4.5".freeze
|
52
|
+
s.summary = "Rails 3 compatible scheduler daemon. Replaces cron/rake pattern of periodically running rake tasks to perform maintenance tasks in Rails apps. Scheduler Daemon is made specifically for your Rails app, and only loads the environment once, no matter how many tasks run. What's so great about it? Well, I'm glad you asked! - Only loads your Rails environment once on daemon start, not every time a task is run - Allows you to easily deploy the scheduled tasks with your Rails app instead of depending on an administrator to update crontab - It doesn't use rake or cron! - Gets you up and running with your own daemon in under 2 minutes".freeze
|
51
53
|
|
52
|
-
|
53
|
-
s.specification_version = 3
|
54
|
+
s.specification_version = 4
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.8"])
|
63
|
-
s.add_runtime_dependency(%q<daemons>, [">= 1.0.10"])
|
64
|
-
s.add_runtime_dependency(%q<rufus-scheduler>, [">= 2.0.1"])
|
65
|
-
s.add_runtime_dependency(%q<chronic>, [">= 0.2.0"])
|
66
|
-
else
|
67
|
-
s.add_dependency(%q<scheduler_daemon>, [">= 0"])
|
68
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.8"])
|
69
|
-
s.add_dependency(%q<daemons>, [">= 1.0.10"])
|
70
|
-
s.add_dependency(%q<rufus-scheduler>, [">= 2.0.1"])
|
71
|
-
s.add_dependency(%q<chronic>, [">= 0.2.0"])
|
72
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
73
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.8"])
|
74
|
-
s.add_dependency(%q<daemons>, [">= 1.0.10"])
|
75
|
-
s.add_dependency(%q<rufus-scheduler>, [">= 2.0.1"])
|
76
|
-
s.add_dependency(%q<chronic>, [">= 0.2.0"])
|
77
|
-
end
|
78
|
-
else
|
79
|
-
s.add_dependency(%q<scheduler_daemon>, [">= 0"])
|
80
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.8"])
|
81
|
-
s.add_dependency(%q<daemons>, [">= 1.0.10"])
|
82
|
-
s.add_dependency(%q<rufus-scheduler>, [">= 2.0.1"])
|
83
|
-
s.add_dependency(%q<chronic>, [">= 0.2.0"])
|
84
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
85
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.8"])
|
86
|
-
s.add_dependency(%q<daemons>, [">= 1.0.10"])
|
87
|
-
s.add_dependency(%q<rufus-scheduler>, [">= 2.0.1"])
|
88
|
-
s.add_dependency(%q<chronic>, [">= 0.2.0"])
|
89
|
-
end
|
56
|
+
s.add_runtime_dependency(%q<scheduler_daemon>.freeze, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.12.0"])
|
58
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<eventmachine>.freeze, [">= 0.12.8"])
|
60
|
+
s.add_runtime_dependency(%q<daemons>.freeze, [">= 1.0.10"])
|
61
|
+
s.add_runtime_dependency(%q<rufus-scheduler>.freeze, ["~> 2.0.24"])
|
62
|
+
s.add_runtime_dependency(%q<chronic>.freeze, [">= 0.2.0"])
|
90
63
|
end
|
91
64
|
|
@@ -3,24 +3,24 @@ require 'scheduler_daemon/command_line_args_to_hash'
|
|
3
3
|
|
4
4
|
describe CommandLineArgsToHash do
|
5
5
|
it 'should process arguments' do
|
6
|
-
h = CommandLineArgsToHash.parse('--hello')
|
7
|
-
h['hello'].
|
6
|
+
h = CommandLineArgsToHash.parse(['--hello'])
|
7
|
+
expect(h['hello']).to eq true
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it 'should change key names with - to _' do
|
11
11
|
h = CommandLineArgsToHash.parse(['--hi-there'])
|
12
|
-
h['hi_there'].
|
12
|
+
expect(h['hi_there']).to eq true
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it 'should play nice with array args' do
|
16
16
|
h = CommandLineArgsToHash.parse(['--only=one,two,three'], :array_args => 'only')
|
17
|
-
h['only'].
|
17
|
+
expect(h['only']).to eq %w(one two three)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it 'should handle multiple args ok' do
|
21
21
|
h = CommandLineArgsToHash.parse(['--one', '--two=three'])
|
22
|
-
h['one'].
|
23
|
-
h['two'].
|
22
|
+
expect(h['one']).to eq true
|
23
|
+
expect(h['two']).to eq 'three'
|
24
24
|
end
|
25
|
-
|
26
|
-
end
|
25
|
+
|
26
|
+
end
|
@@ -9,12 +9,12 @@ require 'scheduler_daemon/rails/generators/scheduler/templates/lib/scheduled_tas
|
|
9
9
|
describe SessionCleanerTask do
|
10
10
|
before(:each) do
|
11
11
|
@task = SessionCleanerTask.new
|
12
|
-
@task.
|
12
|
+
# expect(@task).to receive(:log)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should remove old sessions" do
|
16
16
|
# this test only matters if we're using AR's session store.
|
17
|
-
if defined?(ActionController) && defined?(ActiveRecord) &&
|
17
|
+
if defined?(ActionController) && defined?(ActiveRecord) &&
|
18
18
|
ActionController::Base.session_store == ActiveRecord::SessionStore
|
19
19
|
|
20
20
|
# insert old session
|
@@ -25,11 +25,12 @@ describe SessionCleanerTask do
|
|
25
25
|
ActiveRecord::Base.connection.select_one(%(select count(*) as count from #{@task.session_table_name}))['count'].to_i
|
26
26
|
}
|
27
27
|
|
28
|
-
lambda {
|
28
|
+
expect(lambda {
|
29
29
|
@task.run
|
30
|
-
}.
|
30
|
+
}).to change(get_session_count, :call).by_at_most(-1)
|
31
31
|
else
|
32
32
|
pending 'skipping SessionCleanerTask test since it depends on rails and ActiveRecord::SessionStore; try copying this spec to your rails application.'
|
33
|
+
raise 'skipping'
|
33
34
|
end
|
34
35
|
end
|
35
|
-
end
|
36
|
+
end
|
data/spec/scheduler_spec.rb
CHANGED
@@ -4,18 +4,18 @@ require 'scheduler_daemon/base'
|
|
4
4
|
describe Scheduler::Base do
|
5
5
|
before(:each) do
|
6
6
|
@scheduler = Scheduler::Base.new(:skip_init => true, :silent => true)
|
7
|
-
@scheduler.stub
|
7
|
+
# @scheduler.stub(:log)
|
8
8
|
end
|
9
9
|
|
10
10
|
describe 'decide_what_to_run' do
|
11
11
|
it "should support --only" do
|
12
12
|
@scheduler = Scheduler::Base.new({:skip_init => true, :silent => true}, ['--only=alphabets'])
|
13
|
-
@scheduler.options['only'].
|
13
|
+
expect(@scheduler.options['only']).to eq ['alphabets']
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should support --except" do
|
17
17
|
@scheduler = Scheduler::Base.new({:skip_init => true, :silent => true}, ['--except=balloons,monkeys'])
|
18
|
-
@scheduler.options['except'].
|
18
|
+
expect(@scheduler.options['except']).to eq ['balloons', 'monkeys']
|
19
19
|
end
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,174 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scheduler_daemon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Steven Soroka
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2023-01-29 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: scheduler_daemon
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 0.12.8
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.12.8
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: daemons
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.0.10
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.10
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: rufus-scheduler
|
28
|
+
name: rspec
|
64
29
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
30
|
requirements:
|
67
|
-
- -
|
31
|
+
- - "~>"
|
68
32
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
70
|
-
type: :
|
33
|
+
version: 3.12.0
|
34
|
+
type: :development
|
71
35
|
prerelease: false
|
72
36
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
37
|
requirements:
|
75
|
-
- -
|
38
|
+
- - "~>"
|
76
39
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: chronic
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 0.2.0
|
86
|
-
type: :runtime
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 0.2.0
|
40
|
+
version: 3.12.0
|
94
41
|
- !ruby/object:Gem::Dependency
|
95
42
|
name: activesupport
|
96
43
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
44
|
requirements:
|
99
|
-
- -
|
45
|
+
- - ">="
|
100
46
|
- !ruby/object:Gem::Version
|
101
47
|
version: '0'
|
102
48
|
type: :runtime
|
103
49
|
prerelease: false
|
104
50
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
51
|
requirements:
|
107
|
-
- -
|
52
|
+
- - ">="
|
108
53
|
- !ruby/object:Gem::Version
|
109
54
|
version: '0'
|
110
55
|
- !ruby/object:Gem::Dependency
|
111
56
|
name: eventmachine
|
112
57
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
58
|
requirements:
|
115
|
-
- -
|
59
|
+
- - ">="
|
116
60
|
- !ruby/object:Gem::Version
|
117
61
|
version: 0.12.8
|
118
62
|
type: :runtime
|
119
63
|
prerelease: false
|
120
64
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
65
|
requirements:
|
123
|
-
- -
|
66
|
+
- - ">="
|
124
67
|
- !ruby/object:Gem::Version
|
125
68
|
version: 0.12.8
|
126
69
|
- !ruby/object:Gem::Dependency
|
127
70
|
name: daemons
|
128
71
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
72
|
requirements:
|
131
|
-
- -
|
73
|
+
- - ">="
|
132
74
|
- !ruby/object:Gem::Version
|
133
75
|
version: 1.0.10
|
134
76
|
type: :runtime
|
135
77
|
prerelease: false
|
136
78
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
79
|
requirements:
|
139
|
-
- -
|
80
|
+
- - ">="
|
140
81
|
- !ruby/object:Gem::Version
|
141
82
|
version: 1.0.10
|
142
83
|
- !ruby/object:Gem::Dependency
|
143
84
|
name: rufus-scheduler
|
144
85
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
86
|
requirements:
|
147
|
-
- -
|
87
|
+
- - "~>"
|
148
88
|
- !ruby/object:Gem::Version
|
149
|
-
version: 2.0.
|
89
|
+
version: 2.0.24
|
150
90
|
type: :runtime
|
151
91
|
prerelease: false
|
152
92
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
93
|
requirements:
|
155
|
-
- -
|
94
|
+
- - "~>"
|
156
95
|
- !ruby/object:Gem::Version
|
157
|
-
version: 2.0.
|
96
|
+
version: 2.0.24
|
158
97
|
- !ruby/object:Gem::Dependency
|
159
98
|
name: chronic
|
160
99
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
100
|
requirements:
|
163
|
-
- -
|
101
|
+
- - ">="
|
164
102
|
- !ruby/object:Gem::Version
|
165
103
|
version: 0.2.0
|
166
104
|
type: :runtime
|
167
105
|
prerelease: false
|
168
106
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
107
|
requirements:
|
171
|
-
- -
|
108
|
+
- - ">="
|
172
109
|
- !ruby/object:Gem::Version
|
173
110
|
version: 0.2.0
|
174
111
|
description: a Rails 2.3, Rails 3, and Ruby compatible scheduler daemon. Replaces
|
@@ -202,6 +139,7 @@ files:
|
|
202
139
|
- lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb
|
203
140
|
- lib/scheduler_daemon/rails/railtie.rb
|
204
141
|
- lib/scheduler_daemon/scheduler_task.rb
|
142
|
+
- scheduler_daemon-1.1.5.gem
|
205
143
|
- scheduler_daemon.gemspec
|
206
144
|
- spec/command_line_args_to_hash_spec.rb
|
207
145
|
- spec/scheduled_tasks/session_cleaner_task_spec.rb
|
@@ -209,30 +147,28 @@ files:
|
|
209
147
|
- spec/spec_helper.rb
|
210
148
|
homepage: http://github.com/ssoroka/scheduler_daemon
|
211
149
|
licenses: []
|
212
|
-
|
150
|
+
metadata: {}
|
151
|
+
post_install_message:
|
213
152
|
rdoc_options: []
|
214
153
|
require_paths:
|
215
154
|
- lib
|
216
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
156
|
requirements:
|
219
|
-
- -
|
157
|
+
- - ">="
|
220
158
|
- !ruby/object:Gem::Version
|
221
159
|
version: '0'
|
222
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
-
none: false
|
224
161
|
requirements:
|
225
|
-
- -
|
162
|
+
- - ">="
|
226
163
|
- !ruby/object:Gem::Version
|
227
164
|
version: '0'
|
228
165
|
requirements: []
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
specification_version: 3
|
166
|
+
rubygems_version: 3.4.5
|
167
|
+
signing_key:
|
168
|
+
specification_version: 4
|
233
169
|
summary: Rails 3 compatible scheduler daemon. Replaces cron/rake pattern of periodically
|
234
|
-
running rake tasks
|
235
|
-
is made specifically for your Rails app,
|
170
|
+
running rake tasks to perform maintenance tasks in Rails apps. Scheduler Daemon
|
171
|
+
is made specifically for your Rails app, and only loads the environment once, no
|
236
172
|
matter how many tasks run. What's so great about it? Well, I'm glad you asked! -
|
237
173
|
Only loads your Rails environment once on daemon start, not every time a task is
|
238
174
|
run - Allows you to easily deploy the scheduled tasks with your Rails app instead
|