activesupport 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (403) hide show
  1. data/CHANGELOG +30 -53
  2. data/lib/active_support.rb +43 -31
  3. data/lib/active_support/all.rb +3 -7
  4. data/lib/active_support/backtrace_cleaner.rb +24 -8
  5. data/lib/active_support/base64.rb +9 -0
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +12 -9
  8. data/lib/active_support/cache.rb +75 -55
  9. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  10. data/lib/active_support/cache/file_store.rb +35 -17
  11. data/lib/active_support/cache/mem_cache_store.rb +29 -20
  12. data/lib/active_support/cache/memory_store.rb +18 -17
  13. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  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.rb +2 -7
  18. data/lib/active_support/core_ext/array.rb +2 -10
  19. data/lib/active_support/core_ext/array/access.rb +39 -46
  20. data/lib/active_support/core_ext/array/conversions.rb +146 -182
  21. data/lib/active_support/core_ext/array/extract_options.rb +12 -18
  22. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  23. data/lib/active_support/core_ext/array/random_access.rb +4 -40
  24. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  25. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  30. data/lib/active_support/core_ext/class.rb +0 -2
  31. data/lib/active_support/core_ext/class/attribute.rb +8 -39
  32. data/lib/active_support/core_ext/class/attribute_accessors.rb +31 -35
  33. data/lib/active_support/core_ext/class/delegating_attributes.rb +34 -40
  34. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -16
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -238
  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 +83 -95
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +14 -15
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file.rb +0 -4
  46. data/lib/active_support/core_ext/file/atomic.rb +34 -41
  47. data/lib/active_support/core_ext/float.rb +0 -6
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/hash.rb +8 -14
  50. data/lib/active_support/core_ext/hash/conversions.rb +236 -236
  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/integer.rb +1 -7
  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/kernel/reporting.rb +9 -7
  63. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  64. data/lib/active_support/core_ext/load_error.rb +16 -33
  65. data/lib/active_support/core_ext/logger.rb +3 -2
  66. data/lib/active_support/core_ext/module.rb +3 -16
  67. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  68. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  69. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  70. data/lib/active_support/core_ext/module/attribute_accessors.rb +36 -41
  71. data/lib/active_support/core_ext/module/delegation.rb +1 -1
  72. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  73. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  74. data/lib/active_support/core_ext/module/loading.rb +2 -0
  75. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  76. data/lib/active_support/core_ext/name_error.rb +3 -4
  77. data/lib/active_support/core_ext/numeric.rb +1 -8
  78. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  79. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  80. data/lib/active_support/core_ext/object.rb +4 -2
  81. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  82. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  83. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  84. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  85. data/lib/active_support/core_ext/object/metaclass.rb +5 -6
  86. data/lib/active_support/core_ext/object/misc.rb +2 -93
  87. data/lib/active_support/core_ext/object/returning.rb +42 -0
  88. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  89. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  90. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  91. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  92. data/lib/active_support/core_ext/proc.rb +6 -4
  93. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  94. data/lib/active_support/core_ext/range.rb +2 -9
  95. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  96. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  97. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  98. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  99. data/lib/active_support/core_ext/regexp.rb +5 -0
  100. data/lib/active_support/core_ext/rexml.rb +12 -7
  101. data/lib/active_support/core_ext/string.rb +6 -19
  102. data/lib/active_support/core_ext/string/access.rb +88 -95
  103. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  104. data/lib/active_support/core_ext/string/conversions.rb +19 -21
  105. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  106. data/lib/active_support/core_ext/string/filters.rb +17 -23
  107. data/lib/active_support/core_ext/string/inflections.rb +146 -153
  108. data/lib/active_support/{vendor/i18n-0.4.1/i18n/core_ext/string/interpolate.rb → core_ext/string/interpolation.rb} +8 -15
  109. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  110. data/lib/active_support/core_ext/string/output_safety.rb +21 -17
  111. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -32
  112. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  113. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  114. data/lib/active_support/core_ext/time/calculations.rb +276 -308
  115. data/lib/active_support/core_ext/time/conversions.rb +78 -84
  116. data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +22 -0
  117. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  118. data/lib/active_support/core_ext/time/zones.rb +73 -81
  119. data/lib/active_support/core_ext/uri.rb +2 -1
  120. data/lib/active_support/dependencies.rb +38 -48
  121. data/lib/active_support/dependencies/autoload.rb +49 -0
  122. data/lib/active_support/deprecation.rb +9 -195
  123. data/lib/active_support/deprecation/behaviors.rb +38 -0
  124. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  125. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  126. data/lib/active_support/deprecation/reporting.rb +55 -0
  127. data/lib/active_support/duration.rb +6 -2
  128. data/lib/active_support/hash_with_indifferent_access.rb +137 -0
  129. data/lib/active_support/i18n.rb +2 -0
  130. data/lib/active_support/inflections.rb +1 -1
  131. data/lib/active_support/inflector.rb +4 -406
  132. data/lib/active_support/inflector/inflections.rb +211 -0
  133. data/lib/active_support/inflector/methods.rb +139 -0
  134. data/lib/active_support/inflector/transliterate.rb +61 -0
  135. data/lib/active_support/json/backends/jsongem.rb +16 -10
  136. data/lib/active_support/json/backends/yaml.rb +72 -2
  137. data/lib/active_support/json/decoding.rb +2 -16
  138. data/lib/active_support/json/encoding.rb +153 -33
  139. data/lib/active_support/json/variable.rb +4 -3
  140. data/lib/active_support/locale/en.yml +1 -4
  141. data/lib/active_support/memoizable.rb +7 -6
  142. data/lib/active_support/message_encryptor.rb +1 -0
  143. data/lib/active_support/message_verifier.rb +12 -29
  144. data/lib/active_support/multibyte.rb +9 -4
  145. data/lib/active_support/multibyte/chars.rb +25 -17
  146. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  147. data/lib/active_support/multibyte/utils.rb +1 -1
  148. data/lib/active_support/notifications.rb +77 -0
  149. data/lib/active_support/notifications/fanout.rb +69 -0
  150. data/lib/active_support/notifications/instrumenter.rb +50 -0
  151. data/lib/active_support/option_merger.rb +2 -0
  152. data/lib/active_support/ordered_hash.rb +33 -37
  153. data/lib/active_support/ordered_options.rb +3 -1
  154. data/lib/active_support/railtie.rb +64 -0
  155. data/lib/active_support/rescuable.rb +11 -6
  156. data/lib/active_support/ruby/shim.rb +19 -0
  157. data/lib/active_support/test_case.rb +8 -1
  158. data/lib/active_support/testing/assertions.rb +2 -14
  159. data/lib/active_support/testing/declarative.rb +31 -12
  160. data/lib/active_support/testing/deprecation.rb +8 -10
  161. data/lib/active_support/testing/isolation.rb +153 -0
  162. data/lib/active_support/testing/pending.rb +48 -0
  163. data/lib/active_support/testing/performance.rb +342 -339
  164. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  165. data/lib/active_support/time.rb +34 -0
  166. data/lib/active_support/time/autoload.rb +5 -0
  167. data/lib/active_support/time_with_zone.rb +18 -12
  168. data/lib/active_support/values/time_zone.rb +97 -93
  169. data/lib/active_support/version.rb +3 -3
  170. data/lib/active_support/whiny_nil.rb +1 -4
  171. data/lib/active_support/xml_mini.rb +2 -0
  172. data/lib/active_support/xml_mini/jdom.rb +13 -7
  173. data/lib/active_support/xml_mini/libxml.rb +19 -12
  174. data/lib/active_support/xml_mini/libxmlsax.rb +19 -9
  175. data/lib/active_support/xml_mini/nokogiri.rb +18 -12
  176. data/lib/active_support/xml_mini/nokogirisax.rb +15 -6
  177. data/lib/active_support/xml_mini/rexml.rb +24 -9
  178. metadata +94 -244
  179. data/lib/active_support/cache/drb_store.rb +0 -14
  180. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  181. data/lib/active_support/core_ext/base64.rb +0 -4
  182. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  183. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  184. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  185. data/lib/active_support/core_ext/blank.rb +0 -2
  186. data/lib/active_support/core_ext/class/removal.rb +0 -50
  187. data/lib/active_support/core_ext/date.rb +0 -10
  188. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  189. data/lib/active_support/core_ext/date_time.rb +0 -12
  190. data/lib/active_support/core_ext/duplicable.rb +0 -43
  191. data/lib/active_support/core_ext/float/time.rb +0 -27
  192. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  193. data/lib/active_support/core_ext/kernel/singleton_class.rb +0 -13
  194. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  195. data/lib/active_support/core_ext/module/remove_method.rb +0 -6
  196. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  197. data/lib/active_support/core_ext/object/extending.rb +0 -80
  198. data/lib/active_support/core_ext/object/singleton_class.rb +0 -13
  199. data/lib/active_support/core_ext/pathname.rb +0 -7
  200. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  201. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  202. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  203. data/lib/active_support/core_ext/symbol.rb +0 -14
  204. data/lib/active_support/core_ext/time.rb +0 -46
  205. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  206. data/lib/active_support/json/backends/okjson.rb +0 -644
  207. data/lib/active_support/json/backends/yajl.rb +0 -40
  208. data/lib/active_support/json/encoders/date.rb +0 -22
  209. data/lib/active_support/json/encoders/date_time.rb +0 -22
  210. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  211. data/lib/active_support/json/encoders/false_class.rb +0 -7
  212. data/lib/active_support/json/encoders/hash.rb +0 -56
  213. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  214. data/lib/active_support/json/encoders/numeric.rb +0 -21
  215. data/lib/active_support/json/encoders/object.rb +0 -10
  216. data/lib/active_support/json/encoders/regexp.rb +0 -9
  217. data/lib/active_support/json/encoders/string.rb +0 -9
  218. data/lib/active_support/json/encoders/symbol.rb +0 -5
  219. data/lib/active_support/json/encoders/time.rb +0 -22
  220. data/lib/active_support/json/encoders/true_class.rb +0 -7
  221. data/lib/active_support/vendor.rb +0 -36
  222. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  223. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  224. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  225. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  226. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  227. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  228. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  229. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  230. data/lib/active_support/vendor/i18n-0.4.1/i18n.rb +0 -322
  231. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend.rb +0 -20
  232. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record.rb +0 -61
  233. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/missing.rb +0 -65
  234. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/store_procs.rb +0 -38
  235. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/translation.rb +0 -93
  236. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/base.rb +0 -237
  237. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cache.rb +0 -77
  238. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cascade.rb +0 -57
  239. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/chain.rb +0 -77
  240. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cldr.rb +0 -100
  241. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/fallbacks.rb +0 -69
  242. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/flatten.rb +0 -113
  243. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/gettext.rb +0 -75
  244. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/interpolation_compiler.rb +0 -123
  245. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/key_value.rb +0 -102
  246. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/memoize.rb +0 -48
  247. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/metadata.rb +0 -65
  248. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/pluralization.rb +0 -57
  249. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/simple.rb +0 -87
  250. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/transliterator.rb +0 -98
  251. data/lib/active_support/vendor/i18n-0.4.1/i18n/config.rb +0 -84
  252. data/lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb +0 -29
  253. data/lib/active_support/vendor/i18n-0.4.1/i18n/exceptions.rb +0 -61
  254. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext.rb +0 -27
  255. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/helpers.rb +0 -65
  256. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/po_parser.rb +0 -329
  257. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale.rb +0 -6
  258. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/fallbacks.rb +0 -98
  259. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag.rb +0 -28
  260. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/parents.rb +0 -24
  261. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/rfc4646.rb +0 -76
  262. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/simple.rb +0 -41
  263. data/lib/active_support/vendor/i18n-0.4.1/i18n/version.rb +0 -3
  264. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  390. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  391. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  392. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  393. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  394. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  395. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  396. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  397. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  398. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  399. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  400. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  401. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  402. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  403. data/lib/activesupport.rb +0 -2
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/array/extract_options'
2
+
1
3
  # Extends the class object with class and instance accessors for class attributes,
2
4
  # just like the native attr* accessors for instance attributes.
3
5
  #
@@ -8,54 +10,48 @@
8
10
  # Person.hair_colors = [:brown, :black, :blonde, :red]
9
11
  class Class
10
12
  def cattr_reader(*syms)
11
- options = syms.extract_options!
12
- syms.each do |sym|
13
+ syms.flatten.each do |sym|
13
14
  next if sym.is_a?(Hash)
14
15
  class_eval(<<-EOS, __FILE__, __LINE__ + 1)
15
- unless defined? @@#{sym}
16
- @@#{sym} = nil
17
- end
18
-
19
- def self.#{sym}
20
- @@#{sym}
21
- end
16
+ unless defined? @@#{sym} # unless defined? @@hair_colors
17
+ @@#{sym} = nil # @@hair_colors = nil
18
+ end # end
19
+ #
20
+ def self.#{sym} # def self.hair_colors
21
+ @@#{sym} # @@hair_colors
22
+ end # end
23
+ #
24
+ def #{sym} # def hair_colors
25
+ @@#{sym} # @@hair_colors
26
+ end # end
22
27
  EOS
23
-
24
- unless options[:instance_reader] == false
25
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
26
- def #{sym}
27
- @@#{sym}
28
- end
29
- EOS
30
- end
31
28
  end
32
29
  end
33
30
 
34
31
  def cattr_writer(*syms)
35
32
  options = syms.extract_options!
36
- syms.each do |sym|
33
+ syms.flatten.each do |sym|
37
34
  class_eval(<<-EOS, __FILE__, __LINE__ + 1)
38
- unless defined? @@#{sym}
39
- @@#{sym} = nil
40
- end
41
-
42
- def self.#{sym}=(obj)
43
- @@#{sym} = obj
44
- end
35
+ unless defined? @@#{sym} # unless defined? @@hair_colors
36
+ @@#{sym} = nil # @@hair_colors = nil
37
+ end # end
38
+ #
39
+ def self.#{sym}=(obj) # def self.hair_colors=(obj)
40
+ @@#{sym} = obj # @@hair_colors = obj
41
+ end # end
42
+ #
43
+ #{" #
44
+ def #{sym}=(obj) # def hair_colors=(obj)
45
+ @@#{sym} = obj # @@hair_colors = obj
46
+ end # end
47
+ " unless options[:instance_writer] == false } # # instance writer above is generated unless options[:instance_writer] == false
45
48
  EOS
46
-
47
- unless options[:instance_writer] == false
48
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
49
- def #{sym}=(obj)
50
- @@#{sym} = obj
51
- end
52
- EOS
53
- end
49
+ self.send("#{sym}=", yield) if block_given?
54
50
  end
55
51
  end
56
52
 
57
- def cattr_accessor(*syms)
53
+ def cattr_accessor(*syms, &blk)
58
54
  cattr_reader(*syms)
59
- cattr_writer(*syms)
55
+ cattr_writer(*syms, &blk)
60
56
  end
61
57
  end
@@ -1,47 +1,41 @@
1
- # These class attributes behave something like the class
2
- # inheritable accessors. But instead of copying the hash over at
3
- # the time the subclass is first defined, the accessors simply
4
- # delegate to their superclass unless they have been given a
5
- # specific value. This stops the strange situation where values
6
- # set after class definition don't get applied to subclasses.
1
+ require 'active_support/core_ext/object/blank'
2
+ require 'active_support/core_ext/array/extract_options'
3
+ require 'active_support/core_ext/object/metaclass'
4
+
7
5
  class Class
8
- def superclass_delegating_reader(*names)
9
- class_name_to_stop_searching_on = self.superclass.name.blank? ? "Object" : self.superclass.name
10
- names.each do |name|
11
- class_eval <<-EOS
12
- def self.#{name} # def self.only_reader
13
- if defined?(@#{name}) # if defined?(@only_reader)
14
- @#{name} # @only_reader
15
- elsif superclass < #{class_name_to_stop_searching_on} && # elsif superclass < Object &&
16
- superclass.respond_to?(:#{name}) # superclass.respond_to?(:only_reader)
17
- superclass.#{name} # superclass.only_reader
18
- end # end
19
- end # end
20
- def #{name} # def only_reader
21
- self.class.#{name} # self.class.only_reader
22
- end # end
23
- def self.#{name}? # def self.only_reader?
24
- !!#{name} # !!only_reader
25
- end # end
26
- def #{name}? # def only_reader?
27
- !!#{name} # !!only_reader
28
- end # end
29
- EOS
30
- end
6
+ def superclass_delegating_accessor(name, options = {})
7
+ # Create private _name and _name= methods that can still be used if the public
8
+ # methods are overridden. This allows
9
+ _superclass_delegating_accessor("_#{name}")
10
+
11
+ # Generate the public methods name, name=, and name?
12
+ # These methods dispatch to the private _name, and _name= methods, making them
13
+ # overridable
14
+ metaclass.send(:define_method, name) { send("_#{name}") }
15
+ metaclass.send(:define_method, "#{name}?") { !!send("_#{name}") }
16
+ metaclass.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
17
+
18
+ # If an instance_reader is needed, generate methods for name and name= on the
19
+ # class itself, so instances will be able to see them
20
+ define_method(name) { send("_#{name}") } if options[:instance_reader] != false
21
+ define_method("#{name}?") { !!send("#{name}") } if options[:instance_reader] != false
31
22
  end
32
23
 
33
- def superclass_delegating_writer(*names)
34
- names.each do |name|
35
- class_eval <<-EOS
36
- def self.#{name}=(value) # def self.only_writer=(value)
37
- @#{name} = value # @only_writer = value
38
- end # end
39
- EOS
40
- end
24
+ private
25
+
26
+ # Take the object being set and store it in a method. This gives us automatic
27
+ # inheritance behavior, without having to store the object in an instance
28
+ # variable and look up the superclass chain manually.
29
+ def _stash_object_in_method(object, method, instance_reader = true)
30
+ metaclass.send(:define_method, method) { object }
31
+ define_method(method) { object } if instance_reader
41
32
  end
42
33
 
43
- def superclass_delegating_accessor(*names)
44
- superclass_delegating_reader(*names)
45
- superclass_delegating_writer(*names)
34
+ def _superclass_delegating_accessor(name, options = {})
35
+ metaclass.send(:define_method, "#{name}=") do |value|
36
+ _stash_object_in_method(value, name, options[:instance_reader] != false)
37
+ end
38
+ self.send("#{name}=", nil)
46
39
  end
40
+
47
41
  end
@@ -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
@@ -109,11 +115,6 @@ class Class # :nodoc:
109
115
  write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
110
116
  end
111
117
 
112
- def write_inheritable_hiwa(key, hash)
113
- write_inheritable_attribute(key, {}.with_indifferent_access) if read_inheritable_attribute(key).nil?
114
- write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
115
- end
116
-
117
118
  def read_inheritable_attribute(key)
118
119
  inheritable_attributes[key]
119
120
  end
@@ -143,3 +144,86 @@ class Class # :nodoc:
143
144
  alias inherited_without_inheritable_attributes inherited
144
145
  alias inherited inherited_with_inheritable_attributes
145
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,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,241 +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
- def last_year # :nodoc:
139
- ActiveSupport::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
- ActiveSupport::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
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
239
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
240
220
  end
241
221
  end