emipair-delayed_job 2.0.3.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.
Files changed (91) hide show
  1. data/.gitignore +2 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +213 -0
  4. data/Rakefile +33 -0
  5. data/VERSION +1 -0
  6. data/benchmarks.rb +33 -0
  7. data/contrib/delayed_job.monitrc +14 -0
  8. data/contrib/delayed_job_multiple.monitrc +23 -0
  9. data/emipair-delayed_job.gemspec +25 -0
  10. data/generators/delayed_job/delayed_job_generator.rb +22 -0
  11. data/generators/delayed_job/templates/migration.rb +21 -0
  12. data/generators/delayed_job/templates/script +5 -0
  13. data/init.rb +1 -0
  14. data/lib/delayed/backend/active_record.rb +90 -0
  15. data/lib/delayed/backend/base.rb +111 -0
  16. data/lib/delayed/backend/data_mapper.rb +147 -0
  17. data/lib/delayed/backend/mongo_mapper.rb +110 -0
  18. data/lib/delayed/command.rb +109 -0
  19. data/lib/delayed/message_sending.rb +22 -0
  20. data/lib/delayed/performable_method.rb +62 -0
  21. data/lib/delayed/railtie.rb +10 -0
  22. data/lib/delayed/recipes.rb +31 -0
  23. data/lib/delayed/tasks.rb +15 -0
  24. data/lib/delayed/worker.rb +214 -0
  25. data/lib/delayed_job.rb +15 -0
  26. data/lib/passive_support.rb +4 -0
  27. data/lib/passive_support/basic_object.rb +16 -0
  28. data/lib/passive_support/core_ext.rb +8 -0
  29. data/lib/passive_support/core_ext/class.rb +1 -0
  30. data/lib/passive_support/core_ext/class/attribute_accessors.rb +57 -0
  31. data/lib/passive_support/core_ext/date.rb +10 -0
  32. data/lib/passive_support/core_ext/date/behavior.rb +42 -0
  33. data/lib/passive_support/core_ext/date/calculations.rb +241 -0
  34. data/lib/passive_support/core_ext/date/conversions.rb +107 -0
  35. data/lib/passive_support/core_ext/date_time.rb +12 -0
  36. data/lib/passive_support/core_ext/date_time/calculations.rb +126 -0
  37. data/lib/passive_support/core_ext/date_time/conversions.rb +107 -0
  38. data/lib/passive_support/core_ext/enumerable.rb +120 -0
  39. data/lib/passive_support/core_ext/kernel.rb +5 -0
  40. data/lib/passive_support/core_ext/kernel/agnostics.rb +11 -0
  41. data/lib/passive_support/core_ext/kernel/daemonizing.rb +7 -0
  42. data/lib/passive_support/core_ext/kernel/debugger.rb +16 -0
  43. data/lib/passive_support/core_ext/kernel/reporting.rb +59 -0
  44. data/lib/passive_support/core_ext/kernel/requires.rb +24 -0
  45. data/lib/passive_support/core_ext/module.rb +20 -0
  46. data/lib/passive_support/core_ext/module/aliasing.rb +74 -0
  47. data/lib/passive_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  48. data/lib/passive_support/core_ext/module/attr_internal.rb +32 -0
  49. data/lib/passive_support/core_ext/module/delegation.rb +135 -0
  50. data/lib/passive_support/core_ext/module/inclusion.rb +30 -0
  51. data/lib/passive_support/core_ext/module/introspection.rb +90 -0
  52. data/lib/passive_support/core_ext/module/loading.rb +23 -0
  53. data/lib/passive_support/core_ext/module/model_naming.rb +25 -0
  54. data/lib/passive_support/core_ext/module/synchronization.rb +39 -0
  55. data/lib/passive_support/core_ext/numeric.rb +9 -0
  56. data/lib/passive_support/core_ext/numeric/bytes.rb +50 -0
  57. data/lib/passive_support/core_ext/numeric/conversions.rb +19 -0
  58. data/lib/passive_support/core_ext/numeric/time.rb +81 -0
  59. data/lib/passive_support/core_ext/object.rb +6 -0
  60. data/lib/passive_support/core_ext/object/blank.rb +76 -0
  61. data/lib/passive_support/core_ext/object/conversions.rb +15 -0
  62. data/lib/passive_support/core_ext/object/extending.rb +80 -0
  63. data/lib/passive_support/core_ext/object/instance_variables.rb +74 -0
  64. data/lib/passive_support/core_ext/object/misc.rb +90 -0
  65. data/lib/passive_support/core_ext/object/singleton_class.rb +13 -0
  66. data/lib/passive_support/core_ext/string.rb +1 -0
  67. data/lib/passive_support/core_ext/string/constantize.rb +7 -0
  68. data/lib/passive_support/core_ext/time.rb +46 -0
  69. data/lib/passive_support/core_ext/time/behavior.rb +13 -0
  70. data/lib/passive_support/core_ext/time/calculations.rb +313 -0
  71. data/lib/passive_support/core_ext/time/conversions.rb +90 -0
  72. data/lib/passive_support/core_ext/time/zones.rb +86 -0
  73. data/lib/passive_support/duration.rb +100 -0
  74. data/lib/passive_support/ordered_hash.rb +158 -0
  75. data/rails/init.rb +5 -0
  76. data/recipes/delayed_job.rb +1 -0
  77. data/spec/backend/active_record_job_spec.rb +46 -0
  78. data/spec/backend/data_mapper_job_spec.rb +16 -0
  79. data/spec/backend/mongo_mapper_job_spec.rb +94 -0
  80. data/spec/backend/shared_backend_spec.rb +268 -0
  81. data/spec/delayed_method_spec.rb +58 -0
  82. data/spec/performable_method_spec.rb +42 -0
  83. data/spec/sample_jobs.rb +25 -0
  84. data/spec/setup/active_record.rb +33 -0
  85. data/spec/setup/data_mapper.rb +24 -0
  86. data/spec/setup/mongo_mapper.rb +17 -0
  87. data/spec/spec_helper.rb +19 -0
  88. data/spec/story_spec.rb +17 -0
  89. data/spec/worker_spec.rb +225 -0
  90. data/tasks/jobs.rake +1 -0
  91. metadata +323 -0
@@ -0,0 +1,10 @@
1
+ require 'date'
2
+ require 'passive_support/core_ext/date/behavior'
3
+ require 'passive_support/core_ext/date/calculations'
4
+ require 'passive_support/core_ext/date/conversions'
5
+
6
+ class Date#:nodoc:
7
+ include PassiveSupport::CoreExtensions::Date::Behavior
8
+ include PassiveSupport::CoreExtensions::Date::Calculations
9
+ include PassiveSupport::CoreExtensions::Date::Conversions
10
+ end
@@ -0,0 +1,42 @@
1
+ require 'date'
2
+
3
+ module PassiveSupport #:nodoc:
4
+ module CoreExtensions #:nodoc:
5
+ module Date #:nodoc:
6
+ module Behavior
7
+ # Enable more predictable duck-typing on Date-like classes. See
8
+ # Object#acts_like?.
9
+ def acts_like_date?
10
+ true
11
+ end
12
+
13
+ # Date memoizes some instance methods using metaprogramming to wrap
14
+ # the methods with one that caches the result in an instance variable.
15
+ #
16
+ # If a Date is frozen but the memoized method hasn't been called, the
17
+ # first call will result in a frozen object error since the memo
18
+ # instance variable is uninitialized.
19
+ #
20
+ # Work around by eagerly memoizing before freezing.
21
+ #
22
+ # Ruby 1.9 uses a preinitialized instance variable so it's unaffected.
23
+ # This hack is as close as we can get to feature detection:
24
+ begin
25
+ ::Date.today.freeze.jd
26
+ rescue => frozen_object_error
27
+ if frozen_object_error.message =~ /frozen/
28
+ def freeze #:nodoc:
29
+ self.class.private_instance_methods(false).each do |m|
30
+ if m.to_s =~ /\A__\d+__\Z/
31
+ instance_variable_set(:"@#{m}", [send(m)])
32
+ end
33
+ end
34
+
35
+ super
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,241 @@
1
+ module PassiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Date #:nodoc:
4
+ # Enables the use of time calculations within Date itself
5
+ module Calculations
6
+ def self.included(base) #:nodoc:
7
+ base.extend ClassMethods
8
+
9
+ base.instance_eval do
10
+ alias_method :plus_without_duration, :+
11
+ alias_method :+, :plus_with_duration
12
+
13
+ alias_method :minus_without_duration, :-
14
+ alias_method :-, :minus_with_duration
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ # Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
20
+ def yesterday
21
+ ::Date.today.yesterday
22
+ end
23
+
24
+ # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
25
+ def tomorrow
26
+ ::Date.today.tomorrow
27
+ end
28
+
29
+ # Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.
30
+ def current
31
+ ::Time.zone_default ? ::Time.zone.today : ::Date.today
32
+ end
33
+ end
34
+
35
+ # Tells whether the Date object's date lies in the past
36
+ def past?
37
+ self < ::Date.current
38
+ end
39
+
40
+ # Tells whether the Date object's date is today
41
+ def today?
42
+ self.to_date == ::Date.current # we need the to_date because of DateTime
43
+ end
44
+
45
+ # Tells whether the Date object's date lies in the future
46
+ def future?
47
+ self > ::Date.current
48
+ end
49
+
50
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
51
+ # and then subtracts the specified number of seconds
52
+ def ago(seconds)
53
+ to_time.since(-seconds)
54
+ end
55
+
56
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
57
+ # and then adds the specified number of seconds
58
+ def since(seconds)
59
+ to_time.since(seconds)
60
+ end
61
+ alias :in :since
62
+
63
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
64
+ def beginning_of_day
65
+ to_time
66
+ end
67
+ alias :midnight :beginning_of_day
68
+ alias :at_midnight :beginning_of_day
69
+ alias :at_beginning_of_day :beginning_of_day
70
+
71
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
72
+ def end_of_day
73
+ to_time.end_of_day
74
+ end
75
+
76
+ def plus_with_duration(other) #:nodoc:
77
+ if PassiveSupport::Duration === other
78
+ other.since(self)
79
+ else
80
+ plus_without_duration(other)
81
+ end
82
+ end
83
+
84
+ def minus_with_duration(other) #:nodoc:
85
+ if PassiveSupport::Duration === other
86
+ plus_with_duration(-other)
87
+ else
88
+ minus_without_duration(other)
89
+ end
90
+ end
91
+
92
+ # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
93
+ # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
94
+ def advance(options)
95
+ options = options.dup
96
+ d = self
97
+ d = d >> options.delete(:years) * 12 if options[:years]
98
+ d = d >> options.delete(:months) if options[:months]
99
+ d = d + options.delete(:weeks) * 7 if options[:weeks]
100
+ d = d + options.delete(:days) if options[:days]
101
+ d
102
+ end
103
+
104
+ # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
105
+ #
106
+ # Examples:
107
+ #
108
+ # Date.new(2007, 5, 12).change(:day => 1) # => Date.new(2007, 5, 1)
109
+ # Date.new(2007, 5, 12).change(:year => 2005, :month => 1) # => Date.new(2005, 1, 12)
110
+ def change(options)
111
+ ::Date.new(
112
+ options[:year] || self.year,
113
+ options[:month] || self.month,
114
+ options[:day] || self.day
115
+ )
116
+ end
117
+
118
+ # Returns a new Date/DateTime representing the time a number of specified months ago
119
+ def months_ago(months)
120
+ advance(:months => -months)
121
+ end
122
+
123
+ # Returns a new Date/DateTime representing the time a number of specified months in the future
124
+ def months_since(months)
125
+ advance(:months => months)
126
+ end
127
+
128
+ # Returns a new Date/DateTime representing the time a number of specified years ago
129
+ def years_ago(years)
130
+ advance(:years => -years)
131
+ end
132
+
133
+ # Returns a new Date/DateTime representing the time a number of specified years in the future
134
+ def years_since(years)
135
+ advance(:years => years)
136
+ end
137
+
138
+ def last_year # :nodoc:
139
+ PassiveSupport::Deprecation.warn("Date#last_year is deprecated and has been removed in Rails 3, please use Date#prev_year instead", caller)
140
+ prev_year
141
+ end
142
+
143
+ # Short-hand for years_ago(1)
144
+ def prev_year
145
+ years_ago(1)
146
+ end unless method_defined?(:prev_year)
147
+
148
+ # Short-hand for years_since(1)
149
+ def next_year
150
+ years_since(1)
151
+ end
152
+
153
+ def last_month # :nodoc:
154
+ PassiveSupport::Deprecation.warn("Date#last_month is deprecated and has been removed in Rails 3, please use Date#prev_month instead", caller)
155
+ prev_month
156
+ end
157
+
158
+ # Short-hand for months_ago(1)
159
+ def prev_month
160
+ months_ago(1)
161
+ end unless method_defined?(:prev_month)
162
+
163
+ # Short-hand for months_since(1)
164
+ def next_month
165
+ months_since(1)
166
+ end
167
+
168
+ # Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
169
+ def beginning_of_week
170
+ days_to_monday = self.wday!=0 ? self.wday-1 : 6
171
+ result = self - days_to_monday
172
+ self.acts_like?(:time) ? result.midnight : result
173
+ end
174
+ alias :monday :beginning_of_week
175
+ alias :at_beginning_of_week :beginning_of_week
176
+
177
+ # Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
178
+ def end_of_week
179
+ days_to_sunday = self.wday!=0 ? 7-self.wday : 0
180
+ result = self + days_to_sunday.days
181
+ self.acts_like?(:time) ? result.end_of_day : result
182
+ end
183
+ alias :at_end_of_week :end_of_week
184
+
185
+ # Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
186
+ def next_week(day = :monday)
187
+ days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
188
+ result = (self + 7).beginning_of_week + days_into_week[day]
189
+ self.acts_like?(:time) ? result.change(:hour => 0) : result
190
+ end
191
+
192
+ # Returns a new ; DateTime objects will have time set to 0:00DateTime representing the start of the month (1st of the month; DateTime objects will have time set to 0:00)
193
+ def beginning_of_month
194
+ self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
195
+ end
196
+ alias :at_beginning_of_month :beginning_of_month
197
+
198
+ # Returns a new Date/DateTime representing the end of the month (last day of the month; DateTime objects will have time set to 0:00)
199
+ def end_of_month
200
+ last_day = ::Time.days_in_month( self.month, self.year )
201
+ self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
202
+ end
203
+ alias :at_end_of_month :end_of_month
204
+
205
+ # Returns a new Date/DateTime representing the start of the quarter (1st of january, april, july, october; DateTime objects will have time set to 0:00)
206
+ def beginning_of_quarter
207
+ beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
208
+ end
209
+ alias :at_beginning_of_quarter :beginning_of_quarter
210
+
211
+ # Returns a new Date/DateTime representing the end of the quarter (last day of march, june, september, december; DateTime objects will have time set to 23:59:59)
212
+ def end_of_quarter
213
+ beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
214
+ end
215
+ alias :at_end_of_quarter :end_of_quarter
216
+
217
+ # Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
218
+ def beginning_of_year
219
+ self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
220
+ end
221
+ alias :at_beginning_of_year :beginning_of_year
222
+
223
+ # Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
224
+ def end_of_year
225
+ self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
226
+ end
227
+ alias :at_end_of_year :end_of_year
228
+
229
+ # Convenience method which returns a new Date/DateTime representing the time 1 day ago
230
+ def yesterday
231
+ self - 1
232
+ end
233
+
234
+ # Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
235
+ def tomorrow
236
+ self + 1
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,107 @@
1
+ module PassiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Date #:nodoc:
4
+ # Converting dates to formatted strings, times, and datetimes.
5
+ module Conversions
6
+ DATE_FORMATS = {
7
+ :short => "%e %b",
8
+ :long => "%B %e, %Y",
9
+ :db => "%Y-%m-%d",
10
+ :number => "%Y%m%d",
11
+ :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") }, # => "April 25th, 2007"
12
+ :rfc822 => "%e %b %Y"
13
+ }
14
+
15
+ def self.included(base) #:nodoc:
16
+ base.instance_eval do
17
+ alias_method :to_default_s, :to_s
18
+ alias_method :to_s, :to_formatted_s
19
+ alias_method :default_inspect, :inspect
20
+ alias_method :inspect, :readable_inspect
21
+
22
+ # Ruby 1.9 has Date#to_time which converts to localtime only.
23
+ remove_method :to_time if base.instance_methods.include?(:to_time)
24
+
25
+ # Ruby 1.9 has Date#xmlschema which converts to a string without the time component.
26
+ remove_method :xmlschema if base.instance_methods.include?(:xmlschema)
27
+ end
28
+ end
29
+
30
+ # Convert to a formatted string. See DATE_FORMATS for predefined formats.
31
+ #
32
+ # This method is aliased to <tt>to_s</tt>.
33
+ #
34
+ # ==== Examples
35
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
36
+ #
37
+ # date.to_formatted_s(:db) # => "2007-11-10"
38
+ # date.to_s(:db) # => "2007-11-10"
39
+ #
40
+ # date.to_formatted_s(:short) # => "10 Nov"
41
+ # date.to_formatted_s(:long) # => "November 10, 2007"
42
+ # date.to_formatted_s(:long_ordinal) # => "November 10th, 2007"
43
+ # date.to_formatted_s(:rfc822) # => "10 Nov 2007"
44
+ #
45
+ # == Adding your own time formats to to_formatted_s
46
+ # You can add your own formats to the Date::DATE_FORMATS hash.
47
+ # Use the format name as the hash key and either a strftime string
48
+ # or Proc instance that takes a date argument as the value.
49
+ #
50
+ # # config/initializers/time_formats.rb
51
+ # Date::DATE_FORMATS[:month_and_year] = "%B %Y"
52
+ # Date::DATE_FORMATS[:short_ordinal] = lambda { |date| date.strftime("%B #{date.day.ordinalize}") }
53
+ def to_formatted_s(format = :default)
54
+ if formatter = DATE_FORMATS[format]
55
+ if formatter.respond_to?(:call)
56
+ formatter.call(self).to_s
57
+ else
58
+ strftime(formatter)
59
+ end
60
+ else
61
+ to_default_s
62
+ end
63
+ end
64
+
65
+ # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
66
+ def readable_inspect
67
+ strftime("%a, %d %b %Y")
68
+ end
69
+
70
+ # A method to keep Time, Date and DateTime instances interchangeable on conversions.
71
+ # In this case, it simply returns +self+.
72
+ def to_date
73
+ self
74
+ end if RUBY_VERSION < '1.9'
75
+
76
+ # Converts a Date instance to a Time, where the time is set to the beginning of the day.
77
+ # The timezone can be either :local or :utc (default :local).
78
+ #
79
+ # ==== Examples
80
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
81
+ #
82
+ # date.to_time # => Sat Nov 10 00:00:00 0800 2007
83
+ # date.to_time(:local) # => Sat Nov 10 00:00:00 0800 2007
84
+ #
85
+ # date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
86
+ def to_time(form = :local)
87
+ ::Time.send("#{form}_time", year, month, day)
88
+ end
89
+
90
+ # Converts a Date instance to a DateTime, where the time is set to the beginning of the day
91
+ # and UTC offset is set to 0.
92
+ #
93
+ # ==== Examples
94
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
95
+ #
96
+ # date.to_datetime # => Sat, 10 Nov 2007 00:00:00 0000
97
+ def to_datetime
98
+ ::DateTime.civil(year, month, day, 0, 0, 0, 0)
99
+ end if RUBY_VERSION < '1.9'
100
+
101
+ def xmlschema
102
+ to_time.xmlschema
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,12 @@
1
+ require 'date'
2
+ require 'passive_support/core_ext/time/behavior'
3
+ require 'passive_support/core_ext/time/zones'
4
+ require 'passive_support/core_ext/date_time/calculations'
5
+ require 'passive_support/core_ext/date_time/conversions'
6
+
7
+ class DateTime
8
+ include PassiveSupport::CoreExtensions::Time::Behavior
9
+ include PassiveSupport::CoreExtensions::Time::Zones
10
+ include PassiveSupport::CoreExtensions::DateTime::Calculations
11
+ include PassiveSupport::CoreExtensions::DateTime::Conversions
12
+ end
@@ -0,0 +1,126 @@
1
+ require 'rational'
2
+
3
+ module PassiveSupport #:nodoc:
4
+ module CoreExtensions #:nodoc:
5
+ module DateTime #:nodoc:
6
+ # Enables the use of time calculations within DateTime itself
7
+ module Calculations
8
+ def self.included(base) #:nodoc:
9
+ base.extend ClassMethods
10
+
11
+ base.class_eval do
12
+ alias_method :compare_without_coercion, :<=>
13
+ alias_method :<=>, :compare_with_coercion
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ # DateTimes aren't aware of DST rules, so use a consistent non-DST offset when creating a DateTime with an offset in the local zone
19
+ def local_offset
20
+ ::Time.local(2007).utc_offset.to_r / 86400
21
+ end
22
+
23
+ def current
24
+ ::Time.zone_default ? ::Time.zone.now.to_datetime : ::Time.now.to_datetime
25
+ end
26
+ end
27
+
28
+ # Tells whether the DateTime object's datetime lies in the past
29
+ def past?
30
+ self < ::DateTime.current
31
+ end
32
+
33
+ # Tells whether the DateTime object's datetime lies in the future
34
+ def future?
35
+ self > ::DateTime.current
36
+ end
37
+
38
+ # Seconds since midnight: DateTime.now.seconds_since_midnight
39
+ def seconds_since_midnight
40
+ self.sec + (self.min * 60) + (self.hour * 3600)
41
+ end
42
+
43
+ # Returns a new DateTime where one or more of the elements have been changed according to the +options+ parameter. The time options
44
+ # (hour, minute, sec) reset cascadingly, so if only the hour is passed, then minute and sec is set to 0. If the hour and
45
+ # minute is passed, then sec is set to 0.
46
+ def change(options)
47
+ ::DateTime.civil(
48
+ options[:year] || self.year,
49
+ options[:month] || self.month,
50
+ options[:day] || self.day,
51
+ options[:hour] || self.hour,
52
+ options[:min] || (options[:hour] ? 0 : self.min),
53
+ options[:sec] || ((options[:hour] || options[:min]) ? 0 : self.sec),
54
+ options[:offset] || self.offset,
55
+ options[:start] || self.start
56
+ )
57
+ end
58
+
59
+ # Uses Date to provide precise Time calculations for years, months, and days.
60
+ # The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
61
+ # <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
62
+ # <tt>:minutes</tt>, <tt>:seconds</tt>.
63
+ def advance(options)
64
+ d = to_date.advance(options)
65
+ datetime_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
66
+ seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
67
+ seconds_to_advance == 0 ? datetime_advanced_by_date : datetime_advanced_by_date.since(seconds_to_advance)
68
+ end
69
+
70
+ # Returns a new DateTime representing the time a number of seconds ago
71
+ # Do not use this method in combination with x.months, use months_ago instead!
72
+ def ago(seconds)
73
+ self.since(-seconds)
74
+ end
75
+
76
+ # Returns a new DateTime representing the time a number of seconds since the instance time
77
+ # Do not use this method in combination with x.months, use months_since instead!
78
+ def since(seconds)
79
+ self + Rational(seconds.round, 86400)
80
+ end
81
+ alias :in :since
82
+
83
+ # Returns a new DateTime representing the start of the day (0:00)
84
+ def beginning_of_day
85
+ change(:hour => 0)
86
+ end
87
+ alias :midnight :beginning_of_day
88
+ alias :at_midnight :beginning_of_day
89
+ alias :at_beginning_of_day :beginning_of_day
90
+
91
+ # Returns a new DateTime representing the end of the day (23:59:59)
92
+ def end_of_day
93
+ change(:hour => 23, :min => 59, :sec => 59)
94
+ end
95
+
96
+ # Adjusts DateTime to UTC by adding its offset value; offset is set to 0
97
+ #
98
+ # Example:
99
+ #
100
+ # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600
101
+ # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 +0000
102
+ def utc
103
+ new_offset(0)
104
+ end
105
+ alias_method :getutc, :utc
106
+
107
+ # Returns true if offset == 0
108
+ def utc?
109
+ offset == 0
110
+ end
111
+
112
+ # Returns the offset value in seconds
113
+ def utc_offset
114
+ (offset * 86400).to_i
115
+ end
116
+
117
+ # Layers additional behavior on DateTime#<=> so that Time and PassiveSupport::TimeWithZone instances can be compared with a DateTime
118
+ def compare_with_coercion(other)
119
+ other = other.comparable_time if other.respond_to?(:comparable_time)
120
+ other = other.to_datetime unless other.acts_like?(:date)
121
+ compare_without_coercion(other)
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end