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
@@ -2,7 +2,10 @@ require 'active_support/core_ext/kernel/reporting'
2
2
 
3
3
  # Fixes the rexml vulnerability disclosed at:
4
4
  # http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/
5
- # This fix is identical to rexml-expansion-fix version 1.0.1
5
+ # This fix is identical to rexml-expansion-fix version 1.0.1.
6
+ #
7
+ # We still need to distribute this fix because albeit the REXML
8
+ # in recent 1.8.7s is patched, it wasn't in early patchlevels.
6
9
  require 'rexml/rexml'
7
10
 
8
11
  # Earlier versions of rexml defined REXML::Version, newer ones REXML::VERSION
@@ -4,8 +4,9 @@ require 'active_support/core_ext/string/multibyte'
4
4
  require 'active_support/core_ext/string/starts_ends_with'
5
5
  require 'active_support/core_ext/string/inflections'
6
6
  require 'active_support/core_ext/string/access'
7
- require 'active_support/core_ext/string/iterators'
8
7
  require 'active_support/core_ext/string/xchar'
9
8
  require 'active_support/core_ext/string/behavior'
10
9
  require 'active_support/core_ext/string/interpolation'
11
- require 'active_support/core_ext/string/output_safety'
10
+ require 'active_support/core_ext/string/output_safety'
11
+ require 'active_support/core_ext/string/exclude'
12
+ require 'active_support/core_ext/string/encoding'
@@ -1,3 +1,5 @@
1
+ require "active_support/multibyte"
2
+
1
3
  class String
2
4
  unless '1.9'.respond_to?(:force_encoding)
3
5
  # Returns the character at the +position+ treating the string as an array (where 0 is the first character).
@@ -5,7 +7,7 @@ class String
5
7
  # Examples:
6
8
  # "hello".at(0) # => "h"
7
9
  # "hello".at(4) # => "o"
8
- # "hello".at(10) # => nil
10
+ # "hello".at(10) # => ERROR if < 1.9, nil in 1.9
9
11
  def at(position)
10
12
  mb_chars[position, 1].to_s
11
13
  end
@@ -15,7 +17,7 @@ class String
15
17
  # Examples:
16
18
  # "hello".from(0) # => "hello"
17
19
  # "hello".from(2) # => "llo"
18
- # "hello".from(10) # => nil
20
+ # "hello".from(10) # => "" if < 1.9, nil in 1.9
19
21
  def from(position)
20
22
  mb_chars[position..-1].to_s
21
23
  end
@@ -1,24 +1,51 @@
1
1
  require 'date'
2
+ require 'active_support/core_ext/time/publicize_conversion_methods'
2
3
  require 'active_support/core_ext/time/calculations'
3
4
 
4
5
  class String
5
- # 'a'.ord == 'a'[0] for Ruby 1.9 forward compatibility.
6
+ # Returns the codepoint of the first character of the string, assuming a
7
+ # single-byte character encoding:
8
+ #
9
+ # "a".ord # => 97
10
+ # "à".ord # => 224, in ISO-8859-1
11
+ #
12
+ # This method is defined in Ruby 1.8 for Ruby 1.9 forward compatibility on
13
+ # these character encodings.
14
+ #
15
+ # <tt>ActiveSupport::Multibyte::Chars#ord</tt> is forward compatible with
16
+ # Ruby 1.9 on UTF8 strings:
17
+ #
18
+ # "a".mb_chars.ord # => 97
19
+ # "à".mb_chars.ord # => 224, in UTF8
20
+ #
21
+ # Note that the 224 is different in both examples. In ISO-8859-1 "à" is
22
+ # represented as a single byte, 224. In UTF8 it is represented with two
23
+ # bytes, namely 195 and 160, but its Unicode codepoint is 224. If we
24
+ # call +ord+ on the UTF8 string "à" the return value will be 195. That is
25
+ # not an error, because UTF8 is unsupported, the call itself would be
26
+ # bogus.
6
27
  def ord
7
28
  self[0]
8
29
  end unless method_defined?(:ord)
9
30
 
31
+ # +getbyte+ backport from Ruby 1.9
32
+ alias_method :getbyte, :[] unless method_defined?(:getbyte)
33
+
10
34
  # Form can be either :utc (default) or :local.
11
35
  def to_time(form = :utc)
36
+ return nil if self.blank?
12
37
  d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction).map { |arg| arg || 0 }
13
38
  d[6] *= 1000000
14
39
  ::Time.send("#{form}_time", *d)
15
40
  end
16
41
 
17
42
  def to_date
43
+ return nil if self.blank?
18
44
  ::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
19
45
  end
20
46
 
21
47
  def to_datetime
48
+ return nil if self.blank?
22
49
  d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :sec_fraction).map { |arg| arg || 0 }
23
50
  d[5] += d.pop
24
51
  ::DateTime.civil(*d)
@@ -0,0 +1,11 @@
1
+ class String
2
+ if defined?(Encoding) && "".respond_to?(:encode)
3
+ def encoding_aware?
4
+ true
5
+ end
6
+ else
7
+ def encoding_aware?
8
+ false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class String
2
+ # The inverse of String#include?. Returns true if the string does not include the other string.
3
+ def exclude?(string)
4
+ !include?(string)
5
+ end
6
+ end
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/string/multibyte'
2
+
1
3
  class String
2
4
  # Returns the string, first removing all whitespace on both ends of
3
5
  # the string, and then changing remaining consecutive whitespace
@@ -17,4 +19,31 @@ class String
17
19
  gsub!(/\s+/, ' ')
18
20
  self
19
21
  end
22
+
23
+ # Truncates a given +text+ after a given <tt>length</tt> if +text+ is longer than <tt>length</tt>:
24
+ #
25
+ # "Once upon a time in a world far far away".truncate(27)
26
+ # # => "Once upon a time in a wo..."
27
+ #
28
+ # The last characters will be replaced with the <tt>:omission</tt> string (defaults to "...")
29
+ # for a total length not exceeding <tt>:length</tt>:
30
+ #
31
+ # "Once upon a time in a world far far away".truncate(27, :separator => ' ')
32
+ # # => "Once upon a time in a..."
33
+ #
34
+ # Pass a <tt>:separator</tt> to truncate +text+ at a natural break:
35
+ #
36
+ # "And they found that many people were sleeping better.".truncate(25, :omission => "... (continued)")
37
+ # # => "And they f... (continued)"
38
+ def truncate(length, options = {})
39
+ text = self.dup
40
+ options[:omission] ||= "..."
41
+
42
+ length_with_room_for_omission = length - options[:omission].mb_chars.length
43
+ chars = text.mb_chars
44
+ stop = options[:separator] ?
45
+ (chars.rindex(options[:separator].mb_chars, length_with_room_for_omission) || length_with_room_for_omission) : length_with_room_for_omission
46
+
47
+ (chars.length > length ? chars[0...stop] + options[:omission] : text).to_s
48
+ end
20
49
  end
@@ -2,7 +2,7 @@
2
2
  # For instance, you can figure out the name of a database from the name of a class.
3
3
  #
4
4
  # "ScaleScore".tableize # => "scale_scores"
5
-
5
+ #
6
6
  class String
7
7
  # Returns the plural form of the word in the string.
8
8
  #
@@ -28,6 +28,17 @@ class String
28
28
  ActiveSupport::Inflector.singularize(self)
29
29
  end
30
30
 
31
+ # +constantize+ tries to find a declared constant with the name specified
32
+ # in the string. It raises a NameError when the name is not in CamelCase
33
+ # or is not initialized.
34
+ #
35
+ # Examples
36
+ # "Module".constantize # => Module
37
+ # "Class".constantize # => Class
38
+ def constantize
39
+ ActiveSupport::Inflector.constantize(self)
40
+ end
41
+
31
42
  # By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
32
43
  # is set to <tt>:lower</tt> then camelize produces lowerCamelCase.
33
44
  #
@@ -146,15 +157,4 @@ class String
146
157
  def foreign_key(separate_class_name_and_id_with_underscore = true)
147
158
  ActiveSupport::Inflector.foreign_key(self, separate_class_name_and_id_with_underscore)
148
159
  end
149
-
150
- # +constantize+ tries to find a declared constant with the name specified
151
- # in the string. It raises a NameError when the name is not in CamelCase
152
- # or is not initialized.
153
- #
154
- # Examples
155
- # "Module".constantize # => Module
156
- # "Class".constantize # => Class
157
- def constantize
158
- ActiveSupport::Inflector.constantize(self)
159
- end
160
160
  end
@@ -1,92 +1,2 @@
1
- =begin
2
- heavily based on Masao Mutoh's gettext String interpolation extension
3
- http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb
4
- Copyright (C) 2005-2009 Masao Mutoh
5
- You may redistribute it and/or modify it under the same license terms as Ruby.
6
- =end
7
-
8
- if RUBY_VERSION < '1.9'
9
- require 'active_support/core_ext/string/bytesize'
10
-
11
- # KeyError is raised by String#% when the string contains a named placeholder
12
- # that is not contained in the given arguments hash. Ruby 1.9 includes and
13
- # raises this exception natively. We define it to mimic Ruby 1.9's behaviour
14
- # in Ruby 1.8.x
15
-
16
- class KeyError < IndexError
17
- def initialize(message = nil)
18
- super(message || "key not found")
19
- end
20
- end unless defined?(KeyError)
21
-
22
- # Extension for String class. This feature is included in Ruby 1.9 or later but not occur TypeError.
23
- #
24
- # String#% method which accept "named argument". The translator can know
25
- # the meaning of the msgids using "named argument" instead of %s/%d style.
26
-
27
- class String
28
- alias :interpolate_without_ruby_19_syntax :% # :nodoc:
29
-
30
- INTERPOLATION_PATTERN = Regexp.union(
31
- /%%/,
32
- /%\{(\w+)\}/, # matches placeholders like "%{foo}"
33
- /%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/ # matches placeholders like "%<foo>.d"
34
- )
35
-
36
- # % uses self (i.e. the String) as a format specification and returns the
37
- # result of applying it to the given arguments. In other words it interpolates
38
- # the given arguments to the string according to the formats the string
39
- # defines.
40
- #
41
- # There are three ways to use it:
42
- #
43
- # * Using a single argument or Array of arguments.
44
- #
45
- # This is the default behaviour of the String class. See Kernel#sprintf for
46
- # more details about the format string.
47
- #
48
- # Example:
49
- #
50
- # "%d %s" % [1, "message"]
51
- # # => "1 message"
52
- #
53
- # * Using a Hash as an argument and unformatted, named placeholders.
54
- #
55
- # When you pass a Hash as an argument and specify placeholders with %{foo}
56
- # it will interpret the hash values as named arguments.
57
- #
58
- # Example:
59
- #
60
- # "%{firstname}, %{lastname}" % {:firstname => "Masao", :lastname => "Mutoh"}
61
- # # => "Masao Mutoh"
62
- #
63
- # * Using a Hash as an argument and formatted, named placeholders.
64
- #
65
- # When you pass a Hash as an argument and specify placeholders with %<foo>d
66
- # it will interpret the hash values as named arguments and format the value
67
- # according to the formatting instruction appended to the closing >.
68
- #
69
- # Example:
70
- #
71
- # "%<integer>d, %<float>.1f" % { :integer => 10, :float => 43.4 }
72
- # # => "10, 43.3"
73
- def %(args)
74
- if args.kind_of?(Hash)
75
- dup.gsub(INTERPOLATION_PATTERN) do |match|
76
- if match == '%%'
77
- '%'
78
- else
79
- key = ($1 || $2).to_sym
80
- raise KeyError unless args.has_key?(key)
81
- $3 ? sprintf("%#{$3}", args[key]) : args[key]
82
- end
83
- end
84
- elsif self =~ INTERPOLATION_PATTERN
85
- raise ArgumentError.new('one hash required')
86
- else
87
- result = gsub(/%([{<])/, '%%\1')
88
- result.send :'interpolate_without_ruby_19_syntax', args
89
- end
90
- end
91
- end
92
- end
1
+ require 'active_support/i18n'
2
+ require 'i18n/core_ext/string/interpolate'
@@ -2,7 +2,7 @@
2
2
  require 'active_support/multibyte'
3
3
 
4
4
  class String
5
- unless '1.9'.respond_to?(:force_encoding)
5
+ if RUBY_VERSION >= "1.9"
6
6
  # == Multibyte proxy
7
7
  #
8
8
  # +mb_chars+ is a multibyte safe proxy for string methods.
@@ -37,30 +37,13 @@ class String
37
37
  # For more information about the methods defined on the Chars proxy see ActiveSupport::Multibyte::Chars. For
38
38
  # information about how to change the default Multibyte behaviour see ActiveSupport::Multibyte.
39
39
  def mb_chars
40
- if ActiveSupport::Multibyte.proxy_class.wants?(self)
40
+ if ActiveSupport::Multibyte.proxy_class.consumes?(self)
41
41
  ActiveSupport::Multibyte.proxy_class.new(self)
42
42
  else
43
43
  self
44
44
  end
45
45
  end
46
-
47
- # Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
48
- # them), returns false otherwise.
49
- def is_utf8?
50
- ActiveSupport::Multibyte::Chars.consumes?(self)
51
- end
52
46
 
53
- unless '1.8.7 and later'.respond_to?(:chars)
54
- def chars
55
- ActiveSupport::Deprecation.warn('String#chars has been deprecated in favor of String#mb_chars.', caller)
56
- mb_chars
57
- end
58
- end
59
- else
60
- def mb_chars #:nodoc
61
- self
62
- end
63
-
64
47
  def is_utf8? #:nodoc
65
48
  case encoding
66
49
  when Encoding::UTF_8
@@ -71,5 +54,19 @@ class String
71
54
  false
72
55
  end
73
56
  end
57
+ else
58
+ def mb_chars
59
+ if ActiveSupport::Multibyte.proxy_class.wants?(self)
60
+ ActiveSupport::Multibyte.proxy_class.new(self)
61
+ else
62
+ self
63
+ end
64
+ end
65
+
66
+ # Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
67
+ # them), returns false otherwise.
68
+ def is_utf8?
69
+ ActiveSupport::Multibyte::Chars.consumes?(self)
70
+ end
74
71
  end
75
72
  end
@@ -1,43 +1,109 @@
1
- class String
2
- def html_safe?
3
- defined?(@_rails_html_safe) && @_rails_html_safe
1
+ require 'erb'
2
+ require 'active_support/core_ext/kernel/singleton_class'
3
+
4
+ class ERB
5
+ module Util
6
+ HTML_ESCAPE = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;' }
7
+ JSON_ESCAPE = { '&' => '\u0026', '>' => '\u003E', '<' => '\u003C' }
8
+
9
+ # A utility method for escaping HTML tag characters.
10
+ # This method is also aliased as <tt>h</tt>.
11
+ #
12
+ # In your ERb templates, use this method to escape any unsafe content. For example:
13
+ # <%=h @person.name %>
14
+ #
15
+ # ==== Example:
16
+ # puts html_escape("is a > 0 & a < 10?")
17
+ # # => is a &gt; 0 &amp; a &lt; 10?
18
+ def html_escape(s)
19
+ s = s.to_s
20
+ if s.html_safe?
21
+ s
22
+ else
23
+ s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }.html_safe
24
+ end
25
+ end
26
+
27
+ remove_method(:h)
28
+ alias h html_escape
29
+
30
+ module_function :h
31
+
32
+ singleton_class.send(:remove_method, :html_escape)
33
+ module_function :html_escape
34
+
35
+ # A utility method for escaping HTML entities in JSON strings.
36
+ # This method is also aliased as <tt>j</tt>.
37
+ #
38
+ # In your ERb templates, use this method to escape any HTML entities:
39
+ # <%=j @person.to_json %>
40
+ #
41
+ # ==== Example:
42
+ # puts json_escape("is a > 0 & a < 10?")
43
+ # # => is a \u003E 0 \u0026 a \u003C 10?
44
+ def json_escape(s)
45
+ s.to_s.gsub(/[&"><]/) { |special| JSON_ESCAPE[special] }
46
+ end
47
+
48
+ alias j json_escape
49
+ module_function :j
50
+ module_function :json_escape
4
51
  end
52
+ end
5
53
 
6
- def html_safe!
7
- @_rails_html_safe = true
8
- self
54
+ class Object
55
+ def html_safe?
56
+ false
9
57
  end
10
-
11
- def html_safe
12
- dup.html_safe!
58
+ end
59
+
60
+ class Fixnum
61
+ def html_safe?
62
+ true
13
63
  end
14
-
15
- alias original_plus +
16
- def +(other)
17
- result = original_plus(other)
18
- if html_safe? && also_html_safe?(other)
19
- result.html_safe!
20
- else
21
- result
64
+ end
65
+
66
+ module ActiveSupport #:nodoc:
67
+ class SafeBuffer < String
68
+ alias safe_concat concat
69
+
70
+ def concat(value)
71
+ if value.html_safe?
72
+ super(value)
73
+ else
74
+ super(ERB::Util.h(value))
75
+ end
76
+ end
77
+ alias << concat
78
+
79
+ def +(other)
80
+ dup.concat(other)
81
+ end
82
+
83
+ def html_safe?
84
+ true
85
+ end
86
+
87
+ def html_safe
88
+ self
89
+ end
90
+
91
+ def to_s
92
+ self
93
+ end
94
+
95
+ def to_yaml(*args)
96
+ to_str.to_yaml(*args)
22
97
  end
23
98
  end
24
-
25
- alias original_concat <<
26
- def <<(other)
27
- result = original_concat(other)
28
- unless html_safe? && also_html_safe?(other)
29
- @_rails_html_safe = false
30
- end
31
- result
99
+ end
100
+
101
+ class String
102
+ def html_safe!
103
+ raise "You can't call html_safe! on a String"
32
104
  end
33
-
34
- def concat(other)
35
- self << other
105
+
106
+ def html_safe
107
+ ActiveSupport::SafeBuffer.new(self)
36
108
  end
37
-
38
- private
39
- def also_html_safe?(other)
40
- other.respond_to?(:html_safe?) && other.html_safe?
41
- end
42
-
43
- end
109
+ end