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,130 +1,77 @@
1
1
  require 'libxml'
2
+ require 'active_support/core_ext/object/returning'
3
+ require 'active_support/core_ext/object/blank'
2
4
 
3
5
  # = XmlMini LibXML implementation
4
6
  module ActiveSupport
5
7
  module XmlMini_LibXML #:nodoc:
6
8
  extend self
7
9
 
8
- # Parse an XML Document string into a simple hash using libxml.
9
- # string::
10
- # XML Document string to parse
11
- def parse(string)
12
- LibXML::XML.default_keep_blanks = false
10
+ # Parse an XML Document string or IO into a simple hash using libxml.
11
+ # data::
12
+ # XML Document string or IO to parse
13
+ def parse(data)
14
+ if !data.respond_to?(:read)
15
+ data = StringIO.new(data || '')
16
+ end
13
17
 
14
- if string.blank?
18
+ char = data.getc
19
+ if char.nil?
15
20
  {}
16
21
  else
17
- LibXML::XML::Parser.string(string.strip).parse.to_hash
22
+ data.ungetc(char)
23
+ LibXML::XML::Parser.io(data).parse.to_hash
18
24
  end
19
25
  end
20
26
 
21
27
  end
22
28
  end
23
29
 
24
- module LibXML
25
- module Conversions
26
- module Document
30
+ module LibXML #:nodoc:
31
+ module Conversions #:nodoc:
32
+ module Document #:nodoc:
27
33
  def to_hash
28
34
  root.to_hash
29
35
  end
30
36
  end
31
37
 
32
- module Node
33
- CONTENT_ROOT = '__content__'
34
- LIB_XML_LIMIT = 30000000 # Hardcoded LibXML limit
38
+ module Node #:nodoc:
39
+ CONTENT_ROOT = '__content__'.freeze
35
40
 
36
41
  # Convert XML document to hash
37
42
  #
38
43
  # hash::
39
44
  # Hash to merge the converted element into.
40
45
  def to_hash(hash={})
41
- if text?
42
- raise LibXML::XML::Error if content.length >= LIB_XML_LIMIT
43
- hash[CONTENT_ROOT] = content
44
- else
45
- sub_hash = insert_name_into_hash(hash, name)
46
- attributes_to_hash(sub_hash)
47
- if array?
48
- children_array_to_hash(sub_hash)
49
- elsif yaml?
50
- children_yaml_to_hash(sub_hash)
51
- else
52
- children_to_hash(sub_hash)
53
- end
54
- end
55
- hash
56
- end
57
-
58
- protected
59
-
60
- # Insert name into hash
61
- #
62
- # hash::
63
- # Hash to merge the converted element into.
64
- # name::
65
- # name to to merge into hash
66
- def insert_name_into_hash(hash, name)
67
- sub_hash = {}
68
- if hash[name]
69
- if !hash[name].kind_of? Array
70
- hash[name] = [hash[name]]
71
- end
72
- hash[name] << sub_hash
73
- else
74
- hash[name] = sub_hash
75
- end
76
- sub_hash
77
- end
78
-
79
- # Insert children into hash
80
- #
81
- # hash::
82
- # Hash to merge the children into.
83
- def children_to_hash(hash={})
84
- each { |child| child.to_hash(hash) }
85
- attributes_to_hash(hash)
86
- hash
87
- end
46
+ node_hash = {}
88
47
 
89
- # Convert xml attributes to hash
90
- #
91
- # hash::
92
- # Hash to merge the attributes into
93
- def attributes_to_hash(hash={})
94
- each_attr { |attr| hash[attr.name] = attr.value }
95
- hash
48
+ # Insert node hash into parent hash correctly.
49
+ case hash[name]
50
+ when Array then hash[name] << node_hash
51
+ when Hash then hash[name] = [hash[name], node_hash]
52
+ when nil then hash[name] = node_hash
96
53
  end
97
54
 
98
- # Convert array into hash
99
- #
100
- # hash::
101
- # Hash to merge the array into
102
- def children_array_to_hash(hash={})
103
- hash[child.name] = map do |child|
104
- returning({}) { |sub_hash| child.children_to_hash(sub_hash) }
55
+ # Handle child elements
56
+ each_child do |c|
57
+ if c.element?
58
+ c.to_hash(node_hash)
59
+ elsif c.text? || c.cdata?
60
+ node_hash[CONTENT_ROOT] ||= ''
61
+ node_hash[CONTENT_ROOT] << c.content
105
62
  end
106
- hash
107
- end
108
-
109
- # Convert yaml into hash
110
- #
111
- # hash::
112
- # Hash to merge the yaml into
113
- def children_yaml_to_hash(hash = {})
114
- hash[CONTENT_ROOT] = content unless content.blank?
115
- hash
116
63
  end
117
64
 
118
- # Check if child is of type array
119
- def array?
120
- child? && child.next? && child.name == child.next.name
65
+ # Remove content node if it is blank
66
+ if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank?
67
+ node_hash.delete(CONTENT_ROOT)
121
68
  end
122
69
 
123
- # Check if child is of type yaml
124
- def yaml?
125
- attributes.collect{|x| x.value}.include?('yaml')
126
- end
70
+ # Handle attributes
71
+ each_attr { |a| node_hash[a.name] = a.value }
127
72
 
73
+ hash
74
+ end
128
75
  end
129
76
  end
130
77
  end
@@ -0,0 +1,85 @@
1
+ require 'libxml'
2
+ require 'active_support/core_ext/object/blank'
3
+
4
+ # = XmlMini LibXML implementation using a SAX-based parser
5
+ module ActiveSupport
6
+ module XmlMini_LibXMLSAX
7
+ extend self
8
+
9
+ # Class that will build the hash while the XML document
10
+ # is being parsed using SAX events.
11
+ class HashBuilder
12
+
13
+ include LibXML::XML::SaxParser::Callbacks
14
+
15
+ CONTENT_KEY = '__content__'.freeze
16
+ HASH_SIZE_KEY = '__hash_size__'.freeze
17
+
18
+ attr_reader :hash
19
+
20
+ def current_hash
21
+ @hash_stack.last
22
+ end
23
+
24
+ def on_start_document
25
+ @hash = { CONTENT_KEY => '' }
26
+ @hash_stack = [@hash]
27
+ end
28
+
29
+ def on_end_document
30
+ @hash = @hash_stack.pop
31
+ @hash.delete(CONTENT_KEY)
32
+ end
33
+
34
+ def on_start_element(name, attrs = {})
35
+ new_hash = { CONTENT_KEY => '' }.merge(attrs)
36
+ new_hash[HASH_SIZE_KEY] = new_hash.size + 1
37
+
38
+ case current_hash[name]
39
+ when Array then current_hash[name] << new_hash
40
+ when Hash then current_hash[name] = [current_hash[name], new_hash]
41
+ when nil then current_hash[name] = new_hash
42
+ end
43
+
44
+ @hash_stack.push(new_hash)
45
+ end
46
+
47
+ def on_end_element(name)
48
+ if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == ''
49
+ current_hash.delete(CONTENT_KEY)
50
+ end
51
+ @hash_stack.pop
52
+ end
53
+
54
+ def on_characters(string)
55
+ current_hash[CONTENT_KEY] << string
56
+ end
57
+
58
+ alias_method :on_cdata_block, :on_characters
59
+ end
60
+
61
+ attr_accessor :document_class
62
+ self.document_class = HashBuilder
63
+
64
+ def parse(data)
65
+ if !data.respond_to?(:read)
66
+ data = StringIO.new(data || '')
67
+ end
68
+
69
+ char = data.getc
70
+ if char.nil?
71
+ {}
72
+ else
73
+ data.ungetc(char)
74
+
75
+ LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER)
76
+ parser = LibXML::XML::SaxParser.io(data)
77
+ document = self.document_class.new
78
+
79
+ parser.callbacks = document
80
+ parser.parse
81
+ document.hash
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,64 +1,73 @@
1
1
  require 'nokogiri'
2
+ require 'active_support/core_ext/object/blank'
2
3
 
3
4
  # = XmlMini Nokogiri implementation
4
5
  module ActiveSupport
5
6
  module XmlMini_Nokogiri #:nodoc:
6
7
  extend self
7
8
 
8
- # Parse an XML Document string into a simple hash using libxml / nokogiri.
9
- # string::
10
- # XML Document string to parse
11
- def parse(string)
12
- if string.blank?
9
+ # Parse an XML Document string or IO into a simple hash using libxml / nokogiri.
10
+ # data::
11
+ # XML Document string or IO to parse
12
+ def parse(data)
13
+ if !data.respond_to?(:read)
14
+ data = StringIO.new(data || '')
15
+ end
16
+
17
+ char = data.getc
18
+ if char.nil?
13
19
  {}
14
20
  else
15
- doc = Nokogiri::XML(string) { |cfg| cfg.noblanks }
21
+ data.ungetc(char)
22
+ doc = Nokogiri::XML(data)
16
23
  raise doc.errors.first if doc.errors.length > 0
17
24
  doc.to_hash
18
25
  end
19
26
  end
20
27
 
21
- module Conversions
22
- module Document
28
+ module Conversions #:nodoc:
29
+ module Document #:nodoc:
23
30
  def to_hash
24
31
  root.to_hash
25
32
  end
26
33
  end
27
34
 
28
- module Node
29
- CONTENT_ROOT = '__content__'
35
+ module Node #:nodoc:
36
+ CONTENT_ROOT = '__content__'.freeze
30
37
 
31
38
  # Convert XML document to hash
32
39
  #
33
40
  # hash::
34
41
  # Hash to merge the converted element into.
35
- def to_hash(hash = {})
36
- attributes = attributes_as_hash
37
- if hash[name]
38
- hash[name] = [hash[name]].flatten
39
- hash[name] << attributes
40
- else
41
- hash[name] ||= attributes
42
- end
42
+ def to_hash(hash={})
43
+ node_hash = {}
43
44
 
44
- children.each { |child|
45
- next if child.blank? && 'file' != self['type']
45
+ # Insert node hash into parent hash correctly.
46
+ case hash[name]
47
+ when Array then hash[name] << node_hash
48
+ when Hash then hash[name] = [hash[name], node_hash]
49
+ when nil then hash[name] = node_hash
50
+ end
46
51
 
47
- if child.text? || child.cdata?
48
- (attributes[CONTENT_ROOT] ||= '') << child.content
49
- next
52
+ # Handle child elements
53
+ children.each do |c|
54
+ if c.element?
55
+ c.to_hash(node_hash)
56
+ elsif c.text? || c.cdata?
57
+ node_hash[CONTENT_ROOT] ||= ''
58
+ node_hash[CONTENT_ROOT] << c.content
50
59
  end
60
+ end
51
61
 
52
- child.to_hash attributes
53
- }
62
+ # Remove content node if it is blank and there are child tags
63
+ if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank?
64
+ node_hash.delete(CONTENT_ROOT)
65
+ end
54
66
 
55
- hash
56
- end
67
+ # Handle attributes
68
+ attribute_nodes.each { |a| node_hash[a.node_name] = a.value }
57
69
 
58
- def attributes_as_hash
59
- Hash[*(attribute_nodes.map { |node|
60
- [node.node_name, node.value]
61
- }.flatten)]
70
+ hash
62
71
  end
63
72
  end
64
73
  end
@@ -0,0 +1,83 @@
1
+ require 'nokogiri'
2
+ require 'active_support/core_ext/object/blank'
3
+
4
+ # = XmlMini Nokogiri implementation using a SAX-based parser
5
+ module ActiveSupport
6
+ module XmlMini_NokogiriSAX
7
+ extend self
8
+
9
+ # Class that will build the hash while the XML document
10
+ # is being parsed using SAX events.
11
+ class HashBuilder < Nokogiri::XML::SAX::Document
12
+
13
+ CONTENT_KEY = '__content__'.freeze
14
+ HASH_SIZE_KEY = '__hash_size__'.freeze
15
+
16
+ attr_reader :hash
17
+
18
+ def current_hash
19
+ @hash_stack.last
20
+ end
21
+
22
+ def start_document
23
+ @hash = {}
24
+ @hash_stack = [@hash]
25
+ end
26
+
27
+ def end_document
28
+ raise "Parse stack not empty!" if @hash_stack.size > 1
29
+ end
30
+
31
+ def error(error_message)
32
+ raise error_message
33
+ end
34
+
35
+ def start_element(name, attrs = [])
36
+ new_hash = { CONTENT_KEY => '' }
37
+ new_hash[attrs.shift] = attrs.shift while attrs.length > 0
38
+ new_hash[HASH_SIZE_KEY] = new_hash.size + 1
39
+
40
+ case current_hash[name]
41
+ when Array then current_hash[name] << new_hash
42
+ when Hash then current_hash[name] = [current_hash[name], new_hash]
43
+ when nil then current_hash[name] = new_hash
44
+ end
45
+
46
+ @hash_stack.push(new_hash)
47
+ end
48
+
49
+ def end_element(name)
50
+ if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == ''
51
+ current_hash.delete(CONTENT_KEY)
52
+ end
53
+ @hash_stack.pop
54
+ end
55
+
56
+ def characters(string)
57
+ current_hash[CONTENT_KEY] << string
58
+ end
59
+
60
+ alias_method :cdata_block, :characters
61
+ end
62
+
63
+ attr_accessor :document_class
64
+ self.document_class = HashBuilder
65
+
66
+ def parse(data)
67
+ if !data.respond_to?(:read)
68
+ data = StringIO.new(data || '')
69
+ end
70
+
71
+ char = data.getc
72
+ if char.nil?
73
+ {}
74
+ else
75
+ data.ungetc(char)
76
+ document = self.document_class.new
77
+ parser = Nokogiri::XML::SAX::Parser.new(document)
78
+ parser.parse(data)
79
+ document.hash
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,3 +1,6 @@
1
+ require 'active_support/core_ext/kernel/reporting'
2
+ require 'active_support/core_ext/object/blank'
3
+
1
4
  # = XmlMini ReXML implementation
2
5
  module ActiveSupport
3
6
  module XmlMini_REXML #:nodoc:
@@ -5,17 +8,33 @@ module ActiveSupport
5
8
 
6
9
  CONTENT_KEY = '__content__'.freeze
7
10
 
8
- # Parse an XML Document string into a simple hash
11
+ # Parse an XML Document string or IO into a simple hash
9
12
  #
10
13
  # Same as XmlSimple::xml_in but doesn't shoot itself in the foot,
11
14
  # and uses the defaults from ActiveSupport
12
15
  #
13
- # string::
14
- # XML Document string to parse
15
- def parse(string)
16
- require 'rexml/document' unless defined?(REXML::Document)
17
- doc = REXML::Document.new(string)
18
- merge_element!({}, doc.root)
16
+ # data::
17
+ # XML Document string or IO to parse
18
+ def parse(data)
19
+ if !data.respond_to?(:read)
20
+ data = StringIO.new(data || '')
21
+ end
22
+
23
+ char = data.getc
24
+ if char.nil?
25
+ {}
26
+ else
27
+ data.ungetc(char)
28
+ silence_warnings { require 'rexml/document' } unless defined?(REXML::Document)
29
+ doc = REXML::Document.new(data)
30
+
31
+ if doc.root
32
+ merge_element!({}, doc.root)
33
+ else
34
+ raise REXML::ParseException,
35
+ "The document #{doc.to_s.inspect} does not have a valid root"
36
+ end
37
+ end
19
38
  end
20
39
 
21
40
  private
@@ -48,7 +67,7 @@ module ActiveSupport
48
67
  # Merge all the texts of an element into the hash
49
68
  #
50
69
  # hash::
51
- # Hash to add the converted emement to.
70
+ # Hash to add the converted element to.
52
71
  # element::
53
72
  # XML element whose texts are to me merged into the hash
54
73
  def merge_texts!(hash, element)
@@ -56,7 +75,9 @@ module ActiveSupport
56
75
  hash
57
76
  else
58
77
  # must use value to prevent double-escaping
59
- merge!(hash, CONTENT_KEY, element.texts.sum(&:value))
78
+ texts = ''
79
+ element.texts.each { |t| texts << t.value }
80
+ merge!(hash, CONTENT_KEY, texts)
60
81
  end
61
82
  end
62
83
 
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+
1
3
  module ActiveSupport
2
4
  # = XmlMini
3
5
  #
@@ -22,38 +22,54 @@
22
22
  #++
23
23
 
24
24
  module ActiveSupport
25
- def self.load_all!
26
- [Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom, TimeWithZone]
25
+ class << self
26
+ attr_accessor :load_all_hooks
27
+ def on_load_all(&hook) load_all_hooks << hook end
28
+ def load_all!; load_all_hooks.each { |hook| hook.call } end
27
29
  end
30
+ self.load_all_hooks = []
28
31
 
29
- autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
30
- autoload :Base64, 'active_support/base64'
31
- autoload :BasicObject, 'active_support/basic_object'
32
- autoload :BufferedLogger, 'active_support/buffered_logger'
33
- autoload :Cache, 'active_support/cache'
34
- autoload :Callbacks, 'active_support/callbacks'
35
- autoload :Deprecation, 'active_support/deprecation'
36
- autoload :Duration, 'active_support/duration'
37
- autoload :Gzip, 'active_support/gzip'
38
- autoload :Inflector, 'active_support/inflector'
39
- autoload :Memoizable, 'active_support/memoizable'
40
- autoload :MessageEncryptor, 'active_support/message_encryptor'
41
- autoload :MessageVerifier, 'active_support/message_verifier'
42
- autoload :Multibyte, 'active_support/multibyte'
43
- autoload :OptionMerger, 'active_support/option_merger'
44
- autoload :OrderedHash, 'active_support/ordered_hash'
45
- autoload :OrderedOptions, 'active_support/ordered_options'
46
- autoload :Rescuable, 'active_support/rescuable'
47
- autoload :SecureRandom, 'active_support/secure_random'
48
- autoload :StringInquirer, 'active_support/string_inquirer'
49
- autoload :TimeWithZone, 'active_support/time_with_zone'
50
- autoload :TimeZone, 'active_support/values/time_zone'
51
- autoload :XmlMini, 'active_support/xml_mini'
32
+ on_load_all do
33
+ [Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom]
34
+ end
52
35
  end
53
36
 
54
- require 'active_support/vendor'
55
- require 'active_support/core_ext'
56
- require 'active_support/dependencies'
57
- require 'active_support/json'
37
+ require "active_support/dependencies/autoload"
38
+
39
+ module ActiveSupport
40
+ extend ActiveSupport::Autoload
41
+
42
+ # TODO: Narrow this list down
43
+ eager_autoload do
44
+ autoload :BacktraceCleaner
45
+ autoload :Base64
46
+ autoload :BasicObject
47
+ autoload :Benchmarkable
48
+ autoload :BufferedLogger
49
+ autoload :Cache
50
+ autoload :Callbacks
51
+ autoload :Concern
52
+ autoload :Configurable
53
+ autoload :Deprecation
54
+ autoload :Gzip
55
+ autoload :Inflector
56
+ autoload :JSON
57
+ autoload :Memoizable
58
+ autoload :MessageEncryptor
59
+ autoload :MessageVerifier
60
+ autoload :Multibyte
61
+ autoload :OptionMerger
62
+ autoload :OrderedHash
63
+ autoload :OrderedOptions
64
+ autoload :Notifications
65
+ autoload :Rescuable
66
+ autoload :SecureRandom
67
+ autoload :StringInquirer
68
+ autoload :XmlMini
69
+ end
70
+
71
+ autoload :SafeBuffer, "active_support/core_ext/string/output_safety"
72
+ autoload :TestCase
73
+ end
58
74
 
59
- I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml"
75
+ autoload :I18n, "active_support/i18n"