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,3 +1,14 @@
1
+ class Hash
2
+ # By default, only instances of Hash itself are extractable.
3
+ # Subclasses of Hash may implement this method and return
4
+ # true to declare themselves as extractable. If a Hash
5
+ # is extractable, Array#extract_options! pops it from
6
+ # the Array when it is the last element of the Array.
7
+ def extractable_options?
8
+ instance_of?(Hash)
9
+ end
10
+ end
11
+
1
12
  class Array
2
13
  # Extracts options from a set of arguments. Removes and returns the last
3
14
  # element in the array if it's a hash, otherwise returns a blank hash.
@@ -9,6 +20,10 @@ class Array
9
20
  # options(1, 2) # => {}
10
21
  # options(1, 2, :a => :b) # => {:a=>:b}
11
22
  def extract_options!
12
- last.is_a?(::Hash) ? pop : {}
23
+ if last.is_a?(Hash) && last.extractable_options?
24
+ pop
25
+ else
26
+ {}
27
+ end
13
28
  end
14
29
  end
@@ -55,7 +55,7 @@ class Array
55
55
  # ["6", "7"]
56
56
  def in_groups(number, fill_with = nil)
57
57
  # size / number gives minor group size;
58
- # size % number gives how many objects need extra accomodation;
58
+ # size % number gives how many objects need extra accommodation;
59
59
  # each group hold either division or division + 1 items.
60
60
  division = size / number
61
61
  modulo = size % number
@@ -1,6 +1,27 @@
1
1
  class Array
2
- # Returns a random element from the array.
3
- def rand
4
- self[Kernel.rand(length)]
5
- end
6
- end
2
+ # Backport of Array#sample based on Marc-Andre Lafortune's http://github.com/marcandre/backports/
3
+ # Returns a random element or +n+ random elements from the array.
4
+ # If the array is empty and +n+ is nil, returns <tt>nil</tt>. if +n+ is passed, returns <tt>[]</tt>.
5
+ #
6
+ # [1,2,3,4,5,6].sample # => 4
7
+ # [1,2,3,4,5,6].sample(3) # => [2, 4, 5]
8
+ # [].sample # => nil
9
+ # [].sample(3) # => []
10
+ def sample(n=nil)
11
+ return self[Kernel.rand(size)] if n.nil?
12
+ n = n.to_int
13
+ rescue Exception => e
14
+ raise TypeError, "Coercion error: #{n.inspect}.to_int => Integer failed:\n(#{e.message})"
15
+ else
16
+ raise TypeError, "Coercion error: obj.to_int did NOT return an Integer (was #{n.class})" unless n.kind_of? Integer
17
+ raise ArgumentError, "negative array size" if n < 0
18
+ n = size if n > size
19
+ result = Array.new(self)
20
+ n.times do |i|
21
+ r = i + Kernel.rand(size - i)
22
+ result[i], result[r] = result[r], result[i]
23
+ end
24
+ result[n..size] = []
25
+ result
26
+ end unless method_defined? :sample
27
+ end
@@ -0,0 +1,17 @@
1
+ class Array
2
+ # Return an unique array based on the criteria given as a proc.
3
+ #
4
+ # [1, 2, 3, 4].uniq_by { |i| i.odd? }
5
+ # #=> [1, 2]
6
+ #
7
+ def uniq_by
8
+ hash, array = {}, []
9
+ each { |i| hash[yield(i)] ||= (array << i) }
10
+ array
11
+ end
12
+
13
+ # Same as uniq_by, but modifies self.
14
+ def uniq_by!
15
+ replace(uniq_by{ |i| yield(i) })
16
+ end
17
+ end
@@ -1,18 +1,22 @@
1
1
  class Array
2
2
  # Wraps the object in an Array unless it's an Array. Converts the
3
3
  # object to an Array using #to_ary if it implements that.
4
+ #
5
+ # It differs with Array() in that it does not call +to_a+ on
6
+ # the argument:
7
+ #
8
+ # Array(:foo => :bar) # => [[:foo, :bar]]
9
+ # Array.wrap(:foo => :bar) # => [{:foo => :bar}]
10
+ #
11
+ # Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
12
+ # Array.wrap("foo\nbar") # => ["foo\nbar"]
4
13
  def self.wrap(object)
5
- case object
6
- when nil
14
+ if object.nil?
7
15
  []
8
- when self
9
- object
16
+ elsif object.respond_to?(:to_ary)
17
+ object.to_ary
10
18
  else
11
- if object.respond_to?(:to_ary)
12
- object.to_ary
13
- else
14
- [object]
15
- end
19
+ [object]
16
20
  end
17
21
  end
18
22
  end
@@ -1,18 +1,6 @@
1
1
  require 'benchmark'
2
2
 
3
3
  class << Benchmark
4
- # Earlier Ruby had a slower implementation.
5
- if RUBY_VERSION < '1.8.7'
6
- remove_method :realtime
7
-
8
- def realtime
9
- r0 = Time.now
10
- yield
11
- r1 = Time.now
12
- r1.to_f - r0.to_f
13
- end
14
- end
15
-
16
4
  def ms
17
5
  1000 * realtime { yield }
18
6
  end
@@ -1,3 +1,5 @@
1
+ require 'cgi'
2
+
1
3
  class CGI #:nodoc:
2
4
  if RUBY_VERSION >= '1.9'
3
5
  def self.escape_skipping_slashes(str)
@@ -1,4 +1,5 @@
1
+ require 'active_support/core_ext/class/attribute'
1
2
  require 'active_support/core_ext/class/attribute_accessors'
2
3
  require 'active_support/core_ext/class/inheritable_attributes'
3
- require 'active_support/core_ext/class/removal'
4
4
  require 'active_support/core_ext/class/delegating_attributes'
5
+ require 'active_support/core_ext/class/subclasses'
@@ -0,0 +1,67 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
2
+ require 'active_support/core_ext/module/remove_method'
3
+
4
+ class Class
5
+ # Declare a class-level attribute whose value is inheritable and
6
+ # overwritable by subclasses:
7
+ #
8
+ # class Base
9
+ # class_attribute :setting
10
+ # end
11
+ #
12
+ # class Subclass < Base
13
+ # end
14
+ #
15
+ # Base.setting = true
16
+ # Subclass.setting # => true
17
+ # Subclass.setting = false
18
+ # Subclass.setting # => false
19
+ # Base.setting # => true
20
+ #
21
+ # This matches normal Ruby method inheritance: think of writing an attribute
22
+ # on a subclass as overriding the reader method.
23
+ #
24
+ # For convenience, a query method is defined as well:
25
+ #
26
+ # Subclass.setting? # => false
27
+ #
28
+ # Instances may overwrite the class value in the same way:
29
+ #
30
+ # Base.setting = true
31
+ # object = Base.new
32
+ # object.setting # => true
33
+ # object.setting = false
34
+ # object.setting # => false
35
+ # Base.setting # => true
36
+ #
37
+ # To opt out of the instance writer method, pass :instance_writer => false.
38
+ #
39
+ # object.setting = false # => NoMethodError
40
+ def class_attribute(*attrs)
41
+ instance_writer = !attrs.last.is_a?(Hash) || attrs.pop[:instance_writer]
42
+
43
+ attrs.each do |name|
44
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
45
+ def self.#{name}() nil end
46
+ def self.#{name}?() !!#{name} end
47
+
48
+ def self.#{name}=(val)
49
+ singleton_class.class_eval do
50
+ remove_possible_method(:#{name})
51
+ define_method(:#{name}) { val }
52
+ end
53
+ end
54
+
55
+ def #{name}
56
+ defined?(@#{name}) ? @#{name} : singleton_class.#{name}
57
+ end
58
+
59
+ def #{name}?
60
+ !!#{name}
61
+ end
62
+ RUBY
63
+
64
+ attr_writer name if instance_writer
65
+ end
66
+ end
67
+ end
@@ -10,42 +10,48 @@ require 'active_support/core_ext/array/extract_options'
10
10
  # Person.hair_colors = [:brown, :black, :blonde, :red]
11
11
  class Class
12
12
  def cattr_reader(*syms)
13
- syms.flatten.each do |sym|
14
- next if sym.is_a?(Hash)
13
+ options = syms.extract_options!
14
+ syms.each do |sym|
15
15
  class_eval(<<-EOS, __FILE__, __LINE__ + 1)
16
- unless defined? @@#{sym} # unless defined? @@hair_colors
17
- @@#{sym} = nil # @@hair_colors = nil
18
- end # end
19
- #
20
- def self.#{sym} # def self.hair_colors
21
- @@#{sym} # @@hair_colors
22
- end # end
23
- #
24
- def #{sym} # def hair_colors
25
- @@#{sym} # @@hair_colors
26
- end # end
16
+ unless defined? @@#{sym}
17
+ @@#{sym} = nil
18
+ end
19
+
20
+ def self.#{sym}
21
+ @@#{sym}
22
+ end
27
23
  EOS
24
+
25
+ unless options[:instance_reader] == false
26
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
27
+ def #{sym}
28
+ @@#{sym}
29
+ end
30
+ EOS
31
+ end
28
32
  end
29
33
  end
30
34
 
31
35
  def cattr_writer(*syms)
32
36
  options = syms.extract_options!
33
- syms.flatten.each do |sym|
37
+ syms.each do |sym|
34
38
  class_eval(<<-EOS, __FILE__, __LINE__ + 1)
35
- unless defined? @@#{sym} # unless defined? @@hair_colors
36
- @@#{sym} = nil # @@hair_colors = nil
37
- end # end
38
- #
39
- def self.#{sym}=(obj) # def self.hair_colors=(obj)
40
- @@#{sym} = obj # @@hair_colors = obj
41
- end # end
42
- #
43
- #{" #
44
- def #{sym}=(obj) # def hair_colors=(obj)
45
- @@#{sym} = obj # @@hair_colors = obj
46
- end # end
47
- " unless options[:instance_writer] == false } # # instance writer above is generated unless options[:instance_writer] == false
39
+ unless defined? @@#{sym}
40
+ @@#{sym} = nil
41
+ end
42
+
43
+ def self.#{sym}=(obj)
44
+ @@#{sym} = obj
45
+ end
48
46
  EOS
47
+
48
+ unless options[:instance_writer] == false
49
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
50
+ def #{sym}=(obj)
51
+ @@#{sym} = obj
52
+ end
53
+ EOS
54
+ end
49
55
  self.send("#{sym}=", yield) if block_given?
50
56
  end
51
57
  end
@@ -1,50 +1,44 @@
1
1
  require 'active_support/core_ext/object/blank'
2
+ require 'active_support/core_ext/array/extract_options'
3
+ require 'active_support/core_ext/kernel/singleton_class'
4
+ require 'active_support/core_ext/module/remove_method'
2
5
 
3
6
  class Class
4
- def superclass_delegating_reader(*names)
5
- class_name_to_stop_searching_on = superclass.name.blank? ? "Object" : superclass.name
6
- names.each do |name|
7
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
8
- def self.#{name} # def self.only_reader
9
- if defined?(@#{name}) # if defined?(@only_reader)
10
- @#{name} # @only_reader
11
- elsif superclass < #{class_name_to_stop_searching_on} && # elsif superclass < Object &&
12
- superclass.respond_to?(:#{name}) # superclass.respond_to?(:only_reader)
13
- superclass.#{name} # superclass.only_reader
14
- end # end
15
- end # end
16
- def #{name} # def only_reader
17
- self.class.#{name} # self.class.only_reader
18
- end # end
19
- def self.#{name}? # def self.only_reader?
20
- !!#{name} # !!only_reader
21
- end # end
22
- def #{name}? # def only_reader?
23
- !!#{name} # !!only_reader
24
- end # end
25
- EOS
26
- end
7
+ def superclass_delegating_accessor(name, options = {})
8
+ # Create private _name and _name= methods that can still be used if the public
9
+ # methods are overridden. This allows
10
+ _superclass_delegating_accessor("_#{name}")
11
+
12
+ # Generate the public methods name, name=, and name?
13
+ # These methods dispatch to the private _name, and _name= methods, making them
14
+ # overridable
15
+ singleton_class.send(:define_method, name) { send("_#{name}") }
16
+ singleton_class.send(:define_method, "#{name}?") { !!send("_#{name}") }
17
+ singleton_class.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
18
+
19
+ # If an instance_reader is needed, generate methods for name and name= on the
20
+ # class itself, so instances will be able to see them
21
+ define_method(name) { send("_#{name}") } if options[:instance_reader] != false
22
+ define_method("#{name}?") { !!send("#{name}") } if options[:instance_reader] != false
27
23
  end
28
24
 
29
- def superclass_delegating_writer(*names, &block)
30
- names.each do |name|
31
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
32
- def self.#{name}=(value) # def self.property=(value)
33
- @#{name} = value # @property = value
34
- end # end
35
- EOS
36
- self.send("#{name}=", yield) if block_given?
37
- end
25
+ private
26
+
27
+ # Take the object being set and store it in a method. This gives us automatic
28
+ # inheritance behavior, without having to store the object in an instance
29
+ # variable and look up the superclass chain manually.
30
+ def _stash_object_in_method(object, method, instance_reader = true)
31
+ singleton_class.remove_possible_method(method)
32
+ singleton_class.send(:define_method, method) { object }
33
+ remove_possible_method(method)
34
+ define_method(method) { object } if instance_reader
38
35
  end
39
36
 
40
- # These class attributes behave something like the class
41
- # inheritable accessors. But instead of copying the hash over at
42
- # the time the subclass is first defined, the accessors simply
43
- # delegate to their superclass unless they have been given a
44
- # specific value. This stops the strange situation where values
45
- # set after class definition don't get applied to subclasses.
46
- def superclass_delegating_accessor(*names, &block)
47
- superclass_delegating_reader(*names)
48
- superclass_delegating_writer(*names, &block)
37
+ def _superclass_delegating_accessor(name, options = {})
38
+ singleton_class.send(:define_method, "#{name}=") do |value|
39
+ _stash_object_in_method(value, name, options[:instance_reader] != false)
40
+ end
41
+ send("#{name}=", nil)
49
42
  end
43
+
50
44
  end
@@ -1,4 +1,5 @@
1
1
  require 'active_support/core_ext/object/duplicable'
2
+ require 'active_support/core_ext/array/extract_options'
2
3
 
3
4
  # Retain for backward compatibility. Methods are now included in Class.
4
5
  module ClassInheritableAttributes # :nodoc:
@@ -8,18 +9,24 @@ end
8
9
  # their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
9
10
  # to, for example, an array without those additions being shared with either their parent, siblings, or
10
11
  # children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
12
+ #
13
+ # The copies of inheritable parent attributes are added to subclasses when they are created, via the
14
+ # +inherited+ hook.
11
15
  class Class # :nodoc:
12
16
  def class_inheritable_reader(*syms)
17
+ options = syms.extract_options!
13
18
  syms.each do |sym|
14
19
  next if sym.is_a?(Hash)
15
20
  class_eval(<<-EOS, __FILE__, __LINE__ + 1)
16
- def self.#{sym} # def self.after_add
17
- read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:after_add)
18
- end # end
19
-
20
- def #{sym} # def after_add
21
- self.class.#{sym} # self.class.after_add
22
- end # end
21
+ def self.#{sym} # def self.after_add
22
+ read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:after_add)
23
+ end # end
24
+ #
25
+ #{" #
26
+ def #{sym} # def after_add
27
+ self.class.#{sym} # self.class.after_add
28
+ end # end
29
+ " unless options[:instance_reader] == false } # # the reader above is generated unless options[:instance_reader] == false
23
30
  EOS
24
31
  end
25
32
  end
@@ -121,7 +128,7 @@ class Class # :nodoc:
121
128
 
122
129
  private
123
130
  # Prevent this constant from being created multiple times
124
- EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze unless const_defined?(:EMPTY_INHERITABLE_ATTRIBUTES)
131
+ EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze
125
132
 
126
133
  def inherited_with_inheritable_attributes(child)
127
134
  inherited_without_inheritable_attributes(child) if respond_to?(:inherited_without_inheritable_attributes)
@@ -155,8 +162,8 @@ class Class
155
162
  # (error out or do the same as other methods above) instead of silently
156
163
  # moving on). In particular, this makes the return value of this function
157
164
  # less useful.
158
- def extlib_inheritable_reader(*ivars)
159
- instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
165
+ def extlib_inheritable_reader(*ivars, &block)
166
+ options = ivars.extract_options!
160
167
 
161
168
  ivars.each do |ivar|
162
169
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
@@ -164,16 +171,17 @@ class Class
164
171
  return @#{ivar} if self.object_id == #{self.object_id} || defined?(@#{ivar})
165
172
  ivar = superclass.#{ivar}
166
173
  return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}")
167
- @#{ivar} = ivar && !ivar.is_a?(Module) && !ivar.is_a?(Numeric) && !ivar.is_a?(TrueClass) && !ivar.is_a?(FalseClass) ? ivar.dup : ivar
174
+ @#{ivar} = ivar.duplicable? ? ivar.dup : ivar
168
175
  end
169
176
  RUBY
170
- unless instance_reader == false
177
+ unless options[:instance_reader] == false
171
178
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
172
179
  def #{ivar}
173
180
  self.class.#{ivar}
174
181
  end
175
182
  RUBY
176
183
  end
184
+ instance_variable_set(:"@#{ivar}", yield) if block_given?
177
185
  end
178
186
  end
179
187
 
@@ -190,14 +198,15 @@ class Class
190
198
  # @todo We need a style for class_eval <<-HEREDOC. I'd like to make it
191
199
  # class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.
192
200
  def extlib_inheritable_writer(*ivars)
193
- instance_writer = ivars.pop[:writer] if ivars.last.is_a?(Hash)
201
+ options = ivars.extract_options!
202
+
194
203
  ivars.each do |ivar|
195
204
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
196
205
  def self.#{ivar}=(obj)
197
206
  @#{ivar} = obj
198
207
  end
199
208
  RUBY
200
- unless instance_writer == false
209
+ unless options[:instance_writer] == false
201
210
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
202
211
  def #{ivar}=(obj) self.class.#{ivar} = obj end
203
212
  RUBY