activesupport 2.3.5 → 3.0.0.beta3

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 (391) hide show
  1. data/CHANGELOG +66 -9
  2. data/lib/active_support/all.rb +2 -7
  3. data/lib/active_support/backtrace_cleaner.rb +31 -9
  4. data/lib/active_support/base64.rb +9 -0
  5. data/lib/active_support/basic_object.rb +7 -10
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +14 -9
  8. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  9. data/lib/active_support/cache/file_store.rb +35 -17
  10. data/lib/active_support/cache/mem_cache_store.rb +32 -23
  11. data/lib/active_support/cache/memory_store.rb +17 -10
  12. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  13. data/lib/active_support/cache.rb +75 -55
  14. data/lib/active_support/callbacks.rb +490 -169
  15. data/lib/active_support/concern.rb +29 -0
  16. data/lib/active_support/configurable.rb +35 -0
  17. data/lib/active_support/core_ext/array/access.rb +39 -46
  18. data/lib/active_support/core_ext/array/conversions.rb +145 -182
  19. data/lib/active_support/core_ext/array/extract_options.rb +26 -17
  20. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  21. data/lib/active_support/core_ext/array/random_access.rb +4 -10
  22. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  23. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  24. data/lib/active_support/core_ext/array.rb +2 -10
  25. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/class/attribute.rb +70 -0
  30. data/lib/active_support/core_ext/class/attribute_accessors.rb +40 -31
  31. data/lib/active_support/core_ext/class/delegating_attributes.rb +37 -40
  32. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -11
  33. data/lib/active_support/core_ext/class/subclasses.rb +55 -0
  34. data/lib/active_support/core_ext/class.rb +1 -1
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -228
  37. data/lib/active_support/core_ext/date/conversions.rb +87 -96
  38. data/lib/active_support/core_ext/date/freeze.rb +31 -0
  39. data/lib/active_support/core_ext/date_time/acts_like.rb +13 -0
  40. data/lib/active_support/core_ext/date_time/calculations.rb +97 -110
  41. data/lib/active_support/core_ext/date_time/conversions.rb +85 -85
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +18 -13
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file/atomic.rb +35 -40
  46. data/lib/active_support/core_ext/file/path.rb +5 -0
  47. data/lib/active_support/core_ext/file.rb +0 -4
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/float.rb +0 -6
  50. data/lib/active_support/core_ext/hash/conversions.rb +255 -229
  51. data/lib/active_support/core_ext/hash/deep_merge.rb +12 -19
  52. data/lib/active_support/core_ext/hash/diff.rb +11 -17
  53. data/lib/active_support/core_ext/hash/except.rb +21 -22
  54. data/lib/active_support/core_ext/hash/indifferent_access.rb +8 -137
  55. data/lib/active_support/core_ext/hash/keys.rb +38 -45
  56. data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -32
  57. data/lib/active_support/core_ext/hash/slice.rb +35 -37
  58. data/lib/active_support/core_ext/hash.rb +8 -14
  59. data/lib/active_support/core_ext/integer/inflections.rb +10 -16
  60. data/lib/active_support/core_ext/integer/multiple.rb +6 -0
  61. data/lib/active_support/core_ext/integer/time.rb +36 -42
  62. data/lib/active_support/core_ext/integer.rb +1 -7
  63. data/lib/active_support/core_ext/kernel/debugger.rb +1 -1
  64. data/lib/active_support/core_ext/kernel/reporting.rb +9 -7
  65. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  66. data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
  67. data/lib/active_support/core_ext/kernel.rb +1 -1
  68. data/lib/active_support/core_ext/load_error.rb +16 -32
  69. data/lib/active_support/core_ext/logger.rb +3 -2
  70. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  71. data/lib/active_support/core_ext/module/anonymous.rb +24 -0
  72. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  73. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  74. data/lib/active_support/core_ext/module/attribute_accessors.rb +48 -42
  75. data/lib/active_support/core_ext/module/delegation.rb +22 -11
  76. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  77. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  78. data/lib/active_support/core_ext/module/method_names.rb +14 -0
  79. data/lib/active_support/core_ext/module/reachable.rb +10 -0
  80. data/lib/active_support/core_ext/module/remove_method.rb +6 -0
  81. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  82. data/lib/active_support/core_ext/module.rb +7 -18
  83. data/lib/active_support/core_ext/name_error.rb +3 -4
  84. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  85. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  86. data/lib/active_support/core_ext/numeric.rb +1 -8
  87. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  88. data/lib/active_support/core_ext/object/blank.rb +20 -2
  89. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  90. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  91. data/lib/active_support/core_ext/object/extending.rb +8 -77
  92. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  93. data/lib/active_support/core_ext/object/misc.rb +2 -90
  94. data/lib/active_support/core_ext/object/returning.rb +42 -0
  95. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  96. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  97. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  98. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  99. data/lib/active_support/core_ext/object.rb +10 -2
  100. data/lib/active_support/core_ext/proc.rb +3 -1
  101. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  102. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  103. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  104. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  105. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  106. data/lib/active_support/core_ext/range.rb +2 -9
  107. data/lib/active_support/core_ext/regexp.rb +5 -0
  108. data/lib/active_support/core_ext/rexml.rb +12 -7
  109. data/lib/active_support/core_ext/string/access.rb +88 -95
  110. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  111. data/lib/active_support/core_ext/string/conversions.rb +20 -21
  112. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  113. data/lib/active_support/core_ext/string/filters.rb +17 -23
  114. data/lib/active_support/core_ext/string/inflections.rb +147 -154
  115. data/lib/active_support/core_ext/string/interpolation.rb +1 -0
  116. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  117. data/lib/active_support/core_ext/string/output_safety.rb +105 -44
  118. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -34
  119. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  120. data/lib/active_support/core_ext/string.rb +6 -20
  121. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  122. data/lib/active_support/core_ext/time/calculations.rb +276 -299
  123. data/lib/active_support/core_ext/time/conversions.rb +79 -84
  124. data/lib/active_support/core_ext/time/marshal.rb +56 -0
  125. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  126. data/lib/active_support/core_ext/time/zones.rb +73 -81
  127. data/lib/active_support/core_ext/uri.rb +2 -1
  128. data/lib/active_support/core_ext.rb +2 -7
  129. data/lib/active_support/dependencies/autoload.rb +50 -0
  130. data/lib/active_support/dependencies.rb +168 -197
  131. data/lib/active_support/deprecation/behaviors.rb +38 -0
  132. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  133. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  134. data/lib/active_support/deprecation/reporting.rb +56 -0
  135. data/lib/active_support/deprecation.rb +9 -187
  136. data/lib/active_support/duration.rb +6 -2
  137. data/lib/active_support/hash_with_indifferent_access.rb +141 -0
  138. data/lib/active_support/i18n.rb +3 -0
  139. data/lib/active_support/inflections.rb +1 -1
  140. data/lib/active_support/inflector/inflections.rb +211 -0
  141. data/lib/active_support/inflector/methods.rb +141 -0
  142. data/lib/active_support/inflector/transliterate.rb +77 -0
  143. data/lib/active_support/inflector.rb +4 -403
  144. data/lib/active_support/json/backends/jsongem.rb +16 -10
  145. data/lib/active_support/json/backends/yajl.rb +40 -0
  146. data/lib/active_support/json/backends/yaml.rb +14 -8
  147. data/lib/active_support/json/decoding.rb +17 -1
  148. data/lib/active_support/json/encoding.rb +164 -35
  149. data/lib/active_support/json/variable.rb +4 -3
  150. data/lib/active_support/lazy_load_hooks.rb +17 -0
  151. data/lib/active_support/memoizable.rb +8 -5
  152. data/lib/active_support/message_encryptor.rb +1 -0
  153. data/lib/active_support/message_verifier.rb +12 -29
  154. data/lib/active_support/multibyte/chars.rb +88 -31
  155. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  156. data/lib/active_support/multibyte/utils.rb +6 -7
  157. data/lib/active_support/multibyte.rb +11 -6
  158. data/lib/active_support/notifications/fanout.rb +83 -0
  159. data/lib/active_support/notifications/instrumenter.rb +50 -0
  160. data/lib/active_support/notifications.rb +81 -0
  161. data/lib/active_support/option_merger.rb +2 -0
  162. data/lib/active_support/ordered_hash.rb +28 -11
  163. data/lib/active_support/ordered_options.rb +9 -1
  164. data/lib/active_support/railtie.rb +64 -0
  165. data/lib/active_support/rescuable.rb +11 -6
  166. data/lib/active_support/ruby/shim.rb +21 -0
  167. data/lib/active_support/test_case.rb +10 -8
  168. data/lib/active_support/testing/assertions.rb +17 -0
  169. data/lib/active_support/testing/declarative.rb +31 -12
  170. data/lib/active_support/testing/deprecation.rb +8 -10
  171. data/lib/active_support/testing/isolation.rb +153 -0
  172. data/lib/active_support/testing/pending.rb +48 -0
  173. data/lib/active_support/testing/performance.rb +342 -339
  174. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  175. data/lib/active_support/time/autoload.rb +5 -0
  176. data/lib/active_support/time.rb +34 -0
  177. data/lib/active_support/time_with_zone.rb +18 -12
  178. data/lib/active_support/values/time_zone.rb +51 -68
  179. data/lib/active_support/version.rb +5 -4
  180. data/lib/active_support/whiny_nil.rb +5 -9
  181. data/lib/active_support/xml_mini/jdom.rb +13 -7
  182. data/lib/active_support/xml_mini/libxml.rb +38 -91
  183. data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
  184. data/lib/active_support/xml_mini/nokogiri.rb +40 -31
  185. data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
  186. data/lib/active_support/xml_mini/rexml.rb +30 -9
  187. data/lib/active_support/xml_mini.rb +2 -0
  188. data/lib/active_support.rb +46 -30
  189. metadata +136 -215
  190. data/lib/active_support/cache/drb_store.rb +0 -14
  191. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  192. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  193. data/lib/active_support/core_ext/base64.rb +0 -4
  194. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  195. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  196. data/lib/active_support/core_ext/blank.rb +0 -2
  197. data/lib/active_support/core_ext/class/removal.rb +0 -50
  198. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  199. data/lib/active_support/core_ext/date.rb +0 -10
  200. data/lib/active_support/core_ext/date_time.rb +0 -12
  201. data/lib/active_support/core_ext/duplicable.rb +0 -43
  202. data/lib/active_support/core_ext/float/time.rb +0 -27
  203. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  204. data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
  205. data/lib/active_support/core_ext/module/inclusion.rb +0 -30
  206. data/lib/active_support/core_ext/module/loading.rb +0 -23
  207. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  208. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  209. data/lib/active_support/core_ext/object/metaclass.rb +0 -13
  210. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  211. data/lib/active_support/core_ext/pathname.rb +0 -7
  212. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  213. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  214. data/lib/active_support/core_ext/symbol.rb +0 -14
  215. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  216. data/lib/active_support/core_ext/time.rb +0 -42
  217. data/lib/active_support/json/encoders/date.rb +0 -22
  218. data/lib/active_support/json/encoders/date_time.rb +0 -22
  219. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  220. data/lib/active_support/json/encoders/false_class.rb +0 -7
  221. data/lib/active_support/json/encoders/hash.rb +0 -56
  222. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  223. data/lib/active_support/json/encoders/numeric.rb +0 -21
  224. data/lib/active_support/json/encoders/object.rb +0 -10
  225. data/lib/active_support/json/encoders/regexp.rb +0 -9
  226. data/lib/active_support/json/encoders/string.rb +0 -9
  227. data/lib/active_support/json/encoders/symbol.rb +0 -5
  228. data/lib/active_support/json/encoders/time.rb +0 -22
  229. data/lib/active_support/json/encoders/true_class.rb +0 -7
  230. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  231. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  232. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  233. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  234. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  235. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  236. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  237. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  238. data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
  239. data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
  240. data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
  241. data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
  242. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -214
  243. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
  244. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -199
  245. data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
  246. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
  247. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
  248. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
  249. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
  250. data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
  251. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  252. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  253. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  254. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  255. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  256. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  257. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  258. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  259. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  260. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  261. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  262. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  263. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  264. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  390. data/lib/active_support/vendor.rb +0 -28
  391. data/lib/activesupport.rb +0 -2
@@ -1,3 +1,6 @@
1
+ require 'active_support/core_ext/object/duplicable'
2
+ require 'active_support/core_ext/array/extract_options'
3
+
1
4
  # Retain for backward compatibility. Methods are now included in Class.
2
5
  module ClassInheritableAttributes # :nodoc:
3
6
  end
@@ -8,16 +11,19 @@ end
8
11
  # children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
9
12
  class Class # :nodoc:
10
13
  def class_inheritable_reader(*syms)
14
+ options = syms.extract_options!
11
15
  syms.each do |sym|
12
16
  next if sym.is_a?(Hash)
13
- class_eval <<-EOS
14
- def self.#{sym} # def self.before_add_for_comments
15
- read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:before_add_for_comments)
16
- end # end
17
- #
18
- def #{sym} # def before_add_for_comments
19
- self.class.#{sym} # self.class.before_add_for_comments
20
- end # end
17
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
18
+ def self.#{sym} # def self.after_add
19
+ read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:after_add)
20
+ end # end
21
+ #
22
+ #{" #
23
+ def #{sym} # def after_add
24
+ self.class.#{sym} # self.class.after_add
25
+ end # end
26
+ " unless options[:instance_reader] == false } # # the reader above is generated unless options[:instance_reader] == false
21
27
  EOS
22
28
  end
23
29
  end
@@ -25,7 +31,7 @@ class Class # :nodoc:
25
31
  def class_inheritable_writer(*syms)
26
32
  options = syms.extract_options!
27
33
  syms.each do |sym|
28
- class_eval <<-EOS
34
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
29
35
  def self.#{sym}=(obj) # def self.color=(obj)
30
36
  write_inheritable_attribute(:#{sym}, obj) # write_inheritable_attribute(:color, obj)
31
37
  end # end
@@ -42,7 +48,7 @@ class Class # :nodoc:
42
48
  def class_inheritable_array_writer(*syms)
43
49
  options = syms.extract_options!
44
50
  syms.each do |sym|
45
- class_eval <<-EOS
51
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
46
52
  def self.#{sym}=(obj) # def self.levels=(obj)
47
53
  write_inheritable_array(:#{sym}, obj) # write_inheritable_array(:levels, obj)
48
54
  end # end
@@ -59,7 +65,7 @@ class Class # :nodoc:
59
65
  def class_inheritable_hash_writer(*syms)
60
66
  options = syms.extract_options!
61
67
  syms.each do |sym|
62
- class_eval <<-EOS
68
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
63
69
  def self.#{sym}=(obj) # def self.nicknames=(obj)
64
70
  write_inheritable_hash(:#{sym}, obj) # write_inheritable_hash(:nicknames, obj)
65
71
  end # end
@@ -138,3 +144,86 @@ class Class # :nodoc:
138
144
  alias inherited_without_inheritable_attributes inherited
139
145
  alias inherited inherited_with_inheritable_attributes
140
146
  end
147
+
148
+ class Class
149
+ # Defines class-level inheritable attribute reader. Attributes are available to subclasses,
150
+ # each subclass has a copy of parent's attribute.
151
+ #
152
+ # @param *syms<Array[#to_s]> Array of attributes to define inheritable reader for.
153
+ # @return <Array[#to_s]> Array of attributes converted into inheritable_readers.
154
+ #
155
+ # @api public
156
+ #
157
+ # @todo Do we want to block instance_reader via :instance_reader => false
158
+ # @todo It would be preferable that we do something with a Hash passed in
159
+ # (error out or do the same as other methods above) instead of silently
160
+ # moving on). In particular, this makes the return value of this function
161
+ # less useful.
162
+ def extlib_inheritable_reader(*ivars, &block)
163
+ options = ivars.extract_options!
164
+
165
+ ivars.each do |ivar|
166
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
167
+ def self.#{ivar}
168
+ return @#{ivar} if self.object_id == #{self.object_id} || defined?(@#{ivar})
169
+ ivar = superclass.#{ivar}
170
+ return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}")
171
+ @#{ivar} = ivar.duplicable? ? ivar.dup : ivar
172
+ end
173
+ RUBY
174
+ unless options[:instance_reader] == false
175
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
176
+ def #{ivar}
177
+ self.class.#{ivar}
178
+ end
179
+ RUBY
180
+ end
181
+ instance_variable_set(:"@#{ivar}", yield) if block_given?
182
+ end
183
+ end
184
+
185
+ # Defines class-level inheritable attribute writer. Attributes are available to subclasses,
186
+ # each subclass has a copy of parent's attribute.
187
+ #
188
+ # @param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
189
+ # define inheritable writer for.
190
+ # @option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined.
191
+ # @return <Array[#to_s]> An Array of the attributes that were made into inheritable writers.
192
+ #
193
+ # @api public
194
+ #
195
+ # @todo We need a style for class_eval <<-HEREDOC. I'd like to make it
196
+ # class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.
197
+ def extlib_inheritable_writer(*ivars)
198
+ options = ivars.extract_options!
199
+
200
+ ivars.each do |ivar|
201
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
202
+ def self.#{ivar}=(obj)
203
+ @#{ivar} = obj
204
+ end
205
+ RUBY
206
+ unless options[:instance_writer] == false
207
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
208
+ def #{ivar}=(obj) self.class.#{ivar} = obj end
209
+ RUBY
210
+ end
211
+
212
+ self.send("#{ivar}=", yield) if block_given?
213
+ end
214
+ end
215
+
216
+ # Defines class-level inheritable attribute accessor. Attributes are available to subclasses,
217
+ # each subclass has a copy of parent's attribute.
218
+ #
219
+ # @param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
220
+ # define inheritable accessor for.
221
+ # @option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined.
222
+ # @return <Array[#to_s]> An Array of attributes turned into inheritable accessors.
223
+ #
224
+ # @api public
225
+ def extlib_inheritable_accessor(*syms, &block)
226
+ extlib_inheritable_reader(*syms)
227
+ extlib_inheritable_writer(*syms, &block)
228
+ end
229
+ end
@@ -0,0 +1,55 @@
1
+ require 'active_support/core_ext/module/anonymous'
2
+ require 'active_support/core_ext/module/reachable'
3
+
4
+ class Class #:nodoc:
5
+ # Returns an array with the names of the subclasses of +self+ as strings.
6
+ #
7
+ # Integer.subclasses # => ["Bignum", "Fixnum"]
8
+ def subclasses
9
+ Class.subclasses_of(self).map { |o| o.to_s }
10
+ end
11
+
12
+ # Rubinius
13
+ if defined?(Class.__subclasses__)
14
+ def descendents
15
+ subclasses = []
16
+ __subclasses__.each {|k| subclasses << k; subclasses.concat k.descendents }
17
+ subclasses
18
+ end
19
+ else
20
+ # MRI
21
+ begin
22
+ ObjectSpace.each_object(Class.new) {}
23
+
24
+ def descendents
25
+ subclasses = []
26
+ ObjectSpace.each_object(class << self; self; end) do |k|
27
+ subclasses << k unless k == self
28
+ end
29
+ subclasses
30
+ end
31
+ # JRuby
32
+ rescue StandardError
33
+ def descendents
34
+ subclasses = []
35
+ ObjectSpace.each_object(Class) do |k|
36
+ subclasses << k if k < self
37
+ end
38
+ subclasses.uniq!
39
+ subclasses
40
+ end
41
+ end
42
+ end
43
+
44
+ # Exclude this class unless it's a subclass of our supers and is defined.
45
+ # We check defined? in case we find a removed class that has yet to be
46
+ # garbage collected. This also fails for anonymous classes -- please
47
+ # submit a patch if you have a workaround.
48
+ def self.subclasses_of(*superclasses) #:nodoc:
49
+ subclasses = []
50
+ superclasses.each do |klass|
51
+ subclasses.concat klass.descendents.select {|k| k.anonymous? || k.reachable?}
52
+ end
53
+ subclasses
54
+ end
55
+ end
@@ -1,4 +1,4 @@
1
1
  require 'active_support/core_ext/class/attribute_accessors'
2
2
  require 'active_support/core_ext/class/inheritable_attributes'
3
- require 'active_support/core_ext/class/removal'
4
3
  require 'active_support/core_ext/class/delegating_attributes'
4
+ require 'active_support/core_ext/class/subclasses'
@@ -0,0 +1,8 @@
1
+ require 'active_support/core_ext/object/acts_like'
2
+
3
+ class Date
4
+ # Duck-types as a Date-like class. See Object#acts_like?.
5
+ def acts_like_date?
6
+ true
7
+ end
8
+ end
@@ -1,231 +1,221 @@
1
- module ActiveSupport #: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 ActiveSupport::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 ActiveSupport::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
- # Short-hand for years_ago(1)
139
- def last_year
140
- years_ago(1)
141
- end
142
-
143
- # Short-hand for years_since(1)
144
- def next_year
145
- years_since(1)
146
- end
147
-
148
- # Short-hand for months_ago(1)
149
- def last_month
150
- months_ago(1)
151
- end
152
-
153
- # Short-hand for months_since(1)
154
- def next_month
155
- months_since(1)
156
- end
157
-
158
- # Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
159
- def beginning_of_week
160
- days_to_monday = self.wday!=0 ? self.wday-1 : 6
161
- result = self - days_to_monday
162
- self.acts_like?(:time) ? result.midnight : result
163
- end
164
- alias :monday :beginning_of_week
165
- alias :at_beginning_of_week :beginning_of_week
166
-
167
- # Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
168
- def end_of_week
169
- days_to_sunday = self.wday!=0 ? 7-self.wday : 0
170
- result = self + days_to_sunday.days
171
- self.acts_like?(:time) ? result.end_of_day : result
172
- end
173
- alias :at_end_of_week :end_of_week
174
-
175
- # Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
176
- def next_week(day = :monday)
177
- days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
178
- result = (self + 7).beginning_of_week + days_into_week[day]
179
- self.acts_like?(:time) ? result.change(:hour => 0) : result
180
- end
181
-
182
- # 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)
183
- def beginning_of_month
184
- self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
185
- end
186
- alias :at_beginning_of_month :beginning_of_month
187
-
188
- # 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)
189
- def end_of_month
190
- last_day = ::Time.days_in_month( self.month, self.year )
191
- self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
192
- end
193
- alias :at_end_of_month :end_of_month
194
-
195
- # 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)
196
- def beginning_of_quarter
197
- beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
198
- end
199
- alias :at_beginning_of_quarter :beginning_of_quarter
200
-
201
- # 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)
202
- def end_of_quarter
203
- beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
204
- end
205
- alias :at_end_of_quarter :end_of_quarter
206
-
207
- # Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
208
- def beginning_of_year
209
- self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
210
- end
211
- alias :at_beginning_of_year :beginning_of_year
212
-
213
- # Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
214
- def end_of_year
215
- self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
216
- end
217
- alias :at_end_of_year :end_of_year
218
-
219
- # Convenience method which returns a new Date/DateTime representing the time 1 day ago
220
- def yesterday
221
- self - 1
222
- end
223
-
224
- # Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
225
- def tomorrow
226
- self + 1
227
- end
228
- end
1
+ require 'date'
2
+ require 'active_support/duration'
3
+ require 'active_support/core_ext/time/zones'
4
+ require 'active_support/core_ext/object/acts_like'
5
+
6
+ class Date
7
+ class << self
8
+ # Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
9
+ def yesterday
10
+ ::Date.today.yesterday
229
11
  end
12
+
13
+ # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
14
+ def tomorrow
15
+ ::Date.today.tomorrow
16
+ end
17
+
18
+ # Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.
19
+ def current
20
+ ::Time.zone_default ? ::Time.zone.today : ::Date.today
21
+ end
22
+ end
23
+
24
+ # Tells whether the Date object's date lies in the past
25
+ def past?
26
+ self < ::Date.current
27
+ end
28
+
29
+ # Tells whether the Date object's date is today
30
+ def today?
31
+ self.to_date == ::Date.current # we need the to_date because of DateTime
32
+ end
33
+
34
+ # Tells whether the Date object's date lies in the future
35
+ def future?
36
+ self > ::Date.current
37
+ end
38
+
39
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
40
+ # and then subtracts the specified number of seconds
41
+ def ago(seconds)
42
+ to_time.since(-seconds)
43
+ end
44
+
45
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
46
+ # and then adds the specified number of seconds
47
+ def since(seconds)
48
+ to_time.since(seconds)
49
+ end
50
+ alias :in :since
51
+
52
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
53
+ def beginning_of_day
54
+ to_time
55
+ end
56
+ alias :midnight :beginning_of_day
57
+ alias :at_midnight :beginning_of_day
58
+ alias :at_beginning_of_day :beginning_of_day
59
+
60
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
61
+ def end_of_day
62
+ to_time.end_of_day
63
+ end
64
+
65
+ def plus_with_duration(other) #:nodoc:
66
+ if ActiveSupport::Duration === other
67
+ other.since(self)
68
+ else
69
+ plus_without_duration(other)
70
+ end
71
+ end
72
+ alias_method :plus_without_duration, :+
73
+ alias_method :+, :plus_with_duration
74
+
75
+ def minus_with_duration(other) #:nodoc:
76
+ if ActiveSupport::Duration === other
77
+ plus_with_duration(-other)
78
+ else
79
+ minus_without_duration(other)
80
+ end
81
+ end
82
+ alias_method :minus_without_duration, :-
83
+ alias_method :-, :minus_with_duration
84
+
85
+ # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
86
+ # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
87
+ def advance(options)
88
+ options = options.dup
89
+ d = self
90
+ d = d >> options.delete(:years) * 12 if options[:years]
91
+ d = d >> options.delete(:months) if options[:months]
92
+ d = d + options.delete(:weeks) * 7 if options[:weeks]
93
+ d = d + options.delete(:days) if options[:days]
94
+ d
95
+ end
96
+
97
+ # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
98
+ #
99
+ # Examples:
100
+ #
101
+ # Date.new(2007, 5, 12).change(:day => 1) # => Date.new(2007, 5, 1)
102
+ # Date.new(2007, 5, 12).change(:year => 2005, :month => 1) # => Date.new(2005, 1, 12)
103
+ def change(options)
104
+ ::Date.new(
105
+ options[:year] || self.year,
106
+ options[:month] || self.month,
107
+ options[:day] || self.day
108
+ )
109
+ end
110
+
111
+ # Returns a new Date/DateTime representing the time a number of specified months ago
112
+ def months_ago(months)
113
+ advance(:months => -months)
114
+ end
115
+
116
+ # Returns a new Date/DateTime representing the time a number of specified months in the future
117
+ def months_since(months)
118
+ advance(:months => months)
119
+ end
120
+
121
+ # Returns a new Date/DateTime representing the time a number of specified years ago
122
+ def years_ago(years)
123
+ advance(:years => -years)
124
+ end
125
+
126
+ # Returns a new Date/DateTime representing the time a number of specified years in the future
127
+ def years_since(years)
128
+ advance(:years => years)
129
+ end
130
+
131
+ # Short-hand for years_ago(1)
132
+ def last_year
133
+ years_ago(1)
134
+ end
135
+
136
+ # Short-hand for years_since(1)
137
+ def next_year
138
+ years_since(1)
139
+ end unless method_defined?(:next_year)
140
+
141
+ # Short-hand for months_ago(1)
142
+ def last_month
143
+ months_ago(1)
144
+ end
145
+
146
+ # Short-hand for months_since(1)
147
+ def next_month
148
+ months_since(1)
149
+ end unless method_defined?(:next_month)
150
+
151
+ # Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
152
+ def beginning_of_week
153
+ days_to_monday = self.wday!=0 ? self.wday-1 : 6
154
+ result = self - days_to_monday
155
+ self.acts_like?(:time) ? result.midnight : result
156
+ end
157
+ alias :monday :beginning_of_week
158
+ alias :at_beginning_of_week :beginning_of_week
159
+
160
+ # Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
161
+ def end_of_week
162
+ days_to_sunday = self.wday!=0 ? 7-self.wday : 0
163
+ result = self + days_to_sunday.days
164
+ self.acts_like?(:time) ? result.end_of_day : result
165
+ end
166
+ alias :at_end_of_week :end_of_week
167
+
168
+ # Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
169
+ def next_week(day = :monday)
170
+ days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
171
+ result = (self + 7).beginning_of_week + days_into_week[day]
172
+ self.acts_like?(:time) ? result.change(:hour => 0) : result
173
+ end
174
+
175
+ # 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)
176
+ def beginning_of_month
177
+ self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
178
+ end
179
+ alias :at_beginning_of_month :beginning_of_month
180
+
181
+ # 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)
182
+ def end_of_month
183
+ last_day = ::Time.days_in_month( self.month, self.year )
184
+ self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
185
+ end
186
+ alias :at_end_of_month :end_of_month
187
+
188
+ # 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)
189
+ def beginning_of_quarter
190
+ beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
191
+ end
192
+ alias :at_beginning_of_quarter :beginning_of_quarter
193
+
194
+ # 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)
195
+ def end_of_quarter
196
+ beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
197
+ end
198
+ alias :at_end_of_quarter :end_of_quarter
199
+
200
+ # Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
201
+ def beginning_of_year
202
+ self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
203
+ end
204
+ alias :at_beginning_of_year :beginning_of_year
205
+
206
+ # Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
207
+ def end_of_year
208
+ self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
209
+ end
210
+ alias :at_end_of_year :end_of_year
211
+
212
+ # Convenience method which returns a new Date/DateTime representing the time 1 day ago
213
+ def yesterday
214
+ self - 1
215
+ end
216
+
217
+ # Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
218
+ def tomorrow
219
+ self + 1
230
220
  end
231
221
  end