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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6d6fd31e83428dddd1dc38cc0d61d57f6f548ac
4
- data.tar.gz: 7f3f60dd31dad264be4e598219794778af64e578
3
+ metadata.gz: 2b2cd47bed48216943fca5ceb558f4209b58b887
4
+ data.tar.gz: be5a04e84a1146461fe40792562c58b32f5065f9
5
5
  SHA512:
6
- metadata.gz: bbe29034e2ccbad6c0340e07adf11e30059cb422c750896f6801987e58af6c8860093346e2a3d71d4e954c62b547d5977236243cb6f83b99f2184968a0acfe23
7
- data.tar.gz: 8a61920ac3da2e6e6c5677008dab78e2361d746bc4cbb1829dc13775f263b64ee038eee7f4932d2ea1629f1dac3a882faeace7d6a3c08c85c54e6ed560aa7597
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 I require that as a minimum, but I obviously can't guarantee that you won't 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)?)
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
- If you're using Rails, it'll expect to find a file listing scheduled tasks in 'config/scheduled_tasks.rb'. If you're not using Rails, do whatever makes you happy. Stick some scheduled tasks somewhere and make sure it's somewhere that runs when your application starts.
18
+ $ rails generate day_planner:install
19
+ $ rake db:migrate
20
20
 
21
21
  ## Usage
22
22
 
23
- ### Rails
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 really 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.)
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
- ### Other options
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.find_task("my task")
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, you can either call the task's "destroy" method, or call a class method on DayPlanner:
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 basically a minimum possible period before it's performed again -- if a task takes time to run, keep that in mind (or spin off a new thread yourself in the task).
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 goodies may be waiting in the pipeline) 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. If you alter this value while DayPlanner is already running, it won't take effect until the current interval ends.
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.required_ruby_version = ">= 2.0.0"
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
@@ -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 schedule(options, &block)
21
- raise ArgumentError unless options.is_a?(Hash)
22
-
23
- Task.new(options, &block)
24
- end
25
-
26
- def cancel(task)
27
- task = find_task(task) if task.is_a?(String) || task.is_a?(Symbol)
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 find_task(name)
68
- @@named_tasks[name.to_s]
34
+ def clear_tasks
35
+ @@tasks = []
36
+ ActiveRecord::Base.connection.execute("TRUNCATE #{DayPlanner::Task.table_name}")
69
37
  end
70
38
 
71
- def register_task_name(name, task)
72
- raise ArgumentError unless task.is_a?(DayPlanner::Task)
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
- def delete_task_name(name)
78
- @@named_tasks.delete(name)
79
- end
42
+ task = DayPlanner::Task.schedule(options)
80
43
 
81
- private
82
- def check_schedule
83
- tasks.each do |t|
84
- if Time.now > t.last_executed + t.interval
85
- begin
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
- class Task
100
- attr_reader :name, :last_executed, :interval
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
- def perform
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
- @task.call
107
- else
108
- log_info = "DayPlanner: "
60
+ @@tasks.select!{ |t| t.id != task.id }
109
61
 
110
- if @name
111
- log_info += "Skipping task '#{@name}'"
112
- else
113
- log_info += "Skipping a task"
114
- end
62
+ task.destroy
63
+ end
115
64
 
116
- log_info += " because it's set for environment '#{@environment}'."
65
+ def deactivate
66
+ @@master.kill if defined?(@@master)
67
+ @@status = "stopped"
68
+ @@tasks = []
117
69
 
118
- if defined?(Rails) && Rails.logger
119
- Rails.logger.info(log_info)
120
- else
121
- puts log_info
122
- end
123
- end
124
- end
70
+ clear_tasks
125
71
 
126
- def destroy
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
- def initialize(options, &block)
134
- if options[:every]
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
- raise ArgumentError, "DayPlanner: Scheduling tasks at anything other than simple intervals using 'every' is still not implemented, not even a little bit."
82
+ puts "DayPlanner activated at #{Time.now.inspect}."
139
83
  end
140
84
 
141
- if options[:name]
142
- name = options.delete(:name)
143
- if !DayPlanner.find_task(name)
144
- @name = name.to_s
145
- DayPlanner.register_task_name(name, self)
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
- @environment = options.delete(:environment) if options[:environment]
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
- @task = block
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
- DayPlanner.tasks.push(self)
154
- log_info = "DayPlanner: New task added"
155
- log_info += ": '#{@name}'" unless @name.nil?
156
- log_info += " with an execution interval of #{@interval.to_i} seconds."
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
- if defined?(Rails) && Rails.logger
159
- Rails.logger.info(log_info)
160
- else
161
- puts log_info
162
- end
116
+ task.save!
163
117
 
164
- begin
165
- perform
166
- rescue => e
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
@@ -1,8 +1,9 @@
1
1
  module DayPlanner
2
2
  MAJOR = 0
3
- MINOR = 0
4
- TINY = 18
3
+ MINOR = 1
4
+ TINY = 0
5
+ PRE = "pre1"
5
6
  BUILD = nil
6
7
 
7
- VERSION = [MAJOR, MINOR, TINY, BUILD].compact.join(".")
8
+ VERSION = [MAJOR, MINOR, TINY, PRE, BUILD].compact.join(".")
8
9
  end
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.18
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: 2013-12-30 00:00:00.000000000 Z
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: 2.0.0
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: '0'
107
+ version: 1.3.1
76
108
  requirements: []
77
109
  rubyforge_project:
78
110
  rubygems_version: 2.0.14