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
data/CHANGELOG CHANGED
@@ -1,81 +1,58 @@
1
- ## Rails 2.3.15 (Jan 8, 2012) ##
1
+ *Rails 3.0 (pending)*
2
2
 
3
- * Hash.from_xml raises when it encounters type="symbol" or type="yaml". Use Hash.from_trusted_xml to parse this XML. CVE-2013-0156 [Jeremy Kemper]
3
+ * Introduce class_attribute to declare inheritable class attributes. Writing an attribute on a subclass behaves just like overriding the superclass reader method. Unifies and replaces most usage of cattr_accessor, class_inheritable_attribute, superclass_delegating_attribute, and extlib_inheritable_attribute. [Jeremy Kemper, Yehuda Katz]
4
4
 
5
+ * Time#- with a DateTime argument behaves the same as with a Time argument, i.e. returns the difference between self and arg as a Float #3476 [Geoff Buesing]
5
6
 
6
- *2.3.11 (February 9, 2011)*
7
-
8
-
9
- *2.3.10 (October 15, 2010)*
10
-
11
-
12
- *2.3.9 (September 4, 2010)*
13
-
14
- * i18n: bundle i18n 0.4.1 for forward compatibility with Rails 3. Deprecates {{foo}} interpolation syntax in favor of 1.9-native %{foo}.
15
-
16
- * Deprecate Kernel#returning in favor of Object#tap since it's included in Ruby 1.8.7 and later. [Santiago Pastorino]
17
-
18
- * Deprecates ActiveSupport::Dependencies.load_(once_)paths, renamed to autoload_(once_)paths. [fxn]
19
-
20
- * Deprecates Array#random_element, renamed to sample to match Ruby 1.9, thanks to Marc-Andre Lafortune. [fxn]
21
-
22
-
23
- *2.3.8 (May 24, 2010)*
24
-
25
- * Version bump.
26
-
27
-
28
- *2.3.7 (May 24, 2010)*
29
-
30
- * HTML safety: fix compatibility with the optional rails_xss plugin. [Nathan Weizenbaum, Santiago Pastorino]
31
-
7
+ * YAML serialization for OrderedHash. #3608 [Gregor Schmidt]
32
8
 
33
- *2.3.6 (May 23, 2010)*
9
+ * Update bundled TZInfo to v0.3.16 [Geoff Buesing]
34
10
 
35
- * 1.9 compat: deprecated last_(month|year) in favor of prev_(month|year). [fxn]
11
+ * Georgetown TimeZone is now mapped to "America/Guyana" instead of "America/Argentina/San_Juan" #1821 [Geoff Buesing, Reuben Sivan]
36
12
 
37
- * Deprecated Array#rand in favor of Array#random_element. [Santiago Pastorino, Rizwan Reza]
13
+ * Changed the default ActiveSupport.use_standard_json_time_format from false to true and
14
+ ActiveSupport.escape_html_entities_in_json from true to false to match previously announced Rails 3 defaults [DHH]
38
15
 
39
16
  * Added Object#presence that returns the object if it's #present? otherwise returns nil [DHH/Colin Kelley]
40
17
 
41
- * New assertions assert_blank and assert_present. #4299 [Juanjo Bazan]
42
-
43
- * Use Object#singleton_class instead of #metaclass. Prefer Ruby's choice. [Jeremy Kemper]
44
-
45
- * JSON backend for YAJL. Preferred if available. #2666 [Brian Lopez]
46
-
47
- * Introduce String#html_safe for rails_xss plugin and forward-compatibility with Rails 3. [Michael Koziarski, Santiago Pastorino, José Ignacio Costa]
48
-
49
- * Time#- with a DateTime argument behaves the same as with a Time argument, i.e. returns the difference between self and arg as a Float #3476 [Geoff Buesing]
18
+ * Add Enumerable#exclude? to bring parity to Enumerable#include? and avoid if !x.include?/else calls [DHH]
50
19
 
51
- * YAML serialization for OrderedHash. #3608 [Gregor Schmidt]
20
+ * Update Edinburgh TimeZone to use "Europe/London" instead of "Europe/Dublin" #3310 [Phil Ross]
52
21
 
53
- * Add Enumerable#exclude? to bring parity to Enumerable#include? and avoid if !x.include?/else calls [DHH]
22
+ * Update bundled TZInfo to v0.3.15 [Geoff Buesing]
54
23
 
24
+ * JSON: +Object#to_json+ calls +as_json+ to coerce itself into something natively encodable like +Hash+, +Integer+, or +String+. Override +as_json+ instead of +to_json+ so you're JSON library agnostic. [Jeremy Kemper]
55
25
 
56
- *2.3.5 (November 25, 2009)*
26
+ * String #to_time and #to_datetime: handle fractional seconds #864 [Jason Frey]
57
27
 
58
- * Minor Bug Fixes and deprecation warnings
28
+ * Update bundled TZInfo to v0.3.13 [Geoff Buesing]
59
29
 
60
- * Update Edinburgh TimeZone to use "Europe/London" instead of "Europe/Dublin" #3310 [Phil Ross]
30
+ * Allow MemCacheStore to be initialized with a MemCache-like object instead of addresses and options [Bryan Helmkamp]
61
31
 
62
- * Fixes for the Nokogiri backend for XmlMini
32
+ * Change spelling of Kyev timezone to Kyiv #2613 [Alexander Dymo]
63
33
 
64
- * Ruby 1.9 Compatibility
34
+ * Add ActiveSupport.parse_json_times to disable time parsing in JSON backends that don't support it or don't need it. [rick]
65
35
 
36
+ * Add pluggable JSON backends with support for the JSON gem. [rick]
37
+ Example: ActiveSupport::JSON.backend = "JSONGem"
66
38
 
67
- *2.3.4 (September 4, 2009)*
39
+ All internal Rails JSON encoding is now handled by ActiveSupport::JSON.encode(). Use of #to_json is not recommended, as it may clash with other libraries that overwrite it. However, you can recover Rails specific functionality
40
+ if you really want to use #to_json.
68
41
 
69
- * Introduce ActiveSupport::Multibyte.clean to clean invalid multibyte strings.
42
+ gem 'json'
43
+ ActiveSupport::JSON.backend = "JSONGem"
70
44
 
71
- * Bug fixes
45
+ class ActiveRecord::Base
46
+ alias to_json rails_to_json
47
+ end
72
48
 
49
+ * require 'active_support' no longer orders the whole menu of core extensions. Ask for just what you need: e.g. require 'active_support/core/time' to use timezones, durations, and stdlib date/time extensions. [Jeremy Kemper]
73
50
 
74
- *2.3.3 (July 12, 2009)*
51
+ * Removed rarely-used DRb cache store. [Jeremy Kemper]
75
52
 
76
- * JSON: +Object#to_json+ calls +as_json+ to coerce itself into something natively encodable like +Hash+, +Integer+, or +String+. Override +as_json+ instead of +to_json+ so you're JSON-library-agnostic. [Jeremy Kemper]
53
+ * TimeWithZone.name returns 'Time', to further thwart type checking [Geoff Buesing]
77
54
 
78
- * Allow MemCacheStore to be initialized with a MemCache-like object instead of addresses and options [Bryan Helmkamp]
55
+ * Time.local instances: Adding 24.hours across the DST boundary adds 24 hours instead of one day #2066 [Michael Curtis]
79
56
 
80
57
 
81
58
  *2.3.2 [Final] (March 15, 2009)*
@@ -22,39 +22,51 @@
22
22
  #++
23
23
 
24
24
  module ActiveSupport
25
- def self.load_all!
26
- [Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom, TimeWithZone]
25
+ class << self
26
+ attr_accessor :load_all_hooks
27
+ def on_load_all(&hook) load_all_hooks << hook end
28
+ def load_all!; load_all_hooks.each { |hook| hook.call } end
27
29
  end
30
+ self.load_all_hooks = []
28
31
 
29
- autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
30
- autoload :Base64, 'active_support/base64'
31
- autoload :BasicObject, 'active_support/basic_object'
32
- autoload :BufferedLogger, 'active_support/buffered_logger'
33
- autoload :Cache, 'active_support/cache'
34
- autoload :Callbacks, 'active_support/callbacks'
35
- autoload :Deprecation, 'active_support/deprecation'
36
- autoload :Duration, 'active_support/duration'
37
- autoload :Gzip, 'active_support/gzip'
38
- autoload :Inflector, 'active_support/inflector'
39
- autoload :Memoizable, 'active_support/memoizable'
40
- autoload :MessageEncryptor, 'active_support/message_encryptor'
41
- autoload :MessageVerifier, 'active_support/message_verifier'
42
- autoload :Multibyte, 'active_support/multibyte'
43
- autoload :OptionMerger, 'active_support/option_merger'
44
- autoload :OrderedHash, 'active_support/ordered_hash'
45
- autoload :OrderedOptions, 'active_support/ordered_options'
46
- autoload :Rescuable, 'active_support/rescuable'
47
- autoload :SafeBuffer, 'active_support/core_ext/string/output_safety'
48
- autoload :SecureRandom, 'active_support/secure_random'
49
- autoload :StringInquirer, 'active_support/string_inquirer'
50
- autoload :TimeWithZone, 'active_support/time_with_zone'
51
- autoload :TimeZone, 'active_support/values/time_zone'
52
- autoload :XmlMini, 'active_support/xml_mini'
32
+ on_load_all do
33
+ [Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom]
34
+ end
53
35
  end
54
36
 
55
- require 'active_support/vendor'
56
- require 'active_support/core_ext'
57
- require 'active_support/dependencies'
58
- require 'active_support/json'
37
+ require "active_support/dependencies/autoload"
38
+
39
+ module ActiveSupport
40
+ extend ActiveSupport::Autoload
41
+
42
+ # TODO: Narrow this list down
43
+ eager_autoload do
44
+ autoload :BacktraceCleaner
45
+ autoload :Base64
46
+ autoload :BasicObject
47
+ autoload :Benchmarkable
48
+ autoload :BufferedLogger
49
+ autoload :Cache
50
+ autoload :Callbacks
51
+ autoload :Concern
52
+ autoload :Configurable
53
+ autoload :Deprecation
54
+ autoload :Gzip
55
+ autoload :Inflector
56
+ autoload :Memoizable
57
+ autoload :MessageEncryptor
58
+ autoload :MessageVerifier
59
+ autoload :Multibyte
60
+ autoload :OptionMerger
61
+ autoload :OrderedHash
62
+ autoload :OrderedOptions
63
+ autoload :Notifications
64
+ autoload :Rescuable
65
+ autoload :SecureRandom
66
+ autoload :StringInquirer
67
+ autoload :XmlMini
68
+ end
59
69
 
60
- I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml"
70
+ autoload :SafeBuffer, "active_support/core_ext/string/output_safety"
71
+ autoload :TestCase
72
+ end
@@ -1,8 +1,4 @@
1
- # For forward compatibility with Rails 3.
2
- #
3
- # require 'active_support' loads a very bare minumum in Rails 3.
4
- # require 'active_support/all' loads the whole suite like Rails 2 did.
5
- #
6
- # To prepare for Rails 3, switch to require 'active_support/all' now.
7
-
8
1
  require 'active_support'
2
+ require 'active_support/i18n'
3
+ require 'active_support/time'
4
+ require 'active_support/core_ext'
@@ -9,7 +9,7 @@ module ActiveSupport
9
9
  # Example:
10
10
  #
11
11
  # bc = BacktraceCleaner.new
12
- # bc.add_filter { |line| line.gsub(Rails.root, '') }
12
+ # bc.add_filter { |line| line.gsub(Rails.root, '') }
13
13
  # bc.add_silencer { |line| line =~ /mongrel|rubygems/ }
14
14
  # bc.clean(exception.backtrace) # will strip the Rails.root prefix and skip any lines from mongrel or rubygems
15
15
  #
@@ -18,10 +18,19 @@ module ActiveSupport
18
18
  def initialize
19
19
  @filters, @silencers = [], []
20
20
  end
21
-
21
+
22
22
  # Returns the backtrace after all filters and silencers has been run against it. Filters run first, then silencers.
23
- def clean(backtrace)
24
- silence(filter(backtrace))
23
+ def clean(backtrace, kind = :silent)
24
+ filtered = filter(backtrace)
25
+
26
+ case kind
27
+ when :silent
28
+ silence(filtered)
29
+ when :noise
30
+ noise(filtered)
31
+ else
32
+ filtered
33
+ end
25
34
  end
26
35
 
27
36
  # Adds a filter from the block provided. Each line in the backtrace will be mapped against this filter.
@@ -51,21 +60,28 @@ module ActiveSupport
51
60
  @silencers = []
52
61
  end
53
62
 
54
-
55
63
  private
56
64
  def filter(backtrace)
57
65
  @filters.each do |f|
58
66
  backtrace = backtrace.map { |line| f.call(line) }
59
67
  end
60
-
68
+
61
69
  backtrace
62
70
  end
63
-
71
+
64
72
  def silence(backtrace)
65
73
  @silencers.each do |s|
66
74
  backtrace = backtrace.reject { |line| s.call(line) }
67
75
  end
68
-
76
+
77
+ backtrace
78
+ end
79
+
80
+ def noise(backtrace)
81
+ @silencers.each do |s|
82
+ backtrace = backtrace.select { |line| s.call(line) }
83
+ end
84
+
69
85
  backtrace
70
86
  end
71
87
  end
@@ -30,4 +30,13 @@ module ActiveSupport
30
30
  end
31
31
  end
32
32
  end
33
+
34
+ # Encodes the value as base64 without the newline breaks. This makes the base64 encoding readily usable as URL parameters
35
+ # or memcache keys without further processing.
36
+ #
37
+ # ActiveSupport::Base64.encode64s("Original unencoded string")
38
+ # # => "T3JpZ2luYWwgdW5lbmNvZGVkIHN0cmluZw=="
39
+ def Base64.encode64s(value)
40
+ encode64(value).gsub(/\n/, '')
41
+ end
33
42
  end
@@ -0,0 +1,60 @@
1
+ require 'active_support/core_ext/benchmark'
2
+ require 'active_support/core_ext/hash/keys'
3
+
4
+ module ActiveSupport
5
+ module Benchmarkable
6
+ # Allows you to measure the execution time of a block
7
+ # in a template and records the result to the log. Wrap this block around
8
+ # expensive operations or possible bottlenecks to get a time reading
9
+ # for the operation. For example, let's say you thought your file
10
+ # processing method was taking too long; you could wrap it in a benchmark block.
11
+ #
12
+ # <% benchmark "Process data files" do %>
13
+ # <%= expensive_files_operation %>
14
+ # <% end %>
15
+ #
16
+ # That would add something like "Process data files (345.2ms)" to the log,
17
+ # which you can then use to compare timings when optimizing your code.
18
+ #
19
+ # You may give an optional logger level as the :level option.
20
+ # (:debug, :info, :warn, :error); the default value is :info.
21
+ #
22
+ # <% benchmark "Low-level files", :level => :debug do %>
23
+ # <%= lowlevel_files_operation %>
24
+ # <% end %>
25
+ #
26
+ # Finally, you can pass true as the third argument to silence all log activity
27
+ # inside the block. This is great for boiling down a noisy block to just a single statement:
28
+ #
29
+ # <% benchmark "Process data files", :level => :info, :silence => true do %>
30
+ # <%= expensive_and_chatty_files_operation %>
31
+ # <% end %>
32
+ def benchmark(message = "Benchmarking", options = {})
33
+ if logger
34
+ if options.is_a?(Symbol)
35
+ ActiveSupport::Deprecation.warn("use benchmark('#{message}', :level => :#{options}) instead", caller)
36
+ options = { :level => options, :silence => false }
37
+ else
38
+ options.assert_valid_keys(:level, :silence)
39
+ options[:level] ||= :info
40
+ end
41
+
42
+ result = nil
43
+ ms = Benchmark.ms { result = options[:silence] ? logger.silence { yield } : yield }
44
+ logger.send(options[:level], '%s (%.1fms)' % [ message, ms ])
45
+ result
46
+ else
47
+ yield
48
+ end
49
+ end
50
+
51
+ # Silence the logger during the execution of the block.
52
+ #
53
+ def silence
54
+ old_logger_level, logger.level = logger.level, ::Logger::ERROR if logger
55
+ yield
56
+ ensure
57
+ logger.level = old_logger_level if logger
58
+ end
59
+ end
60
+ end
@@ -1,4 +1,4 @@
1
- require 'thread'
1
+ require 'active_support/core_ext/class/attribute_accessors'
2
2
 
3
3
  module ActiveSupport
4
4
  # Inspired by the buffered logger idea by Ezra
@@ -53,7 +53,6 @@ module ActiveSupport
53
53
  FileUtils.mkdir_p(File.dirname(log))
54
54
  @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
55
55
  @log.sync = true
56
- @log.write("# Logfile created on %s" % [Time.now.to_s])
57
56
  end
58
57
  end
59
58
 
@@ -68,15 +67,19 @@ module ActiveSupport
68
67
  message
69
68
  end
70
69
 
70
+ # Dynamically add methods such as:
71
+ # def info
72
+ # def warn
73
+ # def debug
71
74
  for severity in Severity.constants
72
75
  class_eval <<-EOT, __FILE__, __LINE__ + 1
73
- def #{severity.downcase}(message = nil, progname = nil, &block) # def debug(message = nil, progname = nil, &block)
74
- add(#{severity}, message, progname, &block) # add(DEBUG, message, progname, &block)
75
- end # end
76
- #
77
- def #{severity.downcase}? # def debug?
78
- #{severity} >= @level # DEBUG >= @level
79
- end # end
76
+ def #{severity.downcase}(message = nil, progname = nil, &block) # def debug(message = nil, progname = nil, &block)
77
+ add(#{severity}, message, progname, &block) # add(DEBUG, message, progname, &block)
78
+ end # end
79
+
80
+ def #{severity.downcase}? # def debug?
81
+ #{severity} >= @level # DEBUG >= @level
82
+ end # end
80
83
  EOT
81
84
  end
82
85
 
@@ -1,4 +1,10 @@
1
1
  require 'benchmark'
2
+ require 'active_support/core_ext/array/wrap'
3
+ require 'active_support/core_ext/benchmark'
4
+ require 'active_support/core_ext/exception'
5
+ require 'active_support/core_ext/class/attribute_accessors'
6
+ require 'active_support/core_ext/object/to_param'
7
+ require 'active_support/core_ext/string/inflections'
2
8
 
3
9
  module ActiveSupport
4
10
  # See ActiveSupport::Cache::Store for documentation.
@@ -6,7 +12,6 @@ module ActiveSupport
6
12
  autoload :FileStore, 'active_support/cache/file_store'
7
13
  autoload :MemoryStore, 'active_support/cache/memory_store'
8
14
  autoload :SynchronizedMemoryStore, 'active_support/cache/synchronized_memory_store'
9
- autoload :DRbStore, 'active_support/cache/drb_store'
10
15
  autoload :MemCacheStore, 'active_support/cache/mem_cache_store'
11
16
  autoload :CompressedMemCacheStore, 'active_support/cache/compressed_mem_cache_store'
12
17
 
@@ -25,9 +30,9 @@ module ActiveSupport
25
30
  #
26
31
  # ActiveSupport::Cache.lookup_store(:memory_store)
27
32
  # # => returns a new ActiveSupport::Cache::MemoryStore object
28
- #
29
- # ActiveSupport::Cache.lookup_store(:drb_store)
30
- # # => returns a new ActiveSupport::Cache::DRbStore object
33
+ #
34
+ # ActiveSupport::Cache.lookup_store(:mem_cache_store)
35
+ # # => returns a new ActiveSupport::Cache::MemCacheStore object
31
36
  #
32
37
  # Any additional arguments will be passed to the corresponding cache store
33
38
  # class's constructor:
@@ -40,11 +45,11 @@ module ActiveSupport
40
45
  # ActiveSupport::Cache.lookup_store(MyOwnCacheStore.new)
41
46
  # # => returns MyOwnCacheStore.new
42
47
  def self.lookup_store(*store_option)
43
- store, *parameters = *([ store_option ].flatten)
48
+ store, *parameters = *Array.wrap(store_option).flatten
44
49
 
45
50
  case store
46
51
  when Symbol
47
- store_class_name = (store == :drb_store ? "DRbStore" : store.to_s.camelize)
52
+ store_class_name = store.to_s.camelize
48
53
  store_class = ActiveSupport::Cache.const_get(store_class_name)
49
54
  store_class.new(*parameters)
50
55
  when nil
@@ -54,19 +59,27 @@ module ActiveSupport
54
59
  end
55
60
  end
56
61
 
62
+ RAILS_CACHE_ID = ENV["RAILS_CACHE_ID"]
63
+ RAILS_APP_VERION = ENV["RAILS_APP_VERION"]
64
+ EXPANDED_CACHE = RAILS_CACHE_ID || RAILS_APP_VERION
65
+
57
66
  def self.expand_cache_key(key, namespace = nil)
58
67
  expanded_cache_key = namespace ? "#{namespace}/" : ""
59
68
 
60
- if ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"]
61
- expanded_cache_key << "#{ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"]}/"
69
+ if EXPANDED_CACHE
70
+ expanded_cache_key << "#{RAILS_CACHE_ID || RAILS_APP_VERION}/"
62
71
  end
63
72
 
64
- expanded_cache_key << case
65
- when key.respond_to?(:cache_key)
73
+ expanded_cache_key <<
74
+ if key.respond_to?(:cache_key)
66
75
  key.cache_key
67
- when key.is_a?(Array)
68
- key.collect { |element| expand_cache_key(element) }.to_param
69
- when key
76
+ elsif key.is_a?(Array)
77
+ if key.size > 1
78
+ key.collect { |element| expand_cache_key(element) }.to_param
79
+ else
80
+ key.first.to_param
81
+ end
82
+ elsif key
70
83
  key.to_param
71
84
  end.to_s
72
85
 
@@ -84,23 +97,21 @@ module ActiveSupport
84
97
  # Ruby objects, but don't count on every cache store to be able to do that.
85
98
  #
86
99
  # cache = ActiveSupport::Cache::MemoryStore.new
87
- #
100
+ #
88
101
  # cache.read("city") # => nil
89
102
  # cache.write("city", "Duckburgh")
90
103
  # cache.read("city") # => "Duckburgh"
91
104
  class Store
92
- cattr_accessor :logger
105
+ cattr_accessor :logger, :instance_writter => false
93
106
 
94
- attr_reader :silence, :logger_off
107
+ attr_reader :silence
108
+ alias :silence? :silence
95
109
 
96
110
  def silence!
97
111
  @silence = true
98
112
  self
99
113
  end
100
114
 
101
- alias silence? silence
102
- alias logger_off? logger_off
103
-
104
115
  def mute
105
116
  previous_silence, @silence = defined?(@silence) && @silence, true
106
117
  yield
@@ -108,6 +119,15 @@ module ActiveSupport
108
119
  @silence = previous_silence
109
120
  end
110
121
 
122
+ # Set to true if cache stores should be instrumented. By default is false.
123
+ def self.instrument=(boolean)
124
+ Thread.current[:instrument_cache_store] = boolean
125
+ end
126
+
127
+ def self.instrument
128
+ Thread.current[:instrument_cache_store] || false
129
+ end
130
+
111
131
  # Fetches data from the cache, using the given key. If there is data in
112
132
  # the cache with the given key, then that data is returned.
113
133
  #
@@ -119,7 +139,7 @@ module ActiveSupport
119
139
  #
120
140
  # cache.write("today", "Monday")
121
141
  # cache.fetch("today") # => "Monday"
122
- #
142
+ #
123
143
  # cache.fetch("city") # => nil
124
144
  # cache.fetch("city") do
125
145
  # "Duckburgh"
@@ -138,8 +158,8 @@ module ActiveSupport
138
158
  #
139
159
  # For example, MemCacheStore's #write method supports the +:expires_in+
140
160
  # option, which tells the memcached server to automatically expire the
141
- # cache item after a certain period. We can use this option with #fetch
142
- # too:
161
+ # cache item after a certain period. This options is also supported by
162
+ # FileStore's #read method. We can use this option with #fetch too:
143
163
  #
144
164
  # cache = ActiveSupport::Cache::MemCacheStore.new
145
165
  # cache.fetch("foo", :force => true, :expires_in => 5.seconds) do
@@ -148,26 +168,13 @@ module ActiveSupport
148
168
  # cache.fetch("foo") # => "bar"
149
169
  # sleep(6)
150
170
  # cache.fetch("foo") # => nil
151
- def fetch(key, options = {})
152
- @logger_off = true
171
+ def fetch(key, options = {}, &block)
153
172
  if !options[:force] && value = read(key, options)
154
- @logger_off = false
155
- log("hit", key, options)
156
173
  value
157
174
  elsif block_given?
158
- @logger_off = false
159
- log("miss", key, options)
160
-
161
- value = nil
162
- ms = Benchmark.ms { value = yield }
163
-
164
- @logger_off = true
165
- write(key, value, options)
166
- @logger_off = false
167
-
168
- log('write (will save %.2fms)' % ms, key, nil)
169
-
170
- value
175
+ result = instrument(:generate, key, options, &block)
176
+ write(key, result, options)
177
+ result
171
178
  end
172
179
  end
173
180
 
@@ -178,8 +185,12 @@ module ActiveSupport
178
185
  # You may also specify additional options via the +options+ argument.
179
186
  # The specific cache store implementation will decide what to do with
180
187
  # +options+.
181
- def read(key, options = nil)
182
- log("read", key, options)
188
+ #
189
+ # For example, FileStore supports the +:expires_in+ option, which
190
+ # makes the method return nil for cache items older than the specified
191
+ # period.
192
+ def read(key, options = nil, &block)
193
+ instrument(:read, key, options, &block)
183
194
  end
184
195
 
185
196
  # Writes the given value to the cache, with the given key.
@@ -187,7 +198,7 @@ module ActiveSupport
187
198
  # You may also specify additional options via the +options+ argument.
188
199
  # The specific cache store implementation will decide what to do with
189
200
  # +options+.
190
- #
201
+ #
191
202
  # For example, MemCacheStore supports the +:expires_in+ option, which
192
203
  # tells the memcached server to automatically expire the cache item after
193
204
  # a certain period:
@@ -197,24 +208,23 @@ module ActiveSupport
197
208
  # cache.read("foo") # => "bar"
198
209
  # sleep(6)
199
210
  # cache.read("foo") # => nil
200
- def write(key, value, options = nil)
201
- log("write", key, options)
211
+ def write(key, value, options = nil, &block)
212
+ instrument(:write, key, options, &block)
202
213
  end
203
214
 
204
- def delete(key, options = nil)
205
- log("delete", key, options)
215
+ def delete(key, options = nil, &block)
216
+ instrument(:delete, key, options, &block)
206
217
  end
207
218
 
208
- def delete_matched(matcher, options = nil)
209
- log("delete matched", matcher.inspect, options)
219
+ def delete_matched(matcher, options = nil, &block)
220
+ instrument(:delete_matched, matcher.inspect, options, &block)
210
221
  end
211
222
 
212
- def exist?(key, options = nil)
213
- log("exist?", key, options)
223
+ def exist?(key, options = nil, &block)
224
+ instrument(:exist?, key, options, &block)
214
225
  end
215
226
 
216
227
  def increment(key, amount = 1)
217
- log("incrementing", key, amount)
218
228
  if num = read(key)
219
229
  write(key, num + amount)
220
230
  else
@@ -223,7 +233,6 @@ module ActiveSupport
223
233
  end
224
234
 
225
235
  def decrement(key, amount = 1)
226
- log("decrementing", key, amount)
227
236
  if num = read(key)
228
237
  write(key, num - amount)
229
238
  else
@@ -234,14 +243,25 @@ module ActiveSupport
234
243
  private
235
244
  def expires_in(options)
236
245
  expires_in = options && options[:expires_in]
237
-
238
246
  raise ":expires_in must be a number" if expires_in && !expires_in.is_a?(Numeric)
239
-
240
247
  expires_in || 0
241
248
  end
242
249
 
250
+ def instrument(operation, key, options)
251
+ log(operation, key, options)
252
+
253
+ if self.class.instrument
254
+ payload = { :key => key }
255
+ payload.merge!(options) if options.is_a?(Hash)
256
+ ActiveSupport::Notifications.instrument("active_support.cache_#{operation}", payload){ yield }
257
+ else
258
+ yield
259
+ end
260
+ end
261
+
243
262
  def log(operation, key, options)
244
- logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !silence? && !logger_off?
263
+ return unless logger && !silence?
264
+ logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}")
245
265
  end
246
266
  end
247
267
  end