facets 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (488) hide show
  1. data/ProjectInfo +32 -25
  2. data/data/facets/index.yml +30 -6
  3. data/data/facets/units/binary/base.yaml +12 -0
  4. data/data/facets/units/binary/extra.yaml +8 -0
  5. data/data/facets/units/cex.yaml +7 -0
  6. data/data/facets/units/currency/base.yaml +268 -0
  7. data/data/facets/units/default.yaml +22 -0
  8. data/data/facets/units/dump_yaml.rb +309 -0
  9. data/data/facets/units/si/base.yaml +36 -0
  10. data/data/facets/units/si/derived.yaml +133 -0
  11. data/data/facets/units/si/extra.yaml +107 -0
  12. data/data/facets/units/standard.yaml +5 -0
  13. data/data/facets/units/uk.yaml +16 -0
  14. data/data/facets/units/uk/base.yaml +107 -0
  15. data/data/facets/units/us.yaml +16 -0
  16. data/data/facets/units/us/base.yaml +112 -0
  17. data/data/facets/units/xmethods/cached.yaml +83 -0
  18. data/data/facets/units/xmethods/mapping.yaml +85 -0
  19. data/lib/facet/array/join_sentence.rb +1 -0
  20. data/lib/facet/class/cattr.rb +1 -0
  21. data/lib/facet/class/cattr_accessor.rb +1 -0
  22. data/lib/facet/class/cattr_reader.rb +1 -0
  23. data/lib/facet/class/cattr_writer.rb +1 -0
  24. data/lib/facet/elementor.rb +1 -0
  25. data/lib/facet/enumerable/accumulate.rb +1 -0
  26. data/lib/facet/enumerable/collect_if.rb +1 -0
  27. data/lib/facet/enumerable/map_if.rb +1 -0
  28. data/lib/facet/file/self/append.rb +1 -0
  29. data/lib/facet/file/self/read_binary.rb +1 -0
  30. data/lib/facet/file/self/write.rb +1 -0
  31. data/lib/facet/json.rb +1 -0
  32. data/lib/facet/kernel/__self__.rb +1 -0
  33. data/lib/facet/kernel/methodname.rb +1 -0
  34. data/lib/facet/module/attr_query.rb +1 -0
  35. data/lib/facet/module/attr_validator.rb +1 -0
  36. data/lib/facet/module/inherit.rb +1 -0
  37. data/lib/facet/module/let.rb +1 -0
  38. data/lib/facet/module/mattr.rb +1 -0
  39. data/lib/facet/module/mattr_accessor.rb +1 -0
  40. data/lib/facet/module/mattr_reader.rb +1 -0
  41. data/lib/facet/module/mattr_writer.rb +1 -0
  42. data/lib/facet/module/singleton_to_module.rb +1 -0
  43. data/lib/facet/nilclass/op_cmp.rb +1 -0
  44. data/lib/facet/nilclass/succ.rb +1 -0
  45. data/lib/facet/recorder.rb +1 -0
  46. data/lib/facet/xoxo.rb +1 -0
  47. data/lib/facets/core/array.rb +1 -0
  48. data/lib/facets/core/array/join_sentence.rb +12 -0
  49. data/lib/facets/core/class.rb +4 -0
  50. data/lib/facets/core/{module → class}/cattr.rb +7 -9
  51. data/lib/facets/core/class/cattr_accessor.rb +2 -0
  52. data/lib/facets/core/class/cattr_reader.rb +3 -0
  53. data/lib/facets/core/class/cattr_writer.rb +2 -0
  54. data/lib/facets/core/dir/self/ls_r.rb +4 -9
  55. data/lib/facets/core/enumerable.rb +3 -0
  56. data/lib/facets/core/enumerable/accumulate.rb +25 -0
  57. data/lib/facets/core/enumerable/collect_if.rb +15 -0
  58. data/lib/facets/core/enumerable/ew.rb +1 -5
  59. data/lib/facets/core/enumerable/map_if.rb +3 -0
  60. data/lib/facets/core/file.rb +3 -0
  61. data/lib/facets/core/file/self/append.rb +8 -0
  62. data/lib/facets/core/file/self/create.rb +14 -8
  63. data/lib/facets/core/file/self/open_as_string.rb +31 -13
  64. data/lib/facets/core/file/self/read_binary.rb +8 -0
  65. data/lib/facets/core/file/self/read_list.rb +11 -7
  66. data/lib/facets/core/file/self/write.rb +8 -0
  67. data/lib/facets/core/fileutils/wc.rb +4 -9
  68. data/lib/facets/core/fileutils/which.rb +4 -9
  69. data/lib/facets/core/kernel.rb +2 -1
  70. data/lib/facets/core/kernel/__self__.rb +32 -0
  71. data/lib/facets/core/kernel/as.rb +1 -1
  72. data/lib/facets/core/kernel/assign_from.rb +3 -3
  73. data/lib/facets/core/kernel/assign_with.rb +2 -0
  74. data/lib/facets/core/kernel/me.rb +3 -2
  75. data/lib/facets/core/kernel/method_name.rb +2 -49
  76. data/lib/facets/core/kernel/methodname.rb +49 -0
  77. data/lib/facets/core/module.rb +9 -4
  78. data/lib/facets/core/module/attr_query.rb +56 -0
  79. data/lib/facets/core/module/attr_validator.rb +18 -0
  80. data/lib/facets/core/module/inherit.rb +70 -0
  81. data/lib/facets/core/module/integrate.rb +1 -1
  82. data/lib/facets/core/module/let.rb +55 -0
  83. data/lib/facets/core/module/mattr.rb +180 -0
  84. data/lib/facets/core/module/{cattr_accessor.rb → mattr_accessor.rb} +0 -0
  85. data/lib/facets/core/module/{cattr_reader.rb → mattr_reader.rb} +0 -0
  86. data/lib/facets/core/module/{cattr_writer.rb → mattr_writer.rb} +0 -0
  87. data/lib/facets/core/module/on_included.rb +3 -1
  88. data/lib/facets/core/module/singleton_to_module.rb +23 -0
  89. data/lib/facets/core/nilclass.rb +2 -0
  90. data/lib/facets/core/string/methodize.rb +4 -3
  91. data/lib/facets/core/string/modulize.rb +3 -3
  92. data/lib/facets/more/ansicode.rb +1 -1
  93. data/lib/facets/more/aspects.rb +1 -1
  94. data/lib/facets/more/basicobject.rb +67 -22
  95. data/lib/facets/more/classinherit.rb +2 -2
  96. data/lib/facets/more/cloneable.rb +1 -1
  97. data/lib/facets/more/consoleapp.rb +31 -20
  98. data/lib/facets/more/dictionary.rb +1 -1
  99. data/lib/facets/more/filelist.rb +2 -10
  100. data/lib/facets/more/functor.rb +6 -6
  101. data/lib/facets/more/json.rb +891 -0
  102. data/lib/facets/more/methodprobe.rb +1 -1
  103. data/lib/facets/more/multiton.rb +16 -8
  104. data/lib/facets/more/nilcomparable.rb +31 -49
  105. data/lib/facets/more/openobject.rb +50 -10
  106. data/lib/facets/more/recorder.rb +125 -0
  107. data/lib/facets/more/rtals.rb +199 -4
  108. data/lib/facets/more/typecast.rb +12 -12
  109. data/lib/facets/more/units.rb +20 -14
  110. data/lib/facets/more/xoxo.rb +519 -0
  111. data/setup.rb +283 -271
  112. data/test/lib/facets/core/array/test_at_rand.rb +1 -1
  113. data/test/lib/facets/core/array/test_delete_unless.rb +1 -1
  114. data/test/lib/facets/core/array/test_delete_values.rb +1 -1
  115. data/test/lib/facets/core/array/test_delete_values_at.rb +1 -1
  116. data/test/lib/facets/core/array/test_first.rb +1 -1
  117. data/test/lib/facets/core/array/test_head.rb +1 -1
  118. data/test/lib/facets/core/array/test_last_index.rb +1 -1
  119. data/test/lib/facets/core/array/test_merge.rb +1 -1
  120. data/test/lib/facets/core/array/test_mid.rb +1 -1
  121. data/test/lib/facets/core/array/test_middle.rb +1 -1
  122. data/test/lib/facets/core/array/test_op_fetch.rb +1 -1
  123. data/test/lib/facets/core/array/test_op_store.rb +1 -1
  124. data/test/lib/facets/core/array/test_pick.rb +1 -1
  125. data/test/lib/facets/core/array/test_pos.rb +1 -1
  126. data/test/lib/facets/core/array/test_pull.rb +1 -1
  127. data/test/lib/facets/core/array/test_rand_index.rb +1 -1
  128. data/test/lib/facets/core/array/test_rand_subset.rb +1 -1
  129. data/test/lib/facets/core/array/test_range.rb +1 -1
  130. data/test/lib/facets/core/array/test_rotate.rb +1 -1
  131. data/test/lib/facets/core/array/test_select.rb +1 -1
  132. data/test/lib/facets/core/array/test_shuffle.rb +1 -1
  133. data/test/lib/facets/core/array/test_slap.rb +1 -1
  134. data/test/lib/facets/core/array/test_thru.rb +1 -1
  135. data/test/lib/facets/core/array/test_to_b.rb +1 -1
  136. data/test/lib/facets/core/array/test_to_h.rb +1 -1
  137. data/test/lib/facets/core/array/test_to_hash.rb +1 -1
  138. data/test/lib/facets/core/binding/self/test_of_caller.rb +1 -1
  139. data/test/lib/facets/core/binding/test___LINE__.rb +1 -1
  140. data/test/lib/facets/core/binding/test_call_stack.rb +1 -1
  141. data/test/lib/facets/core/binding/test_called.rb +1 -1
  142. data/test/lib/facets/core/binding/test_caller.rb +1 -1
  143. data/test/lib/facets/core/binding/test_defined.rb +1 -1
  144. data/test/lib/facets/core/binding/test_eval.rb +1 -1
  145. data/test/lib/facets/core/binding/test_local_variables.rb +1 -1
  146. data/test/lib/facets/core/binding/test_method_name.rb +1 -1
  147. data/test/lib/facets/core/binding/test_op_fetch.rb +1 -1
  148. data/test/lib/facets/core/binding/test_op_store.rb +1 -1
  149. data/test/lib/facets/core/binding/test_self.rb +1 -1
  150. data/test/lib/facets/core/{module/test_cattr_accessor.rb → class/test_cattr.rb} +11 -3
  151. data/test/lib/facets/core/class/test_descendents.rb +1 -1
  152. data/test/lib/facets/core/class/test_method_name.rb +1 -1
  153. data/test/lib/facets/core/class/test_remove_descendents.rb +1 -1
  154. data/test/lib/facets/core/class/test_unix_path.rb +1 -1
  155. data/test/lib/facets/core/comparable/test_at_least.rb +1 -1
  156. data/test/lib/facets/core/comparable/test_clip.rb +1 -1
  157. data/test/lib/facets/core/comparable/test_cmp.rb +1 -1
  158. data/test/lib/facets/core/continuation/self/test_create.rb +1 -1
  159. data/test/lib/facets/core/date/test_days_in_month.rb +1 -1
  160. data/test/lib/facets/core/date/test_days_of_month.rb +1 -1
  161. data/test/lib/facets/core/date/test_stamp.rb +1 -1
  162. data/test/lib/facets/core/date/test_to_date.rb +1 -1
  163. data/test/lib/facets/core/date/test_to_s.rb +1 -1
  164. data/test/lib/facets/core/date/test_to_time.rb +1 -1
  165. data/test/lib/facets/core/dir/self/test_ancestor.rb +1 -1
  166. data/test/lib/facets/core/dir/self/test_ascend.rb +1 -1
  167. data/test/lib/facets/core/enumerable/self/test_combinations.rb +1 -1
  168. data/test/lib/facets/core/enumerable/self/test_cross.rb +1 -1
  169. data/test/lib/facets/core/enumerable/test_collect_with_index.rb +1 -1
  170. data/test/lib/facets/core/enumerable/test_commonality.rb +1 -1
  171. data/test/lib/facets/core/enumerable/test_compact_collect.rb +1 -1
  172. data/test/lib/facets/core/enumerable/test_cross.rb +1 -1
  173. data/test/lib/facets/core/enumerable/test_each_combination.rb +1 -1
  174. data/test/lib/facets/core/enumerable/test_each_pair.rb +1 -1
  175. data/test/lib/facets/core/enumerable/test_each_slice.rb +1 -1
  176. data/test/lib/facets/core/enumerable/test_each_unique_pair.rb +1 -1
  177. data/test/lib/facets/core/enumerable/test_entropy.rb +1 -1
  178. data/test/lib/facets/core/enumerable/test_every.rb +1 -1
  179. data/test/lib/facets/core/enumerable/test_ew.rb +1 -1
  180. data/test/lib/facets/core/enumerable/test_filter_collect.rb +1 -1
  181. data/test/lib/facets/core/enumerable/test_find_collisions.rb +1 -1
  182. data/test/lib/facets/core/enumerable/test_frequency.rb +1 -1
  183. data/test/lib/facets/core/enumerable/test_graph.rb +1 -1
  184. data/test/lib/facets/core/enumerable/test_ideal_entropy.rb +1 -1
  185. data/test/lib/facets/core/enumerable/test_none.rb +1 -1
  186. data/test/lib/facets/core/enumerable/test_occur.rb +1 -1
  187. data/test/lib/facets/core/enumerable/test_one.rb +1 -1
  188. data/test/lib/facets/core/enumerable/test_op_pow.rb +1 -1
  189. data/test/lib/facets/core/enumerable/test_partition_by.rb +1 -1
  190. data/test/lib/facets/core/enumerable/test_permute.rb +1 -1
  191. data/test/lib/facets/core/enumerable/test_probability.rb +1 -1
  192. data/test/lib/facets/core/enumerable/test_to_h.rb +1 -1
  193. data/test/lib/facets/core/enumerable/test_uniq_by.rb +1 -1
  194. data/test/lib/facets/core/file/self/test_create.rb +14 -9
  195. data/test/lib/facets/core/file/self/test_open_as_string.rb +21 -11
  196. data/test/lib/facets/core/file/self/test_read_list.rb +11 -8
  197. data/test/lib/facets/core/file/self/test_sanitize.rb +1 -1
  198. data/test/lib/facets/core/file/self/test_split_all.rb +1 -1
  199. data/test/lib/facets/core/float/test_round_at.rb +1 -1
  200. data/test/lib/facets/core/float/test_round_to.rb +1 -1
  201. data/test/lib/facets/core/hash/self/test_zipnew.rb +1 -1
  202. data/test/lib/facets/core/hash/test_alias.rb +1 -1
  203. data/test/lib/facets/core/hash/test_assert_has_keys.rb +1 -1
  204. data/test/lib/facets/core/hash/test_assert_has_only_keys.rb +1 -1
  205. data/test/lib/facets/core/hash/test_at.rb +1 -1
  206. data/test/lib/facets/core/hash/test_collate.rb +1 -1
  207. data/test/lib/facets/core/hash/test_each.rb +1 -1
  208. data/test/lib/facets/core/hash/test_each_with_index.rb +1 -1
  209. data/test/lib/facets/core/hash/test_each_with_key.rb +1 -1
  210. data/test/lib/facets/core/hash/test_graph.rb +1 -1
  211. data/test/lib/facets/core/hash/test_has_keys.rb +1 -1
  212. data/test/lib/facets/core/hash/test_has_only_keys.rb +1 -1
  213. data/test/lib/facets/core/hash/test_inverse.rb +1 -1
  214. data/test/lib/facets/core/hash/test_keys_to_s.rb +1 -1
  215. data/test/lib/facets/core/hash/test_keys_to_sym.rb +1 -1
  216. data/test/lib/facets/core/hash/test_op_fetch.rb +1 -1
  217. data/test/lib/facets/core/hash/test_op_lshift.rb +1 -1
  218. data/test/lib/facets/core/hash/test_rand_key.rb +1 -1
  219. data/test/lib/facets/core/hash/test_rand_pair.rb +1 -1
  220. data/test/lib/facets/core/hash/test_rand_value.rb +1 -1
  221. data/test/lib/facets/core/hash/test_replace_each.rb +1 -1
  222. data/test/lib/facets/core/hash/test_shuffle.rb +1 -1
  223. data/test/lib/facets/core/hash/test_slice.rb +1 -1
  224. data/test/lib/facets/core/hash/test_swap.rb +1 -1
  225. data/test/lib/facets/core/hash/test_swapkey.rb +1 -1
  226. data/test/lib/facets/core/hash/test_to_h.rb +1 -1
  227. data/test/lib/facets/core/hash/test_to_ostruct.rb +1 -1
  228. data/test/lib/facets/core/hash/test_to_ostruct_recurse.rb +1 -1
  229. data/test/lib/facets/core/hash/test_traverse.rb +1 -1
  230. data/test/lib/facets/core/hash/test_update_each.rb +1 -1
  231. data/test/lib/facets/core/hash/test_update_keys.rb +1 -1
  232. data/test/lib/facets/core/hash/test_update_values.rb +1 -1
  233. data/test/lib/facets/core/hash/test_weave.rb +1 -1
  234. data/test/lib/facets/core/integer/test_factorial.rb +1 -1
  235. data/test/lib/facets/core/integer/test_multiple.rb +1 -1
  236. data/test/lib/facets/core/integer/test_ordinal.rb +1 -1
  237. data/test/lib/facets/core/integer/test_times_collect.rb +1 -1
  238. data/test/lib/facets/core/kernel/test___class__.rb +1 -1
  239. data/test/lib/facets/core/kernel/test_as.rb +1 -1
  240. data/test/lib/facets/core/kernel/test_assign_from.rb +1 -1
  241. data/test/lib/facets/core/kernel/test_assign_with.rb +1 -1
  242. data/test/lib/facets/core/kernel/test_bool.rb +1 -1
  243. data/test/lib/facets/core/kernel/test_bug.rb +1 -1
  244. data/test/lib/facets/core/kernel/test_call_stack.rb +1 -1
  245. data/test/lib/facets/core/kernel/test_called.rb +1 -1
  246. data/test/lib/facets/core/kernel/test_constant.rb +1 -1
  247. data/test/lib/facets/core/kernel/test_copy.rb +1 -1
  248. data/test/lib/facets/core/kernel/test_deep_copy.rb +1 -1
  249. data/test/lib/facets/core/kernel/test_demo.rb +1 -1
  250. data/test/lib/facets/core/kernel/test_fn.rb +1 -1
  251. data/test/lib/facets/core/kernel/test_generate_method_name.rb +1 -1
  252. data/test/lib/facets/core/kernel/test_get_by_id.rb +1 -1
  253. data/test/lib/facets/core/kernel/test_here.rb +1 -1
  254. data/test/lib/facets/core/kernel/test_in.rb +1 -1
  255. data/test/lib/facets/core/kernel/test_maybe.rb +1 -1
  256. data/test/lib/facets/core/kernel/test_metaclass.rb +1 -1
  257. data/test/lib/facets/core/kernel/test_method.rb +1 -1
  258. data/test/lib/facets/core/kernel/{test_method_name.rb → test_methodname.rb} +3 -3
  259. data/test/lib/facets/core/kernel/test_methods.rb +1 -1
  260. data/test/lib/facets/core/kernel/test_new.rb +1 -1
  261. data/test/lib/facets/core/kernel/test_object_class.rb +1 -1
  262. data/test/lib/facets/core/kernel/test_object_hexid.rb +1 -1
  263. data/test/lib/facets/core/kernel/test_require_all.rb +1 -1
  264. data/test/lib/facets/core/kernel/test_require_esc.rb +1 -1
  265. data/test/lib/facets/core/kernel/test_require_facet.rb +1 -1
  266. data/test/lib/facets/core/kernel/test_resc.rb +1 -1
  267. data/test/lib/facets/core/kernel/test_returning.rb +1 -1
  268. data/test/lib/facets/core/kernel/test_send_as.rb +1 -1
  269. data/test/lib/facets/core/kernel/test_set_from.rb +1 -1
  270. data/test/lib/facets/core/kernel/test_set_with.rb +1 -1
  271. data/test/lib/facets/core/kernel/test_silently.rb +1 -1
  272. data/test/lib/facets/core/kernel/test_singleton.rb +1 -1
  273. data/test/lib/facets/core/kernel/test_superior.rb +1 -1
  274. data/test/lib/facets/core/kernel/test_supermethod.rb +1 -1
  275. data/test/lib/facets/core/kernel/test_this.rb +1 -1
  276. data/test/lib/facets/core/kernel/test_to_b.rb +1 -1
  277. data/test/lib/facets/core/kernel/test_to_bool.rb +1 -1
  278. data/test/lib/facets/core/kernel/test_uri.rb +1 -1
  279. data/test/lib/facets/core/kernel/test_val.rb +1 -1
  280. data/test/lib/facets/core/kernel/test_with_accessor.rb +1 -1
  281. data/test/lib/facets/core/matchdata/test_match.rb +1 -1
  282. data/test/lib/facets/core/matchdata/test_matchtree.rb +1 -1
  283. data/test/lib/facets/core/module/test_abstract.rb +1 -1
  284. data/test/lib/facets/core/module/test_alias_module_function.rb +1 -1
  285. data/test/lib/facets/core/module/test_ancestor.rb +1 -1
  286. data/test/lib/facets/core/module/test_basename.rb +1 -1
  287. data/test/lib/facets/core/module/test_by_name.rb +1 -1
  288. data/test/lib/facets/core/module/test_clone_using.rb +1 -1
  289. data/test/lib/facets/core/module/test_dirname.rb +1 -1
  290. data/test/lib/facets/core/module/test_equate_on.rb +1 -1
  291. data/test/lib/facets/core/module/test_generate_instance_method_name.rb +1 -1
  292. data/test/lib/facets/core/module/test_include_as.rb +1 -1
  293. data/test/lib/facets/core/module/test_inherit.rb +58 -0
  294. data/test/lib/facets/core/module/test_initializer.rb +1 -1
  295. data/test/lib/facets/core/module/test_instance_methods.rb +1 -1
  296. data/test/lib/facets/core/module/test_integrate.rb +1 -1
  297. data/test/lib/facets/core/module/test_let.rb +31 -0
  298. data/test/lib/facets/core/module/test_mattr.rb +71 -0
  299. data/test/lib/facets/core/module/test_memoize.rb +1 -1
  300. data/test/lib/facets/core/module/test_modspace.rb +1 -1
  301. data/test/lib/facets/core/module/test_namespace.rb +1 -1
  302. data/test/lib/facets/core/module/test_nesting.rb +1 -1
  303. data/test/lib/facets/core/module/test_on_included.rb +36 -0
  304. data/test/lib/facets/core/module/test_redef.rb +1 -1
  305. data/test/lib/facets/core/module/test_redefine_method.rb +1 -1
  306. data/test/lib/facets/core/module/test_redirect.rb +1 -1
  307. data/test/lib/facets/core/module/test_redirect_method.rb +1 -1
  308. data/test/lib/facets/core/module/test_remove.rb +1 -1
  309. data/test/lib/facets/core/module/test_rename.rb +1 -1
  310. data/test/lib/facets/core/module/test_rename_method.rb +1 -1
  311. data/test/lib/facets/core/module/test_revisal.rb +1 -1
  312. data/test/lib/facets/core/module/test_shadow_method.rb +1 -1
  313. data/test/lib/facets/core/module/test_sort_on.rb +1 -1
  314. data/test/lib/facets/core/module/test_undef.rb +1 -1
  315. data/test/lib/facets/core/module/test_wrap.rb +1 -1
  316. data/test/lib/facets/core/module/test_wrap_method.rb +1 -1
  317. data/test/lib/facets/core/nilclass/{test_to_f.rb → test_blank.rb} +5 -5
  318. data/test/lib/facets/core/nilclass/test_empty.rb +1 -1
  319. data/test/lib/facets/core/nilclass/test_include.rb +1 -1
  320. data/test/lib/facets/core/nilclass/test_op_fetch.rb +1 -1
  321. data/test/lib/facets/core/nilclass/test_size.rb +1 -1
  322. data/test/lib/facets/core/nilclass/test_to_h.rb +1 -1
  323. data/test/lib/facets/core/{float → numeric}/test_approx.rb +4 -3
  324. data/test/lib/facets/core/numeric/test_ceil_multiple.rb +1 -1
  325. data/test/lib/facets/core/numeric/test_succ.rb +1 -1
  326. data/test/lib/facets/core/numeric/test_to_b.rb +1 -1
  327. data/test/lib/facets/core/ostruct/test___merge__.rb +1 -1
  328. data/test/lib/facets/core/ostruct/test___update__.rb +1 -1
  329. data/test/lib/facets/core/ostruct/test_op_fetch.rb +1 -1
  330. data/test/lib/facets/core/ostruct/test_op_store.rb +1 -1
  331. data/test/lib/facets/core/proc/test_compose.rb +1 -1
  332. data/test/lib/facets/core/proc/test_to_method.rb +1 -1
  333. data/test/lib/facets/core/range/test_to_r.rb +1 -1
  334. data/test/lib/facets/core/range/test_to_range.rb +1 -1
  335. data/test/lib/facets/core/range/test_umbrella.rb +1 -1
  336. data/test/lib/facets/core/range/test_within.rb +1 -1
  337. data/test/lib/facets/core/regexp/test_arity.rb +1 -1
  338. data/test/lib/facets/core/regexp/test_to_re.rb +1 -1
  339. data/test/lib/facets/core/regexp/test_to_regexp.rb +1 -1
  340. data/test/lib/facets/core/string/self/test_interpolate.rb +1 -1
  341. data/test/lib/facets/core/string/self/test_patterns.rb +1 -1
  342. data/test/lib/facets/core/string/self/test_rand_letter.rb +1 -1
  343. data/test/lib/facets/core/string/test_align_center.rb +1 -1
  344. data/test/lib/facets/core/string/test_at_rand.rb +1 -1
  345. data/test/lib/facets/core/string/test_basename.rb +1 -1
  346. data/test/lib/facets/core/string/test_blank.rb +1 -1
  347. data/test/lib/facets/core/string/test_bracket.rb +1 -1
  348. data/test/lib/facets/core/string/test_camelcase.rb +1 -1
  349. data/test/lib/facets/core/string/test_camelize.rb +1 -1
  350. data/test/lib/facets/core/string/test_capitalized.rb +1 -1
  351. data/test/lib/facets/core/string/test_chars.rb +1 -1
  352. data/test/lib/facets/core/string/test_cmp.rb +1 -1
  353. data/test/lib/facets/core/string/test_demodulize.rb +1 -1
  354. data/test/lib/facets/core/string/test_downcase.rb +1 -1
  355. data/test/lib/facets/core/string/test_dresner.rb +1 -1
  356. data/test/lib/facets/core/string/test_each_char.rb +1 -1
  357. data/test/lib/facets/core/string/test_each_word.rb +1 -1
  358. data/test/lib/facets/core/string/test_first.rb +1 -1
  359. data/test/lib/facets/core/string/test_fold.rb +1 -1
  360. data/test/lib/facets/core/string/test_frequency.rb +1 -1
  361. data/test/lib/facets/core/string/test_humanize.rb +1 -1
  362. data/test/lib/facets/core/string/test_indent.rb +1 -1
  363. data/test/lib/facets/core/string/test_index_all.rb +1 -1
  364. data/test/lib/facets/core/string/test_last.rb +1 -1
  365. data/test/lib/facets/core/string/test_line_wrap.rb +1 -1
  366. data/test/lib/facets/core/string/test_lines.rb +1 -1
  367. data/test/lib/facets/core/string/test_lowercase.rb +1 -1
  368. data/test/lib/facets/core/string/test_margin.rb +1 -1
  369. data/test/lib/facets/core/string/test_methodize.rb +1 -1
  370. data/test/lib/facets/core/string/test_modulize.rb +1 -1
  371. data/test/lib/facets/core/string/test_mscan.rb +1 -1
  372. data/test/lib/facets/core/string/test_natcmp.rb +1 -1
  373. data/test/lib/facets/core/string/test_nchar.rb +1 -1
  374. data/test/lib/facets/core/string/test_pathize.rb +1 -1
  375. data/test/lib/facets/core/string/test_pop.rb +1 -1
  376. data/test/lib/facets/core/string/test_probability.rb +1 -1
  377. data/test/lib/facets/core/string/test_push.rb +1 -1
  378. data/test/lib/facets/core/string/test_quote.rb +1 -1
  379. data/test/lib/facets/core/string/test_rand_byte.rb +1 -1
  380. data/test/lib/facets/core/string/test_rand_index.rb +1 -1
  381. data/test/lib/facets/core/string/test_range.rb +1 -1
  382. data/test/lib/facets/core/string/test_range_all.rb +1 -1
  383. data/test/lib/facets/core/string/test_range_of_line.rb +1 -1
  384. data/test/lib/facets/core/string/test_regesc.rb +1 -1
  385. data/test/lib/facets/core/string/test_shatter.rb +1 -1
  386. data/test/lib/facets/core/string/test_shift.rb +1 -1
  387. data/test/lib/facets/core/string/test_shuffle.rb +1 -1
  388. data/test/lib/facets/core/string/test_similarity.rb +1 -1
  389. data/test/lib/facets/core/string/test_singular.rb +1 -1
  390. data/test/lib/facets/core/string/test_slap.rb +1 -1
  391. data/test/lib/facets/core/string/test_soundex.rb +1 -1
  392. data/test/lib/facets/core/string/test_succ.rb +1 -1
  393. data/test/lib/facets/core/string/test_to_a.rb +1 -1
  394. data/test/lib/facets/core/string/test_to_arr.rb +1 -1
  395. data/test/lib/facets/core/string/test_to_b.rb +1 -1
  396. data/test/lib/facets/core/string/test_to_const.rb +1 -1
  397. data/test/lib/facets/core/string/test_to_date.rb +1 -1
  398. data/test/lib/facets/core/string/test_to_proc.rb +1 -1
  399. data/test/lib/facets/core/string/test_to_re.rb +1 -1
  400. data/test/lib/facets/core/string/test_to_time.rb +1 -1
  401. data/test/lib/facets/core/string/test_unix_crypt.rb +1 -1
  402. data/test/lib/facets/core/string/test_unpack.rb +1 -1
  403. data/test/lib/facets/core/string/test_unshift.rb +1 -1
  404. data/test/lib/facets/core/string/test_upcase.rb +1 -1
  405. data/test/lib/facets/core/string/test_whitespace.rb +1 -1
  406. data/test/lib/facets/core/string/test_word_filter.rb +1 -1
  407. data/test/lib/facets/core/string/test_word_wrap.rb +1 -1
  408. data/test/lib/facets/core/string/test_words.rb +1 -1
  409. data/test/lib/facets/core/symbol/test_camelcase.rb +1 -1
  410. data/test/lib/facets/core/symbol/test_camelize.rb +1 -1
  411. data/test/lib/facets/core/symbol/test_capitalize.rb +1 -1
  412. data/test/lib/facets/core/symbol/test_capitalized.rb +1 -1
  413. data/test/lib/facets/core/symbol/test_downcase.rb +1 -1
  414. data/test/lib/facets/core/symbol/test_not.rb +1 -1
  415. data/test/lib/facets/core/symbol/test_pad.rb +1 -1
  416. data/test/lib/facets/core/symbol/test_succ.rb +1 -1
  417. data/test/lib/facets/core/symbol/test_to_const.rb +1 -1
  418. data/test/lib/facets/core/symbol/test_to_proc.rb +1 -1
  419. data/test/lib/facets/core/symbol/test_to_str.rb +1 -1
  420. data/test/lib/facets/core/symbol/test_underscore.rb +1 -1
  421. data/test/lib/facets/core/symbol/test_upcase.rb +1 -1
  422. data/test/lib/facets/core/time/test_change.rb +1 -1
  423. data/test/lib/facets/core/time/test_elapse.rb +1 -1
  424. data/test/lib/facets/core/time/test_stamp.rb +1 -1
  425. data/test/lib/facets/core/time/test_to_date.rb +1 -1
  426. data/test/lib/facets/core/time/test_to_s.rb +1 -1
  427. data/test/lib/facets/core/time/test_to_time.rb +1 -1
  428. data/test/lib/facets/more/test_annotation.rb +1 -1
  429. data/test/lib/facets/more/test_ansicode.rb +1 -1
  430. data/test/lib/facets/more/test_association.rb +1 -1
  431. data/test/lib/facets/more/test_basicobject.rb +58 -0
  432. data/test/lib/facets/more/test_bbcode.rb +1 -1
  433. data/test/lib/facets/more/test_bitmask.rb +1 -1
  434. data/test/lib/facets/more/test_bytes.rb +1 -1
  435. data/test/lib/facets/more/test_classinherit.rb +1 -1
  436. data/test/lib/facets/more/test_classmethods.rb +1 -1
  437. data/test/lib/facets/more/test_coroutine.rb +1 -1
  438. data/test/lib/facets/more/test_crypt.rb +1 -1
  439. data/test/lib/facets/more/test_dictionary.rb +1 -1
  440. data/test/lib/facets/more/test_elementor.rb +48 -0
  441. data/test/lib/facets/more/test_enumerablepass.rb +1 -1
  442. data/test/lib/facets/more/test_floatstring.rb +1 -1
  443. data/test/lib/facets/more/test_functor.rb +1 -1
  444. data/test/lib/facets/more/test_inheritor.rb +1 -1
  445. data/test/lib/facets/more/test_interval.rb +1 -1
  446. data/test/lib/facets/more/test_json.rb +232 -0
  447. data/test/lib/facets/more/test_lisp.rb +1 -1
  448. data/test/lib/facets/more/test_lisp_format.rb +1 -1
  449. data/test/lib/facets/more/test_lrucache.rb +1 -1
  450. data/test/lib/facets/more/test_mathconstants.rb +1 -1
  451. data/test/lib/facets/more/test_methodprobe.rb +1 -1
  452. data/test/lib/facets/more/test_multipliers.rb +1 -1
  453. data/test/lib/facets/more/test_multiton.rb +1 -1
  454. data/test/lib/facets/more/test_nackclass.rb +1 -1
  455. data/test/lib/facets/more/test_nilcomparable.rb +6 -2
  456. data/test/lib/facets/more/test_openobject.rb +1 -1
  457. data/test/lib/facets/more/test_overload.rb +1 -1
  458. data/test/lib/facets/more/test_paramix.rb +1 -1
  459. data/test/lib/facets/more/test_preinitialize.rb +1 -1
  460. data/test/lib/facets/more/test_promoteself.rb +1 -1
  461. data/test/lib/facets/more/test_recorder.rb +44 -0
  462. data/test/lib/facets/more/test_snapshot.rb +1 -1
  463. data/test/lib/facets/more/test_statichash.rb +1 -1
  464. data/test/lib/facets/more/test_syncarray.rb +1 -1
  465. data/test/lib/facets/more/test_synchash.rb +1 -1
  466. data/test/lib/facets/more/test_tagiterator.rb +1 -1
  467. data/test/lib/facets/more/test_timer.rb +1 -1
  468. data/test/lib/facets/more/test_times.rb +1 -1
  469. data/test/lib/facets/more/test_tuple.rb +1 -1
  470. data/test/lib/facets/more/test_typecast.rb +2 -2
  471. data/test/lib/facets/more/test_uninheritable.rb +1 -1
  472. data/test/lib/facets/more/test_units.rb +16 -10
  473. data/test/lib/facets/more/test_xoxo.rb +288 -0
  474. data/test/lib/facets/more/test_yamlstruct.rb +1 -1
  475. metadata +92 -25
  476. data/lib/facet/kernel/instance.rb +0 -1
  477. data/lib/facet/module/cattr.rb +0 -1
  478. data/lib/facet/module/cattr_accessor.rb +0 -1
  479. data/lib/facet/module/cattr_reader.rb +0 -1
  480. data/lib/facet/module/cattr_writer.rb +0 -1
  481. data/lib/facets/core/kernel/instance.rb +0 -29
  482. data/test/FIXTURE/create_file +0 -1
  483. data/test/FIXTURE/open_as_string_file +0 -1
  484. data/test/FIXTURE/read_list_file +0 -6
  485. data/test/lib/facets/core/dir/self/test_ls_r.rb +0 -52
  486. data/test/lib/facets/core/fileutils/test_wc.rb +0 -68
  487. data/test/lib/facets/core/fileutils/test_which.rb +0 -61
  488. data/test/testdir.rb +0 -8
@@ -13,11 +13,10 @@
13
13
  # FOR A PARTICULAR PURPOSE.
14
14
  #
15
15
  # ==========================================================================
16
- # Revision History
16
+ # Revision Notes
17
17
  # ==========================================================================
18
- #
19
- # * Empty
20
- #
18
+ # Consider how this might fit in with method signitures, overloading,
19
+ # and expiremental euphoria-like type system.
21
20
  # ==========================================================================
22
21
  #
23
22
  # TODO : look to implement to_int, to_mailtext, to_r, to_rfc822text and to_str
@@ -31,7 +30,7 @@
31
30
  # To implement a new type conversion, you have two choices :
32
31
  #
33
32
  # Take :
34
- #
33
+ #
35
34
  # class CustomType
36
35
  # def initialize(my_var)
37
36
  # @my_var = my_var
@@ -58,7 +57,7 @@
58
57
  # end
59
58
  #
60
59
  # "1234".cast_to CustomType => #<CustomType:0xb7d1958c @my_var="1234">
61
- #
60
+ #
62
61
  #
63
62
  # Those two methods are equivalent in the result. It was coded like that to
64
63
  # avoid the pollution of core classes with tons of to_* methods.
@@ -74,7 +73,7 @@
74
73
  # == FAQ
75
74
  #
76
75
  # Why didn't you name the `cast_to` method to `to` ?
77
- #
76
+ #
78
77
  # Even if it would make the syntax more friendly, I suspect it could cause
79
78
  # a lot of collisions with already existing code. The goal is that each
80
79
  # time you call cast_to, you either get your result, either a
@@ -85,6 +84,8 @@
85
84
  # * Jonas Pfenniger
86
85
  #
87
86
 
87
+ require 'time'
88
+
88
89
  require 'facet/string/methodize'
89
90
  require 'facet/string/modulize'
90
91
 
@@ -95,6 +96,7 @@ class Object
95
96
  # 1234.cast_to(String) => "1234"
96
97
  #
97
98
  def cast_to(klass, options={})
99
+ # TODO check for a to_{klass.name} here?
98
100
  klass.cast_from(self, options)
99
101
  end
100
102
 
@@ -118,7 +120,7 @@ class Object
118
120
  end
119
121
 
120
122
  # Extend the ruby core
121
- # --
123
+
122
124
  class Array
123
125
  class << self
124
126
  def cast_from(object, options={})
@@ -185,9 +187,7 @@ class Class
185
187
  nil
186
188
  end
187
189
 
188
- # :logger__error.cast_to Class #=> Logger::Error
189
-
190
- alias :cast_from_symbol :cast_from_string
190
+ alias_method :cast_from_symbol, :cast_from_string
191
191
 
192
192
  end
193
193
  end
@@ -278,7 +278,7 @@ end
278
278
  end
279
279
 
280
280
  def test_string_to_time
281
- assert_equal( "Mon Oct 10 00:00:00 CEST 2005", "10-10-2005".cast_to(Time).to_s )
281
+ assert_equal( "Mon Oct 10 00:00:00 2005", "2005-10-10".cast_to(Time).strftime("%a %b %d %H:%M:%S %Y") )
282
282
  end
283
283
 
284
284
  def test_no_converter
@@ -436,7 +436,7 @@ module Units
436
436
  end
437
437
 
438
438
  def driver
439
- @@driver ||= SOAP::WSDLDriverFactory.new("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl").create_rpc_driver #.createDriver
439
+ @@driver ||= SOAP::WSDLDriverFactory.new("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl").create_rpc_driver
440
440
  end
441
441
 
442
442
  end
@@ -797,13 +797,13 @@ module Units
797
797
 
798
798
  # The directory in which the data files are searched for
799
799
  begin
800
- if ::Gem.active?('calibre')
801
- DATADIR = File.join( ::Gem.gempath('calibre'), 'data', 'calibre', 'units' )
800
+ if ::Gem.active?('facets')
801
+ DATADIR = File.join( ::Gem.gempath('facets'), 'data', 'facets', 'units' )
802
802
  else
803
- DATADIR = File.join( ::Config::CONFIG['datadir'], 'calibre', 'units' )
803
+ DATADIR = File.join( ::Config::CONFIG['datadir'], 'facets', 'units' )
804
804
  end
805
805
  rescue
806
- DATADIR = File.join( ::Config::CONFIG['datadir'], 'calibre', 'units' )
806
+ DATADIR = File.join( ::Config::CONFIG['datadir'], 'facets', 'units' )
807
807
  end
808
808
 
809
809
  # The standard service used for looking up currency exchange rates
@@ -920,18 +920,24 @@ end
920
920
  end
921
921
 
922
922
  def test_01_016
923
- assert_equal( [:us, :cex, :default, :uk], Converter.registered_converters )
923
+ assert(
924
+ [:us, :cex, :default, :uk].all? { |c|
925
+ Converter.registered_converters.include?( c )
926
+ }
927
+ )
924
928
  end
925
929
 
926
- def test_01_017
927
- assert_raises(TypeError) {
928
- 1.try.to(usd)
929
- }
930
- end
930
+ # Money exchange is off line at the moment
931
931
 
932
- def test_01_016
933
- assert_equal( "33.2190007563597 twd", (1.usd(:cex).to(twd(:cex))).to_s )
934
- end
932
+ #def test_01_017
933
+ # assert_raises(TypeError) {
934
+ # 1.try.to(usd)
935
+ # }
936
+ #end
937
+
938
+ #def test_01_016
939
+ # assert_equal( "33.2190007563597 twd", (1.usd(:cex).to(twd(:cex))).to_s )
940
+ #end
935
941
 
936
942
  end
937
943
 
@@ -0,0 +1,519 @@
1
+ #--
2
+ # XOXO
3
+ #
4
+ # Ported from xoxo.rb at http://chneukirchen.org/repos/xoxo-rb/
5
+ # Copyright (C) 2006 Christian Neukirchen
6
+ #
7
+ # Ruby License
8
+ #
9
+ # This module is free software. You may use, modify, and/or redistribute this
10
+ # software under the same terms as Ruby.
11
+ #
12
+ # This program is distributed in the hope that it will be useful, but WITHOUT
13
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14
+ # FOR A PARTICULAR PURPOSE.
15
+ #++
16
+
17
+ require 'rexml/parsers/pullparser'
18
+
19
+ # XOXO is a Ruby XOXO parser and generator. It provides
20
+ # a Ruby API similar to Marshal and YAML (though more
21
+ # specific) to load and dump XOXO[http://microformats.org/wiki/xoxo],
22
+ # an simple, open outline format written in standard XHTML and
23
+ # suitable for embedding in (X)HTML, Atom, RSS, and arbitrary XML.
24
+
25
+ module XOXO
26
+
27
+ # xoxo.rb version number
28
+ #VERSION = "0.1"
29
+
30
+ # Load and return a XOXO structure from the String, IO or StringIO or _xoxo_.
31
+ #
32
+ def self.load(xoxo)
33
+ structs = Parser.new(xoxo).parse.structs
34
+ while structs.kind_of?(Array) && structs.size == 1
35
+ structs = structs.first
36
+ end
37
+ structs
38
+ end
39
+
40
+ # Return a XOXO string corresponding to the Ruby object +struct+,
41
+ # translated to the following rules:
42
+ #
43
+ # * Arrays become ordered lists <tt><ol></tt>.
44
+ # * Hashes become definition lists <tt><dl></tt>, keys are
45
+ # stringified with +to_s+.
46
+ # * Everything else becomes stringified with +to_s+ and wrapped in
47
+ # appropriate list elements (<tt><li></tt> or <tt><dt></tt>/<tt><dd></tt>).
48
+ #
49
+ # Additionally, you can pass these options on the _options_ hash:
50
+ # <tt>:html_wrap</tt> => +true+:: Wrap the XOXO with a basic XHTML 1.0
51
+ # Transitional header.
52
+ # <tt>:css</tt> => _css_:: Reference _css_ as stylesheet for the
53
+ # wrapped XOXO document.
54
+ #
55
+ def self.dump(struct, options={})
56
+ struct = [struct] unless struct.kind_of? Array
57
+
58
+ if options[:html_wrap]
59
+ result = <<EOF.strip
60
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
61
+ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
62
+ <html xmlns="http://www.w3.org/1999/xhtml"><head profile=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
63
+ EOF
64
+ if options[:css]
65
+ result << %Q[<style type="text/css" >@import "#{options[:css]}";</style>]
66
+ end
67
+
68
+ result << "</head><body>" << make_xoxo(struct, 'xoxo') << "</body></html>"
69
+ else
70
+ result = make_xoxo(struct, 'xoxo')
71
+ end
72
+
73
+ result
74
+ end
75
+
76
+ private
77
+
78
+ def self.make_xoxo(struct, class_name=nil)
79
+ s = ''
80
+ case struct
81
+ when Array
82
+ if class_name
83
+ s << %Q[<ol class="#{class_name}">]
84
+ else
85
+ s << "<ol>"
86
+ end
87
+ struct.each { |item|
88
+ s << "<li>" << make_xoxo(item) << "</li>"
89
+ }
90
+ s << "</ol>"
91
+
92
+ when Hash
93
+ d = struct.dup
94
+ if d.has_key? 'url'
95
+ s << '<a href="' << d['url'].to_s << '" '
96
+ text = d.fetch('text') { d.fetch('title', d['url']) }
97
+ %w[title rel type].each { |tag|
98
+ if d.has_key? tag
99
+ s << tag.to_s << '="' << make_xoxo(d.delete(tag)) << '" '
100
+ end
101
+ }
102
+ s << '>' << make_xoxo(text) << '</a>'
103
+ d.delete 'text'
104
+ d.delete 'url'
105
+ end
106
+
107
+ unless d.empty?
108
+ s << "<dl>"
109
+ d.each { |key, value|
110
+ s << "<dt>" << key.to_s << "</dt><dd>" << make_xoxo(value) << "</dd>"
111
+ }
112
+ s << "</dl>"
113
+ end
114
+
115
+ when String
116
+ s << struct
117
+
118
+ else
119
+ s << struct.to_s # too gentle?
120
+ end
121
+
122
+ s
123
+ end
124
+ end
125
+
126
+ class XOXO::Parser # :nodoc:
127
+ CONTAINER_TAGS = %w{dl ol ul}
128
+
129
+ attr_reader :structs
130
+
131
+ def initialize(xoxo)
132
+ @parser = REXML::Parsers::PullParser.new(xoxo)
133
+
134
+ @textstack = ['']
135
+ @xostack = []
136
+ @structs = []
137
+ @tags = []
138
+ end
139
+
140
+ def parse
141
+ while @parser.has_next?
142
+ res = @parser.pull
143
+
144
+ if res.start_element?
145
+ @tags << res[0]
146
+
147
+ case res[0]
148
+ when "a"
149
+ attrs = normalize_attrs res[1]
150
+ attrs['url'] = attrs['href']
151
+ attrs.delete 'href'
152
+ push attrs
153
+ @textstack << ''
154
+
155
+ when "dl"
156
+ push({})
157
+
158
+ when "ol", "ul"
159
+ push []
160
+
161
+ when "li", "dt", "dd"
162
+ @textstack << ''
163
+
164
+ end
165
+ elsif res.end_element?
166
+ @tags.pop
167
+
168
+ case res[0]
169
+ when "a"
170
+ val = @textstack.pop
171
+ unless val.empty?
172
+ val = '' if @xostack.last['title'] == val
173
+ val = '' if @xostack.last['url'] == val
174
+ @xostack.last['text'] = val unless val.empty?
175
+ end
176
+ @xostack.pop
177
+
178
+ when "dl", "ol", "ul"
179
+ @xostack.pop
180
+
181
+ when "li"
182
+ val = @textstack.pop
183
+ while @structs.last != @xostack.last
184
+ val = @structs.pop
185
+ @xostack.last << val
186
+ end
187
+ @xostack.last << val if val.kind_of? String
188
+
189
+ when "dt"
190
+ # skip
191
+
192
+ when "dd"
193
+ val = @textstack.pop
194
+ key = @textstack.pop
195
+
196
+ val = @structs.pop if @structs.last != @xostack.last
197
+ @xostack.last[key] = val
198
+
199
+ end
200
+ elsif res.text?
201
+ unless @tags.empty? || CONTAINER_TAGS.include?(@tags.last)
202
+ @textstack.last << res[0]
203
+ end
204
+ end
205
+ end
206
+
207
+ self
208
+ end
209
+
210
+ private
211
+
212
+ def normalize_attrs(attrs)
213
+ attrs.keys.find_all { |k, v| k != k.downcase }.each { |k, v|
214
+ v = v.downcase if k == "rel" || k == "type"
215
+ attrs.delete k
216
+ attrs[k.downcase] = v
217
+ }
218
+ attrs
219
+ end
220
+
221
+ def push(struct)
222
+ if struct == {} && @structs.last.kind_of?(Hash) &&
223
+ @structs.last.has_key?('url') &&
224
+ @structs.last != @xostack.last
225
+ # put back the <a>-made one for extra def's
226
+ @xostack << @structs.last
227
+ else
228
+ @structs << struct
229
+ @xostack << @structs.last
230
+ end
231
+ end
232
+ end
233
+
234
+
235
+
236
+ # _____ _
237
+ # |_ _|__ ___| |_
238
+ # | |/ _ \/ __| __|
239
+ # | | __/\__ \ |_
240
+ # |_|\___||___/\__|
241
+ #
242
+
243
+ =begin test
244
+
245
+ require 'test/unit'
246
+
247
+ class TCXOXO < Test::Unit::TestCase
248
+
249
+ def test_simple_list
250
+ l = ['1', '2', '3']
251
+ html = XOXO.dump(l)
252
+ assert_equal '<ol class="xoxo"><li>1</li><li>2</li><li>3</li></ol>', html
253
+ end
254
+
255
+ def test_nested_list
256
+ l = ['1', ['2', '3']]
257
+ assert_equal '<ol class="xoxo"><li>1</li><li><ol><li>2</li><li>3</li></ol></li></ol>', XOXO.dump(l)
258
+ end
259
+
260
+ def test_hash
261
+ h = {'test' => '1', 'name' => 'Kevin'}
262
+ # Changed since Ruby sorts the hash differently.
263
+ assert_equal '<ol class="xoxo"><li><dl><dt>name</dt><dd>Kevin</dd><dt>test</dt><dd>1</dd></dl></li></ol>', XOXO.dump(h)
264
+ end
265
+
266
+ def test_single_item
267
+ l = 'test'
268
+ assert_equal '<ol class="xoxo"><li>test</li></ol>', XOXO.dump(l)
269
+ end
270
+
271
+ def test_wrap_differs
272
+ l = 'test'
273
+ html = XOXO.dump(l)
274
+ html_wrap = XOXO.dump(l, :html_wrap => true)
275
+ assert_not_equal html, html_wrap
276
+ end
277
+
278
+ def test_wrap_single_item
279
+ l = 'test'
280
+ html = XOXO.dump(l, :html_wrap => true)
281
+ assert_equal <<EOF.strip, html
282
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
283
+ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
284
+ <html xmlns="http://www.w3.org/1999/xhtml"><head profile=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><ol class="xoxo"><li>test</li></ol></body></html>
285
+ EOF
286
+ end
287
+
288
+ def test_wrap_item_with_css
289
+ l = 'test'
290
+ html = XOXO.dump(l, :html_wrap => true, :css => 'reaptest.css')
291
+ assert_equal <<EOF.strip, html
292
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
293
+ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
294
+ <html xmlns="http://www.w3.org/1999/xhtml"><head profile=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css" >@import "reaptest.css";</style></head><body><ol class="xoxo"><li>test</li></ol></body></html>
295
+ EOF
296
+ end
297
+
298
+ def test_hash_roundtrip
299
+ h = {'test' => '1', 'name' => 'Kevin'}
300
+ assert_equal h, XOXO.load(XOXO.dump(h))
301
+ end
302
+
303
+ def test_hash_with_url_roundtrip
304
+ h = {'url' => 'http://example.com', 'name' => 'Kevin'}
305
+ assert_equal h, XOXO.load(XOXO.dump(h))
306
+ end
307
+
308
+ def test_nested_hash_roundtrip
309
+ h = {'test' => '1', 'inner' => {'name' => 'Kevin'}}
310
+ assert_equal h, XOXO.load(XOXO.dump(h))
311
+ end
312
+
313
+ def test_nested_hash_with_url_roundtrip
314
+ h = {'url' => 'http://example.com', 'inner' => {
315
+ 'url' => 'http://slashdot.org', 'name' => 'Kevin'}}
316
+ assert_equal h, XOXO.load(XOXO.dump(h))
317
+ end
318
+
319
+ def test_list_round_trip
320
+ l = ['3', '2', '1']
321
+ assert_equal l, XOXO.load(XOXO.dump(l))
322
+ end
323
+
324
+ def test_list_of_hashes_round_trip
325
+ l = ['3', {'a' => '2'}, {'b' => '1', 'c' => '4'}]
326
+ assert_equal l, XOXO.load(XOXO.dump(l))
327
+ end
328
+
329
+ def test_list_of_lists_round_trip
330
+ l = ['3', ['a', '2'], ['b', ['1', ['c', '4']]]]
331
+ assert_equal l, XOXO.load(XOXO.dump(l))
332
+ end
333
+
334
+ def test_hashes_of_lists_roundtrip
335
+ h = {
336
+ 'test' => ['1', '2'],
337
+ 'name' => 'Kevin',
338
+ 'nestlist' => ['a', ['b', 'c']],
339
+ 'nestdict' => {'e' => '6', 'f' => '7'}
340
+ }
341
+ assert_equal h, XOXO.load(XOXO.dump(h))
342
+ end
343
+
344
+ def test_xoxo_junk_in_containers
345
+ h = XOXO.load '<ol>bad<li><dl>worse<dt>good</dt><dd>buy</dd> now</dl></li></ol>'
346
+ assert_equal({'good' => 'buy'}, h)
347
+ end
348
+
349
+ def test_xoxo_junk_in_elements
350
+ l = XOXO.load '<ol><li>bad<dl><dt>good</dt><dd>buy</dd></dl>worse</li><li>bag<ol><li>OK</li></ol>fish</li></ol>'
351
+ assert_equal([{'good' => 'buy'}, ['OK']], l)
352
+ end
353
+
354
+ def test_xoxo_with_spaces_and_newlines
355
+ xoxo_sample = <<EOF.strip
356
+ <ol class='xoxo'>
357
+ <li>
358
+ <dl>
359
+ <dt>text</dt>
360
+ <dd>item 1</dd>
361
+ <dt>description</dt>
362
+ <dd> This item represents the main point we're trying to make.</dd>
363
+ <dt>url</dt>
364
+ <dd>http://example.com/more.xoxo</dd>
365
+ <dt>title</dt>
366
+ <dd>title of item 1</dd>
367
+ <dt>type</dt>
368
+ <dd>text/xml</dd>
369
+ <dt>rel</dt>
370
+ <dd>help</dd>
371
+ </dl>
372
+ </li>
373
+ </ol>
374
+ EOF
375
+ h = XOXO.load xoxo_sample
376
+ h2 = {
377
+ 'text' => 'item 1',
378
+ 'description' => " This item represents the main point we're trying to make.",
379
+ 'url' => 'http://example.com/more.xoxo',
380
+ 'title' => 'title of item 1',
381
+ 'type' => 'text/xml',
382
+ 'rel' => 'help'
383
+ }
384
+ assert_equal h2, XOXO.load(xoxo_sample)
385
+ end
386
+
387
+ def test_special_attribute_decoding
388
+ xoxo_sample = <<EOF.strip
389
+ <ol class='xoxo'>
390
+ <li>
391
+ <dl>
392
+ <dt>text</dt>
393
+ <dd>item 1</dd>
394
+ <dt>url</dt>
395
+ <dd>http://example.com/more.xoxo</dd>
396
+ <dt>title</dt>
397
+ <dd>title of item 1</dd>
398
+ <dt>type</dt>
399
+ <dd>text/xml</dd>
400
+ <dt>rel</dt>
401
+ <dd>help</dd>
402
+ </dl>
403
+ </li>
404
+ </ol>
405
+ EOF
406
+ smart_xoxo_sample = <<EOF.strip
407
+ <ol class='xoxo'>
408
+ <li><a href="http://example.com/more.xoxo"
409
+ title="title of item 1"
410
+ type="text/xml"
411
+ rel="help">item 1</a>
412
+ <!-- note how the "text" property is simply the contents of the <a> element -->
413
+ </li>
414
+ </ol>
415
+ EOF
416
+ assert_equal XOXO.load(xoxo_sample), XOXO.load(smart_xoxo_sample)
417
+ end
418
+
419
+ def test_special_attribute_and_dl_decoding
420
+ xoxo_sample = <<EOF.strip
421
+ <ol class="xoxo">
422
+ <li>
423
+ <dl>
424
+ <dt>text</dt>
425
+ <dd>item 1</dd>
426
+ <dt>description</dt>
427
+ <dd> This item represents the main point we're trying to make.</dd>
428
+ <dt>url</dt>
429
+ <dd>http://example.com/more.xoxo</dd>
430
+ <dt>title</dt>
431
+ <dd>title of item 1</dd>
432
+ <dt>type</dt>
433
+ <dd>text/xml</dd>
434
+ <dt>rel</dt>
435
+ <dd>help</dd>
436
+ </dl>
437
+ </li>
438
+ </ol>
439
+ EOF
440
+ smart_xoxo_sample = <<EOF.strip
441
+ <ol class="xoxo">
442
+ <li><a href="http://example.com/more.xoxo"
443
+ title="title of item 1"
444
+ type="text/xml"
445
+ rel="help">item 1</a>
446
+ <!-- note how the "text" property is simply the contents of the <a> element -->
447
+ <dl>
448
+ <dt>description</dt>
449
+ <dd> This item represents the main point we're trying to make.</dd>
450
+ </dl>
451
+ </li>
452
+ </ol>
453
+ EOF
454
+ assert_equal XOXO.load(xoxo_sample), XOXO.load(smart_xoxo_sample)
455
+ end
456
+
457
+ def test_special_attribute_encode
458
+ h = {
459
+ 'url' => 'http://example.com/more.xoxo',
460
+ 'title' => 'sample url',
461
+ 'type' => "text/xml",
462
+ 'rel' => 'help',
463
+ 'text' => 'an example'
464
+ }
465
+ assert_equal '<ol class="xoxo"><li><a href="http://example.com/more.xoxo" title="sample url" rel="help" type="text/xml" >an example</a></li></ol>', XOXO.dump(h)
466
+ end
467
+
468
+ def test_special_attribute_roundtrip_full
469
+ h = {
470
+ 'url' => 'http://example.com/more.xoxo',
471
+ 'title' => 'sample url',
472
+ 'type' => "text/xml",
473
+ 'rel' => 'help',
474
+ 'text' => 'an example'
475
+ }
476
+ assert_equal h, XOXO.load(XOXO.dump(h))
477
+ end
478
+
479
+ def test_special_attribute_roundtrip_no_text
480
+ h = {
481
+ 'url' => 'http://example.com/more.xoxo',
482
+ 'title' => 'sample url',
483
+ 'type' => "text/xml",
484
+ 'rel' => 'help'
485
+ }
486
+ assert_equal h, XOXO.load(XOXO.dump(h))
487
+ end
488
+
489
+ def test_special_attribute_roundtrip_no_text_or_title
490
+ h = {'url' => 'http://example.com/more.xoxo'}
491
+ assert_equal h, XOXO.load(XOXO.dump(h))
492
+ end
493
+
494
+ def test_attention_roundtrip
495
+ kmattn = <<EOF.strip
496
+ <ol class="xoxo"><li><a href="http://www.boingboing.net/" title="Boing Boing Blog" >Boing Boing Blog</a><dl><dt>alturls</dt><dd><ol><li><a href="http://boingboing.net/rss.xml" >xmlurl</a></li></ol></dd><dt>description</dt><dd>Boing Boing Blog</dd></dl></li><li><a href="http://www.financialcryptography.com/" title="Financial Cryptography" >Financial Cryptography</a><dl><dt>alturls</dt><dd><ol><li><a href="http://www.financialcryptography.com/mt/index.rdf" >xmlurl</a></li></ol></dd><dt>description</dt><dd>Financial Cryptography</dd></dl></li><li><a href="http://hublog.hubmed.org/" title="HubLog" >HubLog</a><dl><dt>alturls</dt><dd><ol><li><a href="http://hublog.hubmed.org/index.xml" >xmlurl</a></li><li><a href="http://hublog.hubmed.org/foaf.rdf" >foafurl</a></li></ol></dd><dt>description</dt><dd>HubLog</dd></dl></li></ol>
497
+ EOF
498
+ assert_equal kmattn, XOXO.dump(XOXO.load(kmattn))
499
+ assert_equal XOXO.load(kmattn), XOXO.load(XOXO.dump(XOXO.load(kmattn)))
500
+ assert_equal XOXO.dump(XOXO.load(kmattn)),
501
+ XOXO.dump(XOXO.load(XOXO.dump(XOXO.load(kmattn))))
502
+ end
503
+
504
+ def test_unicode_roundtrip
505
+ unicode = "Tantek \xc3\x87elik and a snowman \xe2\x98\x83"
506
+ assert_equal unicode, XOXO.load(XOXO.dump(unicode))
507
+ end
508
+
509
+ # TBD: Implement proper encodings.
510
+ #
511
+ # def test_utf8_roundtrip
512
+ # end
513
+ # def test_windows1252_roundtrip
514
+ # end
515
+ end
516
+
517
+ =end
518
+
519
+