activesupport 3.0.pre → 3.0.0.rc

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 (351) hide show
  1. data/CHANGELOG +121 -1
  2. data/README.rdoc +33 -0
  3. data/lib/active_support.rb +42 -4
  4. data/lib/active_support/backtrace_cleaner.rb +31 -9
  5. data/lib/active_support/benchmarkable.rb +1 -0
  6. data/lib/active_support/buffered_logger.rb +5 -2
  7. data/lib/active_support/builder.rb +6 -0
  8. data/lib/active_support/cache.rb +454 -84
  9. data/lib/active_support/cache/compressed_mem_cache_store.rb +6 -13
  10. data/lib/active_support/cache/file_store.rb +140 -41
  11. data/lib/active_support/cache/mem_cache_store.rb +121 -76
  12. data/lib/active_support/cache/memory_store.rb +127 -27
  13. data/lib/active_support/cache/strategy/local_cache.rb +111 -58
  14. data/lib/active_support/cache/synchronized_memory_store.rb +2 -38
  15. data/lib/active_support/callbacks.rb +105 -76
  16. data/lib/active_support/configurable.rb +19 -18
  17. data/lib/active_support/core_ext/array.rb +1 -0
  18. data/lib/active_support/core_ext/array/access.rb +1 -1
  19. data/lib/active_support/core_ext/array/conversions.rb +29 -54
  20. data/lib/active_support/core_ext/array/extract_options.rb +16 -1
  21. data/lib/active_support/core_ext/array/grouping.rb +1 -1
  22. data/lib/active_support/core_ext/array/random_access.rb +26 -5
  23. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  24. data/lib/active_support/core_ext/array/wrap.rb +13 -9
  25. data/lib/active_support/core_ext/benchmark.rb +0 -12
  26. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +2 -0
  27. data/lib/active_support/core_ext/class.rb +2 -1
  28. data/lib/active_support/core_ext/class/attribute.rb +67 -0
  29. data/lib/active_support/core_ext/class/attribute_accessors.rb +33 -27
  30. data/lib/active_support/core_ext/class/delegating_attributes.rb +35 -41
  31. data/lib/active_support/core_ext/class/inheritable_attributes.rb +23 -14
  32. data/lib/active_support/core_ext/class/subclasses.rb +50 -0
  33. data/lib/active_support/core_ext/date/calculations.rb +35 -12
  34. data/lib/active_support/core_ext/date/conversions.rb +5 -5
  35. data/lib/active_support/core_ext/date/zones.rb +14 -0
  36. data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
  37. data/lib/active_support/core_ext/date_time/conversions.rb +24 -5
  38. data/lib/active_support/core_ext/date_time/zones.rb +4 -0
  39. data/lib/active_support/core_ext/enumerable.rb +5 -9
  40. data/lib/active_support/core_ext/exception.rb +0 -47
  41. data/lib/active_support/core_ext/file.rb +1 -0
  42. data/lib/active_support/core_ext/file/atomic.rb +3 -2
  43. data/lib/active_support/core_ext/file/path.rb +5 -0
  44. data/lib/active_support/core_ext/float/rounding.rb +3 -2
  45. data/lib/active_support/core_ext/hash/conversions.rb +65 -145
  46. data/lib/active_support/core_ext/hash/deep_merge.rb +6 -7
  47. data/lib/active_support/core_ext/hash/except.rb +8 -1
  48. data/lib/active_support/core_ext/hash/indifferent_access.rb +5 -0
  49. data/lib/active_support/core_ext/hash/keys.rb +10 -11
  50. data/lib/active_support/core_ext/hash/slice.rb +6 -0
  51. data/lib/active_support/core_ext/integer.rb +1 -1
  52. data/lib/active_support/core_ext/integer/multiple.rb +6 -0
  53. data/lib/active_support/core_ext/kernel.rb +1 -1
  54. data/lib/active_support/core_ext/kernel/debugger.rb +3 -2
  55. data/lib/active_support/core_ext/kernel/reporting.rb +2 -1
  56. data/lib/active_support/core_ext/kernel/requires.rb +2 -2
  57. data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
  58. data/lib/active_support/core_ext/load_error.rb +17 -30
  59. data/lib/active_support/core_ext/logger.rb +2 -40
  60. data/lib/active_support/core_ext/module.rb +5 -3
  61. data/lib/active_support/core_ext/module/aliasing.rb +1 -1
  62. data/lib/active_support/core_ext/module/anonymous.rb +24 -0
  63. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  64. data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
  65. data/lib/active_support/core_ext/module/attribute_accessors.rb +20 -22
  66. data/lib/active_support/core_ext/module/delegation.rb +21 -10
  67. data/lib/active_support/core_ext/module/introspection.rb +8 -8
  68. data/lib/active_support/core_ext/module/method_names.rb +14 -0
  69. data/lib/active_support/core_ext/module/reachable.rb +10 -0
  70. data/lib/active_support/core_ext/module/remove_method.rb +11 -0
  71. data/lib/active_support/core_ext/module/synchronization.rb +2 -1
  72. data/lib/active_support/core_ext/name_error.rb +3 -1
  73. data/lib/active_support/core_ext/object.rb +5 -3
  74. data/lib/active_support/core_ext/object/blank.rb +20 -2
  75. data/lib/active_support/core_ext/object/conversions.rb +2 -16
  76. data/lib/active_support/core_ext/object/duplicable.rb +23 -1
  77. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  78. data/lib/active_support/core_ext/object/to_json.rb +19 -0
  79. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  80. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  81. data/lib/active_support/core_ext/object/with_options.rb +2 -0
  82. data/lib/active_support/core_ext/proc.rb +4 -4
  83. data/lib/active_support/core_ext/range/overlaps.rb +1 -1
  84. data/lib/active_support/core_ext/regexp.rb +0 -22
  85. data/lib/active_support/core_ext/rexml.rb +4 -1
  86. data/lib/active_support/core_ext/string.rb +3 -2
  87. data/lib/active_support/core_ext/string/access.rb +4 -2
  88. data/lib/active_support/core_ext/string/conversions.rb +28 -1
  89. data/lib/active_support/core_ext/string/encoding.rb +11 -0
  90. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  91. data/lib/active_support/core_ext/string/filters.rb +29 -0
  92. data/lib/active_support/core_ext/string/inflections.rb +12 -12
  93. data/lib/active_support/core_ext/string/interpolation.rb +2 -92
  94. data/lib/active_support/core_ext/string/multibyte.rb +16 -19
  95. data/lib/active_support/core_ext/string/output_safety.rb +101 -35
  96. data/lib/active_support/core_ext/string/starts_ends_with.rb +0 -14
  97. data/lib/active_support/core_ext/string/xchar.rb +1 -1
  98. data/lib/active_support/core_ext/time/calculations.rb +14 -7
  99. data/lib/active_support/core_ext/time/conversions.rb +1 -0
  100. data/lib/active_support/core_ext/time/marshal.rb +56 -0
  101. data/lib/active_support/core_ext/time/zones.rb +2 -5
  102. data/lib/active_support/core_ext/uri.rb +10 -4
  103. data/lib/active_support/dependencies.rb +200 -197
  104. data/lib/active_support/dependencies/autoload.rb +50 -0
  105. data/lib/active_support/deprecation/behaviors.rb +13 -9
  106. data/lib/active_support/deprecation/method_wrappers.rb +10 -9
  107. data/lib/active_support/deprecation/proxy_wrappers.rb +7 -0
  108. data/lib/active_support/deprecation/reporting.rb +5 -3
  109. data/lib/active_support/descendants_tracker.rb +43 -0
  110. data/lib/active_support/duration.rb +8 -4
  111. data/lib/active_support/file_update_checker.rb +36 -0
  112. data/lib/active_support/hash_with_indifferent_access.rb +9 -1
  113. data/lib/active_support/i18n.rb +9 -0
  114. data/lib/active_support/i18n_railtie.rb +81 -0
  115. data/lib/active_support/inflections.rb +1 -1
  116. data/lib/active_support/inflector.rb +4 -407
  117. data/lib/active_support/inflector/inflections.rb +211 -0
  118. data/lib/active_support/inflector/methods.rb +151 -0
  119. data/lib/active_support/inflector/transliterate.rb +97 -0
  120. data/lib/active_support/json/backends/jsongem.rb +12 -9
  121. data/lib/active_support/json/backends/yajl.rb +40 -0
  122. data/lib/active_support/json/backends/yaml.rb +1 -1
  123. data/lib/active_support/json/decoding.rb +17 -2
  124. data/lib/active_support/json/encoding.rb +48 -31
  125. data/lib/active_support/json/variable.rb +2 -4
  126. data/lib/active_support/lazy_load_hooks.rb +27 -0
  127. data/lib/active_support/locale/en.yml +5 -2
  128. data/lib/active_support/log_subscriber.rb +123 -0
  129. data/lib/active_support/log_subscriber/test_helper.rb +99 -0
  130. data/lib/active_support/memoizable.rb +1 -1
  131. data/lib/active_support/message_encryptor.rb +1 -0
  132. data/lib/active_support/message_verifier.rb +2 -1
  133. data/lib/active_support/multibyte.rb +8 -23
  134. data/lib/active_support/multibyte/chars.rb +213 -446
  135. data/lib/active_support/multibyte/unicode.rb +392 -0
  136. data/lib/active_support/multibyte/utils.rb +6 -7
  137. data/lib/active_support/notifications.rb +29 -122
  138. data/lib/active_support/notifications/fanout.rb +61 -0
  139. data/lib/active_support/notifications/instrumenter.rb +54 -0
  140. data/lib/active_support/ordered_hash.rb +59 -14
  141. data/lib/active_support/ordered_options.rb +6 -0
  142. data/lib/active_support/railtie.rb +60 -0
  143. data/lib/active_support/rescuable.rb +7 -4
  144. data/lib/active_support/ruby/shim.rb +4 -6
  145. data/lib/active_support/test_case.rb +2 -7
  146. data/lib/active_support/testing/assertions.rb +15 -0
  147. data/lib/active_support/testing/declarative.rb +1 -1
  148. data/lib/active_support/testing/isolation.rb +64 -17
  149. data/lib/active_support/testing/performance.rb +306 -335
  150. data/lib/active_support/testing/setup_and_teardown.rb +51 -29
  151. data/lib/active_support/time.rb +24 -3
  152. data/lib/active_support/time_with_zone.rb +10 -14
  153. data/lib/active_support/values/time_zone.rb +192 -234
  154. data/lib/active_support/values/unicode_tables.dat +0 -0
  155. data/lib/active_support/version.rb +3 -2
  156. data/lib/active_support/whiny_nil.rb +9 -7
  157. data/lib/active_support/xml_mini.rb +130 -1
  158. data/lib/active_support/xml_mini/jdom.rb +2 -0
  159. data/lib/active_support/xml_mini/libxml.rb +23 -86
  160. data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
  161. data/lib/active_support/xml_mini/nokogiri.rb +27 -24
  162. data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
  163. data/lib/active_support/xml_mini/rexml.rb +8 -2
  164. metadata +62 -195
  165. data/README +0 -43
  166. data/lib/active_support/autoload.rb +0 -28
  167. data/lib/active_support/core_ext/boolean.rb +0 -1
  168. data/lib/active_support/core_ext/boolean/conversions.rb +0 -11
  169. data/lib/active_support/core_ext/class/removal.rb +0 -53
  170. data/lib/active_support/core_ext/date.rb +0 -7
  171. data/lib/active_support/core_ext/date_time.rb +0 -5
  172. data/lib/active_support/core_ext/integer/even_odd.rb +0 -16
  173. data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
  174. data/lib/active_support/core_ext/module/inclusion.rb +0 -30
  175. data/lib/active_support/core_ext/module/loading.rb +0 -23
  176. data/lib/active_support/core_ext/nil.rb +0 -1
  177. data/lib/active_support/core_ext/nil/conversions.rb +0 -5
  178. data/lib/active_support/core_ext/object/extending.rb +0 -80
  179. data/lib/active_support/core_ext/object/metaclass.rb +0 -13
  180. data/lib/active_support/core_ext/object/misc.rb +0 -3
  181. data/lib/active_support/core_ext/object/returning.rb +0 -42
  182. data/lib/active_support/core_ext/object/tap.rb +0 -16
  183. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  184. data/lib/active_support/core_ext/string/iterators.rb +0 -13
  185. data/lib/active_support/core_ext/symbol.rb +0 -1
  186. data/lib/active_support/core_ext/symbol/to_proc.rb +0 -14
  187. data/lib/active_support/core_ext/time.rb +0 -10
  188. data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +0 -22
  189. data/lib/active_support/deprecated_callbacks.rb +0 -283
  190. data/lib/active_support/multibyte/unicode_database.rb +0 -71
  191. data/lib/active_support/vendor.rb +0 -16
  192. data/lib/active_support/vendor/builder-2.1.2/lib/blankslate.rb +0 -113
  193. data/lib/active_support/vendor/builder-2.1.2/lib/builder.rb +0 -13
  194. data/lib/active_support/vendor/builder-2.1.2/lib/builder/blankslate.rb +0 -20
  195. data/lib/active_support/vendor/builder-2.1.2/lib/builder/css.rb +0 -250
  196. data/lib/active_support/vendor/builder-2.1.2/lib/builder/xchar.rb +0 -115
  197. data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlbase.rb +0 -139
  198. data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlevents.rb +0 -63
  199. data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlmarkup.rb +0 -328
  200. data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
  201. data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
  202. data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
  203. data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
  204. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -204
  205. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -215
  206. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
  207. data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
  208. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
  209. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
  210. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
  211. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
  212. data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
  213. data/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb +0 -1133
  214. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo.rb +0 -33
  215. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone.rb +0 -47
  216. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone_info.rb +0 -228
  217. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Algiers.rb +0 -55
  218. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Cairo.rb +0 -219
  219. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Casablanca.rb +0 -42
  220. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Harare.rb +0 -18
  221. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  222. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  223. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  224. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  225. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  226. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Bogota.rb +0 -23
  227. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Caracas.rb +0 -23
  228. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chicago.rb +0 -283
  229. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chihuahua.rb +0 -136
  230. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Denver.rb +0 -204
  231. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Godthab.rb +0 -161
  232. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Guatemala.rb +0 -27
  233. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Halifax.rb +0 -274
  234. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  235. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Juneau.rb +0 -194
  236. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/La_Paz.rb +0 -22
  237. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Lima.rb +0 -35
  238. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  239. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mazatlan.rb +0 -139
  240. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mexico_City.rb +0 -144
  241. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Monterrey.rb +0 -131
  242. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/New_York.rb +0 -282
  243. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Phoenix.rb +0 -30
  244. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Regina.rb +0 -74
  245. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Santiago.rb +0 -205
  246. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  247. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/St_Johns.rb +0 -288
  248. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Tijuana.rb +0 -196
  249. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Almaty.rb +0 -67
  250. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  251. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baku.rb +0 -161
  252. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  253. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  254. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Colombo.rb +0 -30
  255. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  256. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  257. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  258. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  259. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  260. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kabul.rb +0 -20
  261. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  262. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Karachi.rb +0 -32
  263. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kathmandu.rb +0 -20
  264. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  265. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  266. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  267. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  268. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Magadan.rb +0 -163
  269. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Muscat.rb +0 -18
  270. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  271. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  272. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  273. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Seoul.rb +0 -34
  274. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  275. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Singapore.rb +0 -33
  276. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Taipei.rb +0 -59
  277. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  278. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  279. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tehran.rb +0 -121
  280. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  281. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  282. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  283. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  284. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  285. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  286. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  287. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  288. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  289. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  290. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  291. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  292. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Darwin.rb +0 -29
  293. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Hobart.rb +0 -193
  294. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  295. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Perth.rb +0 -37
  296. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Sydney.rb +0 -185
  297. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Etc/UTC.rb +0 -16
  298. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  299. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Athens.rb +0 -185
  300. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  301. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Berlin.rb +0 -188
  302. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  303. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Brussels.rb +0 -232
  304. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  305. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Budapest.rb +0 -197
  306. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  307. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Dublin.rb +0 -276
  308. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  309. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  310. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Kiev.rb +0 -168
  311. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  312. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  313. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/London.rb +0 -288
  314. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Madrid.rb +0 -211
  315. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Minsk.rb +0 -170
  316. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Moscow.rb +0 -181
  317. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Paris.rb +0 -232
  318. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Prague.rb +0 -187
  319. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Riga.rb +0 -176
  320. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Rome.rb +0 -215
  321. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  322. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Skopje.rb +0 -13
  323. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sofia.rb +0 -173
  324. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  325. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  326. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vienna.rb +0 -183
  327. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  328. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  329. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  330. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  331. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  332. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Guam.rb +0 -22
  333. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  334. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  335. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Midway.rb +0 -25
  336. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  337. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  338. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  339. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  340. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/info_timezone.rb +0 -52
  341. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone.rb +0 -51
  342. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone_info.rb +0 -44
  343. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/offset_rationals.rb +0 -98
  344. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/ruby_core_support.rb +0 -56
  345. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/time_or_datetime.rb +0 -292
  346. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone.rb +0 -508
  347. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_definition.rb +0 -56
  348. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_info.rb +0 -40
  349. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_offset_info.rb +0 -94
  350. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_period.rb +0 -198
  351. data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_transition_info.rb +0 -129
@@ -1,6 +1,8 @@
1
+ require 'active_support/descendants_tracker'
1
2
  require 'active_support/core_ext/array/wrap'
2
3
  require 'active_support/core_ext/class/inheritable_attributes'
3
4
  require 'active_support/core_ext/kernel/reporting'
5
+ require 'active_support/core_ext/kernel/singleton_class'
4
6
 
5
7
  module ActiveSupport
6
8
  # Callbacks are hooks into the lifecycle of an object that allow you to trigger logic
@@ -83,6 +85,10 @@ module ActiveSupport
83
85
  module Callbacks
84
86
  extend Concern
85
87
 
88
+ included do
89
+ extend ActiveSupport::DescendantsTracker
90
+ end
91
+
86
92
  def run_callbacks(kind, *args, &block)
87
93
  send("_run_#{kind}_callbacks", *args, &block)
88
94
  end
@@ -90,7 +96,7 @@ module ActiveSupport
90
96
  class Callback
91
97
  @@_callback_sequence = 0
92
98
 
93
- attr_accessor :chain, :filter, :kind, :options, :per_key, :klass
99
+ attr_accessor :chain, :filter, :kind, :options, :per_key, :klass, :raw_filter
94
100
 
95
101
  def initialize(chain, filter, kind, options, klass)
96
102
  @chain, @kind, @klass = chain, kind, klass
@@ -202,8 +208,8 @@ module ActiveSupport
202
208
  # end
203
209
  #
204
210
  name = "_conditional_callback_#{@kind}_#{next_id}"
205
- txt, line = <<-RUBY_EVAL, __LINE__ + 1
206
- def #{name}(halted)
211
+ @klass.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
212
+ def #{name}(halted)
207
213
  #{@compiled_options[0] || "if true"} && !halted
208
214
  #{@filter} do
209
215
  yield self
@@ -213,7 +219,6 @@ module ActiveSupport
213
219
  end
214
220
  end
215
221
  RUBY_EVAL
216
- @klass.class_eval(txt, __FILE__, line)
217
222
  "#{name}(halted) do"
218
223
  end
219
224
  end
@@ -311,9 +316,9 @@ module ActiveSupport
311
316
 
312
317
  def _normalize_legacy_filter(kind, filter)
313
318
  if !filter.respond_to?(kind) && filter.respond_to?(:filter)
314
- filter.metaclass.class_eval(
315
- "def #{kind}(context, &block) filter(context, &block) end",
316
- __FILE__, __LINE__ - 1)
319
+ filter.singleton_class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
320
+ def #{kind}(context, &block) filter(context, &block) end
321
+ RUBY_EVAL
317
322
  elsif filter.respond_to?(:before) && filter.respond_to?(:after) && kind == :around
318
323
  def filter.around(context)
319
324
  should_continue = before(context)
@@ -367,12 +372,6 @@ module ActiveSupport
367
372
  method << "halted ? false : (block_given? ? value : true)"
368
373
  method.compact.join("\n")
369
374
  end
370
-
371
- def clone(klass)
372
- chain = CallbackChain.new(@name, @config.dup)
373
- callbacks = map { |c| c.clone(chain, klass) }
374
- chain.push(*callbacks)
375
- end
376
375
  end
377
376
 
378
377
  module ClassMethods
@@ -391,26 +390,24 @@ module ActiveSupport
391
390
  def __define_runner(symbol) #:nodoc:
392
391
  body = send("_#{symbol}_callbacks").compile(nil)
393
392
 
394
- body, line = <<-RUBY_EVAL, __LINE__
395
- def _run_#{symbol}_callbacks(key = nil, &blk)
396
- if key
397
- name = "_run__\#{self.class.name.hash.abs}__#{symbol}__\#{key.hash.abs}__callbacks"
393
+ silence_warnings do
394
+ undef_method "_run_#{symbol}_callbacks" if method_defined?("_run_#{symbol}_callbacks")
395
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
396
+ def _run_#{symbol}_callbacks(key = nil, &blk)
397
+ if key
398
+ name = "_run__\#{self.class.name.hash.abs}__#{symbol}__\#{key.hash.abs}__callbacks"
398
399
 
399
- unless respond_to?(name)
400
- self.class.__create_keyed_callback(name, :#{symbol}, self, &blk)
401
- end
400
+ unless respond_to?(name)
401
+ self.class.__create_keyed_callback(name, :#{symbol}, self, &blk)
402
+ end
402
403
 
403
- send(name, &blk)
404
- else
405
- #{body}
404
+ send(name, &blk)
405
+ else
406
+ #{body}
407
+ end
406
408
  end
407
- end
408
- private :_run_#{symbol}_callbacks
409
- RUBY_EVAL
410
-
411
- silence_warnings do
412
- undef_method "_run_#{symbol}_callbacks" if method_defined?("_run_#{symbol}_callbacks")
413
- class_eval body, __FILE__, line
409
+ private :_run_#{symbol}_callbacks
410
+ RUBY_EVAL
414
411
  end
415
412
  end
416
413
 
@@ -435,10 +432,11 @@ module ActiveSupport
435
432
  options = filters.last.is_a?(Hash) ? filters.pop : {}
436
433
  filters.unshift(block) if block
437
434
 
438
- chain = send("_#{name}_callbacks")
439
- yield chain, type, filters, options if block_given?
440
-
441
- __define_runner(name)
435
+ ([self] + ActiveSupport::DescendantsTracker.descendants(self)).each do |target|
436
+ chain = target.send("_#{name}_callbacks")
437
+ yield chain, type, filters, options
438
+ target.__define_runner(name)
439
+ end
442
440
  end
443
441
 
444
442
  # Set callbacks for a previously defined callback.
@@ -451,11 +449,13 @@ module ActiveSupport
451
449
  # Use skip_callback to skip any defined one.
452
450
  #
453
451
  # When creating or skipping callbacks, you can specify conditions that
454
- # are always the same for a given key. For instance, in ActionPack,
452
+ # are always the same for a given key. For instance, in Action Pack,
455
453
  # we convert :only and :except conditions into per-key conditions.
456
454
  #
457
455
  # before_filter :authenticate, :except => "index"
456
+ #
458
457
  # becomes
458
+ #
459
459
  # dispatch_callback :before, :authenticate, :per_key => {:unless => proc {|c| c.action_name == "index"}}
460
460
  #
461
461
  # Per-Key conditions are evaluated only once per use of a given key.
@@ -467,31 +467,36 @@ module ActiveSupport
467
467
  # method that took into consideration the per_key conditions. This
468
468
  # is a speed improvement for ActionPack.
469
469
  #
470
- def set_callback(name, *filters, &block)
471
- __update_callbacks(name, filters, block) do |chain, type, filters, options|
472
- filters.map! do |filter|
473
- chain.delete_if {|c| c.matches?(type, filter) }
470
+ def set_callback(name, *filter_list, &block)
471
+ mapped = nil
472
+
473
+ __update_callbacks(name, filter_list, block) do |chain, type, filters, options|
474
+ mapped ||= filters.map do |filter|
474
475
  Callback.new(chain, filter, type, options.dup, self)
475
476
  end
476
477
 
477
- options[:prepend] ? chain.unshift(*filters) : chain.push(*filters)
478
+ filters.each do |filter|
479
+ chain.delete_if {|c| c.matches?(type, filter) }
480
+ end
481
+
482
+ options[:prepend] ? chain.unshift(*mapped) : chain.push(*mapped)
478
483
  end
479
484
  end
480
485
 
481
486
  # Skip a previously defined callback for a given type.
482
487
  #
483
- def skip_callback(name, *filters, &block)
484
- __update_callbacks(name, filters, block) do |chain, type, filters, options|
485
- chain = send("_#{name}_callbacks=", chain.clone(self))
486
-
488
+ def skip_callback(name, *filter_list, &block)
489
+ __update_callbacks(name, filter_list, block) do |chain, type, filters, options|
487
490
  filters.each do |filter|
488
491
  filter = chain.find {|c| c.matches?(type, filter) }
489
492
 
490
493
  if filter && options.any?
491
- filter.recompile!(options, options[:per_key] || {})
492
- else
493
- chain.delete(filter)
494
+ new_filter = filter.clone(chain, self)
495
+ chain.insert(chain.index(filter), new_filter)
496
+ new_filter.recompile!(options, options[:per_key] || {})
494
497
  end
498
+
499
+ chain.delete(filter)
495
500
  end
496
501
  end
497
502
  end
@@ -499,61 +504,85 @@ module ActiveSupport
499
504
  # Reset callbacks for a given type.
500
505
  #
501
506
  def reset_callbacks(symbol)
502
- send("_#{symbol}_callbacks").clear
507
+ callbacks = send("_#{symbol}_callbacks")
508
+
509
+ ActiveSupport::DescendantsTracker.descendants(self).each do |target|
510
+ chain = target.send("_#{symbol}_callbacks")
511
+ callbacks.each { |c| chain.delete(c) }
512
+ target.__define_runner(symbol)
513
+ end
514
+
515
+ callbacks.clear
503
516
  __define_runner(symbol)
504
517
  end
505
518
 
506
- # Define callbacks types.
507
- #
508
- # ==== Example
519
+ # Defines callbacks types:
509
520
  #
510
521
  # define_callbacks :validate
511
522
  #
512
- # ==== Options
523
+ # This macro accepts the following options:
513
524
  #
514
525
  # * <tt>:terminator</tt> - Indicates when a before filter is considered
515
526
  # to be halted.
516
527
  #
517
528
  # define_callbacks :validate, :terminator => "result == false"
518
529
  #
519
- # In the example above, if any before validate callbacks returns false,
520
- # other callbacks are not executed. Defaults to "false".
530
+ # In the example above, if any before validate callbacks returns +false+,
531
+ # other callbacks are not executed. Defaults to "false", meaning no value
532
+ # halts the chain.
521
533
  #
522
534
  # * <tt>:rescuable</tt> - By default, after filters are not executed if
523
- # the given block or an before_filter raises an error. Supply :rescuable => true
524
- # to change this behavior.
535
+ # the given block or a before filter raises an error. Set this option to
536
+ # true to change this behavior.
537
+ #
538
+ # * <tt>:scope</tt> - Indicates which methods should be executed when a class
539
+ # is given as callback. Defaults to <tt>[:kind]</tt>.
525
540
  #
526
- # * <tt>:scope</tt> - Show which methods should be executed when a class
527
- # is giben as callback:
541
+ # class Audit
542
+ # def before(caller)
543
+ # puts 'Audit: before is called'
544
+ # end
528
545
  #
529
- # define_callbacks :filters, :scope => [ :kind ]
546
+ # def before_save(caller)
547
+ # puts 'Audit: before_save is called'
548
+ # end
549
+ # end
530
550
  #
531
- # When a class is given:
551
+ # class Account
552
+ # include ActiveSupport::Callbacks
532
553
  #
533
- # before_filter MyFilter
554
+ # define_callbacks :save
555
+ # set_callback :save, :before, Audit.new
534
556
  #
535
- # It will call the type of the filter in the given class, which in this
536
- # case, is "before".
557
+ # def save
558
+ # run_callbacks :save do
559
+ # puts 'save in main'
560
+ # end
561
+ # end
562
+ # end
537
563
  #
538
- # If, for instance, you supply the given scope:
564
+ # In the above case whenever you save an account the method <tt>Audit#before</tt> will
565
+ # be called. On the other hand
539
566
  #
540
- # define_callbacks :validate, :scope => [ :kind, :name ]
567
+ # define_callbacks :save, :scope => [:kind, :name]
541
568
  #
542
- # It will call "#{kind}_#{name}" in the given class. So "before_validate"
543
- # will be called in the class below:
569
+ # would trigger <tt>Audit#before_save</tt> instead. That's constructed by calling
570
+ # <tt>"#{kind}_#{name}"</tt> on the given instance. In this case "kind" is "before" and
571
+ # "name" is "save".
544
572
  #
545
- # before_validate MyValidation
573
+ # A declaration like
546
574
  #
547
- # Defaults to :kind.
575
+ # define_callbacks :save, :scope => [:name]
548
576
  #
549
- def define_callbacks(*symbols)
550
- config = symbols.last.is_a?(Hash) ? symbols.pop : {}
551
- symbols.each do |symbol|
552
- extlib_inheritable_accessor("_#{symbol}_callbacks") do
553
- CallbackChain.new(symbol, config)
577
+ # would call <tt>Audit#save</tt>.
578
+ #
579
+ def define_callbacks(*callbacks)
580
+ config = callbacks.last.is_a?(Hash) ? callbacks.pop : {}
581
+ callbacks.each do |callback|
582
+ extlib_inheritable_reader("_#{callback}_callbacks") do
583
+ CallbackChain.new(callback, config)
554
584
  end
555
-
556
- __define_runner(symbol)
585
+ __define_runner(callback)
557
586
  end
558
587
  end
559
588
  end
@@ -1,35 +1,36 @@
1
- require "active_support/concern"
1
+ require 'active_support/concern'
2
+ require 'active_support/ordered_options'
3
+ require 'active_support/core_ext/kernel/singleton_class'
4
+ require 'active_support/core_ext/module/delegation'
2
5
 
3
6
  module ActiveSupport
4
7
  module Configurable
5
8
  extend ActiveSupport::Concern
6
9
 
7
10
  module ClassMethods
8
- def get_config
9
- module_parts = name.split("::")
10
- modules = [Object]
11
- module_parts.each {|name| modules.push modules.last.const_get(name) }
12
- modules.reverse_each do |mod|
13
- return mod.const_get(:DEFAULT_CONFIG) if const_defined?(:DEFAULT_CONFIG)
14
- end
15
- {}
16
- end
17
-
18
11
  def config
19
- self.config = get_config unless @config
20
- @config
12
+ @config ||= ActiveSupport::InheritableOptions.new(superclass.respond_to?(:config) ? superclass.config : {})
21
13
  end
22
14
 
23
- def config=(hash)
24
- @config = ActiveSupport::OrderedOptions.new
25
- hash.each do |key, value|
26
- @config[key] = value
15
+ def configure
16
+ yield config
17
+ end
18
+
19
+ def config_accessor(*names)
20
+ names.each do |name|
21
+ code, line = <<-RUBY, __LINE__ + 1
22
+ def #{name}; config.#{name}; end
23
+ def #{name}=(value); config.#{name} = value; end
24
+ RUBY
25
+
26
+ singleton_class.class_eval code, __FILE__, line
27
+ class_eval code, __FILE__, line
27
28
  end
28
29
  end
29
30
  end
30
31
 
31
32
  def config
32
- self.class.config
33
+ @config ||= ActiveSupport::InheritableOptions.new(self.class.config)
33
34
  end
34
35
  end
35
36
  end
@@ -1,5 +1,6 @@
1
1
  require 'active_support/core_ext/array/wrap'
2
2
  require 'active_support/core_ext/array/access'
3
+ require 'active_support/core_ext/array/uniq_by'
3
4
  require 'active_support/core_ext/array/conversions'
4
5
  require 'active_support/core_ext/array/extract_options'
5
6
  require 'active_support/core_ext/array/grouping'
@@ -4,7 +4,7 @@ class Array
4
4
  # %w( a b c d ).from(0) # => %w( a b c d )
5
5
  # %w( a b c d ).from(2) # => %w( c d )
6
6
  # %w( a b c d ).from(10) # => nil
7
- # %w().from(0) # => nil
7
+ # %w().from(0) # => %w()
8
8
  def from(position)
9
9
  self[position..-1]
10
10
  end
@@ -1,6 +1,7 @@
1
+ require 'active_support/xml_mini'
1
2
  require 'active_support/core_ext/hash/keys'
2
3
  require 'active_support/core_ext/hash/reverse_merge'
3
- require 'active_support/inflector'
4
+ require 'active_support/core_ext/string/inflections'
4
5
 
5
6
  class Array
6
7
  # Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:
@@ -8,21 +9,14 @@ class Array
8
9
  # * <tt>:two_words_connector</tt> - The sign or word used to join the elements in arrays with two elements (default: " and ")
9
10
  # * <tt>:last_word_connector</tt> - The sign or word used to join the last element in arrays with three or more elements (default: ", and ")
10
11
  def to_sentence(options = {})
11
- default_words_connector = I18n.translate(:'support.array.words_connector', :locale => options[:locale])
12
- default_two_words_connector = I18n.translate(:'support.array.two_words_connector', :locale => options[:locale])
13
- default_last_word_connector = I18n.translate(:'support.array.last_word_connector', :locale => options[:locale])
14
-
15
- # Try to emulate to_sentences previous to 2.3
16
- if options.has_key?(:connector) || options.has_key?(:skip_last_comma)
17
- ::ActiveSupport::Deprecation.warn(":connector has been deprecated. Use :words_connector instead", caller) if options.has_key? :connector
18
- ::ActiveSupport::Deprecation.warn(":skip_last_comma has been deprecated. Use :last_word_connector instead", caller) if options.has_key? :skip_last_comma
19
-
20
- skip_last_comma = options.delete :skip_last_comma
21
- if connector = options.delete(:connector)
22
- options[:last_word_connector] ||= skip_last_comma ? connector : ", #{connector}"
23
- else
24
- options[:last_word_connector] ||= skip_last_comma ? default_two_words_connector : default_last_word_connector
25
- end
12
+ if defined?(I18n)
13
+ default_words_connector = I18n.translate(:'support.array.words_connector', :locale => options[:locale])
14
+ default_two_words_connector = I18n.translate(:'support.array.two_words_connector', :locale => options[:locale])
15
+ default_last_word_connector = I18n.translate(:'support.array.last_word_connector', :locale => options[:locale])
16
+ else
17
+ default_words_connector = ", "
18
+ default_two_words_connector = " and "
19
+ default_last_word_connector = ", and "
26
20
  end
27
21
 
28
22
  options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
@@ -40,22 +34,6 @@ class Array
40
34
  end
41
35
  end
42
36
 
43
-
44
- # Calls <tt>to_param</tt> on all its elements and joins the result with
45
- # slashes. This is used by <tt>url_for</tt> in Action Pack.
46
- def to_param
47
- collect { |e| e.to_param }.join '/'
48
- end
49
-
50
- # Converts an array into a string suitable for use as a URL query string,
51
- # using the given +key+ as the param name.
52
- #
53
- # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
54
- def to_query(key)
55
- prefix = "#{key}[]"
56
- collect { |value| value.to_query(prefix) }.join '&'
57
- end
58
-
59
37
  # Converts a collection of elements into a formatted string by calling
60
38
  # <tt>to_s</tt> on all elements and joining them:
61
39
  #
@@ -156,34 +134,31 @@ class Array
156
134
  # </messages>
157
135
  #
158
136
  def to_xml(options = {})
159
- raise "Not all elements respond to to_xml" unless all? { |e| e.respond_to? :to_xml }
160
- require 'builder' unless defined?(Builder)
137
+ require 'active_support/builder' unless defined?(Builder)
161
138
 
162
139
  options = options.dup
163
- options[:root] ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(first.class.name)) : "records"
164
- options[:children] ||= options[:root].singularize
165
- options[:indent] ||= 2
166
- options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
167
-
168
- root = options.delete(:root).to_s
169
- children = options.delete(:children)
170
-
171
- if !options.has_key?(:dasherize) || options[:dasherize]
172
- root = root.dasherize
140
+ options[:indent] ||= 2
141
+ options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
142
+ options[:root] ||= if first.class.to_s != "Hash" && all? { |e| e.is_a?(first.class) }
143
+ underscored = ActiveSupport::Inflector.underscore(first.class.name)
144
+ ActiveSupport::Inflector.pluralize(underscored).tr('/', '_')
145
+ else
146
+ "objects"
173
147
  end
174
148
 
175
- options[:builder].instruct! unless options.delete(:skip_instruct)
149
+ builder = options[:builder]
150
+ builder.instruct! unless options.delete(:skip_instruct)
176
151
 
177
- opts = options.merge({ :root => children })
152
+ root = ActiveSupport::XmlMini.rename_key(options[:root].to_s, options)
153
+ children = options.delete(:children) || root.singularize
178
154
 
179
- xml = options[:builder]
180
- if empty?
181
- xml.tag!(root, options[:skip_types] ? {} : {:type => "array"})
182
- else
183
- xml.tag!(root, options[:skip_types] ? {} : {:type => "array"}) {
184
- yield xml if block_given?
185
- each { |e| e.to_xml(opts.merge({ :skip_instruct => true })) }
186
- }
155
+ attributes = options[:skip_types] ? {} : {:type => "array"}
156
+ return builder.tag!(root, attributes) if empty?
157
+
158
+ builder.__send__(:method_missing, root, attributes) do
159
+ each { |value| ActiveSupport::XmlMini.to_tag(children, value, options) }
160
+ yield builder if block_given?
187
161
  end
188
162
  end
163
+
189
164
  end