activesupport 2.3.5 → 3.0.0.beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. data/CHANGELOG +66 -9
  2. data/lib/active_support/all.rb +2 -7
  3. data/lib/active_support/backtrace_cleaner.rb +31 -9
  4. data/lib/active_support/base64.rb +9 -0
  5. data/lib/active_support/basic_object.rb +7 -10
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +14 -9
  8. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  9. data/lib/active_support/cache/file_store.rb +35 -17
  10. data/lib/active_support/cache/mem_cache_store.rb +32 -23
  11. data/lib/active_support/cache/memory_store.rb +17 -10
  12. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  13. data/lib/active_support/cache.rb +75 -55
  14. data/lib/active_support/callbacks.rb +490 -169
  15. data/lib/active_support/concern.rb +29 -0
  16. data/lib/active_support/configurable.rb +35 -0
  17. data/lib/active_support/core_ext/array/access.rb +39 -46
  18. data/lib/active_support/core_ext/array/conversions.rb +145 -182
  19. data/lib/active_support/core_ext/array/extract_options.rb +26 -17
  20. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  21. data/lib/active_support/core_ext/array/random_access.rb +4 -10
  22. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  23. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  24. data/lib/active_support/core_ext/array.rb +2 -10
  25. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/class/attribute.rb +70 -0
  30. data/lib/active_support/core_ext/class/attribute_accessors.rb +40 -31
  31. data/lib/active_support/core_ext/class/delegating_attributes.rb +37 -40
  32. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -11
  33. data/lib/active_support/core_ext/class/subclasses.rb +55 -0
  34. data/lib/active_support/core_ext/class.rb +1 -1
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -228
  37. data/lib/active_support/core_ext/date/conversions.rb +87 -96
  38. data/lib/active_support/core_ext/date/freeze.rb +31 -0
  39. data/lib/active_support/core_ext/date_time/acts_like.rb +13 -0
  40. data/lib/active_support/core_ext/date_time/calculations.rb +97 -110
  41. data/lib/active_support/core_ext/date_time/conversions.rb +85 -85
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +18 -13
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file/atomic.rb +35 -40
  46. data/lib/active_support/core_ext/file/path.rb +5 -0
  47. data/lib/active_support/core_ext/file.rb +0 -4
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/float.rb +0 -6
  50. data/lib/active_support/core_ext/hash/conversions.rb +255 -229
  51. data/lib/active_support/core_ext/hash/deep_merge.rb +12 -19
  52. data/lib/active_support/core_ext/hash/diff.rb +11 -17
  53. data/lib/active_support/core_ext/hash/except.rb +21 -22
  54. data/lib/active_support/core_ext/hash/indifferent_access.rb +8 -137
  55. data/lib/active_support/core_ext/hash/keys.rb +38 -45
  56. data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -32
  57. data/lib/active_support/core_ext/hash/slice.rb +35 -37
  58. data/lib/active_support/core_ext/hash.rb +8 -14
  59. data/lib/active_support/core_ext/integer/inflections.rb +10 -16
  60. data/lib/active_support/core_ext/integer/multiple.rb +6 -0
  61. data/lib/active_support/core_ext/integer/time.rb +36 -42
  62. data/lib/active_support/core_ext/integer.rb +1 -7
  63. data/lib/active_support/core_ext/kernel/debugger.rb +1 -1
  64. data/lib/active_support/core_ext/kernel/reporting.rb +9 -7
  65. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  66. data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
  67. data/lib/active_support/core_ext/kernel.rb +1 -1
  68. data/lib/active_support/core_ext/load_error.rb +16 -32
  69. data/lib/active_support/core_ext/logger.rb +3 -2
  70. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  71. data/lib/active_support/core_ext/module/anonymous.rb +24 -0
  72. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  73. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  74. data/lib/active_support/core_ext/module/attribute_accessors.rb +48 -42
  75. data/lib/active_support/core_ext/module/delegation.rb +22 -11
  76. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  77. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  78. data/lib/active_support/core_ext/module/method_names.rb +14 -0
  79. data/lib/active_support/core_ext/module/reachable.rb +10 -0
  80. data/lib/active_support/core_ext/module/remove_method.rb +6 -0
  81. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  82. data/lib/active_support/core_ext/module.rb +7 -18
  83. data/lib/active_support/core_ext/name_error.rb +3 -4
  84. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  85. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  86. data/lib/active_support/core_ext/numeric.rb +1 -8
  87. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  88. data/lib/active_support/core_ext/object/blank.rb +20 -2
  89. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  90. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  91. data/lib/active_support/core_ext/object/extending.rb +8 -77
  92. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  93. data/lib/active_support/core_ext/object/misc.rb +2 -90
  94. data/lib/active_support/core_ext/object/returning.rb +42 -0
  95. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  96. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  97. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  98. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  99. data/lib/active_support/core_ext/object.rb +10 -2
  100. data/lib/active_support/core_ext/proc.rb +3 -1
  101. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  102. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  103. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  104. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  105. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  106. data/lib/active_support/core_ext/range.rb +2 -9
  107. data/lib/active_support/core_ext/regexp.rb +5 -0
  108. data/lib/active_support/core_ext/rexml.rb +12 -7
  109. data/lib/active_support/core_ext/string/access.rb +88 -95
  110. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  111. data/lib/active_support/core_ext/string/conversions.rb +20 -21
  112. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  113. data/lib/active_support/core_ext/string/filters.rb +17 -23
  114. data/lib/active_support/core_ext/string/inflections.rb +147 -154
  115. data/lib/active_support/core_ext/string/interpolation.rb +1 -0
  116. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  117. data/lib/active_support/core_ext/string/output_safety.rb +105 -44
  118. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -34
  119. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  120. data/lib/active_support/core_ext/string.rb +6 -20
  121. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  122. data/lib/active_support/core_ext/time/calculations.rb +276 -299
  123. data/lib/active_support/core_ext/time/conversions.rb +79 -84
  124. data/lib/active_support/core_ext/time/marshal.rb +56 -0
  125. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  126. data/lib/active_support/core_ext/time/zones.rb +73 -81
  127. data/lib/active_support/core_ext/uri.rb +2 -1
  128. data/lib/active_support/core_ext.rb +2 -7
  129. data/lib/active_support/dependencies/autoload.rb +50 -0
  130. data/lib/active_support/dependencies.rb +168 -197
  131. data/lib/active_support/deprecation/behaviors.rb +38 -0
  132. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  133. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  134. data/lib/active_support/deprecation/reporting.rb +56 -0
  135. data/lib/active_support/deprecation.rb +9 -187
  136. data/lib/active_support/duration.rb +6 -2
  137. data/lib/active_support/hash_with_indifferent_access.rb +141 -0
  138. data/lib/active_support/i18n.rb +3 -0
  139. data/lib/active_support/inflections.rb +1 -1
  140. data/lib/active_support/inflector/inflections.rb +211 -0
  141. data/lib/active_support/inflector/methods.rb +141 -0
  142. data/lib/active_support/inflector/transliterate.rb +77 -0
  143. data/lib/active_support/inflector.rb +4 -403
  144. data/lib/active_support/json/backends/jsongem.rb +16 -10
  145. data/lib/active_support/json/backends/yajl.rb +40 -0
  146. data/lib/active_support/json/backends/yaml.rb +14 -8
  147. data/lib/active_support/json/decoding.rb +17 -1
  148. data/lib/active_support/json/encoding.rb +164 -35
  149. data/lib/active_support/json/variable.rb +4 -3
  150. data/lib/active_support/lazy_load_hooks.rb +17 -0
  151. data/lib/active_support/memoizable.rb +8 -5
  152. data/lib/active_support/message_encryptor.rb +1 -0
  153. data/lib/active_support/message_verifier.rb +12 -29
  154. data/lib/active_support/multibyte/chars.rb +88 -31
  155. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  156. data/lib/active_support/multibyte/utils.rb +6 -7
  157. data/lib/active_support/multibyte.rb +11 -6
  158. data/lib/active_support/notifications/fanout.rb +83 -0
  159. data/lib/active_support/notifications/instrumenter.rb +50 -0
  160. data/lib/active_support/notifications.rb +81 -0
  161. data/lib/active_support/option_merger.rb +2 -0
  162. data/lib/active_support/ordered_hash.rb +28 -11
  163. data/lib/active_support/ordered_options.rb +9 -1
  164. data/lib/active_support/railtie.rb +64 -0
  165. data/lib/active_support/rescuable.rb +11 -6
  166. data/lib/active_support/ruby/shim.rb +21 -0
  167. data/lib/active_support/test_case.rb +10 -8
  168. data/lib/active_support/testing/assertions.rb +17 -0
  169. data/lib/active_support/testing/declarative.rb +31 -12
  170. data/lib/active_support/testing/deprecation.rb +8 -10
  171. data/lib/active_support/testing/isolation.rb +153 -0
  172. data/lib/active_support/testing/pending.rb +48 -0
  173. data/lib/active_support/testing/performance.rb +342 -339
  174. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  175. data/lib/active_support/time/autoload.rb +5 -0
  176. data/lib/active_support/time.rb +34 -0
  177. data/lib/active_support/time_with_zone.rb +18 -12
  178. data/lib/active_support/values/time_zone.rb +51 -68
  179. data/lib/active_support/version.rb +5 -4
  180. data/lib/active_support/whiny_nil.rb +5 -9
  181. data/lib/active_support/xml_mini/jdom.rb +13 -7
  182. data/lib/active_support/xml_mini/libxml.rb +38 -91
  183. data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
  184. data/lib/active_support/xml_mini/nokogiri.rb +40 -31
  185. data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
  186. data/lib/active_support/xml_mini/rexml.rb +30 -9
  187. data/lib/active_support/xml_mini.rb +2 -0
  188. data/lib/active_support.rb +46 -30
  189. metadata +136 -215
  190. data/lib/active_support/cache/drb_store.rb +0 -14
  191. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  192. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  193. data/lib/active_support/core_ext/base64.rb +0 -4
  194. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  195. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  196. data/lib/active_support/core_ext/blank.rb +0 -2
  197. data/lib/active_support/core_ext/class/removal.rb +0 -50
  198. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  199. data/lib/active_support/core_ext/date.rb +0 -10
  200. data/lib/active_support/core_ext/date_time.rb +0 -12
  201. data/lib/active_support/core_ext/duplicable.rb +0 -43
  202. data/lib/active_support/core_ext/float/time.rb +0 -27
  203. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  204. data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
  205. data/lib/active_support/core_ext/module/inclusion.rb +0 -30
  206. data/lib/active_support/core_ext/module/loading.rb +0 -23
  207. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  208. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  209. data/lib/active_support/core_ext/object/metaclass.rb +0 -13
  210. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  211. data/lib/active_support/core_ext/pathname.rb +0 -7
  212. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  213. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  214. data/lib/active_support/core_ext/symbol.rb +0 -14
  215. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  216. data/lib/active_support/core_ext/time.rb +0 -42
  217. data/lib/active_support/json/encoders/date.rb +0 -22
  218. data/lib/active_support/json/encoders/date_time.rb +0 -22
  219. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  220. data/lib/active_support/json/encoders/false_class.rb +0 -7
  221. data/lib/active_support/json/encoders/hash.rb +0 -56
  222. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  223. data/lib/active_support/json/encoders/numeric.rb +0 -21
  224. data/lib/active_support/json/encoders/object.rb +0 -10
  225. data/lib/active_support/json/encoders/regexp.rb +0 -9
  226. data/lib/active_support/json/encoders/string.rb +0 -9
  227. data/lib/active_support/json/encoders/symbol.rb +0 -5
  228. data/lib/active_support/json/encoders/time.rb +0 -22
  229. data/lib/active_support/json/encoders/true_class.rb +0 -7
  230. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  231. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  232. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  233. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  234. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  235. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  236. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  237. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  238. data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
  239. data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
  240. data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
  241. data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
  242. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -214
  243. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
  244. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -199
  245. data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
  246. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
  247. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
  248. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
  249. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
  250. data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
  251. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  252. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  253. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  254. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  255. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  256. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  257. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  258. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  259. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  260. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  261. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  262. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  263. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  264. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  390. data/lib/active_support/vendor.rb +0 -28
  391. data/lib/activesupport.rb +0 -2
@@ -1,7 +1,19 @@
1
1
  # encoding: utf-8
2
+ require 'active_support/core_ext/array/wrap'
3
+ require 'active_support/core_ext/hash/except'
4
+ require 'active_support/core_ext/hash/slice'
2
5
  require 'active_support/core_ext/module/delegation'
6
+ require 'active_support/core_ext/object/instance_variables'
3
7
  require 'active_support/deprecation'
4
8
 
9
+ require 'active_support/time'
10
+
11
+ # Hack to load json gem first so we can overwrite its to_json.
12
+ begin
13
+ require 'json'
14
+ rescue LoadError
15
+ end
16
+
5
17
  module ActiveSupport
6
18
  class << self
7
19
  delegate :use_standard_json_time_format, :use_standard_json_time_format=,
@@ -13,15 +25,55 @@ module ActiveSupport
13
25
  # matches YAML-formatted dates
14
26
  DATE_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/
15
27
 
16
- class << self
17
- delegate :encode, :to => :'ActiveSupport::JSON::Encoding'
28
+ # Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info.
29
+ def self.encode(value, options = nil)
30
+ Encoding::Encoder.new(options).encode(value)
18
31
  end
19
32
 
20
33
  module Encoding #:nodoc:
21
- class CircularReferenceError < StandardError
34
+ class CircularReferenceError < StandardError; end
35
+
36
+ class Encoder
37
+ attr_reader :options
38
+
39
+ def initialize(options = nil)
40
+ @options = options
41
+ @seen = []
42
+ end
43
+
44
+ def encode(value)
45
+ check_for_circular_references(value) do
46
+ value.as_json(options).encode_json(self)
47
+ end
48
+ end
49
+
50
+ def escape(string)
51
+ Encoding.escape(string)
52
+ end
53
+
54
+ private
55
+ def check_for_circular_references(value)
56
+ if @seen.any? { |object| object.equal?(value) }
57
+ raise CircularReferenceError, 'object references itself'
58
+ end
59
+ @seen.unshift value
60
+ yield
61
+ ensure
62
+ @seen.shift
63
+ end
22
64
  end
23
65
 
66
+
24
67
  ESCAPED_CHARS = {
68
+ "\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002',
69
+ "\x03" => '\u0003', "\x04" => '\u0004', "\x05" => '\u0005',
70
+ "\x06" => '\u0006', "\x07" => '\u0007', "\x0B" => '\u000B',
71
+ "\x0E" => '\u000E', "\x0F" => '\u000F', "\x10" => '\u0010',
72
+ "\x11" => '\u0011', "\x12" => '\u0012', "\x13" => '\u0013',
73
+ "\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016',
74
+ "\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019',
75
+ "\x1A" => '\u001A', "\x1B" => '\u001B', "\x1C" => '\u001C',
76
+ "\x1D" => '\u001D', "\x1E" => '\u001E', "\x1F" => '\u001F',
25
77
  "\010" => '\b',
26
78
  "\f" => '\f',
27
79
  "\n" => '\n',
@@ -43,9 +95,9 @@ module ActiveSupport
43
95
  def escape_html_entities_in_json=(value)
44
96
  self.escape_regex = \
45
97
  if @escape_html_entities_in_json = value
46
- /[\010\f\n\r\t"\\><&]/
98
+ /[\x00-\x1F"\\><&]/
47
99
  else
48
- /[\010\f\n\r\t"\\]/
100
+ /[\x00-\x1F"\\]/
49
101
  end
50
102
  end
51
103
 
@@ -60,43 +112,120 @@ module ActiveSupport
60
112
  }
61
113
  %("#{json}")
62
114
  end
63
-
64
- # Converts a Ruby object into a JSON string.
65
- def encode(value, options = nil)
66
- options = {} unless Hash === options
67
- seen = (options[:seen] ||= [])
68
- raise CircularReferenceError, 'object references itself' if seen.include?(value)
69
- seen << value
70
- value.to_json(options)
71
- ensure
72
- seen.pop
73
- end
74
115
  end
75
116
 
76
- self.escape_html_entities_in_json = true
117
+ self.use_standard_json_time_format = true
118
+ self.escape_html_entities_in_json = false
77
119
  end
78
120
 
79
121
  CircularReferenceError = Deprecation::DeprecatedConstantProxy.new('ActiveSupport::JSON::CircularReferenceError', Encoding::CircularReferenceError)
80
122
  end
81
123
  end
82
124
 
83
- # Hack to load json gem first so we can overwrite its to_json.
84
- begin
85
- require 'json'
86
- rescue LoadError
125
+ class Object
126
+ # Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info.
127
+ def to_json(options = nil)
128
+ ActiveSupport::JSON.encode(self, options)
129
+ end
130
+
131
+ def as_json(options = nil) instance_values end #:nodoc:
132
+ end
133
+
134
+ # A string that returns itself as its JSON-encoded form.
135
+ class ActiveSupport::JSON::Variable < String
136
+ def as_json(options = nil) self end #:nodoc:
137
+ def encode_json(encoder) self end #:nodoc:
138
+ end
139
+
140
+ class TrueClass
141
+ AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze
142
+ def as_json(options = nil) AS_JSON end #:nodoc:
143
+ end
144
+
145
+ class FalseClass
146
+ AS_JSON = ActiveSupport::JSON::Variable.new('false').freeze
147
+ def as_json(options = nil) AS_JSON end #:nodoc:
87
148
  end
88
149
 
89
- require 'active_support/json/variable'
90
- require 'active_support/json/encoders/date'
91
- require 'active_support/json/encoders/date_time'
92
- require 'active_support/json/encoders/enumerable'
93
- require 'active_support/json/encoders/false_class'
94
- require 'active_support/json/encoders/hash'
95
- require 'active_support/json/encoders/nil_class'
96
- require 'active_support/json/encoders/numeric'
97
- require 'active_support/json/encoders/object'
98
- require 'active_support/json/encoders/regexp'
99
- require 'active_support/json/encoders/string'
100
- require 'active_support/json/encoders/symbol'
101
- require 'active_support/json/encoders/time'
102
- require 'active_support/json/encoders/true_class'
150
+ class NilClass
151
+ AS_JSON = ActiveSupport::JSON::Variable.new('null').freeze
152
+ def as_json(options = nil) AS_JSON end #:nodoc:
153
+ end
154
+
155
+ class String
156
+ def as_json(options = nil) self end #:nodoc:
157
+ def encode_json(encoder) encoder.escape(self) end #:nodoc:
158
+ end
159
+
160
+ class Symbol
161
+ def as_json(options = nil) to_s end #:nodoc:
162
+ end
163
+
164
+ class Numeric
165
+ def as_json(options = nil) self end #:nodoc:
166
+ def encode_json(encoder) to_s end #:nodoc:
167
+ end
168
+
169
+ class Regexp
170
+ def as_json(options = nil) self end #:nodoc:
171
+ def encode_json(encoder) inspect end #:nodoc:
172
+ end
173
+
174
+ module Enumerable
175
+ def as_json(options = nil) to_a end #:nodoc:
176
+ end
177
+
178
+ class Array
179
+ def as_json(options = nil) self end #:nodoc:
180
+ def encode_json(encoder) "[#{map { |v| encoder.encode(v) } * ','}]" end #:nodoc:
181
+ end
182
+
183
+ class Hash
184
+ def as_json(options = nil) #:nodoc:
185
+ if options
186
+ if attrs = options[:only]
187
+ slice(*Array.wrap(attrs))
188
+ elsif attrs = options[:except]
189
+ except(*Array.wrap(attrs))
190
+ else
191
+ self
192
+ end
193
+ else
194
+ self
195
+ end
196
+ end
197
+
198
+ def encode_json(encoder)
199
+ "{#{map { |k,v| "#{encoder.encode(k.to_s)}:#{encoder.encode(v)}" } * ','}}"
200
+ end
201
+ end
202
+
203
+ class Time
204
+ def as_json(options = nil) #:nodoc:
205
+ if ActiveSupport.use_standard_json_time_format
206
+ xmlschema
207
+ else
208
+ %(#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
209
+ end
210
+ end
211
+ end
212
+
213
+ class Date
214
+ def as_json(options = nil) #:nodoc:
215
+ if ActiveSupport.use_standard_json_time_format
216
+ strftime("%Y-%m-%d")
217
+ else
218
+ strftime("%Y/%m/%d")
219
+ end
220
+ end
221
+ end
222
+
223
+ class DateTime
224
+ def as_json(options = nil) #:nodoc:
225
+ if ActiveSupport.use_standard_json_time_format
226
+ xmlschema
227
+ else
228
+ strftime('%Y/%m/%d %H:%M:%S %z')
229
+ end
230
+ end
231
+ end
@@ -2,9 +2,10 @@ module ActiveSupport
2
2
  module JSON
3
3
  # A string that returns itself as its JSON-encoded form.
4
4
  class Variable < String
5
- def to_json(options=nil)
6
- self
7
- end
5
+ private
6
+ def rails_to_json(*)
7
+ self
8
+ end
8
9
  end
9
10
  end
10
11
  end
@@ -0,0 +1,17 @@
1
+ module ActiveSupport
2
+ @load_hooks = Hash.new {|h,k| h[k] = [] }
3
+ @loaded = {}
4
+
5
+ def self.on_load(name, &block)
6
+ if base = @loaded[name]
7
+ base.instance_eval(&block)
8
+ else
9
+ @load_hooks[name] << block
10
+ end
11
+ end
12
+
13
+ def self.run_load_hooks(name, base = Object)
14
+ @load_hooks[name].each { |hook| base.instance_eval(&hook) }
15
+ @loaded[name] = base
16
+ end
17
+ end
@@ -1,3 +1,6 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
2
+ require 'active_support/core_ext/module/aliasing'
3
+
1
4
  module ActiveSupport
2
5
  module Memoizable
3
6
  def self.memoized_ivar_for(symbol)
@@ -41,10 +44,10 @@ module ActiveSupport
41
44
  end
42
45
  end
43
46
 
44
- def flush_cache(*syms, &block)
47
+ def flush_cache(*syms)
45
48
  syms.each do |sym|
46
49
  (methods + private_methods + protected_methods).each do |m|
47
- if m.to_s =~ /^_unmemoized_(#{sym})/
50
+ if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/
48
51
  ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
49
52
  instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
50
53
  end
@@ -58,7 +61,7 @@ module ActiveSupport
58
61
  original_method = :"_unmemoized_#{symbol}"
59
62
  memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol)
60
63
 
61
- class_eval <<-EOS, __FILE__, __LINE__
64
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
62
65
  include InstanceMethods # include InstanceMethods
63
66
  #
64
67
  if method_defined?(:#{original_method}) # if method_defined?(:_unmemoized_mime_type)
@@ -69,7 +72,7 @@ module ActiveSupport
69
72
  if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
70
73
  def #{symbol}(reload = false) # def mime_type(reload = false)
71
74
  if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
72
- #{memoized_ivar} = [#{original_method}.freeze] # @_memoized_mime_type = [_unmemoized_mime_type.freeze]
75
+ #{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type]
73
76
  end # end
74
77
  #{memoized_ivar}[0] # @_memoized_mime_type[0]
75
78
  end # end
@@ -82,7 +85,7 @@ module ActiveSupport
82
85
  if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
83
86
  #{memoized_ivar}[args] # @_memoized_mime_type[args]
84
87
  elsif #{memoized_ivar} # elsif @_memoized_mime_type
85
- #{memoized_ivar}[args] = #{original_method}(*args).freeze # @_memoized_mime_type[args] = _unmemoized_mime_type(*args).freeze
88
+ #{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
86
89
  end # end
87
90
  else # else
88
91
  #{original_method}(*args) # _unmemoized_mime_type(*args)
@@ -1,4 +1,5 @@
1
1
  require 'openssl'
2
+ require 'active_support/base64'
2
3
 
3
4
  module ActiveSupport
4
5
  # MessageEncryptor is a simple way to encrypt values which get stored somewhere
@@ -1,3 +1,6 @@
1
+ require 'active_support/base64'
2
+ require 'active_support/core_ext/object/blank'
3
+
1
4
  module ActiveSupport
2
5
  # MessageVerifier makes it easy to generate and verify messages which are signed
3
6
  # to prevent tampering.
@@ -40,40 +43,20 @@ module ActiveSupport
40
43
  end
41
44
 
42
45
  private
43
- if "foo".respond_to?(:force_encoding)
44
- # constant-time comparison algorithm to prevent timing attacks
45
- def secure_compare(a, b)
46
- a = a.dup.force_encoding(Encoding::BINARY)
47
- b = b.dup.force_encoding(Encoding::BINARY)
46
+ # constant-time comparison algorithm to prevent timing attacks
47
+ def secure_compare(a, b)
48
+ return false unless a.bytesize == b.bytesize
48
49
 
49
- if a.length == b.length
50
- result = 0
51
- for i in 0..(a.length - 1)
52
- result |= a[i].ord ^ b[i].ord
53
- end
54
- result == 0
55
- else
56
- false
57
- end
58
- end
59
- else
60
- # For <= 1.8.6
61
- def secure_compare(a, b)
62
- if a.length == b.length
63
- result = 0
64
- for i in 0..(a.length - 1)
65
- result |= a[i] ^ b[i]
66
- end
67
- result == 0
68
- else
69
- false
70
- end
71
- end
50
+ l = a.unpack "C#{a.bytesize}"
51
+
52
+ res = 0
53
+ b.each_byte { |byte| res |= byte ^ l.shift }
54
+ res == 0
72
55
  end
73
56
 
74
57
  def generate_digest(data)
75
58
  require 'openssl' unless defined?(OpenSSL)
76
- OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(@digest), @secret, data)
59
+ OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data)
77
60
  end
78
61
  end
79
62
  end
@@ -1,4 +1,6 @@
1
1
  # encoding: utf-8
2
+ require 'active_support/core_ext/string/access'
3
+ require 'active_support/core_ext/string/behavior'
2
4
 
3
5
  module ActiveSupport #:nodoc:
4
6
  module Multibyte #:nodoc:
@@ -17,7 +19,7 @@ module ActiveSupport #:nodoc:
17
19
  # bad.explicit_checking_method "T".mb_chars.downcase.to_s
18
20
  #
19
21
  # The default Chars implementation assumes that the encoding of the string is UTF-8, if you want to handle different
20
- # encodings you can write your own multibyte string handler and configure it through
22
+ # encodings you can write your own multibyte string handler and configure it through
21
23
  # ActiveSupport::Multibyte.proxy_class.
22
24
  #
23
25
  # class CharsForUTF32
@@ -196,7 +198,7 @@ module ActiveSupport #:nodoc:
196
198
  # 'Café périferôl'.mb_chars.index('ô') #=> 12
197
199
  # 'Café périferôl'.mb_chars.index(/\w/u) #=> 0
198
200
  def index(needle, offset=0)
199
- wrapped_offset = self.first(offset).wrapped_string.length
201
+ wrapped_offset = first(offset).wrapped_string.length
200
202
  index = @wrapped_string.index(needle, wrapped_offset)
201
203
  index ? (self.class.u_unpack(@wrapped_string.slice(0...index)).size) : nil
202
204
  end
@@ -210,7 +212,7 @@ module ActiveSupport #:nodoc:
210
212
  # 'Café périferôl'.mb_chars.rindex(/\w/u) #=> 13
211
213
  def rindex(needle, offset=nil)
212
214
  offset ||= length
213
- wrapped_offset = self.first(offset).wrapped_string.length
215
+ wrapped_offset = first(offset).wrapped_string.length
214
216
  index = @wrapped_string.rindex(needle, wrapped_offset)
215
217
  index ? (self.class.u_unpack(@wrapped_string.slice(0...index)).size) : nil
216
218
  end
@@ -362,6 +364,16 @@ module ActiveSupport #:nodoc:
362
364
  slice
363
365
  end
364
366
 
367
+ # Limit the byte size of the string to a number of bytes without breaking characters. Usable
368
+ # when the storage for a string is limited for some reason.
369
+ #
370
+ # Example:
371
+ # s = 'こんにちは'
372
+ # s.mb_chars.limit(7) #=> "こに"
373
+ def limit(limit)
374
+ slice(0...translate_offset(limit))
375
+ end
376
+
365
377
  # Returns the codepoint of the first character in the string.
366
378
  #
367
379
  # Example:
@@ -373,7 +385,7 @@ module ActiveSupport #:nodoc:
373
385
  # Convert characters in the string to uppercase.
374
386
  #
375
387
  # Example:
376
- # 'Laurent, òu sont les tests?'.mb_chars.upcase.to_s #=> "LAURENT, ÒU SONT LES TESTS?"
388
+ # 'Laurent, sont les tests ?'.mb_chars.upcase.to_s #=> "LAURENT, SONT LES TESTS ?"
377
389
  def upcase
378
390
  apply_mapping :uppercase_mapping
379
391
  end
@@ -446,8 +458,10 @@ module ActiveSupport #:nodoc:
446
458
  end
447
459
 
448
460
  # Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent resulting in a valid UTF-8 string.
449
- def tidy_bytes
450
- chars(self.class.tidy_bytes(@wrapped_string))
461
+ #
462
+ # Passing +true+ will forcibly tidy all bytes, assuming that the string's encoding is entirely CP1252 or ISO-8859-1.
463
+ def tidy_bytes(force = false)
464
+ chars(self.class.tidy_bytes(@wrapped_string, force))
451
465
  end
452
466
 
453
467
  %w(lstrip rstrip strip reverse upcase downcase tidy_bytes capitalize).each do |method|
@@ -516,7 +530,7 @@ module ActiveSupport #:nodoc:
516
530
  unpacked << codepoints[marker..pos-1]
517
531
  marker = pos
518
532
  end
519
- end
533
+ end
520
534
  unpacked
521
535
  end
522
536
 
@@ -632,20 +646,67 @@ module ActiveSupport #:nodoc:
632
646
  codepoints
633
647
  end
634
648
 
649
+ def tidy_byte(byte)
650
+ if byte < 160
651
+ [UCD.cp1252[byte] || byte].pack("U").unpack("C*")
652
+ elsif byte < 192
653
+ [194, byte]
654
+ else
655
+ [195, byte - 64]
656
+ end
657
+ end
658
+ private :tidy_byte
659
+
635
660
  # Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent resulting in a valid UTF-8 string.
636
- def tidy_bytes(string)
637
- string.split(//u).map do |c|
638
- c.force_encoding(Encoding::ASCII) if c.respond_to?(:force_encoding)
639
-
640
- if !ActiveSupport::Multibyte::VALID_CHARACTER['UTF-8'].match(c)
641
- n = c.unpack('C')[0]
642
- n < 128 ? n.chr :
643
- n < 160 ? [UCD.cp1252[n] || n].pack('U') :
644
- n < 192 ? "\xC2" + n.chr : "\xC3" + (n-64).chr
661
+ #
662
+ # Passing +true+ will forcibly tidy all bytes, assuming that the string's encoding is entirely CP-1252 or ISO-8859-1.
663
+ def tidy_bytes(string, force = false)
664
+ if force
665
+ return string.unpack("C*").map do |b|
666
+ tidy_byte(b)
667
+ end.flatten.compact.pack("C*").unpack("U*").pack("U*")
668
+ end
669
+
670
+ bytes = string.unpack("C*")
671
+ conts_expected = 0
672
+ last_lead = 0
673
+
674
+ bytes.each_index do |i|
675
+
676
+ byte = bytes[i]
677
+ is_ascii = byte < 128
678
+ is_cont = byte > 127 && byte < 192
679
+ is_lead = byte > 191 && byte < 245
680
+ is_unused = byte > 240
681
+ is_restricted = byte > 244
682
+
683
+ # Impossible or highly unlikely byte? Clean it.
684
+ if is_unused || is_restricted
685
+ bytes[i] = tidy_byte(byte)
686
+ elsif is_cont
687
+ # Not expecting contination byte? Clean up. Otherwise, now expect one less.
688
+ conts_expected == 0 ? bytes[i] = tidy_byte(byte) : conts_expected -= 1
645
689
  else
646
- c
690
+ if conts_expected > 0
691
+ # Expected continuation, but got ASCII or leading? Clean backwards up to
692
+ # the leading byte.
693
+ (1..(i - last_lead)).each {|j| bytes[i - j] = tidy_byte(bytes[i - j])}
694
+ conts_expected = 0
695
+ end
696
+ if is_lead
697
+ # Final byte is leading? Clean it.
698
+ if i == bytes.length - 1
699
+ bytes[i] = tidy_byte(bytes.last)
700
+ else
701
+ # Valid leading byte? Expect continuations determined by position of
702
+ # first zero bit, with max of 3.
703
+ conts_expected = byte < 224 ? 1 : byte < 240 ? 2 : 3
704
+ last_lead = i
705
+ end
706
+ end
647
707
  end
648
- end.join
708
+ end
709
+ bytes.empty? ? "" : bytes.flatten.compact.pack("C*").unpack("U*").pack("U*")
649
710
  end
650
711
  end
651
712
 
@@ -654,20 +715,16 @@ module ActiveSupport #:nodoc:
654
715
  def translate_offset(byte_offset) #:nodoc:
655
716
  return nil if byte_offset.nil?
656
717
  return 0 if @wrapped_string == ''
657
- chunk = @wrapped_string[0..byte_offset]
718
+
719
+ if @wrapped_string.respond_to?(:force_encoding)
720
+ @wrapped_string = @wrapped_string.dup.force_encoding(Encoding::ASCII_8BIT)
721
+ end
722
+
658
723
  begin
659
- begin
660
- chunk.unpack('U*').length - 1
661
- rescue ArgumentError => e
662
- chunk = @wrapped_string[0..(byte_offset+=1)]
663
- # Stop retrying at the end of the string
664
- raise e unless byte_offset < chunk.length
665
- # We damaged a character, retry
666
- retry
667
- end
668
- # Catch the ArgumentError so we can throw our own
669
- rescue ArgumentError
670
- raise EncodingError, 'malformed UTF-8 character'
724
+ @wrapped_string[0...byte_offset].unpack('U*').length
725
+ rescue ArgumentError => e
726
+ byte_offset -= 1
727
+ retry
671
728
  end
672
729
  end
673
730
 
@@ -23,11 +23,11 @@ module ActiveSupport #:nodoc:
23
23
 
24
24
  # Lazy load the Unicode database so it's only loaded when it's actually used
25
25
  ATTRIBUTES.each do |attr_name|
26
- class_eval(<<-EOS, __FILE__, __LINE__)
27
- def #{attr_name} # def codepoints
28
- load # load
29
- @#{attr_name} # @codepoints
30
- end # end
26
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
27
+ def #{attr_name} # def codepoints
28
+ load # load
29
+ @#{attr_name} # @codepoints
30
+ end # end
31
31
  EOS
32
32
  end
33
33
 
@@ -26,11 +26,11 @@ module ActiveSupport #:nodoc:
26
26
  else
27
27
  def self.verify(string)
28
28
  if expression = valid_character
29
- for c in string.split(//)
30
- return false unless expression.match(c)
31
- end
29
+ # Splits the string on character boundaries, which are determined based on $KCODE.
30
+ string.split(//).all? { |c| expression =~ c }
31
+ else
32
+ true
32
33
  end
33
- true
34
34
  end
35
35
  end
36
36
 
@@ -49,9 +49,8 @@ module ActiveSupport #:nodoc:
49
49
  else
50
50
  def self.clean(string)
51
51
  if expression = valid_character
52
- stripped = []; for c in string.split(//)
53
- stripped << c if expression.match(c)
54
- end; stripped.join
52
+ # Splits the string on character boundaries, which are determined based on $KCODE.
53
+ string.split(//).grep(expression).join
55
54
  else
56
55
  string
57
56
  end
@@ -1,7 +1,15 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'active_support/core_ext/module/attribute_accessors'
4
+
3
5
  module ActiveSupport #:nodoc:
4
6
  module Multibyte
7
+ autoload :EncodingError, 'active_support/multibyte/exceptions'
8
+ autoload :Chars, 'active_support/multibyte/chars'
9
+ autoload :UnicodeDatabase, 'active_support/multibyte/unicode_database'
10
+ autoload :Codepoint, 'active_support/multibyte/unicode_database'
11
+ autoload :UCD, 'active_support/multibyte/unicode_database'
12
+
5
13
  # A list of all available normalization forms. See http://www.unicode.org/reports/tr15/tr15-29.html for more
6
14
  # information about normalization.
7
15
  NORMALIZATION_FORMS = [:c, :kc, :d, :kd]
@@ -45,13 +53,10 @@ module ActiveSupport #:nodoc:
45
53
  \xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf])\z /xn,
46
54
  # Quick check for valid Shift-JIS characters, disregards the odd-even pairing
47
55
  'Shift_JIS' => /\A(?:
48
- [\x00-\x7e \xa1-\xdf] |
49
- [\x81-\x9f \xe0-\xef] [\x40-\x7e \x80-\x9e \x9f-\xfc])\z /xn
56
+ [\x00-\x7e\xa1-\xdf] |
57
+ [\x81-\x9f\xe0-\xef] [\x40-\x7e\x80-\x9e\x9f-\xfc])\z /xn
50
58
  }
51
59
  end
52
60
  end
53
61
 
54
- require 'active_support/multibyte/chars'
55
- require 'active_support/multibyte/exceptions'
56
- require 'active_support/multibyte/unicode_database'
57
- require 'active_support/multibyte/utils'
62
+ require 'active_support/multibyte/utils'