scheduler_daemon 0.5.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/Gemfile +7 -0
  2. data/Gemfile.lock +36 -0
  3. data/README.markdown +83 -28
  4. data/Rakefile +39 -31
  5. data/VERSION +1 -1
  6. data/bin/scheduler_daemon +59 -0
  7. data/lib/loader/scheduler_loader.rb +12 -0
  8. data/lib/scheduler_daemon.rb +2 -0
  9. data/lib/scheduler_daemon/base.rb +149 -0
  10. data/lib/scheduler_daemon/command_line_args_to_hash.rb +47 -0
  11. data/lib/scheduler_daemon/exception_handler.rb +30 -0
  12. data/{generators → lib/scheduler_daemon/rails/generators}/scheduler/USAGE +0 -0
  13. data/lib/scheduler_daemon/rails/generators/scheduler/scheduler_generator.rb +16 -0
  14. data/lib/scheduler_daemon/rails/generators/scheduler/templates/README +11 -0
  15. data/lib/scheduler_daemon/rails/generators/scheduler/templates/lib/scheduled_tasks/session_cleaner_task.rb +29 -0
  16. data/lib/scheduler_daemon/rails/generators/scheduler_task/scheduler_task_generator.rb +17 -0
  17. data/{generators → lib/scheduler_daemon/rails/generators}/scheduler_task/templates/README +1 -1
  18. data/lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb +19 -0
  19. data/lib/scheduler_daemon/rails/railtie.rb +9 -0
  20. data/{generators/scheduler/templates/lib/scheduler → lib/scheduler_daemon}/scheduler_task.rb +17 -8
  21. data/scheduler_daemon.gemspec +58 -35
  22. data/spec/command_line_args_to_hash_spec.rb +26 -0
  23. data/spec/scheduled_tasks/session_cleaner_task_spec.rb +11 -7
  24. data/spec/scheduler_spec.rb +18 -7
  25. data/spec/spec_helper.rb +16 -0
  26. metadata +177 -50
  27. data/.gitignore +0 -1
  28. data/CHANGES +0 -10
  29. data/generators/scheduler/scheduler_generator.rb +0 -25
  30. data/generators/scheduler/templates/README +0 -8
  31. data/generators/scheduler/templates/bin/boot.rb +0 -10
  32. data/generators/scheduler/templates/bin/scheduler_daemon.rb +0 -25
  33. data/generators/scheduler/templates/lib/scheduled_tasks/session_cleaner_task.rb +0 -21
  34. data/generators/scheduler/templates/lib/scheduler.rb +0 -90
  35. data/generators/scheduler/templates/lib/scheduler/exception_handler.rb +0 -12
  36. data/generators/scheduler/templates/lib/scheduler/hijack_puts.rb +0 -8
  37. data/generators/scheduler_task/scheduler_task_generator.rb +0 -11
  38. data/generators/scheduler_task/templates/scheduled_tasks/example_task.rb +0 -10
  39. data/init.rb +0 -1
  40. data/install.rb +0 -1
  41. data/lib/scheduler.rb +0 -2
  42. data/spec/README +0 -1
  43. data/uninstall.rb +0 -1
@@ -1,90 +0,0 @@
1
- require 'eventmachine'
2
- require 'rufus/scheduler'
3
- require File.join(File.dirname(__FILE__), 'scheduler', 'hijack_puts')
4
- require File.join(File.dirname(__FILE__), 'scheduler', 'scheduler_task')
5
- require File.join(File.dirname(__FILE__), 'scheduler', 'exception_handler')
6
-
7
- module Scheduler
8
- class Base
9
- attr_reader :load_only, :load_except, :tasks
10
-
11
- def initialize(*command_line_args)
12
- @load_only = []
13
- @load_except = []
14
- @tasks = []
15
- @rufus_scheduler = nil
16
-
17
- decide_what_to_run(command_line_args)
18
- load_tasks
19
- run_scheduler
20
- end
21
-
22
- def run_scheduler
23
- puts "Starting Scheduler in #{RAILS_ENV}"
24
-
25
- EventMachine::run {
26
- @rufus_scheduler = Rufus::Scheduler::EmScheduler.start_new
27
-
28
- def @rufus_scheduler.handle_exception(job, exception)
29
- msg = "[#{RAILS_ENV}] scheduler job #{job.job_id} (#{job.tags * ' '}) caught exception #{exception.inspect}"
30
- puts msg
31
- puts exception.backtrace.join("\n")
32
- Scheduler::ExceptionHandler.handle_exception(exception, job, message)
33
- end
34
-
35
- # This is where the magic happens. tasks in scheduled_tasks/*.rb are loaded up.
36
- tasks.each do |task|
37
- if task.should_run_in_current_environment?
38
- task.add_to(@rufus_scheduler)
39
- else
40
- puts "#{task} configured not to run in #{RAILS_ENV} environment; skipping."
41
- end
42
- end
43
- }
44
- end
45
-
46
- def load_tasks
47
- tasks_to_run.each{|f|
48
- begin
49
- unless load_only.any? && load_only.all?{|m| f !~ Regexp.new(Regexp.escape(m)) }
50
- require f
51
- filename = f.split('/').last.split('.').first
52
- puts "Loading task #{filename}..."
53
- tasks << filename.camelcase.constantize # path/newsfeed_task.rb => NewsfeedTask
54
- end
55
- rescue Exception => e
56
- msg = "Error loading task #{filename}: #{e.class.name}: #{e.message}"
57
- puts msg
58
- puts e.backtrace.join("\n")
59
- Railsbot.say "#{msg}, see log for backtrace" if Rails.env.production? || Rails.env.staging?
60
- end
61
- }
62
- end
63
-
64
- def tasks_to_run
65
- task_files = Dir[File.join(File.dirname(__FILE__), %w(scheduled_tasks *.rb))]
66
-
67
- if load_only.any?
68
- task_files.reject!{|f| load_only.all?{|m| f !~ Regexp.new(Regexp.escape(m))}}
69
- end
70
-
71
- if load_except.any?
72
- task_files.reject!{|f| load_except.any?{|m| f =~ Regexp.new(Regexp.escape(m))}}
73
- end
74
- task_files
75
- end
76
-
77
- # takes input from command line to later modify list of tasks to run
78
- def decide_what_to_run(command_line_args)
79
- # allow ruby daemons/bin/task_runner.rb run -- --only=toadcamp,newsfeed
80
- if only_arg = command_line_args.detect{|arg| arg =~ /^--only/}
81
- @load_only = only_arg.split('=').last.split(',')
82
- end
83
-
84
- # allow ruby daemons/bin/task_runner.rb run -- --except=toadcamp
85
- if except_arg = command_line_args.detect{|arg| arg =~ /^--except/}
86
- @load_except = except_arg.split('=').last.split(',')
87
- end
88
- end
89
- end
90
- end
@@ -1,12 +0,0 @@
1
- module Scheduler
2
- class ExceptionHandler
3
- # Change me to do something meaningful
4
- def self.handle_exception(exception, job, message)
5
- # If your team all hangs out in Campfire, you might want to make a
6
- # Campfire class that makes use of the tinder gem to write these errors there.
7
- #
8
- # eg:
9
- # Campfire.say "#{msg}, see log for backtrace" if Rails.env.production? || Rails.env.staging?
10
- end
11
- end
12
- end
@@ -1,8 +0,0 @@
1
- # hijack puts to log with a timestamp, since any output is going to be logged anyway.
2
- module Kernel
3
- def puts_with_timestamp(*args)
4
- time = Time.respond_to?(:zone) ? Time.zone.now.to_s : Time.now.to_s
5
- puts_without_timestamp(%([#{time}] #{args.join("\n")}))
6
- end
7
- alias_method_chain :puts, :timestamp
8
- end
@@ -1,11 +0,0 @@
1
- class SchedulerTaskGenerator < Rails::Generator::NamedBase
2
- def manifest
3
- record do |m|
4
- m.directory File.join('scheduler', 'lib', 'scheduled_tasks')
5
-
6
- m.template 'scheduled_tasks/example_task.rb', "scheduler/lib/scheduled_tasks/#{file_name}_task.rb", :assigns => { :class_name => class_name }
7
-
8
- m.readme('README')
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- class <%= class_name %>Task < Scheduler::SchedulerTask
2
- environments :all
3
-
4
- every '10s'
5
-
6
- def run
7
- # Your code here, eg: User.send_due_invoices!
8
- # use puts for writing to log, eg: puts "I've sent invoices!"
9
- end
10
- end
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require 'scheduler'
data/install.rb DELETED
@@ -1 +0,0 @@
1
- puts File.read(File.join(File.dirname(__FILE__), 'README.markdown'))
@@ -1,2 +0,0 @@
1
- # You probably want to look in generators/, most of the code is there.
2
- # In the future I may move some of it here; maybe.
@@ -1 +0,0 @@
1
- To install the specs for the scheduler daemon, copy this "spec" folder to one called "scheduler_daemon" in your project's spec folder.
@@ -1 +0,0 @@
1
- puts "Nooooooooo! but we were so good together!"