mack-active_record 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. data/lib/mack-active_record/test_extensions.rb +0 -3
  2. metadata +3 -374
  3. data/lib/gems/activesupport-2.2.2/lib/active_support/base64.rb +0 -33
  4. data/lib/gems/activesupport-2.2.2/lib/active_support/basic_object.rb +0 -24
  5. data/lib/gems/activesupport-2.2.2/lib/active_support/buffered_logger.rb +0 -122
  6. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/compressed_mem_cache_store.rb +0 -20
  7. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/drb_store.rb +0 -15
  8. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/file_store.rb +0 -72
  9. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/mem_cache_store.rb +0 -127
  10. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/memory_store.rb +0 -52
  11. data/lib/gems/activesupport-2.2.2/lib/active_support/cache/synchronized_memory_store.rb +0 -47
  12. data/lib/gems/activesupport-2.2.2/lib/active_support/cache.rb +0 -223
  13. data/lib/gems/activesupport-2.2.2/lib/active_support/callbacks.rb +0 -280
  14. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array/access.rb +0 -53
  15. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array/conversions.rb +0 -183
  16. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array/extract_options.rb +0 -20
  17. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array/grouping.rb +0 -106
  18. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array/random_access.rb +0 -12
  19. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/array.rb +0 -13
  20. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/base64/encoding.rb +0 -16
  21. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/base64.rb +0 -4
  22. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/benchmark.rb +0 -12
  23. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  24. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/bigdecimal.rb +0 -6
  25. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/blank.rb +0 -58
  26. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +0 -14
  27. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/cgi.rb +0 -5
  28. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/class/attribute_accessors.rb +0 -54
  29. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/class/delegating_attributes.rb +0 -46
  30. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/class/inheritable_attributes.rb +0 -140
  31. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/class/removal.rb +0 -50
  32. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/class.rb +0 -4
  33. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date/behavior.rb +0 -42
  34. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date/calculations.rb +0 -230
  35. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date/conversions.rb +0 -107
  36. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date.rb +0 -10
  37. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date_time/calculations.rb +0 -126
  38. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date_time/conversions.rb +0 -96
  39. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/date_time.rb +0 -12
  40. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/duplicable.rb +0 -43
  41. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/enumerable.rb +0 -107
  42. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/exception.rb +0 -41
  43. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/file/atomic.rb +0 -46
  44. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/file.rb +0 -5
  45. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/float/rounding.rb +0 -24
  46. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/float/time.rb +0 -27
  47. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/float.rb +0 -7
  48. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/conversions.rb +0 -259
  49. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/deep_merge.rb +0 -23
  50. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/diff.rb +0 -19
  51. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/except.rb +0 -25
  52. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/indifferent_access.rb +0 -137
  53. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/keys.rb +0 -52
  54. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/reverse_merge.rb +0 -35
  55. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash/slice.rb +0 -33
  56. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/hash.rb +0 -14
  57. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  58. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/integer/inflections.rb +0 -20
  59. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/integer/time.rb +0 -45
  60. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/integer.rb +0 -9
  61. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel/agnostics.rb +0 -11
  62. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
  63. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel/debugger.rb +0 -13
  64. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel/reporting.rb +0 -59
  65. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel/requires.rb +0 -24
  66. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/kernel.rb +0 -5
  67. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/load_error.rb +0 -38
  68. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/logger.rb +0 -143
  69. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/aliasing.rb +0 -74
  70. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/attr_accessor_with_default.rb +0 -31
  71. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/attr_internal.rb +0 -32
  72. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/attribute_accessors.rb +0 -58
  73. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/delegation.rb +0 -95
  74. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/inclusion.rb +0 -30
  75. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/introspection.rb +0 -90
  76. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/loading.rb +0 -23
  77. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/model_naming.rb +0 -23
  78. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module/synchronization.rb +0 -39
  79. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/module.rb +0 -23
  80. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/name_error.rb +0 -17
  81. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/numeric/bytes.rb +0 -44
  82. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  83. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/numeric/time.rb +0 -81
  84. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/numeric.rb +0 -9
  85. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object/conversions.rb +0 -14
  86. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object/extending.rb +0 -80
  87. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object/instance_variables.rb +0 -74
  88. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object/metaclass.rb +0 -13
  89. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object/misc.rb +0 -74
  90. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/object.rb +0 -5
  91. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  92. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/pathname.rb +0 -7
  93. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/proc.rb +0 -12
  94. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/process/daemon.rb +0 -25
  95. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/process.rb +0 -1
  96. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/range/blockless_step.rb +0 -32
  97. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/range/conversions.rb +0 -27
  98. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/range/include_range.rb +0 -30
  99. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/range/overlaps.rb +0 -15
  100. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/range.rb +0 -11
  101. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/rexml.rb +0 -36
  102. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/access.rb +0 -82
  103. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/behavior.rb +0 -13
  104. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/conversions.rb +0 -28
  105. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/filters.rb +0 -26
  106. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/inflections.rb +0 -167
  107. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/iterators.rb +0 -21
  108. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/multibyte.rb +0 -81
  109. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/starts_ends_with.rb +0 -35
  110. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string/xchar.rb +0 -11
  111. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/string.rb +0 -22
  112. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/symbol.rb +0 -14
  113. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/time/behavior.rb +0 -13
  114. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/time/calculations.rb +0 -303
  115. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/time/conversions.rb +0 -90
  116. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/time/zones.rb +0 -86
  117. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext/time.rb +0 -42
  118. data/lib/gems/activesupport-2.2.2/lib/active_support/core_ext.rb +0 -4
  119. data/lib/gems/activesupport-2.2.2/lib/active_support/dependencies.rb +0 -621
  120. data/lib/gems/activesupport-2.2.2/lib/active_support/deprecation.rb +0 -243
  121. data/lib/gems/activesupport-2.2.2/lib/active_support/duration.rb +0 -96
  122. data/lib/gems/activesupport-2.2.2/lib/active_support/gzip.rb +0 -25
  123. data/lib/gems/activesupport-2.2.2/lib/active_support/inflections.rb +0 -55
  124. data/lib/gems/activesupport-2.2.2/lib/active_support/inflector.rb +0 -397
  125. data/lib/gems/activesupport-2.2.2/lib/active_support/json/decoding.rb +0 -63
  126. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/date.rb +0 -21
  127. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/date_time.rb +0 -21
  128. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/enumerable.rb +0 -12
  129. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/false_class.rb +0 -5
  130. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/hash.rb +0 -47
  131. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/nil_class.rb +0 -5
  132. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/numeric.rb +0 -5
  133. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/object.rb +0 -6
  134. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/regexp.rb +0 -5
  135. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/string.rb +0 -36
  136. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/symbol.rb +0 -5
  137. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/time.rb +0 -21
  138. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoders/true_class.rb +0 -5
  139. data/lib/gems/activesupport-2.2.2/lib/active_support/json/encoding.rb +0 -37
  140. data/lib/gems/activesupport-2.2.2/lib/active_support/json/variable.rb +0 -10
  141. data/lib/gems/activesupport-2.2.2/lib/active_support/json.rb +0 -23
  142. data/lib/gems/activesupport-2.2.2/lib/active_support/locale/en.yml +0 -32
  143. data/lib/gems/activesupport-2.2.2/lib/active_support/memoizable.rb +0 -82
  144. data/lib/gems/activesupport-2.2.2/lib/active_support/multibyte/chars.rb +0 -679
  145. data/lib/gems/activesupport-2.2.2/lib/active_support/multibyte/exceptions.rb +0 -8
  146. data/lib/gems/activesupport-2.2.2/lib/active_support/multibyte/unicode_database.rb +0 -71
  147. data/lib/gems/activesupport-2.2.2/lib/active_support/multibyte.rb +0 -33
  148. data/lib/gems/activesupport-2.2.2/lib/active_support/option_merger.rb +0 -17
  149. data/lib/gems/activesupport-2.2.2/lib/active_support/ordered_hash.rb +0 -58
  150. data/lib/gems/activesupport-2.2.2/lib/active_support/ordered_options.rb +0 -19
  151. data/lib/gems/activesupport-2.2.2/lib/active_support/rescuable.rb +0 -108
  152. data/lib/gems/activesupport-2.2.2/lib/active_support/secure_random.rb +0 -197
  153. data/lib/gems/activesupport-2.2.2/lib/active_support/string_inquirer.rb +0 -21
  154. data/lib/gems/activesupport-2.2.2/lib/active_support/test_case.rb +0 -24
  155. data/lib/gems/activesupport-2.2.2/lib/active_support/testing/core_ext/test/unit/assertions.rb +0 -72
  156. data/lib/gems/activesupport-2.2.2/lib/active_support/testing/core_ext/test.rb +0 -6
  157. data/lib/gems/activesupport-2.2.2/lib/active_support/testing/default.rb +0 -9
  158. data/lib/gems/activesupport-2.2.2/lib/active_support/testing/performance.rb +0 -452
  159. data/lib/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb +0 -120
  160. data/lib/gems/activesupport-2.2.2/lib/active_support/time_with_zone.rb +0 -328
  161. data/lib/gems/activesupport-2.2.2/lib/active_support/values/time_zone.rb +0 -403
  162. data/lib/gems/activesupport-2.2.2/lib/active_support/values/unicode_tables.dat +0 -0
  163. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  164. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  165. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  166. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  167. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  168. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  169. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  170. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  171. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/i18n-0.0.1/i18n/backend/simple.rb +0 -216
  172. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/i18n-0.0.1/i18n/exceptions.rb +0 -53
  173. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/i18n-0.0.1/i18n.rb +0 -194
  174. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb +0 -849
  175. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  176. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  177. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  178. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  179. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  180. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  181. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  182. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  183. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  184. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  185. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  186. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  187. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  188. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  189. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  190. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  191. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  192. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  193. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  194. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  195. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  196. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  197. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  198. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  199. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  200. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  201. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  202. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  203. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  204. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  205. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  206. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  207. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  208. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  209. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  210. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  211. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  212. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  213. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  214. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  215. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  216. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  217. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  218. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  219. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  220. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  221. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  222. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  223. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  224. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  225. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  226. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  227. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  228. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  229. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  230. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  231. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  232. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  233. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  234. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  235. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  236. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  237. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  238. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  239. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  240. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  241. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  242. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  243. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  244. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  245. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  246. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  247. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  248. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  249. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  250. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  251. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  252. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  253. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  254. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  255. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  256. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  257. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  258. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  259. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  260. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  261. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  262. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  263. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  264. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  265. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  266. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  267. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  268. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  269. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  270. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  271. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  272. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  273. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  274. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  275. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  276. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  277. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  278. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  279. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  280. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  281. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  282. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  283. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  284. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  285. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  286. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  287. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  288. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  289. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  290. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  291. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  292. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  293. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  294. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  295. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  296. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  297. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  298. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  299. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  300. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  301. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  302. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  303. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  304. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  305. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  306. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  307. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  308. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  309. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  310. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  311. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  312. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  313. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb +0 -1021
  314. data/lib/gems/activesupport-2.2.2/lib/active_support/vendor.rb +0 -34
  315. data/lib/gems/activesupport-2.2.2/lib/active_support/version.rb +0 -9
  316. data/lib/gems/activesupport-2.2.2/lib/active_support/whiny_nil.rb +0 -58
  317. data/lib/gems/activesupport-2.2.2/lib/active_support.rb +0 -61
  318. data/lib/gems/activesupport-2.2.2/lib/activesupport.rb +0 -1
@@ -1,1021 +0,0 @@
1
- # = XmlSimple
2
- #
3
- # Author:: Maik Schmidt <contact@maik-schmidt.de>
4
- # Copyright:: Copyright (c) 2003-2006 Maik Schmidt
5
- # License:: Distributes under the same terms as Ruby.
6
- #
7
- require 'rexml/document'
8
- require 'stringio'
9
-
10
- # Easy API to maintain XML (especially configuration files).
11
- class XmlSimple
12
- include REXML
13
-
14
- @@VERSION = '1.0.11'
15
-
16
- # A simple cache for XML documents that were already transformed
17
- # by xml_in.
18
- class Cache
19
- # Creates and initializes a new Cache object.
20
- def initialize
21
- @mem_share_cache = {}
22
- @mem_copy_cache = {}
23
- end
24
-
25
- # Saves a data structure into a file.
26
- #
27
- # data::
28
- # Data structure to be saved.
29
- # filename::
30
- # Name of the file belonging to the data structure.
31
- def save_storable(data, filename)
32
- cache_file = get_cache_filename(filename)
33
- File.open(cache_file, "w+") { |f| Marshal.dump(data, f) }
34
- end
35
-
36
- # Restores a data structure from a file. If restoring the data
37
- # structure failed for any reason, nil will be returned.
38
- #
39
- # filename::
40
- # Name of the file belonging to the data structure.
41
- def restore_storable(filename)
42
- cache_file = get_cache_filename(filename)
43
- return nil unless File::exist?(cache_file)
44
- return nil unless File::mtime(cache_file).to_i > File::mtime(filename).to_i
45
- data = nil
46
- File.open(cache_file) { |f| data = Marshal.load(f) }
47
- data
48
- end
49
-
50
- # Saves a data structure in a shared memory cache.
51
- #
52
- # data::
53
- # Data structure to be saved.
54
- # filename::
55
- # Name of the file belonging to the data structure.
56
- def save_mem_share(data, filename)
57
- @mem_share_cache[filename] = [Time::now.to_i, data]
58
- end
59
-
60
- # Restores a data structure from a shared memory cache. You
61
- # should consider these elements as "read only". If restoring
62
- # the data structure failed for any reason, nil will be
63
- # returned.
64
- #
65
- # filename::
66
- # Name of the file belonging to the data structure.
67
- def restore_mem_share(filename)
68
- get_from_memory_cache(filename, @mem_share_cache)
69
- end
70
-
71
- # Copies a data structure to a memory cache.
72
- #
73
- # data::
74
- # Data structure to be copied.
75
- # filename::
76
- # Name of the file belonging to the data structure.
77
- def save_mem_copy(data, filename)
78
- @mem_share_cache[filename] = [Time::now.to_i, Marshal.dump(data)]
79
- end
80
-
81
- # Restores a data structure from a memory cache. If restoring
82
- # the data structure failed for any reason, nil will be
83
- # returned.
84
- #
85
- # filename::
86
- # Name of the file belonging to the data structure.
87
- def restore_mem_copy(filename)
88
- data = get_from_memory_cache(filename, @mem_share_cache)
89
- data = Marshal.load(data) unless data.nil?
90
- data
91
- end
92
-
93
- private
94
-
95
- # Returns the "cache filename" belonging to a filename, i.e.
96
- # the extension '.xml' in the original filename will be replaced
97
- # by '.stor'. If filename does not have this extension, '.stor'
98
- # will be appended.
99
- #
100
- # filename::
101
- # Filename to get "cache filename" for.
102
- def get_cache_filename(filename)
103
- filename.sub(/(\.xml)?$/, '.stor')
104
- end
105
-
106
- # Returns a cache entry from a memory cache belonging to a
107
- # certain filename. If no entry could be found for any reason,
108
- # nil will be returned.
109
- #
110
- # filename::
111
- # Name of the file the cache entry belongs to.
112
- # cache::
113
- # Memory cache to get entry from.
114
- def get_from_memory_cache(filename, cache)
115
- return nil unless cache[filename]
116
- return nil unless cache[filename][0] > File::mtime(filename).to_i
117
- return cache[filename][1]
118
- end
119
- end
120
-
121
- # Create a "global" cache.
122
- @@cache = Cache.new
123
-
124
- # Creates and initializes a new XmlSimple object.
125
- #
126
- # defaults::
127
- # Default values for options.
128
- def initialize(defaults = nil)
129
- unless defaults.nil? || defaults.instance_of?(Hash)
130
- raise ArgumentError, "Options have to be a Hash."
131
- end
132
- @default_options = normalize_option_names(defaults, (KNOWN_OPTIONS['in'] + KNOWN_OPTIONS['out']).uniq)
133
- @options = Hash.new
134
- @_var_values = nil
135
- end
136
-
137
- # Converts an XML document in the same way as the Perl module XML::Simple.
138
- #
139
- # string::
140
- # XML source. Could be one of the following:
141
- #
142
- # - nil: Tries to load and parse '<scriptname>.xml'.
143
- # - filename: Tries to load and parse filename.
144
- # - IO object: Reads from object until EOF is detected and parses result.
145
- # - XML string: Parses string.
146
- #
147
- # options::
148
- # Options to be used.
149
- def xml_in(string = nil, options = nil)
150
- handle_options('in', options)
151
-
152
- # If no XML string or filename was supplied look for scriptname.xml.
153
- if string.nil?
154
- string = File::basename($0)
155
- string.sub!(/\.[^.]+$/, '')
156
- string += '.xml'
157
-
158
- directory = File::dirname($0)
159
- @options['searchpath'].unshift(directory) unless directory.nil?
160
- end
161
-
162
- if string.instance_of?(String)
163
- if string =~ /<.*?>/m
164
- @doc = parse(string)
165
- elsif string == '-'
166
- @doc = parse($stdin.readlines.to_s)
167
- else
168
- filename = find_xml_file(string, @options['searchpath'])
169
-
170
- if @options.has_key?('cache')
171
- @options['cache'].each { |scheme|
172
- case(scheme)
173
- when 'storable'
174
- content = @@cache.restore_storable(filename)
175
- when 'mem_share'
176
- content = @@cache.restore_mem_share(filename)
177
- when 'mem_copy'
178
- content = @@cache.restore_mem_copy(filename)
179
- else
180
- raise ArgumentError, "Unsupported caching scheme: <#{scheme}>."
181
- end
182
- return content if content
183
- }
184
- end
185
-
186
- @doc = load_xml_file(filename)
187
- end
188
- elsif string.kind_of?(IO) || string.kind_of?(StringIO)
189
- @doc = parse(string.readlines.to_s)
190
- else
191
- raise ArgumentError, "Could not parse object of type: <#{string.type}>."
192
- end
193
-
194
- result = collapse(@doc.root)
195
- result = @options['keeproot'] ? merge({}, @doc.root.name, result) : result
196
- put_into_cache(result, filename)
197
- result
198
- end
199
-
200
- # This is the functional version of the instance method xml_in.
201
- def XmlSimple.xml_in(string = nil, options = nil)
202
- xml_simple = XmlSimple.new
203
- xml_simple.xml_in(string, options)
204
- end
205
-
206
- # Converts a data structure into an XML document.
207
- #
208
- # ref::
209
- # Reference to data structure to be converted into XML.
210
- # options::
211
- # Options to be used.
212
- def xml_out(ref, options = nil)
213
- handle_options('out', options)
214
- if ref.instance_of?(Array)
215
- ref = { @options['anonymoustag'] => ref }
216
- end
217
-
218
- if @options['keeproot']
219
- keys = ref.keys
220
- if keys.size == 1
221
- ref = ref[keys[0]]
222
- @options['rootname'] = keys[0]
223
- end
224
- elsif @options['rootname'] == ''
225
- if ref.instance_of?(Hash)
226
- refsave = ref
227
- ref = {}
228
- refsave.each { |key, value|
229
- if !scalar(value)
230
- ref[key] = value
231
- else
232
- ref[key] = [ value.to_s ]
233
- end
234
- }
235
- end
236
- end
237
-
238
- @ancestors = []
239
- xml = value_to_xml(ref, @options['rootname'], '')
240
- @ancestors = nil
241
-
242
- if @options['xmldeclaration']
243
- xml = @options['xmldeclaration'] + "\n" + xml
244
- end
245
-
246
- if @options.has_key?('outputfile')
247
- if @options['outputfile'].kind_of?(IO)
248
- return @options['outputfile'].write(xml)
249
- else
250
- File.open(@options['outputfile'], "w") { |file| file.write(xml) }
251
- end
252
- end
253
- xml
254
- end
255
-
256
- # This is the functional version of the instance method xml_out.
257
- def XmlSimple.xml_out(hash, options = nil)
258
- xml_simple = XmlSimple.new
259
- xml_simple.xml_out(hash, options)
260
- end
261
-
262
- private
263
-
264
- # Declare options that are valid for xml_in and xml_out.
265
- KNOWN_OPTIONS = {
266
- 'in' => %w(
267
- keyattr keeproot forcecontent contentkey noattr
268
- searchpath forcearray suppressempty anonymoustag
269
- cache grouptags normalisespace normalizespace
270
- variables varattr keytosymbol
271
- ),
272
- 'out' => %w(
273
- keyattr keeproot contentkey noattr rootname
274
- xmldeclaration outputfile noescape suppressempty
275
- anonymoustag indent grouptags noindent
276
- )
277
- }
278
-
279
- # Define some reasonable defaults.
280
- DEF_KEY_ATTRIBUTES = []
281
- DEF_ROOT_NAME = 'opt'
282
- DEF_CONTENT_KEY = 'content'
283
- DEF_XML_DECLARATION = "<?xml version='1.0' standalone='yes'?>"
284
- DEF_ANONYMOUS_TAG = 'anon'
285
- DEF_FORCE_ARRAY = true
286
- DEF_INDENTATION = ' '
287
- DEF_KEY_TO_SYMBOL = false
288
-
289
- # Normalizes option names in a hash, i.e., turns all
290
- # characters to lower case and removes all underscores.
291
- # Additionally, this method checks, if an unknown option
292
- # was used and raises an according exception.
293
- #
294
- # options::
295
- # Hash to be normalized.
296
- # known_options::
297
- # List of known options.
298
- def normalize_option_names(options, known_options)
299
- return nil if options.nil?
300
- result = Hash.new
301
- options.each { |key, value|
302
- lkey = key.downcase
303
- lkey.gsub!(/_/, '')
304
- if !known_options.member?(lkey)
305
- raise ArgumentError, "Unrecognised option: #{lkey}."
306
- end
307
- result[lkey] = value
308
- }
309
- result
310
- end
311
-
312
- # Merges a set of options with the default options.
313
- #
314
- # direction::
315
- # 'in': If options should be handled for xml_in.
316
- # 'out': If options should be handled for xml_out.
317
- # options::
318
- # Options to be merged with the default options.
319
- def handle_options(direction, options)
320
- @options = options || Hash.new
321
-
322
- raise ArgumentError, "Options must be a Hash!" unless @options.instance_of?(Hash)
323
-
324
- unless KNOWN_OPTIONS.has_key?(direction)
325
- raise ArgumentError, "Unknown direction: <#{direction}>."
326
- end
327
-
328
- known_options = KNOWN_OPTIONS[direction]
329
- @options = normalize_option_names(@options, known_options)
330
-
331
- unless @default_options.nil?
332
- known_options.each { |option|
333
- unless @options.has_key?(option)
334
- if @default_options.has_key?(option)
335
- @options[option] = @default_options[option]
336
- end
337
- end
338
- }
339
- end
340
-
341
- unless @options.has_key?('noattr')
342
- @options['noattr'] = false
343
- end
344
-
345
- if @options.has_key?('rootname')
346
- @options['rootname'] = '' if @options['rootname'].nil?
347
- else
348
- @options['rootname'] = DEF_ROOT_NAME
349
- end
350
-
351
- if @options.has_key?('xmldeclaration') && @options['xmldeclaration'] == true
352
- @options['xmldeclaration'] = DEF_XML_DECLARATION
353
- end
354
-
355
- @options['keytosymbol'] = DEF_KEY_TO_SYMBOL unless @options.has_key?('keytosymbol')
356
-
357
- if @options.has_key?('contentkey')
358
- if @options['contentkey'] =~ /^-(.*)$/
359
- @options['contentkey'] = $1
360
- @options['collapseagain'] = true
361
- end
362
- else
363
- @options['contentkey'] = DEF_CONTENT_KEY
364
- end
365
-
366
- unless @options.has_key?('normalisespace')
367
- @options['normalisespace'] = @options['normalizespace']
368
- end
369
- @options['normalisespace'] = 0 if @options['normalisespace'].nil?
370
-
371
- if @options.has_key?('searchpath')
372
- unless @options['searchpath'].instance_of?(Array)
373
- @options['searchpath'] = [ @options['searchpath'] ]
374
- end
375
- else
376
- @options['searchpath'] = []
377
- end
378
-
379
- if @options.has_key?('cache') && scalar(@options['cache'])
380
- @options['cache'] = [ @options['cache'] ]
381
- end
382
-
383
- @options['anonymoustag'] = DEF_ANONYMOUS_TAG unless @options.has_key?('anonymoustag')
384
-
385
- if !@options.has_key?('indent') || @options['indent'].nil?
386
- @options['indent'] = DEF_INDENTATION
387
- end
388
-
389
- @options['indent'] = '' if @options.has_key?('noindent')
390
-
391
- # Special cleanup for 'keyattr' which could be an array or
392
- # a hash or left to default to array.
393
- if @options.has_key?('keyattr')
394
- if !scalar(@options['keyattr'])
395
- # Convert keyattr => { elem => '+attr' }
396
- # to keyattr => { elem => ['attr', '+'] }
397
- if @options['keyattr'].instance_of?(Hash)
398
- @options['keyattr'].each { |key, value|
399
- if value =~ /^([-+])?(.*)$/
400
- @options['keyattr'][key] = [$2, $1 ? $1 : '']
401
- end
402
- }
403
- elsif !@options['keyattr'].instance_of?(Array)
404
- raise ArgumentError, "'keyattr' must be String, Hash, or Array!"
405
- end
406
- else
407
- @options['keyattr'] = [ @options['keyattr'] ]
408
- end
409
- else
410
- @options['keyattr'] = DEF_KEY_ATTRIBUTES
411
- end
412
-
413
- if @options.has_key?('forcearray')
414
- if @options['forcearray'].instance_of?(Regexp)
415
- @options['forcearray'] = [ @options['forcearray'] ]
416
- end
417
-
418
- if @options['forcearray'].instance_of?(Array)
419
- force_list = @options['forcearray']
420
- unless force_list.empty?
421
- @options['forcearray'] = {}
422
- force_list.each { |tag|
423
- if tag.instance_of?(Regexp)
424
- unless @options['forcearray']['_regex'].instance_of?(Array)
425
- @options['forcearray']['_regex'] = []
426
- end
427
- @options['forcearray']['_regex'] << tag
428
- else
429
- @options['forcearray'][tag] = true
430
- end
431
- }
432
- else
433
- @options['forcearray'] = false
434
- end
435
- else
436
- @options['forcearray'] = @options['forcearray'] ? true : false
437
- end
438
- else
439
- @options['forcearray'] = DEF_FORCE_ARRAY
440
- end
441
-
442
- if @options.has_key?('grouptags') && !@options['grouptags'].instance_of?(Hash)
443
- raise ArgumentError, "Illegal value for 'GroupTags' option - expected a Hash."
444
- end
445
-
446
- if @options.has_key?('variables') && !@options['variables'].instance_of?(Hash)
447
- raise ArgumentError, "Illegal value for 'Variables' option - expected a Hash."
448
- end
449
-
450
- if @options.has_key?('variables')
451
- @_var_values = @options['variables']
452
- elsif @options.has_key?('varattr')
453
- @_var_values = {}
454
- end
455
- end
456
-
457
- # Actually converts an XML document element into a data structure.
458
- #
459
- # element::
460
- # The document element to be collapsed.
461
- def collapse(element)
462
- result = @options['noattr'] ? {} : get_attributes(element)
463
-
464
- if @options['normalisespace'] == 2
465
- result.each { |k, v| result[k] = normalise_space(v) }
466
- end
467
-
468
- if element.has_elements?
469
- element.each_element { |child|
470
- value = collapse(child)
471
- if empty(value) && (element.attributes.empty? || @options['noattr'])
472
- next if @options.has_key?('suppressempty') && @options['suppressempty'] == true
473
- end
474
- result = merge(result, child.name, value)
475
- }
476
- if has_mixed_content?(element)
477
- # normalisespace?
478
- content = element.texts.map { |x| x.to_s }
479
- content = content[0] if content.size == 1
480
- result[@options['contentkey']] = content
481
- end
482
- elsif element.has_text? # i.e. it has only text.
483
- return collapse_text_node(result, element)
484
- end
485
-
486
- # Turn Arrays into Hashes if key fields present.
487
- count = fold_arrays(result)
488
-
489
- # Disintermediate grouped tags.
490
- if @options.has_key?('grouptags')
491
- result.each { |key, value|
492
- next unless (value.instance_of?(Hash) && (value.size == 1))
493
- child_key, child_value = value.to_a[0]
494
- if @options['grouptags'][key] == child_key
495
- result[key] = child_value
496
- end
497
- }
498
- end
499
-
500
- # Fold Hashes containing a single anonymous Array up into just the Array.
501
- if count == 1
502
- anonymoustag = @options['anonymoustag']
503
- if result.has_key?(anonymoustag) && result[anonymoustag].instance_of?(Array)
504
- return result[anonymoustag]
505
- end
506
- end
507
-
508
- if result.empty? && @options.has_key?('suppressempty')
509
- return @options['suppressempty'] == '' ? '' : nil
510
- end
511
-
512
- result
513
- end
514
-
515
- # Collapses a text node and merges it with an existing Hash, if
516
- # possible.
517
- # Thanks to Curtis Schofield for reporting a subtle bug.
518
- #
519
- # hash::
520
- # Hash to merge text node value with, if possible.
521
- # element::
522
- # Text node to be collapsed.
523
- def collapse_text_node(hash, element)
524
- value = node_to_text(element)
525
- if empty(value) && !element.has_attributes?
526
- return {}
527
- end
528
-
529
- if element.has_attributes? && !@options['noattr']
530
- return merge(hash, @options['contentkey'], value)
531
- else
532
- if @options['forcecontent']
533
- return merge(hash, @options['contentkey'], value)
534
- else
535
- return value
536
- end
537
- end
538
- end
539
-
540
- # Folds all arrays in a Hash.
541
- #
542
- # hash::
543
- # Hash to be folded.
544
- def fold_arrays(hash)
545
- fold_amount = 0
546
- keyattr = @options['keyattr']
547
- if (keyattr.instance_of?(Array) || keyattr.instance_of?(Hash))
548
- hash.each { |key, value|
549
- if value.instance_of?(Array)
550
- if keyattr.instance_of?(Array)
551
- hash[key] = fold_array(value)
552
- else
553
- hash[key] = fold_array_by_name(key, value)
554
- end
555
- fold_amount += 1
556
- end
557
- }
558
- end
559
- fold_amount
560
- end
561
-
562
- # Folds an Array to a Hash, if possible. Folding happens
563
- # according to the content of keyattr, which has to be
564
- # an array.
565
- #
566
- # array::
567
- # Array to be folded.
568
- def fold_array(array)
569
- hash = Hash.new
570
- array.each { |x|
571
- return array unless x.instance_of?(Hash)
572
- key_matched = false
573
- @options['keyattr'].each { |key|
574
- if x.has_key?(key)
575
- key_matched = true
576
- value = x[key]
577
- return array if value.instance_of?(Hash) || value.instance_of?(Array)
578
- value = normalise_space(value) if @options['normalisespace'] == 1
579
- x.delete(key)
580
- hash[value] = x
581
- break
582
- end
583
- }
584
- return array unless key_matched
585
- }
586
- hash = collapse_content(hash) if @options['collapseagain']
587
- hash
588
- end
589
-
590
- # Folds an Array to a Hash, if possible. Folding happens
591
- # according to the content of keyattr, which has to be
592
- # a Hash.
593
- #
594
- # name::
595
- # Name of the attribute to be folded upon.
596
- # array::
597
- # Array to be folded.
598
- def fold_array_by_name(name, array)
599
- return array unless @options['keyattr'].has_key?(name)
600
- key, flag = @options['keyattr'][name]
601
-
602
- hash = Hash.new
603
- array.each { |x|
604
- if x.instance_of?(Hash) && x.has_key?(key)
605
- value = x[key]
606
- return array if value.instance_of?(Hash) || value.instance_of?(Array)
607
- value = normalise_space(value) if @options['normalisespace'] == 1
608
- hash[value] = x
609
- hash[value]["-#{key}"] = hash[value][key] if flag == '-'
610
- hash[value].delete(key) unless flag == '+'
611
- else
612
- $stderr.puts("Warning: <#{name}> element has no '#{key}' attribute.")
613
- return array
614
- end
615
- }
616
- hash = collapse_content(hash) if @options['collapseagain']
617
- hash
618
- end
619
-
620
- # Tries to collapse a Hash even more ;-)
621
- #
622
- # hash::
623
- # Hash to be collapsed again.
624
- def collapse_content(hash)
625
- content_key = @options['contentkey']
626
- hash.each_value { |value|
627
- return hash unless value.instance_of?(Hash) && value.size == 1 && value.has_key?(content_key)
628
- hash.each_key { |key| hash[key] = hash[key][content_key] }
629
- }
630
- hash
631
- end
632
-
633
- # Adds a new key/value pair to an existing Hash. If the key to be added
634
- # does already exist and the existing value associated with key is not
635
- # an Array, it will be converted into an Array. Then the new value is
636
- # appended to that Array.
637
- #
638
- # hash::
639
- # Hash to add key/value pair to.
640
- # key::
641
- # Key to be added.
642
- # value::
643
- # Value to be associated with key.
644
- def merge(hash, key, value)
645
- if value.instance_of?(String)
646
- value = normalise_space(value) if @options['normalisespace'] == 2
647
-
648
- # do variable substitutions
649
- unless @_var_values.nil? || @_var_values.empty?
650
- value.gsub!(/\$\{(\w+)\}/) { |x| get_var($1) }
651
- end
652
-
653
- # look for variable definitions
654
- if @options.has_key?('varattr')
655
- varattr = @options['varattr']
656
- if hash.has_key?(varattr)
657
- set_var(hash[varattr], value)
658
- end
659
- end
660
- end
661
-
662
- #patch for converting keys to symbols
663
- if @options.has_key?('keytosymbol')
664
- if @options['keytosymbol'] == true
665
- key = key.to_s.downcase.to_sym
666
- end
667
- end
668
-
669
- if hash.has_key?(key)
670
- if hash[key].instance_of?(Array)
671
- hash[key] << value
672
- else
673
- hash[key] = [ hash[key], value ]
674
- end
675
- elsif value.instance_of?(Array) # Handle anonymous arrays.
676
- hash[key] = [ value ]
677
- else
678
- if force_array?(key)
679
- hash[key] = [ value ]
680
- else
681
- hash[key] = value
682
- end
683
- end
684
- hash
685
- end
686
-
687
- # Checks, if the 'forcearray' option has to be used for
688
- # a certain key.
689
- def force_array?(key)
690
- return false if key == @options['contentkey']
691
- return true if @options['forcearray'] == true
692
- forcearray = @options['forcearray']
693
- if forcearray.instance_of?(Hash)
694
- return true if forcearray.has_key?(key)
695
- return false unless forcearray.has_key?('_regex')
696
- forcearray['_regex'].each { |x| return true if key =~ x }
697
- end
698
- return false
699
- end
700
-
701
- # Converts the attributes array of a document node into a Hash.
702
- # Returns an empty Hash, if node has no attributes.
703
- #
704
- # node::
705
- # Document node to extract attributes from.
706
- def get_attributes(node)
707
- attributes = {}
708
- node.attributes.each { |n,v| attributes[n] = v }
709
- attributes
710
- end
711
-
712
- # Determines, if a document element has mixed content.
713
- #
714
- # element::
715
- # Document element to be checked.
716
- def has_mixed_content?(element)
717
- if element.has_text? && element.has_elements?
718
- return true if element.texts.join('') !~ /^\s*$/s
719
- end
720
- false
721
- end
722
-
723
- # Called when a variable definition is encountered in the XML.
724
- # A variable definition looks like
725
- # <element attrname="name">value</element>
726
- # where attrname matches the varattr setting.
727
- def set_var(name, value)
728
- @_var_values[name] = value
729
- end
730
-
731
- # Called during variable substitution to get the value for the
732
- # named variable.
733
- def get_var(name)
734
- if @_var_values.has_key?(name)
735
- return @_var_values[name]
736
- else
737
- return "${#{name}}"
738
- end
739
- end
740
-
741
- # Recurses through a data structure building up and returning an
742
- # XML representation of that structure as a string.
743
- #
744
- # ref::
745
- # Reference to the data structure to be encoded.
746
- # name::
747
- # The XML tag name to be used for this item.
748
- # indent::
749
- # A string of spaces for use as the current indent level.
750
- def value_to_xml(ref, name, indent)
751
- named = !name.nil? && name != ''
752
- nl = @options.has_key?('noindent') ? '' : "\n"
753
-
754
- if !scalar(ref)
755
- if @ancestors.member?(ref)
756
- raise ArgumentError, "Circular data structures not supported!"
757
- end
758
- @ancestors << ref
759
- else
760
- if named
761
- return [indent, '<', name, '>', @options['noescape'] ? ref.to_s : escape_value(ref.to_s), '</', name, '>', nl].join('')
762
- else
763
- return ref.to_s + nl
764
- end
765
- end
766
-
767
- # Unfold hash to array if possible.
768
- if ref.instance_of?(Hash) && !ref.empty? && !@options['keyattr'].empty? && indent != ''
769
- ref = hash_to_array(name, ref)
770
- end
771
-
772
- result = []
773
- if ref.instance_of?(Hash)
774
- # Reintermediate grouped values if applicable.
775
- if @options.has_key?('grouptags')
776
- ref.each { |key, value|
777
- if @options['grouptags'].has_key?(key)
778
- ref[key] = { @options['grouptags'][key] => value }
779
- end
780
- }
781
- end
782
-
783
- nested = []
784
- text_content = nil
785
- if named
786
- result << indent << '<' << name
787
- end
788
-
789
- if !ref.empty?
790
- ref.each { |key, value|
791
- next if !key.nil? && key[0, 1] == '-'
792
- if value.nil?
793
- unless @options.has_key?('suppressempty') && @options['suppressempty'].nil?
794
- raise ArgumentError, "Use of uninitialized value!"
795
- end
796
- value = {}
797
- end
798
-
799
- if !scalar(value) || @options['noattr']
800
- nested << value_to_xml(value, key, indent + @options['indent'])
801
- else
802
- value = value.to_s
803
- value = escape_value(value) unless @options['noescape']
804
- if key == @options['contentkey']
805
- text_content = value
806
- else
807
- result << ' ' << key << '="' << value << '"'
808
- end
809
- end
810
- }
811
- else
812
- text_content = ''
813
- end
814
-
815
- if !nested.empty? || !text_content.nil?
816
- if named
817
- result << '>'
818
- if !text_content.nil?
819
- result << text_content
820
- nested[0].sub!(/^\s+/, '') if !nested.empty?
821
- else
822
- result << nl
823
- end
824
- if !nested.empty?
825
- result << nested << indent
826
- end
827
- result << '</' << name << '>' << nl
828
- else
829
- result << nested
830
- end
831
- else
832
- result << ' />' << nl
833
- end
834
- elsif ref.instance_of?(Array)
835
- ref.each { |value|
836
- if scalar(value)
837
- result << indent << '<' << name << '>'
838
- result << (@options['noescape'] ? value.to_s : escape_value(value.to_s))
839
- result << '</' << name << '>' << nl
840
- elsif value.instance_of?(Hash)
841
- result << value_to_xml(value, name, indent)
842
- else
843
- result << indent << '<' << name << '>' << nl
844
- result << value_to_xml(value, @options['anonymoustag'], indent + @options['indent'])
845
- result << indent << '</' << name << '>' << nl
846
- end
847
- }
848
- else
849
- # Probably, this is obsolete.
850
- raise ArgumentError, "Can't encode a value of type: #{ref.type}."
851
- end
852
- @ancestors.pop if !scalar(ref)
853
- result.join('')
854
- end
855
-
856
- # Checks, if a certain value is a "scalar" value. Whatever
857
- # that will be in Ruby ... ;-)
858
- #
859
- # value::
860
- # Value to be checked.
861
- def scalar(value)
862
- return false if value.instance_of?(Hash) || value.instance_of?(Array)
863
- return true
864
- end
865
-
866
- # Attempts to unfold a hash of hashes into an array of hashes. Returns
867
- # a reference to th array on success or the original hash, if unfolding
868
- # is not possible.
869
- #
870
- # parent::
871
- #
872
- # hashref::
873
- # Reference to the hash to be unfolded.
874
- def hash_to_array(parent, hashref)
875
- arrayref = []
876
- hashref.each { |key, value|
877
- return hashref unless value.instance_of?(Hash)
878
-
879
- if @options['keyattr'].instance_of?(Hash)
880
- return hashref unless @options['keyattr'].has_key?(parent)
881
- arrayref << { @options['keyattr'][parent][0] => key }.update(value)
882
- else
883
- arrayref << { @options['keyattr'][0] => key }.update(value)
884
- end
885
- }
886
- arrayref
887
- end
888
-
889
- # Replaces XML markup characters by their external entities.
890
- #
891
- # data::
892
- # The string to be escaped.
893
- def escape_value(data)
894
- Text::normalize(data)
895
- end
896
-
897
- # Removes leading and trailing whitespace and sequences of
898
- # whitespaces from a string.
899
- #
900
- # text::
901
- # String to be normalised.
902
- def normalise_space(text)
903
- text.strip.gsub(/\s\s+/, ' ')
904
- end
905
-
906
- # Checks, if an object is nil, an empty String or an empty Hash.
907
- # Thanks to Norbert Gawor for a bugfix.
908
- #
909
- # value::
910
- # Value to be checked for emptiness.
911
- def empty(value)
912
- case value
913
- when Hash
914
- return value.empty?
915
- when String
916
- return value !~ /\S/m
917
- else
918
- return value.nil?
919
- end
920
- end
921
-
922
- # Converts a document node into a String.
923
- # If the node could not be converted into a String
924
- # for any reason, default will be returned.
925
- #
926
- # node::
927
- # Document node to be converted.
928
- # default::
929
- # Value to be returned, if node could not be converted.
930
- def node_to_text(node, default = nil)
931
- if node.instance_of?(REXML::Element)
932
- node.texts.map { |t| t.value }.join('')
933
- elsif node.instance_of?(REXML::Attribute)
934
- node.value.nil? ? default : node.value.strip
935
- elsif node.instance_of?(REXML::Text)
936
- node.value.strip
937
- else
938
- default
939
- end
940
- end
941
-
942
- # Parses an XML string and returns the according document.
943
- #
944
- # xml_string::
945
- # XML string to be parsed.
946
- #
947
- # The following exception may be raised:
948
- #
949
- # REXML::ParseException::
950
- # If the specified file is not wellformed.
951
- def parse(xml_string)
952
- Document.new(xml_string)
953
- end
954
-
955
- # Searches in a list of paths for a certain file. Returns
956
- # the full path to the file, if it could be found. Otherwise,
957
- # an exception will be raised.
958
- #
959
- # filename::
960
- # Name of the file to search for.
961
- # searchpath::
962
- # List of paths to search in.
963
- def find_xml_file(file, searchpath)
964
- filename = File::basename(file)
965
-
966
- if filename != file
967
- return file if File::file?(file)
968
- else
969
- searchpath.each { |path|
970
- full_path = File::join(path, filename)
971
- return full_path if File::file?(full_path)
972
- }
973
- end
974
-
975
- if searchpath.empty?
976
- return file if File::file?(file)
977
- raise ArgumentError, "File does not exist: #{file}."
978
- end
979
- raise ArgumentError, "Could not find <#{filename}> in <#{searchpath.join(':')}>"
980
- end
981
-
982
- # Loads and parses an XML configuration file.
983
- #
984
- # filename::
985
- # Name of the configuration file to be loaded.
986
- #
987
- # The following exceptions may be raised:
988
- #
989
- # Errno::ENOENT::
990
- # If the specified file does not exist.
991
- # REXML::ParseException::
992
- # If the specified file is not wellformed.
993
- def load_xml_file(filename)
994
- parse(File.readlines(filename).to_s)
995
- end
996
-
997
- # Caches the data belonging to a certain file.
998
- #
999
- # data::
1000
- # Data to be cached.
1001
- # filename::
1002
- # Name of file the data was read from.
1003
- def put_into_cache(data, filename)
1004
- if @options.has_key?('cache')
1005
- @options['cache'].each { |scheme|
1006
- case(scheme)
1007
- when 'storable'
1008
- @@cache.save_storable(data, filename)
1009
- when 'mem_share'
1010
- @@cache.save_mem_share(data, filename)
1011
- when 'mem_copy'
1012
- @@cache.save_mem_copy(data, filename)
1013
- else
1014
- raise ArgumentError, "Unsupported caching scheme: <#{scheme}>."
1015
- end
1016
- }
1017
- end
1018
- end
1019
- end
1020
-
1021
- # vim:sw=2