activesupport 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (403) hide show
  1. data/CHANGELOG +30 -53
  2. data/lib/active_support.rb +43 -31
  3. data/lib/active_support/all.rb +3 -7
  4. data/lib/active_support/backtrace_cleaner.rb +24 -8
  5. data/lib/active_support/base64.rb +9 -0
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +12 -9
  8. data/lib/active_support/cache.rb +75 -55
  9. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  10. data/lib/active_support/cache/file_store.rb +35 -17
  11. data/lib/active_support/cache/mem_cache_store.rb +29 -20
  12. data/lib/active_support/cache/memory_store.rb +18 -17
  13. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  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.rb +2 -7
  18. data/lib/active_support/core_ext/array.rb +2 -10
  19. data/lib/active_support/core_ext/array/access.rb +39 -46
  20. data/lib/active_support/core_ext/array/conversions.rb +146 -182
  21. data/lib/active_support/core_ext/array/extract_options.rb +12 -18
  22. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  23. data/lib/active_support/core_ext/array/random_access.rb +4 -40
  24. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  25. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  30. data/lib/active_support/core_ext/class.rb +0 -2
  31. data/lib/active_support/core_ext/class/attribute.rb +8 -39
  32. data/lib/active_support/core_ext/class/attribute_accessors.rb +31 -35
  33. data/lib/active_support/core_ext/class/delegating_attributes.rb +34 -40
  34. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -16
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -238
  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 +83 -95
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +14 -15
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file.rb +0 -4
  46. data/lib/active_support/core_ext/file/atomic.rb +34 -41
  47. data/lib/active_support/core_ext/float.rb +0 -6
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/hash.rb +8 -14
  50. data/lib/active_support/core_ext/hash/conversions.rb +236 -236
  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/integer.rb +1 -7
  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/kernel/reporting.rb +9 -7
  63. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  64. data/lib/active_support/core_ext/load_error.rb +16 -33
  65. data/lib/active_support/core_ext/logger.rb +3 -2
  66. data/lib/active_support/core_ext/module.rb +3 -16
  67. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  68. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  69. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  70. data/lib/active_support/core_ext/module/attribute_accessors.rb +36 -41
  71. data/lib/active_support/core_ext/module/delegation.rb +1 -1
  72. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  73. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  74. data/lib/active_support/core_ext/module/loading.rb +2 -0
  75. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  76. data/lib/active_support/core_ext/name_error.rb +3 -4
  77. data/lib/active_support/core_ext/numeric.rb +1 -8
  78. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  79. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  80. data/lib/active_support/core_ext/object.rb +4 -2
  81. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  82. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  83. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  84. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  85. data/lib/active_support/core_ext/object/metaclass.rb +5 -6
  86. data/lib/active_support/core_ext/object/misc.rb +2 -93
  87. data/lib/active_support/core_ext/object/returning.rb +42 -0
  88. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  89. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  90. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  91. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  92. data/lib/active_support/core_ext/proc.rb +6 -4
  93. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  94. data/lib/active_support/core_ext/range.rb +2 -9
  95. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  96. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  97. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  98. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  99. data/lib/active_support/core_ext/regexp.rb +5 -0
  100. data/lib/active_support/core_ext/rexml.rb +12 -7
  101. data/lib/active_support/core_ext/string.rb +6 -19
  102. data/lib/active_support/core_ext/string/access.rb +88 -95
  103. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  104. data/lib/active_support/core_ext/string/conversions.rb +19 -21
  105. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  106. data/lib/active_support/core_ext/string/filters.rb +17 -23
  107. data/lib/active_support/core_ext/string/inflections.rb +146 -153
  108. data/lib/active_support/{vendor/i18n-0.4.1/i18n/core_ext/string/interpolate.rb → core_ext/string/interpolation.rb} +8 -15
  109. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  110. data/lib/active_support/core_ext/string/output_safety.rb +21 -17
  111. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -32
  112. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  113. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  114. data/lib/active_support/core_ext/time/calculations.rb +276 -308
  115. data/lib/active_support/core_ext/time/conversions.rb +78 -84
  116. data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +22 -0
  117. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  118. data/lib/active_support/core_ext/time/zones.rb +73 -81
  119. data/lib/active_support/core_ext/uri.rb +2 -1
  120. data/lib/active_support/dependencies.rb +38 -48
  121. data/lib/active_support/dependencies/autoload.rb +49 -0
  122. data/lib/active_support/deprecation.rb +9 -195
  123. data/lib/active_support/deprecation/behaviors.rb +38 -0
  124. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  125. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  126. data/lib/active_support/deprecation/reporting.rb +55 -0
  127. data/lib/active_support/duration.rb +6 -2
  128. data/lib/active_support/hash_with_indifferent_access.rb +137 -0
  129. data/lib/active_support/i18n.rb +2 -0
  130. data/lib/active_support/inflections.rb +1 -1
  131. data/lib/active_support/inflector.rb +4 -406
  132. data/lib/active_support/inflector/inflections.rb +211 -0
  133. data/lib/active_support/inflector/methods.rb +139 -0
  134. data/lib/active_support/inflector/transliterate.rb +61 -0
  135. data/lib/active_support/json/backends/jsongem.rb +16 -10
  136. data/lib/active_support/json/backends/yaml.rb +72 -2
  137. data/lib/active_support/json/decoding.rb +2 -16
  138. data/lib/active_support/json/encoding.rb +153 -33
  139. data/lib/active_support/json/variable.rb +4 -3
  140. data/lib/active_support/locale/en.yml +1 -4
  141. data/lib/active_support/memoizable.rb +7 -6
  142. data/lib/active_support/message_encryptor.rb +1 -0
  143. data/lib/active_support/message_verifier.rb +12 -29
  144. data/lib/active_support/multibyte.rb +9 -4
  145. data/lib/active_support/multibyte/chars.rb +25 -17
  146. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  147. data/lib/active_support/multibyte/utils.rb +1 -1
  148. data/lib/active_support/notifications.rb +77 -0
  149. data/lib/active_support/notifications/fanout.rb +69 -0
  150. data/lib/active_support/notifications/instrumenter.rb +50 -0
  151. data/lib/active_support/option_merger.rb +2 -0
  152. data/lib/active_support/ordered_hash.rb +33 -37
  153. data/lib/active_support/ordered_options.rb +3 -1
  154. data/lib/active_support/railtie.rb +64 -0
  155. data/lib/active_support/rescuable.rb +11 -6
  156. data/lib/active_support/ruby/shim.rb +19 -0
  157. data/lib/active_support/test_case.rb +8 -1
  158. data/lib/active_support/testing/assertions.rb +2 -14
  159. data/lib/active_support/testing/declarative.rb +31 -12
  160. data/lib/active_support/testing/deprecation.rb +8 -10
  161. data/lib/active_support/testing/isolation.rb +153 -0
  162. data/lib/active_support/testing/pending.rb +48 -0
  163. data/lib/active_support/testing/performance.rb +342 -339
  164. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  165. data/lib/active_support/time.rb +34 -0
  166. data/lib/active_support/time/autoload.rb +5 -0
  167. data/lib/active_support/time_with_zone.rb +18 -12
  168. data/lib/active_support/values/time_zone.rb +97 -93
  169. data/lib/active_support/version.rb +3 -3
  170. data/lib/active_support/whiny_nil.rb +1 -4
  171. data/lib/active_support/xml_mini.rb +2 -0
  172. data/lib/active_support/xml_mini/jdom.rb +13 -7
  173. data/lib/active_support/xml_mini/libxml.rb +19 -12
  174. data/lib/active_support/xml_mini/libxmlsax.rb +19 -9
  175. data/lib/active_support/xml_mini/nokogiri.rb +18 -12
  176. data/lib/active_support/xml_mini/nokogirisax.rb +15 -6
  177. data/lib/active_support/xml_mini/rexml.rb +24 -9
  178. metadata +94 -244
  179. data/lib/active_support/cache/drb_store.rb +0 -14
  180. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  181. data/lib/active_support/core_ext/base64.rb +0 -4
  182. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  183. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  184. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  185. data/lib/active_support/core_ext/blank.rb +0 -2
  186. data/lib/active_support/core_ext/class/removal.rb +0 -50
  187. data/lib/active_support/core_ext/date.rb +0 -10
  188. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  189. data/lib/active_support/core_ext/date_time.rb +0 -12
  190. data/lib/active_support/core_ext/duplicable.rb +0 -43
  191. data/lib/active_support/core_ext/float/time.rb +0 -27
  192. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  193. data/lib/active_support/core_ext/kernel/singleton_class.rb +0 -13
  194. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  195. data/lib/active_support/core_ext/module/remove_method.rb +0 -6
  196. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  197. data/lib/active_support/core_ext/object/extending.rb +0 -80
  198. data/lib/active_support/core_ext/object/singleton_class.rb +0 -13
  199. data/lib/active_support/core_ext/pathname.rb +0 -7
  200. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  201. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  202. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  203. data/lib/active_support/core_ext/symbol.rb +0 -14
  204. data/lib/active_support/core_ext/time.rb +0 -46
  205. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  206. data/lib/active_support/json/backends/okjson.rb +0 -644
  207. data/lib/active_support/json/backends/yajl.rb +0 -40
  208. data/lib/active_support/json/encoders/date.rb +0 -22
  209. data/lib/active_support/json/encoders/date_time.rb +0 -22
  210. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  211. data/lib/active_support/json/encoders/false_class.rb +0 -7
  212. data/lib/active_support/json/encoders/hash.rb +0 -56
  213. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  214. data/lib/active_support/json/encoders/numeric.rb +0 -21
  215. data/lib/active_support/json/encoders/object.rb +0 -10
  216. data/lib/active_support/json/encoders/regexp.rb +0 -9
  217. data/lib/active_support/json/encoders/string.rb +0 -9
  218. data/lib/active_support/json/encoders/symbol.rb +0 -5
  219. data/lib/active_support/json/encoders/time.rb +0 -22
  220. data/lib/active_support/json/encoders/true_class.rb +0 -7
  221. data/lib/active_support/vendor.rb +0 -36
  222. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  223. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  224. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  225. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  226. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  227. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  228. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  229. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  230. data/lib/active_support/vendor/i18n-0.4.1/i18n.rb +0 -322
  231. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend.rb +0 -20
  232. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record.rb +0 -61
  233. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/missing.rb +0 -65
  234. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/store_procs.rb +0 -38
  235. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/translation.rb +0 -93
  236. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/base.rb +0 -237
  237. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cache.rb +0 -77
  238. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cascade.rb +0 -57
  239. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/chain.rb +0 -77
  240. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cldr.rb +0 -100
  241. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/fallbacks.rb +0 -69
  242. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/flatten.rb +0 -113
  243. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/gettext.rb +0 -75
  244. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/interpolation_compiler.rb +0 -123
  245. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/key_value.rb +0 -102
  246. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/memoize.rb +0 -48
  247. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/metadata.rb +0 -65
  248. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/pluralization.rb +0 -57
  249. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/simple.rb +0 -87
  250. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/transliterator.rb +0 -98
  251. data/lib/active_support/vendor/i18n-0.4.1/i18n/config.rb +0 -84
  252. data/lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb +0 -29
  253. data/lib/active_support/vendor/i18n-0.4.1/i18n/exceptions.rb +0 -61
  254. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext.rb +0 -27
  255. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/helpers.rb +0 -65
  256. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/po_parser.rb +0 -329
  257. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale.rb +0 -6
  258. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/fallbacks.rb +0 -98
  259. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag.rb +0 -28
  260. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/parents.rb +0 -24
  261. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/rfc4646.rb +0 -76
  262. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/simple.rb +0 -41
  263. data/lib/active_support/vendor/i18n-0.4.1/i18n/version.rb +0 -3
  264. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  390. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  391. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  392. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  393. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  394. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  395. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  396. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  397. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  398. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  399. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  400. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  401. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  402. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  403. data/lib/activesupport.rb +0 -2
@@ -1,264 +1,264 @@
1
- require 'date'
2
- require 'active_support/core_ext/module/attribute_accessors'
1
+ require 'active_support/time'
2
+ require 'active_support/core_ext/array/wrap'
3
+ require 'active_support/core_ext/hash/reverse_merge'
4
+ require 'active_support/core_ext/object/blank'
5
+ require 'active_support/core_ext/string/inflections'
3
6
 
4
- module ActiveSupport #:nodoc:
5
- # these accessors are here because people using ActiveResource and REST to integrate with other systems
6
- # have to be able to control the default behavior of rename_key. dasherize_xml is set to true to emulate
7
- # existing behavior. In a future version it should be set to false by default.
8
- mattr_accessor :dasherize_xml
9
- mattr_accessor :camelize_xml
10
- self.dasherize_xml = true
11
- self.camelize_xml = false
12
- module CoreExtensions #:nodoc:
13
- module Hash #:nodoc:
14
- module Conversions
15
- # This module exists to decorate files deserialized using Hash.from_xml with
16
- # the <tt>original_filename</tt> and <tt>content_type</tt> methods.
17
- module FileLike #:nodoc:
18
- attr_writer :original_filename, :content_type
7
+ class Hash
8
+ # This module exists to decorate files deserialized using Hash.from_xml with
9
+ # the <tt>original_filename</tt> and <tt>content_type</tt> methods.
10
+ module FileLike #:nodoc:
11
+ attr_writer :original_filename, :content_type
19
12
 
20
- def original_filename
21
- @original_filename || 'untitled'
22
- end
23
-
24
- def content_type
25
- @content_type || 'application/octet-stream'
26
- end
27
- end
28
-
29
- DISALLOWED_XML_TYPES = %w(symbol yaml)
30
- class DisallowedType < StandardError #:nodoc:
31
- def initialize(type)
32
- super "Disallowed type attribute: #{type.inspect}"
33
- end
34
- end
35
-
36
- XML_TYPE_NAMES = {
37
- "Symbol" => "symbol",
38
- "Fixnum" => "integer",
39
- "Bignum" => "integer",
40
- "BigDecimal" => "decimal",
41
- "Float" => "float",
42
- "TrueClass" => "boolean",
43
- "FalseClass" => "boolean",
44
- "Date" => "date",
45
- "DateTime" => "datetime",
46
- "Time" => "datetime",
47
- "ActiveSupport::TimeWithZone" => "datetime"
48
- } unless defined?(XML_TYPE_NAMES)
49
-
50
- XML_FORMATTING = {
51
- "symbol" => Proc.new { |symbol| symbol.to_s },
52
- "date" => Proc.new { |date| date.to_s(:db) },
53
- "datetime" => Proc.new { |time| time.xmlschema },
54
- "binary" => Proc.new { |binary| ActiveSupport::Base64.encode64(binary) },
55
- "yaml" => Proc.new { |yaml| yaml.to_yaml }
56
- } unless defined?(XML_FORMATTING)
13
+ def original_filename
14
+ @original_filename || 'untitled'
15
+ end
57
16
 
58
- # TODO: use Time.xmlschema instead of Time.parse;
59
- # use regexp instead of Date.parse
60
- unless defined?(XML_PARSING)
61
- XML_PARSING = {
62
- "symbol" => Proc.new { |symbol| symbol.to_sym },
63
- "date" => Proc.new { |date| ::Date.parse(date) },
64
- "datetime" => Proc.new { |time| ::Time.parse(time).utc rescue ::DateTime.parse(time).utc },
65
- "integer" => Proc.new { |integer| integer.to_i },
66
- "float" => Proc.new { |float| float.to_f },
67
- "decimal" => Proc.new { |number| BigDecimal(number) },
68
- "boolean" => Proc.new { |boolean| %w(1 true).include?(boolean.strip) },
69
- "string" => Proc.new { |string| string.to_s },
70
- "yaml" => Proc.new { |yaml| YAML::load(yaml) rescue yaml },
71
- "base64Binary" => Proc.new { |bin| ActiveSupport::Base64.decode64(bin) },
72
- "file" => Proc.new do |file, entity|
73
- f = StringIO.new(ActiveSupport::Base64.decode64(file))
74
- f.extend(FileLike)
75
- f.original_filename = entity['name']
76
- f.content_type = entity['content_type']
77
- f
78
- end
79
- }
17
+ def content_type
18
+ @content_type || 'application/octet-stream'
19
+ end
20
+ end
80
21
 
81
- XML_PARSING.update(
82
- "double" => XML_PARSING["float"],
83
- "dateTime" => XML_PARSING["datetime"]
84
- )
85
- end
22
+ XML_TYPE_NAMES = {
23
+ "Symbol" => "symbol",
24
+ "Fixnum" => "integer",
25
+ "Bignum" => "integer",
26
+ "BigDecimal" => "decimal",
27
+ "Float" => "float",
28
+ "TrueClass" => "boolean",
29
+ "FalseClass" => "boolean",
30
+ "Date" => "date",
31
+ "DateTime" => "datetime",
32
+ "Time" => "datetime"
33
+ } unless defined?(XML_TYPE_NAMES)
86
34
 
87
- def self.included(klass)
88
- klass.extend(ClassMethods)
89
- end
35
+ XML_FORMATTING = {
36
+ "symbol" => Proc.new { |symbol| symbol.to_s },
37
+ "date" => Proc.new { |date| date.to_s(:db) },
38
+ "datetime" => Proc.new { |time| time.xmlschema },
39
+ "binary" => Proc.new { |binary| ActiveSupport::Base64.encode64(binary) },
40
+ "yaml" => Proc.new { |yaml| yaml.to_yaml }
41
+ } unless defined?(XML_FORMATTING)
90
42
 
91
- # Converts a hash into a string suitable for use as a URL query string. An optional <tt>namespace</tt> can be
92
- # passed to enclose the param names (see example below).
93
- #
94
- # ==== Examples
95
- # { :name => 'David', :nationality => 'Danish' }.to_query # => "name=David&nationality=Danish"
96
- #
97
- # { :name => 'David', :nationality => 'Danish' }.to_query('user') # => "user%5Bname%5D=David&user%5Bnationality%5D=Danish"
98
- def to_query(namespace = nil)
99
- collect do |key, value|
100
- value.to_query(namespace ? "#{namespace}[#{key}]" : key)
101
- end.sort * '&'
102
- end
103
-
104
- alias_method :to_param, :to_query
43
+ # TODO: use Time.xmlschema instead of Time.parse;
44
+ # use regexp instead of Date.parse
45
+ unless defined?(XML_PARSING)
46
+ XML_PARSING = {
47
+ "symbol" => Proc.new { |symbol| symbol.to_sym },
48
+ "date" => Proc.new { |date| ::Date.parse(date) },
49
+ "datetime" => Proc.new { |time| ::Time.parse(time).utc rescue ::DateTime.parse(time).utc },
50
+ "integer" => Proc.new { |integer| integer.to_i },
51
+ "float" => Proc.new { |float| float.to_f },
52
+ "decimal" => Proc.new { |number| BigDecimal(number) },
53
+ "boolean" => Proc.new { |boolean| %w(1 true).include?(boolean.strip) },
54
+ "string" => Proc.new { |string| string.to_s },
55
+ "yaml" => Proc.new { |yaml| YAML::load(yaml) rescue yaml },
56
+ "base64Binary" => Proc.new { |bin| ActiveSupport::Base64.decode64(bin) },
57
+ "file" => Proc.new do |file, entity|
58
+ f = StringIO.new(ActiveSupport::Base64.decode64(file))
59
+ f.extend(FileLike)
60
+ f.original_filename = entity['name']
61
+ f.content_type = entity['content_type']
62
+ f
63
+ end
64
+ }
105
65
 
106
- def to_xml(options = {})
107
- require 'builder' unless defined?(Builder)
66
+ XML_PARSING.update(
67
+ "double" => XML_PARSING["float"],
68
+ "dateTime" => XML_PARSING["datetime"]
69
+ )
70
+ end
108
71
 
109
- options = options.dup
110
- options[:indent] ||= 2
111
- options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]),
112
- :root => "hash" })
113
- options[:builder].instruct! unless options.delete(:skip_instruct)
114
- root = rename_key(options[:root].to_s, options)
72
+ # Returns a string containing an XML representation of its receiver:
73
+ #
74
+ # {"foo" => 1, "bar" => 2}.to_xml
75
+ # # =>
76
+ # # <?xml version="1.0" encoding="UTF-8"?>
77
+ # # <hash>
78
+ # # <foo type="integer">1</foo>
79
+ # # <bar type="integer">2</bar>
80
+ # # </hash>
81
+ #
82
+ # To do so, the method loops over the pairs and builds nodes that depend on
83
+ # the _values_. Given a pair +key+, +value+:
84
+ #
85
+ # * If +value+ is a hash there's a recursive call with +key+ as <tt>:root</tt>.
86
+ #
87
+ # * If +value+ is an array there's a recursive call with +key+ as <tt>:root</tt>,
88
+ # and +key+ singularized as <tt>:children</tt>.
89
+ #
90
+ # * If +value+ is a callable object it must expect one or two arguments. Depending
91
+ # on the arity, the callable is invoked with the +options+ hash as first argument
92
+ # with +key+ as <tt>:root</tt>, and +key+ singularized as second argument. Its
93
+ # return value becomes a new node.
94
+ #
95
+ # * If +value+ responds to +to_xml+ the method is invoked with +key+ as <tt>:root</tt>.
96
+ #
97
+ # * Otherwise, a node with +key+ as tag is created with a string representation of
98
+ # +value+ as text node. If +value+ is +nil+ an attribute "nil" set to "true" is added.
99
+ # Unless the option <tt>:skip_types</tt> exists and is true, an attribute "type" is
100
+ # added as well according to the following mapping:
101
+ #
102
+ # XML_TYPE_NAMES = {
103
+ # "Symbol" => "symbol",
104
+ # "Fixnum" => "integer",
105
+ # "Bignum" => "integer",
106
+ # "BigDecimal" => "decimal",
107
+ # "Float" => "float",
108
+ # "TrueClass" => "boolean",
109
+ # "FalseClass" => "boolean",
110
+ # "Date" => "date",
111
+ # "DateTime" => "datetime",
112
+ # "Time" => "datetime"
113
+ # }
114
+ #
115
+ # By default the root node is "hash", but that's configurable via the <tt>:root</tt> option.
116
+ #
117
+ # The default XML builder is a fresh instance of <tt>Builder::XmlMarkup</tt>. You can
118
+ # configure your own builder with the <tt>:builder</tt> option. The method also accepts
119
+ # options like <tt>:dasherize</tt> and friends, they are forwarded to the builder.
120
+ def to_xml(options = {})
121
+ require 'builder' unless defined?(Builder)
115
122
 
116
- options[:builder].__send__(:method_missing, root) do
117
- each do |key, value|
118
- case value
119
- when ::Hash
120
- value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
121
- when ::Array
122
- value.to_xml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
123
- when ::Method, ::Proc
124
- # If the Method or Proc takes two arguments, then
125
- # pass the suggested child element name. This is
126
- # used if the Method or Proc will be operating over
127
- # multiple records and needs to create an containing
128
- # element that will contain the objects being
129
- # serialized.
130
- if 1 == value.arity
131
- value.call(options.merge({ :root => key, :skip_instruct => true }))
132
- else
133
- value.call(options.merge({ :root => key, :skip_instruct => true }), key.to_s.singularize)
134
- end
135
- else
136
- if value.respond_to?(:to_xml)
137
- value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
138
- else
139
- type_name = XML_TYPE_NAMES[value.class.name]
123
+ options = options.dup
124
+ options[:indent] ||= 2
125
+ options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]),
126
+ :root => "hash" })
127
+ options[:builder].instruct! unless options.delete(:skip_instruct)
128
+ root = rename_key(options[:root].to_s, options)
140
129
 
141
- key = rename_key(key.to_s, options)
130
+ options[:builder].__send__(:method_missing, root) do
131
+ each do |key, value|
132
+ case value
133
+ when ::Hash
134
+ value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
135
+ when ::Array
136
+ value.to_xml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
137
+ when ::Method, ::Proc
138
+ # If the Method or Proc takes two arguments, then
139
+ # pass the suggested child element name. This is
140
+ # used if the Method or Proc will be operating over
141
+ # multiple records and needs to create an containing
142
+ # element that will contain the objects being
143
+ # serialized.
144
+ if 1 == value.arity
145
+ value.call(options.merge({ :root => key, :skip_instruct => true }))
146
+ else
147
+ value.call(options.merge({ :root => key, :skip_instruct => true }), key.to_s.singularize)
148
+ end
149
+ else
150
+ if value.respond_to?(:to_xml)
151
+ value.to_xml(options.merge({ :root => key, :skip_instruct => true }))
152
+ else
153
+ type_name = XML_TYPE_NAMES[value.class.name]
142
154
 
143
- attributes = options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
144
- if value.nil?
145
- attributes[:nil] = true
146
- end
155
+ key = rename_key(key.to_s, options)
147
156
 
148
- options[:builder].tag!(key,
149
- XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
150
- attributes
151
- )
152
- end
157
+ attributes = options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
158
+ if value.nil?
159
+ attributes[:nil] = true
153
160
  end
154
- end
155
-
156
- yield options[:builder] if block_given?
157
- end
158
-
159
- end
160
161
 
161
- def rename_key(key, options = {})
162
- camelize = options.has_key?(:camelize) ? options[:camelize] : ActiveSupport.camelize_xml
163
- dasherize = options.has_key?(:dasherize) ? options[:dasherize] : ActiveSupport.dasherize_xml
164
- key = key.camelize if camelize
165
- key = key.dasherize if dasherize
166
- key
162
+ options[:builder].tag!(key,
163
+ XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
164
+ attributes
165
+ )
166
+ end
167
167
  end
168
+ end
169
+
170
+ yield options[:builder] if block_given?
171
+ end
168
172
 
169
- module ClassMethods
170
- def from_xml(xml, disallowed_types = nil)
171
- typecast_xml_value(unrename_keys(XmlMini.parse(xml)), disallowed_types)
172
- end
173
-
174
- def from_trusted_xml(xml)
175
- from_xml xml, []
176
- end
173
+ end
177
174
 
178
- private
179
- def typecast_xml_value(value, disallowed_types = nil)
180
- disallowed_types ||= DISALLOWED_XML_TYPES
175
+ def rename_key(key, options = {})
176
+ camelize = options.has_key?(:camelize) && options[:camelize]
177
+ dasherize = !options.has_key?(:dasherize) || options[:dasherize]
178
+ key = key.camelize if camelize
179
+ dasherize ? key.dasherize : key
180
+ end
181
181
 
182
- case value.class.to_s
183
- when 'Hash'
184
- if value.include?('type') && !value['type'].is_a?(Hash) && disallowed_types.include?(value['type'])
185
- raise DisallowedType, value['type']
186
- end
182
+ class << self
183
+ def from_xml(xml)
184
+ typecast_xml_value(unrename_keys(ActiveSupport::XmlMini.parse(xml)))
185
+ end
187
186
 
188
- if value['type'] == 'array'
189
- child_key, entries = value.detect { |k,v| k != 'type' } # child_key is throwaway
190
- if entries.nil? || (c = value['__content__'] && c.blank?)
191
- []
192
- else
193
- case entries.class.to_s # something weird with classes not matching here. maybe singleton methods breaking is_a?
194
- when "Array"
195
- entries.collect { |v| typecast_xml_value(v, disallowed_types) }
196
- when "Hash"
197
- [typecast_xml_value(entries, disallowed_types)]
198
- else
199
- raise "can't typecast #{entries.inspect}"
200
- end
201
- end
202
- elsif value.has_key?("__content__")
203
- content = value["__content__"]
204
- if parser = XML_PARSING[value["type"]]
205
- if parser.arity == 2
206
- XML_PARSING[value["type"]].call(content, value)
207
- else
208
- XML_PARSING[value["type"]].call(content)
209
- end
210
- else
211
- content
212
- end
213
- elsif value['type'] == 'string' && value['nil'] != 'true'
214
- ""
215
- # blank or nil parsed values are represented by nil
216
- elsif value.blank? || value['nil'] == 'true'
217
- nil
218
- # If the type is the only element which makes it then
219
- # this still makes the value nil, except if type is
220
- # a XML node(where type['value'] is a Hash)
221
- elsif value['type'] && value.size == 1 && !value['type'].is_a?(::Hash)
222
- nil
223
- else
224
- xml_value = value.inject({}) do |h,(k,v)|
225
- h[k] = typecast_xml_value(v, disallowed_types)
226
- h
227
- end
228
-
229
- # Turn { :files => { :file => #<StringIO> } into { :files => #<StringIO> } so it is compatible with
230
- # how multipart uploaded files from HTML appear
231
- xml_value["file"].is_a?(StringIO) ? xml_value["file"] : xml_value
232
- end
233
- when 'Array'
234
- value.map! { |i| typecast_xml_value(i, disallowed_types) }
235
- case value.length
236
- when 0 then nil
237
- when 1 then value.first
238
- else value
239
- end
240
- when 'String'
241
- value
187
+ private
188
+ def typecast_xml_value(value)
189
+ case value.class.to_s
190
+ when 'Hash'
191
+ if value['type'] == 'array'
192
+ child_key, entries = Array.wrap(value.detect { |k,v| k != 'type' }) # child_key is throwaway
193
+ if entries.nil? || (c = value['__content__'] && c.blank?)
194
+ []
195
+ else
196
+ case entries.class.to_s # something weird with classes not matching here. maybe singleton methods breaking is_a?
197
+ when "Array"
198
+ entries.collect { |v| typecast_xml_value(v) }
199
+ when "Hash"
200
+ [typecast_xml_value(entries)]
242
201
  else
243
- raise "can't typecast #{value.class.name} - #{value.inspect}"
202
+ raise "can't typecast #{entries.inspect}"
203
+ end
244
204
  end
245
- end
246
-
247
- def unrename_keys(params)
248
- case params.class.to_s
249
- when "Hash"
250
- params.inject({}) do |h,(k,v)|
251
- h[k.to_s.tr("-", "_")] = unrename_keys(v)
252
- h
253
- end
254
- when "Array"
255
- params.map { |v| unrename_keys(v) }
205
+ elsif value.has_key?("__content__")
206
+ content = value["__content__"]
207
+ if parser = XML_PARSING[value["type"]]
208
+ if parser.arity == 2
209
+ XML_PARSING[value["type"]].call(content, value)
256
210
  else
257
- params
211
+ XML_PARSING[value["type"]].call(content)
212
+ end
213
+ else
214
+ content
258
215
  end
216
+ elsif value['type'] == 'string' && value['nil'] != 'true'
217
+ ""
218
+ # blank or nil parsed values are represented by nil
219
+ elsif value.blank? || value['nil'] == 'true'
220
+ nil
221
+ # If the type is the only element which makes it then
222
+ # this still makes the value nil, except if type is
223
+ # a XML node(where type['value'] is a Hash)
224
+ elsif value['type'] && value.size == 1 && !value['type'].is_a?(::Hash)
225
+ nil
226
+ else
227
+ xml_value = value.inject({}) do |h,(k,v)|
228
+ h[k] = typecast_xml_value(v)
229
+ h
230
+ end
231
+
232
+ # Turn { :files => { :file => #<StringIO> } into { :files => #<StringIO> } so it is compatible with
233
+ # how multipart uploaded files from HTML appear
234
+ xml_value["file"].is_a?(StringIO) ? xml_value["file"] : xml_value
235
+ end
236
+ when 'Array'
237
+ value.map! { |i| typecast_xml_value(i) }
238
+ case value.length
239
+ when 0 then nil
240
+ when 1 then value.first
241
+ else value
259
242
  end
243
+ when 'String'
244
+ value
245
+ else
246
+ raise "can't typecast #{value.class.name} - #{value.inspect}"
247
+ end
248
+ end
249
+
250
+ def unrename_keys(params)
251
+ case params.class.to_s
252
+ when "Hash"
253
+ params.inject({}) do |h,(k,v)|
254
+ h[k.to_s.tr("-", "_")] = unrename_keys(v)
255
+ h
256
+ end
257
+ when "Array"
258
+ params.map { |v| unrename_keys(v) }
259
+ else
260
+ params
260
261
  end
261
262
  end
262
- end
263
263
  end
264
264
  end