day_planner 0.0.18 → 0.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -35
- data/app/models/day_planner/task.rb +40 -0
- data/day_planner.gemspec +4 -1
- data/lib/day_planner/base.rb +76 -124
- data/lib/day_planner/engine.rb +15 -0
- data/lib/day_planner/generators/day_planner_generator.rb +45 -0
- data/lib/day_planner/templates/migrations/create_day_planner_tasks.rb +14 -0
- data/lib/day_planner/version.rb +4 -3
- metadata +37 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b2cd47bed48216943fca5ceb558f4209b58b887
|
4
|
+
data.tar.gz: be5a04e84a1146461fe40792562c58b32f5065f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4716aa4e9dad6a9f17ae0f662844190b2491bb5a1f29390dab1d7f3151de5ba6ed43f4be4c8b3bded38351966af29aa88838e58f0a92a046bd17460c461981ac
|
7
|
+
data.tar.gz: 8df3a3891c73bb810322e98909b747e165be8e6f762f1f6ec6d860bada59976e7dc10204e272b19b5b99a1f3b91156945b9a15fc2e327a8ede5d72339de160f7
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# DayPlanner
|
2
2
|
|
3
|
-
Day Planner is a simple tool to manage in-process execution of scheduled tasks. There are a lot of tools for running scheduled tasks outside the process ([Clockwork](http://rubygems.org/gems/clockwork) is probably what you're looking for if you want an elegant implementation of scheduled tasks outside the main process).
|
3
|
+
Day Planner is a simple tool to manage in-process execution of scheduled tasks in Rails. There are a lot of tools for running scheduled tasks outside the process ([Clockwork](http://rubygems.org/gems/clockwork) is probably what you're looking for if you want an elegant implementation of scheduled tasks outside the main process).
|
4
4
|
|
5
5
|
I wrote this because I needed a simple, lightweight tool to schedule small, light tasks on an application running on Heroku, without the extra cost of a dedicated clock process to handle it, but executing more frequently than Heroku's free scheduler permits.
|
6
6
|
|
7
|
-
Schedule management is in a thread of its own; scheduled tasks are run in the same thread (I was spawning separate threads for them, but it seemed to be causing issues with database utilization on Heroku). Ruby 2.0's handling of threading is improved over the 1.9 branch, so
|
7
|
+
Schedule management is in a thread of its own; scheduled tasks are run in the same thread (I was spawning separate threads for them, but it seemed to be causing issues with database utilization on Heroku). Ruby 2.0's handling of threading is improved over the 1.9 branch, so it may be a good idea to use it, but I obviously can't guarantee that you won't still encounter situations in which poorly behaved tasks block your application's main thread. If you want assurances against that, use any of the other tools (did I mention [Clockwork](http://rubygems.org/gems/clockwork)?)
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -15,14 +15,12 @@ Add this line to your application's Gemfile:
|
|
15
15
|
And then execute:
|
16
16
|
|
17
17
|
$ bundle install
|
18
|
-
|
19
|
-
|
18
|
+
$ rails generate day_planner:install
|
19
|
+
$ rake db:migrate
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
Create a file called config/scheduled_tasks.rb. Put tasks in it like this:
|
23
|
+
Installation should have created a file called config/scheduled_tasks.rb. Put tasks in it like this:
|
26
24
|
|
27
25
|
DayPlanner.schedule(every: 2.minutes) do
|
28
26
|
MyClass.my_class_method
|
@@ -30,25 +28,11 @@ Create a file called config/scheduled_tasks.rb. Put tasks in it like this:
|
|
30
28
|
|
31
29
|
This file will be read in and its tasks will be added to the schedule automatically.
|
32
30
|
|
33
|
-
### If you're not using Rails
|
34
|
-
|
35
|
-
I don't really know if it'll work. I haven't tried.
|
36
|
-
|
37
|
-
You will have to create a scheduled tasks file, somewhere. Use the same format, but obviously you won't have those cute little Rails-y time methods. You'll want to include this at the bottom:
|
38
|
-
|
39
|
-
DayPlanner.activate
|
40
|
-
|
41
|
-
It's only activated automatically in Rails.
|
42
|
-
|
43
|
-
I have not tested it outside of Rails and it may not work at all but ideally I'd prefer that it did. If you can give me feedback, I'd be much obliged.
|
44
|
-
|
45
|
-
### Either way
|
46
|
-
|
47
31
|
The tasks in the schedule will each be performed on startup and then thereafter according to their stated intervals.
|
48
32
|
|
49
|
-
I'm not doing a whole damn ton to protect you from tasks that throw errors, but there is a begin/rescue/end up in there at some point. I definitely am not protecting you from a process that just won't end or anything like that. Remember that your interval is
|
33
|
+
I'm not doing a whole damn ton to protect you from tasks that throw errors, but there is a begin/rescue/end up in there at some point. I definitely am not protecting you from a process that just won't end or anything like that. Remember that your interval is more or less the minimum possible time between instances of the task being performed, as it does not spawn a new thread for each task. (That seemed to cause problems with Heroku.) Setting a shorter interval will help, as it will endeavor to catch up to the schedule if it falls behind but will never execute tasks between its check intervals. Setting the check interval too short could end up blocking your application's main thread, though, particularly if your tasks end up running long.
|
50
34
|
|
51
|
-
###
|
35
|
+
### Options
|
52
36
|
|
53
37
|
#### name
|
54
38
|
|
@@ -59,26 +43,20 @@ You can name a task thusly:
|
|
59
43
|
end
|
60
44
|
|
61
45
|
If you do, you can find the task later:
|
62
|
-
DayPlanner.
|
63
|
-
|
64
|
-
#### environment
|
65
|
-
|
66
|
-
If you're using Rails, you can include environment in your options hash, setting the value to the Rails environment in which you'd like the task executed. For example:
|
67
|
-
|
68
|
-
DayPlanner.schedule(every: 1.hour, name: "occasional task", environment: "production") do
|
69
|
-
# I run every hour, but only if you're using Rails and in production.
|
70
|
-
end
|
46
|
+
DayPlanner.task("my task")
|
71
47
|
|
72
48
|
### Managing DayPlanner and tasks
|
73
49
|
|
74
50
|
You can activate or deactivate DayPlanner with those respective methods. You can also check whether it's running with DayPlanner.status.
|
75
51
|
|
76
|
-
To cancel a task,
|
52
|
+
To cancel a task, call the class method on DayPlanner:
|
77
53
|
|
78
54
|
DayPlanner.cancel(task)
|
79
55
|
|
80
56
|
You can either pass a name, if you named the task, or the task object.
|
81
57
|
|
58
|
+
Avoid trying to interact with tasks via database calls or ActiveRecord objects. DayPlanner shouldn't attempt to execute any task that isn't scheduled via its methods, as the actual task is retained in memory; the database is only used to track task execution times.
|
59
|
+
|
82
60
|
#### DayPlanner.interval
|
83
61
|
|
84
62
|
By default, DayPlanner checks for tasks to be performed once per minute. You have the power to change this:
|
@@ -89,11 +67,11 @@ Or, like
|
|
89
67
|
|
90
68
|
DayPlanner.interval = 5
|
91
69
|
|
92
|
-
Since tasks are not run in separate threads (this seemed to be giving me database connection issues on Heroku), remember that the interval is
|
70
|
+
Since tasks are not run in separate threads (this seemed to be giving me database connection issues on Heroku), remember that the interval is not entirely precise -- if a task takes time to run, keep that in mind (or spin off a new thread yourself in the task). DayPlanner will attempt to run a task before the task's interval has entirely passed in order to get it to execute at its next scheduled time, should the check interval be short enough to manage this, but no guarantees. It will not run the task if less than half of its interval has elapsed since last performance.
|
93
71
|
|
94
72
|
Note that if you try to schedule a task with an interval shorter than DayPlanner's interval, it'll complain and fail. If you shorten DayPlanner's interval to less than that of one of its tasks, it'll complain but not fail. The task obviously will only run at scheduler thread's intervals. Use your best judgment.
|
95
73
|
|
96
|
-
Specify your preferred interval (and whatever other
|
74
|
+
Specify your preferred interval (and whatever other settings which may be implemented one day) in config/day_planner_tasks.rb. As long as you set your interval before DayPlanner is activated, you won't have to wait for it to cycle through an interval to change the setting. If you alter this value while DayPlanner is already running, it won't take effect until the current interval ends.
|
97
75
|
|
98
76
|
## Contributing
|
99
77
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module DayPlanner
|
2
|
+
class Task < ActiveRecord::Base
|
3
|
+
self.table_name = :day_planner_tasks
|
4
|
+
|
5
|
+
validate :check_name
|
6
|
+
|
7
|
+
def self.schedule(options)
|
8
|
+
unless options[:every]
|
9
|
+
raise ArgumentError, "Must specify task interval with :every, other scheduling methods are not yet implemented"
|
10
|
+
end
|
11
|
+
|
12
|
+
if options[:every].to_i < DayPlanner.interval.to_i
|
13
|
+
raise ArgumentError, "Must specify a task interval at least as long as DayPlanner's check interval."
|
14
|
+
end
|
15
|
+
|
16
|
+
fields = {}
|
17
|
+
fields[:name] = options.delete(:name) if options[:name]
|
18
|
+
fields[:interval] = options.delete(:every).to_i if options[:every]
|
19
|
+
|
20
|
+
task = DayPlanner::Task.create(fields)
|
21
|
+
end
|
22
|
+
|
23
|
+
def check_name
|
24
|
+
if name.present?
|
25
|
+
tasks = Task.where(name: name)
|
26
|
+
if tasks.count > 1 || (tasks.count == 1 && tasks.first.id != id)
|
27
|
+
errors.add(:name, "must be unique if specified")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def block
|
33
|
+
@block
|
34
|
+
end
|
35
|
+
|
36
|
+
def block=(block)
|
37
|
+
@block = block
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/day_planner.gemspec
CHANGED
@@ -21,5 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
|
-
spec.
|
24
|
+
spec.add_dependency "activesupport", ">= 3.0.0"
|
25
|
+
spec.add_dependency "rails", ">= 3.0.0"
|
26
|
+
|
27
|
+
spec.required_ruby_version = ">= 1.9.0"
|
25
28
|
end
|
data/lib/day_planner/base.rb
CHANGED
@@ -1,61 +1,28 @@
|
|
1
|
+
require 'day_planner/engine'
|
2
|
+
|
1
3
|
module DayPlanner
|
2
|
-
@@tasks = []
|
3
|
-
@@named_tasks = {}
|
4
4
|
@@status = "stopped"
|
5
|
-
|
6
|
-
class Railtie < Rails::Railtie
|
7
|
-
unless $0 =~ /rake/
|
8
|
-
initializer "day_planner.activate", after: :finisher_hook do
|
9
|
-
require File.expand_path('config/scheduled_tasks')
|
10
|
-
DayPlanner.activate
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
5
|
+
@@tasks = []
|
14
6
|
|
15
7
|
class << self
|
16
8
|
def tasks
|
17
9
|
@@tasks
|
18
10
|
end
|
19
11
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
raise ArgumentError, "DayPlanner couldn't find this task" if task.nil? || !task.is_a?(DayPlanner::Task)
|
29
|
-
task.destroy
|
12
|
+
def task(task)
|
13
|
+
if task.is_a?(Integer)
|
14
|
+
@@tasks.select{ |t| t.id == task }.first
|
15
|
+
elsif task.is_a?(String)
|
16
|
+
@@task.select{ |t| t.name == task }.first
|
17
|
+
elsif task.is_a?(DayPlanner::Task)
|
18
|
+
@@task.select{ |t| t.id == task.id }.first
|
19
|
+
end
|
30
20
|
end
|
31
21
|
|
32
22
|
def status
|
33
23
|
@@status
|
34
24
|
end
|
35
25
|
|
36
|
-
def deactivate
|
37
|
-
@@master.kill if defined?(@@master)
|
38
|
-
@@status = "stopped"
|
39
|
-
end
|
40
|
-
|
41
|
-
def activate
|
42
|
-
@@master.kill if defined?(@@master)
|
43
|
-
@@status = "running"
|
44
|
-
|
45
|
-
if defined?(Rails) && Rails.logger
|
46
|
-
Rails.logger.info("DayPlanner activated.")
|
47
|
-
else
|
48
|
-
puts "DayPlanner activated."
|
49
|
-
end
|
50
|
-
|
51
|
-
@@master = Thread.new do
|
52
|
-
while true
|
53
|
-
check_schedule
|
54
|
-
sleep(interval)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
26
|
def interval
|
60
27
|
defined?(@@interval) ? @@interval : 60
|
61
28
|
end
|
@@ -64,112 +31,97 @@ module DayPlanner
|
|
64
31
|
@@interval = value
|
65
32
|
end
|
66
33
|
|
67
|
-
def
|
68
|
-
@@
|
34
|
+
def clear_tasks
|
35
|
+
@@tasks = []
|
36
|
+
ActiveRecord::Base.connection.execute("TRUNCATE #{DayPlanner::Task.table_name}")
|
69
37
|
end
|
70
38
|
|
71
|
-
def
|
72
|
-
raise ArgumentError unless
|
73
|
-
raise ArgumentError unless @@named_tasks[name.to_s].nil?
|
74
|
-
@@named_tasks[name.to_s] = task
|
75
|
-
end
|
39
|
+
def schedule(options, &block)
|
40
|
+
raise ArgumentError, "Failed to pass an options hash" unless options.is_a?(Hash)
|
76
41
|
|
77
|
-
|
78
|
-
@@named_tasks.delete(name)
|
79
|
-
end
|
42
|
+
task = DayPlanner::Task.schedule(options)
|
80
43
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
t.perform
|
87
|
-
rescue => e
|
88
|
-
if defined?(Rails) && Rails.logger
|
89
|
-
Rails.logger.error("DayPlanner: Scheduled task threw an error! Behave yourselves!\n#{e.inspect}")
|
90
|
-
else
|
91
|
-
puts "DayPlanner: Scheduled task threw an error! Behave yourselves!\n#{e.inspect}"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
44
|
+
if !task.id.nil?
|
45
|
+
task.block = block
|
46
|
+
@@tasks.push(task)
|
47
|
+
else
|
48
|
+
raise ArgumentError, "Task creation failed. If you specified a name, was it unique?"
|
95
49
|
end
|
50
|
+
|
51
|
+
task
|
96
52
|
end
|
97
|
-
end
|
98
53
|
|
99
|
-
|
100
|
-
|
54
|
+
def cancel(task)
|
55
|
+
task = DayPlanner::Task.find_by_name(task) if task.is_a?(String) || task.is_a?(Symbol)
|
56
|
+
task = DayPlanner::Task.find(task) if task.is_a?(Integer)
|
101
57
|
|
102
|
-
|
103
|
-
if @environment.nil? || (defined?(Rails) && defined?(Rails.env) && Rails.env == @environment)
|
104
|
-
@last_executed = Time.now
|
58
|
+
raise ArgumentError, "DayPlanner couldn't find this task" if task.nil? || !task.is_a?(DayPlanner::Task)
|
105
59
|
|
106
|
-
|
107
|
-
else
|
108
|
-
log_info = "DayPlanner: "
|
60
|
+
@@tasks.select!{ |t| t.id != task.id }
|
109
61
|
|
110
|
-
|
111
|
-
|
112
|
-
else
|
113
|
-
log_info += "Skipping a task"
|
114
|
-
end
|
62
|
+
task.destroy
|
63
|
+
end
|
115
64
|
|
116
|
-
|
65
|
+
def deactivate
|
66
|
+
@@master.kill if defined?(@@master)
|
67
|
+
@@status = "stopped"
|
68
|
+
@@tasks = []
|
117
69
|
|
118
|
-
|
119
|
-
Rails.logger.info(log_info)
|
120
|
-
else
|
121
|
-
puts log_info
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
70
|
+
clear_tasks
|
125
71
|
|
126
|
-
|
127
|
-
DayPlanner.tasks.delete(self)
|
128
|
-
if @name
|
129
|
-
DayPlanner.delete_task_name(@name)
|
130
|
-
end
|
72
|
+
true
|
131
73
|
end
|
74
|
+
|
75
|
+
def activate
|
76
|
+
@@master.kill if defined?(@@master)
|
77
|
+
@@status = "running"
|
132
78
|
|
133
|
-
|
134
|
-
|
135
|
-
@interval = options[:every]
|
136
|
-
raise ArgumentError, "DayPlanner: Task interval is less than scheduler interval. Task not scheduled." if @interval < DayPlanner.interval
|
79
|
+
if defined?(Rails) && Rails.logger
|
80
|
+
Rails.logger.info("DayPlanner activated at #{Time.now.inspect}.")
|
137
81
|
else
|
138
|
-
|
82
|
+
puts "DayPlanner activated at #{Time.now.inspect}."
|
139
83
|
end
|
140
84
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
85
|
+
@@master = Thread.new do
|
86
|
+
begin
|
87
|
+
while true
|
88
|
+
check_schedule
|
89
|
+
sleep(interval)
|
90
|
+
end
|
91
|
+
ensure
|
92
|
+
Rails.logger.flush
|
146
93
|
end
|
147
94
|
end
|
95
|
+
end
|
148
96
|
|
149
|
-
|
97
|
+
private
|
98
|
+
def check_schedule
|
99
|
+
begin
|
100
|
+
DayPlanner.tasks.each_with_index do |t, idx|
|
101
|
+
time = Time.now
|
102
|
+
task = DayPlanner::Task.find(t.id)
|
150
103
|
|
151
|
-
|
104
|
+
if task.nil?
|
105
|
+
@@tasks.select!{ |item| item.id != t.id }
|
106
|
+
else
|
107
|
+
if task.last_execution.nil? || (time > task.next_execution && time > task.last_execution + (task.interval / 2))
|
108
|
+
task.last_execution = time
|
152
109
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
110
|
+
if !task.next_execution.nil?
|
111
|
+
task.next_execution += task.interval #move it up by interval, regardless of if it's getting executed late
|
112
|
+
else
|
113
|
+
task.next_execution = time + task.interval
|
114
|
+
end
|
157
115
|
|
158
|
-
|
159
|
-
Rails.logger.info(log_info)
|
160
|
-
else
|
161
|
-
puts log_info
|
162
|
-
end
|
116
|
+
task.save!
|
163
117
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
if defined?(Rails) && Rails.logger
|
168
|
-
Rails.logger.error("DayPlanner: Task caused error on first performance. There's no second chance for a good first impression!\n#{e.inspect}")
|
169
|
-
else
|
170
|
-
puts "DayPlanner: Task caused error on first performance. There's no second chance for a good first impression!\n#{e.inspect}"
|
118
|
+
t.block.call
|
119
|
+
end
|
120
|
+
end
|
171
121
|
end
|
122
|
+
rescue => e
|
123
|
+
Rails.logger.error("DayPlanner: task threw error:\n#{e.inspect}")
|
172
124
|
end
|
173
125
|
end
|
174
126
|
end
|
175
|
-
end
|
127
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'day_planner/generators/day_planner_generator'
|
2
|
+
|
3
|
+
module DayPlanner
|
4
|
+
class Railtie < Rails::Engine
|
5
|
+
isolate_namespace DayPlanner
|
6
|
+
|
7
|
+
unless $0 =~ /rake/ || defined?(::Rails::Generators) || defined?(::Bundler)# || defined?(::Rails::Console)
|
8
|
+
initializer "day_planner.activate", after: :finisher_hook do
|
9
|
+
DayPlanner.clear_tasks
|
10
|
+
require File.expand_path('config/scheduled_tasks')
|
11
|
+
DayPlanner.activate
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'rails/generators'
|
3
|
+
|
4
|
+
module DayPlanner
|
5
|
+
module Generators
|
6
|
+
class InstallGenerator < ::Rails::Generators::Base
|
7
|
+
include ::Rails::Generators::Migration
|
8
|
+
|
9
|
+
source_root File.expand_path('../../templates', __FILE__)
|
10
|
+
|
11
|
+
def copy_migrations
|
12
|
+
copy_migration "create_day_planner_tasks"
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_schedule_file
|
16
|
+
create_file "config/scheduled_tasks.rb", <<-EOS.gsub(/^\w+/, '')
|
17
|
+
# Example tasks:
|
18
|
+
#
|
19
|
+
# DayPlanner.schedule(every: 1.minute, name: "My Task") do
|
20
|
+
# MyClass.my_task
|
21
|
+
# End
|
22
|
+
EOS
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def copy_migration(filename)
|
28
|
+
if self.class.migration_exists?("db/migrate", filename)
|
29
|
+
say_status("skipped", "Migration #{filename} already exists")
|
30
|
+
else
|
31
|
+
migration_template("migrations/#{filename}.rb", "db/migrate/#{filename}.rb")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.next_migration_number(path)
|
36
|
+
unless @previous_migration_number
|
37
|
+
@previous_migration_number = Time.now.utc.strftime('%Y%m%d%H%M%S').to_i
|
38
|
+
else
|
39
|
+
@previous_migration_number += 1
|
40
|
+
end
|
41
|
+
@previous_migration_number.to_s
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateDayPlannerTasks < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
create_table :day_planner_tasks do |t|
|
4
|
+
t.string :name
|
5
|
+
t.integer :interval
|
6
|
+
t.datetime :last_execution
|
7
|
+
t.datetime :next_execution
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def down
|
12
|
+
drop_table :day_planner_tasks
|
13
|
+
end
|
14
|
+
end
|
data/lib/day_planner/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: day_planner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.1.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damon Siefert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.0.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.0.0
|
41
69
|
description: Simple gem to handle in-process scheduling of tasks
|
42
70
|
email:
|
43
71
|
- siefert@gmail.com
|
@@ -51,9 +79,13 @@ files:
|
|
51
79
|
- LICENSE.txt
|
52
80
|
- README.md
|
53
81
|
- Rakefile
|
82
|
+
- app/models/day_planner/task.rb
|
54
83
|
- day_planner.gemspec
|
55
84
|
- lib/day_planner.rb
|
56
85
|
- lib/day_planner/base.rb
|
86
|
+
- lib/day_planner/engine.rb
|
87
|
+
- lib/day_planner/generators/day_planner_generator.rb
|
88
|
+
- lib/day_planner/templates/migrations/create_day_planner_tasks.rb
|
57
89
|
- lib/day_planner/version.rb
|
58
90
|
homepage: ''
|
59
91
|
licenses:
|
@@ -67,12 +99,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
99
|
requirements:
|
68
100
|
- - '>='
|
69
101
|
- !ruby/object:Gem::Version
|
70
|
-
version:
|
102
|
+
version: 1.9.0
|
71
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
104
|
requirements:
|
73
|
-
- - '
|
105
|
+
- - '>'
|
74
106
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
107
|
+
version: 1.3.1
|
76
108
|
requirements: []
|
77
109
|
rubyforge_project:
|
78
110
|
rubygems_version: 2.0.14
|