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,13 @@
1
+ class Object
2
+ # Returns the object's singleton class.
3
+ def singleton_class
4
+ class << self
5
+ self
6
+ end
7
+ end unless respond_to?(:singleton_class)
8
+
9
+ # class_eval on an object acts like singleton_class_eval.
10
+ def class_eval(*args, &block)
11
+ singleton_class.class_eval(*args, &block)
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ require 'passive_support/core_ext/string/constantize'
@@ -0,0 +1,7 @@
1
+ require 'extlib'
2
+
3
+ class String
4
+ def constantize
5
+ Extlib::Inflection.constantize(self)
6
+ end
7
+ end
@@ -0,0 +1,46 @@
1
+ require 'date'
2
+ require 'time'
3
+
4
+ class Time
5
+ # Ruby 1.8-cvs and 1.9 define private Time#to_date
6
+ %w(to_date to_datetime).each do |method|
7
+ public method if private_instance_methods.include?(method)
8
+ end
9
+
10
+ # Pre-1.9 versions of Ruby have a bug with marshaling Time instances, where utc instances are
11
+ # unmarshaled in the local zone, instead of utc. We're layering behavior on the _dump and _load
12
+ # methods so that utc instances can be flagged on dump, and coerced back to utc on load.
13
+ if RUBY_VERSION < '1.9'
14
+ class << self
15
+ alias_method :_original_load, :_load
16
+ def _load(marshaled_time)
17
+ time = _original_load(marshaled_time)
18
+ time.instance_eval do
19
+ if defined?(@marshal_with_utc_coercion)
20
+ val = remove_instance_variable("@marshal_with_utc_coercion")
21
+ end
22
+ val ? utc : self
23
+ end
24
+ end
25
+ end
26
+
27
+ alias_method :_original_dump, :_dump
28
+ def _dump(*args)
29
+ obj = dup
30
+ obj.instance_variable_set('@marshal_with_utc_coercion', utc?)
31
+ obj._original_dump(*args)
32
+ end
33
+ end
34
+ end
35
+
36
+ require 'passive_support/core_ext/time/behavior'
37
+ require 'passive_support/core_ext/time/calculations'
38
+ require 'passive_support/core_ext/time/conversions'
39
+ require 'passive_support/core_ext/time/zones'
40
+
41
+ class Time#:nodoc:
42
+ include PassiveSupport::CoreExtensions::Time::Behavior
43
+ include PassiveSupport::CoreExtensions::Time::Calculations
44
+ include PassiveSupport::CoreExtensions::Time::Conversions
45
+ include PassiveSupport::CoreExtensions::Time::Zones
46
+ end
@@ -0,0 +1,13 @@
1
+ module PassiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Time #:nodoc:
4
+ module Behavior
5
+ # Enable more predictable duck-typing on Time-like classes. See
6
+ # Object#acts_like?.
7
+ def acts_like_time?
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,313 @@
1
+ require 'passive_support/duration'
2
+
3
+ module PassiveSupport #:nodoc:
4
+ module CoreExtensions #:nodoc:
5
+ module Time #:nodoc:
6
+ # Enables the use of time calculations within Time itself
7
+ module Calculations
8
+ def self.included(base) #:nodoc:
9
+ base.extend ClassMethods
10
+
11
+ base.class_eval do
12
+ alias_method :plus_without_duration, :+
13
+ alias_method :+, :plus_with_duration
14
+
15
+ alias_method :minus_without_duration, :-
16
+ alias_method :-, :minus_with_duration
17
+
18
+ alias_method :minus_without_coercion, :-
19
+ alias_method :-, :minus_with_coercion
20
+
21
+ alias_method :compare_without_coercion, :<=>
22
+ alias_method :<=>, :compare_with_coercion
23
+ end
24
+ end
25
+
26
+ COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
27
+
28
+ module ClassMethods
29
+ # Overriding case equality method so that it returns true for PassiveSupport::TimeWithZone instances
30
+ def ===(other)
31
+ other.is_a?(::Time)
32
+ end
33
+
34
+ # Return the number of days in the given month.
35
+ # If no year is specified, it will use the current year.
36
+ def days_in_month(month, year = now.year)
37
+ return 29 if month == 2 && ::Date.gregorian_leap?(year)
38
+ COMMON_YEAR_DAYS_IN_MONTH[month]
39
+ end
40
+
41
+ # Returns a new Time if requested year can be accommodated by Ruby's Time class
42
+ # (i.e., if year is within either 1970..2038 or 1902..2038, depending on system architecture);
43
+ # otherwise returns a DateTime
44
+ def time_with_datetime_fallback(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
45
+ ::Time.send(utc_or_local, year, month, day, hour, min, sec, usec)
46
+ rescue
47
+ offset = utc_or_local.to_sym == :local ? ::DateTime.local_offset : 0
48
+ ::DateTime.civil(year, month, day, hour, min, sec, offset)
49
+ end
50
+
51
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:utc</tt>.
52
+ def utc_time(*args)
53
+ time_with_datetime_fallback(:utc, *args)
54
+ end
55
+
56
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:local</tt>.
57
+ def local_time(*args)
58
+ time_with_datetime_fallback(:local, *args)
59
+ end
60
+ end
61
+
62
+ # Tells whether the Time object's time lies in the past
63
+ def past?
64
+ self < ::Time.current
65
+ end
66
+
67
+ # Tells whether the Time object's time is today
68
+ def today?
69
+ self.to_date == ::Date.current
70
+ end
71
+
72
+ # Tells whether the Time object's time lies in the future
73
+ def future?
74
+ self > ::Time.current
75
+ end
76
+
77
+ # Seconds since midnight: Time.now.seconds_since_midnight
78
+ def seconds_since_midnight
79
+ self.to_i - self.change(:hour => 0).to_i + (self.usec/1.0e+6)
80
+ end
81
+
82
+ # Returns a new Time where one or more of the elements have been changed according to the +options+ parameter. The time options
83
+ # (hour, minute, sec, usec) reset cascadingly, so if only the hour is passed, then minute, sec, and usec is set to 0. If the hour and
84
+ # minute is passed, then sec and usec is set to 0.
85
+ def change(options)
86
+ ::Time.send(
87
+ self.utc? ? :utc_time : :local_time,
88
+ options[:year] || self.year,
89
+ options[:month] || self.month,
90
+ options[:day] || self.day,
91
+ options[:hour] || self.hour,
92
+ options[:min] || (options[:hour] ? 0 : self.min),
93
+ options[:sec] || ((options[:hour] || options[:min]) ? 0 : self.sec),
94
+ options[:usec] || ((options[:hour] || options[:min] || options[:sec]) ? 0 : self.usec)
95
+ )
96
+ end
97
+
98
+ # Uses Date to provide precise Time calculations for years, months, and days.
99
+ # The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
100
+ # <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
101
+ # <tt>:minutes</tt>, <tt>:seconds</tt>.
102
+ def advance(options)
103
+ unless options[:weeks].nil?
104
+ options[:weeks], partial_weeks = options[:weeks].divmod(1)
105
+ options[:days] = (options[:days] || 0) + 7 * partial_weeks
106
+ end
107
+
108
+ unless options[:days].nil?
109
+ options[:days], partial_days = options[:days].divmod(1)
110
+ options[:hours] = (options[:hours] || 0) + 24 * partial_days
111
+ end
112
+
113
+ d = to_date.advance(options)
114
+ time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
115
+ seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
116
+ seconds_to_advance == 0 ? time_advanced_by_date : time_advanced_by_date.since(seconds_to_advance)
117
+ end
118
+
119
+ # Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension
120
+ def ago(seconds)
121
+ self.since(-seconds)
122
+ end
123
+
124
+ # Returns a new Time representing the time a number of seconds since the instance time, this is basically a wrapper around
125
+ # the Numeric extension.
126
+ def since(seconds)
127
+ f = seconds.since(self)
128
+ if PassiveSupport::Duration === seconds
129
+ f
130
+ else
131
+ initial_dst = self.dst? ? 1 : 0
132
+ final_dst = f.dst? ? 1 : 0
133
+ (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
134
+ end
135
+ rescue
136
+ self.to_datetime.since(seconds)
137
+ end
138
+ alias :in :since
139
+
140
+ # Returns a new Time representing the time a number of specified months ago
141
+ def months_ago(months)
142
+ advance(:months => -months)
143
+ end
144
+
145
+ # Returns a new Time representing the time a number of specified months in the future
146
+ def months_since(months)
147
+ advance(:months => months)
148
+ end
149
+
150
+ # Returns a new Time representing the time a number of specified years ago
151
+ def years_ago(years)
152
+ advance(:years => -years)
153
+ end
154
+
155
+ # Returns a new Time representing the time a number of specified years in the future
156
+ def years_since(years)
157
+ advance(:years => years)
158
+ end
159
+
160
+ def last_year # :nodoc:
161
+ PassiveSupport::Deprecation.warn("Time#last_year is deprecated and has been removed in Rails 3, please use Time#prev_year instead", caller)
162
+ prev_year
163
+ end
164
+
165
+ # Short-hand for years_ago(1)
166
+ def prev_year
167
+ years_ago(1)
168
+ end
169
+
170
+ # Short-hand for years_since(1)
171
+ def next_year
172
+ years_since(1)
173
+ end
174
+
175
+ def last_month # :nodoc:
176
+ PassiveSupport::Deprecation.warn("Time#last_month is deprecated and has been removed in Rails 3, please use Time#prev_month instead", caller)
177
+ prev_month
178
+ end
179
+
180
+ # Short-hand for months_ago(1)
181
+ def prev_month
182
+ months_ago(1)
183
+ end
184
+
185
+ # Short-hand for months_since(1)
186
+ def next_month
187
+ months_since(1)
188
+ end
189
+
190
+ # Returns a new Time representing the "start" of this week (Monday, 0:00)
191
+ def beginning_of_week
192
+ days_to_monday = self.wday!=0 ? self.wday-1 : 6
193
+ (self - days_to_monday.days).midnight
194
+ end
195
+ alias :monday :beginning_of_week
196
+ alias :at_beginning_of_week :beginning_of_week
197
+
198
+ # Returns a new Time representing the end of this week (Sunday, 23:59:59)
199
+ def end_of_week
200
+ days_to_sunday = self.wday!=0 ? 7-self.wday : 0
201
+ (self + days_to_sunday.days).end_of_day
202
+ end
203
+ alias :at_end_of_week :end_of_week
204
+
205
+ # Returns a new Time representing the start of the given day in next week (default is Monday).
206
+ def next_week(day = :monday)
207
+ days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
208
+ since(1.week).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
209
+ end
210
+
211
+ # Returns a new Time representing the start of the day (0:00)
212
+ def beginning_of_day
213
+ #(self - seconds_since_midnight).change(:usec => 0)
214
+ change(:hour => 0, :min => 0, :sec => 0, :usec => 0)
215
+ end
216
+ alias :midnight :beginning_of_day
217
+ alias :at_midnight :beginning_of_day
218
+ alias :at_beginning_of_day :beginning_of_day
219
+
220
+ # Returns a new Time representing the end of the day, 23:59:59.999999 (.999999999 in ruby1.9)
221
+ def end_of_day
222
+ change(:hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
223
+ end
224
+
225
+ # Returns a new Time representing the start of the month (1st of the month, 0:00)
226
+ def beginning_of_month
227
+ #self - ((self.mday-1).days + self.seconds_since_midnight)
228
+ change(:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
229
+ end
230
+ alias :at_beginning_of_month :beginning_of_month
231
+
232
+ # Returns a new Time representing the end of the month (end of the last day of the month)
233
+ def end_of_month
234
+ #self - ((self.mday-1).days + self.seconds_since_midnight)
235
+ last_day = ::Time.days_in_month( self.month, self.year )
236
+ change(:day => last_day, :hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
237
+ end
238
+ alias :at_end_of_month :end_of_month
239
+
240
+ # Returns a new Time representing the start of the quarter (1st of january, april, july, october, 0:00)
241
+ def beginning_of_quarter
242
+ beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
243
+ end
244
+ alias :at_beginning_of_quarter :beginning_of_quarter
245
+
246
+ # Returns a new Time representing the end of the quarter (end of the last day of march, june, september, december)
247
+ def end_of_quarter
248
+ beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
249
+ end
250
+ alias :at_end_of_quarter :end_of_quarter
251
+
252
+ # Returns a new Time representing the start of the year (1st of january, 0:00)
253
+ def beginning_of_year
254
+ change(:month => 1,:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
255
+ end
256
+ alias :at_beginning_of_year :beginning_of_year
257
+
258
+ # Returns a new Time representing the end of the year (end of the 31st of december)
259
+ def end_of_year
260
+ change(:month => 12, :day => 31, :hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
261
+ end
262
+ alias :at_end_of_year :end_of_year
263
+
264
+ # Convenience method which returns a new Time representing the time 1 day ago
265
+ def yesterday
266
+ advance(:days => -1)
267
+ end
268
+
269
+ # Convenience method which returns a new Time representing the time 1 day since the instance time
270
+ def tomorrow
271
+ advance(:days => 1)
272
+ end
273
+
274
+ def plus_with_duration(other) #:nodoc:
275
+ if PassiveSupport::Duration === other
276
+ other.since(self)
277
+ else
278
+ plus_without_duration(other)
279
+ end
280
+ end
281
+
282
+ def minus_with_duration(other) #:nodoc:
283
+ if PassiveSupport::Duration === other
284
+ other.until(self)
285
+ else
286
+ minus_without_duration(other)
287
+ end
288
+ end
289
+
290
+ # Time#- can also be used to determine the number of seconds between two Time instances.
291
+ # We're layering on additional behavior so that PassiveSupport::TimeWithZone instances
292
+ # are coerced into values that Time#- will recognize
293
+ def minus_with_coercion(other)
294
+ other = other.comparable_time if other.respond_to?(:comparable_time)
295
+ other.is_a?(::DateTime) ? to_f - other.to_f : minus_without_coercion(other)
296
+ end
297
+
298
+ # Layers additional behavior on Time#<=> so that DateTime and PassiveSupport::TimeWithZone instances
299
+ # can be chronologically compared with a Time
300
+ def compare_with_coercion(other)
301
+ # if other is an PassiveSupport::TimeWithZone, coerce a Time instance from it so we can do <=> comparison
302
+ other = other.comparable_time if other.respond_to?(:comparable_time)
303
+ if other.acts_like?(:date)
304
+ # other is a Date/DateTime, so coerce self #to_datetime and hand off to DateTime#<=>
305
+ to_datetime.compare_without_coercion(other)
306
+ else
307
+ compare_without_coercion(other)
308
+ end
309
+ end
310
+ end
311
+ end
312
+ end
313
+ end
@@ -0,0 +1,90 @@
1
+ module PassiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Time #:nodoc:
4
+ # Converting times to formatted strings, dates, and datetimes.
5
+ module Conversions
6
+ DATE_FORMATS = {
7
+ :db => "%Y-%m-%d %H:%M:%S",
8
+ :number => "%Y%m%d%H%M%S",
9
+ :time => "%H:%M",
10
+ :short => "%d %b %H:%M",
11
+ :long => "%B %d, %Y %H:%M",
12
+ :long_ordinal => lambda { |time| time.strftime("%B #{time.day.ordinalize}, %Y %H:%M") },
13
+ :rfc822 => lambda { |time| time.strftime("%a, %d %b %Y %H:%M:%S #{time.formatted_offset(false)}") }
14
+ }
15
+
16
+ def self.included(base) #:nodoc:
17
+ base.class_eval do
18
+ alias_method :to_default_s, :to_s
19
+ alias_method :to_s, :to_formatted_s
20
+ end
21
+ end
22
+
23
+ # Converts to a formatted string. See DATE_FORMATS for builtin formats.
24
+ #
25
+ # This method is aliased to <tt>to_s</tt>.
26
+ #
27
+ # time = Time.now # => Thu Jan 18 06:10:17 CST 2007
28
+ #
29
+ # time.to_formatted_s(:time) # => "06:10:17"
30
+ # time.to_s(:time) # => "06:10:17"
31
+ #
32
+ # time.to_formatted_s(:db) # => "2007-01-18 06:10:17"
33
+ # time.to_formatted_s(:number) # => "20070118061017"
34
+ # time.to_formatted_s(:short) # => "18 Jan 06:10"
35
+ # time.to_formatted_s(:long) # => "January 18, 2007 06:10"
36
+ # time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10"
37
+ # time.to_formatted_s(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
38
+ #
39
+ # == Adding your own time formats to +to_formatted_s+
40
+ # You can add your own formats to the Time::DATE_FORMATS hash.
41
+ # Use the format name as the hash key and either a strftime string
42
+ # or Proc instance that takes a time argument as the value.
43
+ #
44
+ # # config/initializers/time_formats.rb
45
+ # Time::DATE_FORMATS[:month_and_year] = "%B %Y"
46
+ # Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") }
47
+ def to_formatted_s(format = :default)
48
+ return to_default_s unless formatter = DATE_FORMATS[format]
49
+ formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
50
+ end
51
+
52
+ # Returns the UTC offset as an +HH:MM formatted string.
53
+ #
54
+ # Time.local(2000).formatted_offset # => "-06:00"
55
+ # Time.local(2000).formatted_offset(false) # => "-0600"
56
+ def formatted_offset(colon = true, alternate_utc_string = nil)
57
+ utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
58
+ end
59
+
60
+ # Converts a Time object to a Date, dropping hour, minute, and second precision.
61
+ #
62
+ # my_time = Time.now # => Mon Nov 12 22:59:51 -0500 2007
63
+ # my_time.to_date # => Mon, 12 Nov 2007
64
+ #
65
+ # your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
66
+ # your_time.to_date # => Tue, 13 Jan 2009
67
+ def to_date
68
+ ::Date.new(year, month, day)
69
+ end
70
+
71
+ # A method to keep Time, Date and DateTime instances interchangeable on conversions.
72
+ # In this case, it simply returns +self+.
73
+ def to_time
74
+ self
75
+ end
76
+
77
+ # Converts a Time instance to a Ruby DateTime instance, preserving UTC offset.
78
+ #
79
+ # my_time = Time.now # => Mon Nov 12 23:04:21 -0500 2007
80
+ # my_time.to_datetime # => Mon, 12 Nov 2007 23:04:21 -0500
81
+ #
82
+ # your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
83
+ # your_time.to_datetime # => Tue, 13 Jan 2009 13:13:03 -0500
84
+ def to_datetime
85
+ ::DateTime.civil(year, month, day, hour, min, sec, Rational(utc_offset, 86400))
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end