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
@@ -41,7 +41,7 @@
41
41
  # but might prove a better means in the future.
42
42
  #
43
43
  # This script is provided for experimetnal purposes. Please inform the author
44
- # if you find ways to improve it or put to an interesting use.
44
+ # if you find ways to improve it or put it to an interesting use.
45
45
  #
46
46
  # == Synopsis
47
47
  #
@@ -44,18 +44,22 @@
44
44
  # end
45
45
  #
46
46
  # a = SomeMultitonClass.new(4)
47
- # b = SomeMultitonClass.new(4) # a and b are same object
47
+ # b = SomeMultitonClass.new(4) # a and b are same object
48
48
  # c = SomeMultitonClass.new(2) # c is a different object
49
49
  #
50
50
  # == Previous Behavior
51
51
  #
52
- # In previous versions of Multion the #new method was made
52
+ # In previous versions of Multion the #new method was made
53
53
  # private and #instance was used in its stay --just like Singleton.
54
- # But this has proved less desirable for Multiton b/c a Multion can
55
- # have multiple instances not just one. So instead we define #create
56
- # as a private alias of the original #new method (should it be needed)
57
- # and then #new is overridden with #instance as an alias for it.
58
- # So if you must have exact old behavior all you need do is re-alias
54
+ # But this has proved less desirable for Multiton since Multitions can
55
+ # have multiple instances, not just one.
56
+ #
57
+ # So instead Multiton now defines #create as a private alias of
58
+ # the original #new method (jus tin case it is needed) and then
59
+ # defines #new to handle the multion, and #instance is provided
60
+ # as an alias for it.
61
+ #
62
+ # So if you must have the old behavior, all you need do is re-alias
59
63
  # #new to #create and privatize it.
60
64
  #
61
65
  # class SomeMultitonClass
@@ -65,6 +69,8 @@
65
69
  # ...
66
70
  # end
67
71
  #
72
+ # Then only #instance will be available for creating the Multiton.
73
+ #
68
74
  # == How It Works
69
75
  #
70
76
  # A pool of objects is searched for a previously cached object,
@@ -136,6 +142,7 @@ module Multiton
136
142
 
137
143
  end
138
144
 
145
+ #--
139
146
  # Deprecated use, now use #private_multiton method after including Multiton
140
147
  #
141
148
  # module MultitonInstance
@@ -159,8 +166,9 @@ end
159
166
  # return obj
160
167
  # end
161
168
  # end
162
- #
169
+ #
163
170
  # end
171
+ #++
164
172
 
165
173
 
166
174
  # _____ _
@@ -49,7 +49,7 @@
49
49
  # end
50
50
  #
51
51
  # To do so for a pre-existing class with a pre-existing #<=> method, you'll
52
- # need to obveride the method. As an example let's make Numeric comparable to nil.
52
+ # need to overide the method. As an example let's make Numeric comparable to nil.
53
53
  #
54
54
  # class Numeric
55
55
  #
@@ -101,53 +101,31 @@ class NilClass
101
101
  end
102
102
 
103
103
 
104
- # DEPRECATED
105
- #
106
- # module NilComparable
107
- #
108
- # def self.included( mod )
109
- #
110
- # mod.class_eval %{
111
- #
112
- # if method_defined?( :<=> )
113
- # alias_method :compare_without_nil, :<=>
114
- # else
115
- # def compare_without_nil( other )
116
- # raise TypeError, "Cannot compare \#{self.inspect} to \#{other.inspect}"
117
- # end
118
- # end
119
- #
120
- # def <=>( other )
121
- # return 1 if other.nil?
122
- # compare_without_nil( other )
123
- # end
124
- #
125
- # }
126
- #
127
- # end
128
- #
129
- # end
130
-
131
- # DEPRECATED
132
- #
133
- # # Calling this method for a given class allows instances
134
- # # of a class to be compared to nil using <=>.
135
- # # Adapted from code by Paul Brannan (Ruby License)
136
- # def nil_comparable(klass=self)
137
- # klass.class_eval %{
138
- # if method_defined?( :<=> )
139
- # alias_method :compare_without_nil, :<=>
140
- # else
141
- # def compare_without_nil( other )
142
- # raise TypeError, "Cannot compare \#{self.inspect} to \#{other.inspect}"
143
- # end
144
- # end
145
- # def <=>( other )
146
- # return 1 if other.nil?
147
- # compare_without_nil( other )
148
- # end
149
- # }
150
- # end
104
+
105
+ =begin DEPRECATED
106
+
107
+ module NilComparable
108
+
109
+ def self.included( mod )
110
+ mod.class_eval %{
111
+ if method_defined?( :<=> )
112
+ alias_method :compare_without_nil, :<=>
113
+ else
114
+ def compare_without_nil( other )
115
+ raise TypeError, "Cannot compare \#{self.inspect} to \#{other.inspect}"
116
+ end
117
+ end
118
+
119
+ def <=>( other )
120
+ return 1 if other.nil?
121
+ compare_without_nil( other )
122
+ end
123
+ }
124
+ end
125
+
126
+ end
127
+
128
+ =end
151
129
 
152
130
 
153
131
 
@@ -163,7 +141,11 @@ end
163
141
  require 'test/unit'
164
142
 
165
143
  class Mock < String
166
- include NilComparable
144
+ alias_method :compare_without_nil, :<=>
145
+ def <=>( other )
146
+ return 1 if other.nil?
147
+ compare_without_nil( other )
148
+ end
167
149
  end
168
150
 
169
151
  class TC_NilClass_Comparable < Test::Unit::TestCase
@@ -36,10 +36,12 @@
36
36
  # advantage in benchmark tests.
37
37
  #
38
38
  #--
39
- # Thrid, when an entry is not found 'null' is returned rather then 'nil'.
39
+ #
40
+ # Third, when an entry is not found 'null' is returned rather then 'nil'.
40
41
  # This allows for run-on entries withuot error. Eg.
41
42
  #
42
43
  # OpenObject.new.a.b.c #=> null
44
+ #
43
45
  #++
44
46
  #
45
47
  # == Author(s)
@@ -48,6 +50,7 @@
48
50
  # * Thomas Sawyer
49
51
  #
50
52
 
53
+ require 'facets/core/hash/keys_to_sym'
51
54
  require 'facets/more/basicobject'
52
55
  #require 'facets/more/nullclass'
53
56
 
@@ -56,15 +59,15 @@ class OpenObject < BasicObject
56
59
  def initialize( init=nil )
57
60
  case init
58
61
  when Array
59
- @table = Hash[*init]
62
+ @table = Hash[*init].keys_to_sym
60
63
  when Hash
61
- @table = init.dup
64
+ @table = init.keys_to_sym
62
65
  when NilClass
63
66
  @table = {}
64
67
  when OpenObject
65
68
  @table = init.__table__.dup
66
69
  else
67
- @table = init.to_h.dup
70
+ @table = init.to_h.keys_to_sym
68
71
  end
69
72
  end
70
73
 
@@ -108,11 +111,14 @@ class OpenObject < BasicObject
108
111
  @table[name] = args[0]
109
112
  self
110
113
  else
111
- #if @table.key?(name)
114
+ if @table.key?(name)
112
115
  @table[name]
113
- #else
114
- # Kernel.null #@table[name] = instance.class.new
115
- #end
116
+ elsif @parent
117
+ @parent.__send__(name)
118
+ else
119
+ nil
120
+ # Kernel.null #@table[name] = instance.class.new
121
+ end
116
122
  end
117
123
  end
118
124
 
@@ -134,18 +140,23 @@ class OpenObject < BasicObject
134
140
  @table.each( &yld )
135
141
  end
136
142
 
143
+ # shadow methods
144
+
137
145
  def __table__ ; @table ; end
138
146
 
147
+ def __parent__ ; @parent ; end
148
+ def __parent__=(x) ; @parent = x ; end
149
+
139
150
  #def __get__(k) ; @table.key?(k.to_sym) ? @table[k.to_sym] : null ; end
140
151
  def __get__(k) ; @table[k.to_sym] ; end
141
152
  def __set__(k) ; @table[k.to_sym]=v ; end
142
153
 
143
- def __key__?(key) ; @table.key?(key) ; end
154
+ def __key__?(k) ; @table.key?(k.to_sym) ; end
144
155
  def __keys__ ; @table.keys ; end
145
156
 
146
157
  def __update__( other )
147
158
  other = Hash[*other] if other.is_a?(Array)
148
- other.each{ |k, v| @table[k] = v }
159
+ other.each{ |k, v| @table[k.to_sym] = v }
149
160
  end
150
161
 
151
162
  def __merge__( other )
@@ -158,6 +169,35 @@ end
158
169
 
159
170
 
160
171
 
172
+ class CascadingOpenObject < OpenObject
173
+
174
+ def method_missing( sym, *args )
175
+ type = sym.to_s[-1,1]
176
+ name = sym.to_s.gsub(/[=!?]$/, '').to_sym
177
+ if type == '='
178
+ @table[name] = args[0]
179
+ elsif type == '!' and args.size > 0
180
+ @table[name] = args[0]
181
+ self
182
+ else
183
+ if @table.key?(name)
184
+ if Hash === @table[name]
185
+ self.__class__.new( @table[name] )
186
+ else
187
+ @table[name]
188
+ end
189
+ elsif @parent
190
+ @parent.__send__(name)
191
+ else
192
+ nil
193
+ # Kernel.null #@table[name] = instance.class.new
194
+ end
195
+ end
196
+ end
197
+
198
+ end
199
+
200
+
161
201
  # _____ _
162
202
  # |_ _|__ ___| |_
163
203
  # | |/ _ \/ __| __|
@@ -0,0 +1,125 @@
1
+ #--
2
+ # Multiton
3
+ #
4
+ # Copyright (c) 2005 Thomas Sawyer
5
+ #
6
+ # Ruby License
7
+ #
8
+ # This module is free software. You may use, modify, and/or redistribute this
9
+ # software under the same terms as Ruby.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
+ # FOR A PARTICULAR PURPOSE.
14
+ #
15
+ #
16
+ # ==========================================================================
17
+ # Revision History ::
18
+ # --------------------------------------------------------------------------
19
+ # 2006-04-04 trans * Created
20
+ # ==========================================================================
21
+ #++
22
+
23
+ require 'facets/more/basicobject'
24
+
25
+ #:title: Recorder
26
+ #
27
+ # Recorder is similar essentially a method probe. It records everthing
28
+ # that happens to it, building an internal parse tree. You can then
29
+ # pass a substitute object and apply the recoding to it. Or you can
30
+ # utilize the parse tree.
31
+ #
32
+ # The only limitation of Recorder is with special operators, like if, &&, ||, etc.
33
+ # Since they are not true methods they can't be recorded. (Too bad for Ruby.)
34
+ #
35
+ # == Synopsis
36
+ #
37
+ # class Z
38
+ # def name ; 'George' ; end
39
+ # def age ; 12 ; end
40
+ # end
41
+ #
42
+ # z = Z.new
43
+ #
44
+ # r = Recorder.new
45
+ # q = proc { |x| (x.name == 'George') & (x.age > 10) }
46
+ # x = q[r]
47
+ # x.__call__(z)
48
+ #
49
+ # produces
50
+ #
51
+ # true
52
+ #
53
+ # == Author(s)
54
+ #
55
+ # * Thomas Sawyer
56
+ #
57
+
58
+ class Recorder < BasicObject
59
+
60
+ def initialize( msg=nil )
61
+ @msg = msg
62
+ end
63
+
64
+ def inspect
65
+ "<Recorder #{@msg.inspect}>"
66
+ end
67
+
68
+ def __call__( orig )
69
+ return orig unless @msg
70
+
71
+ sym = @msg[0]
72
+ args = @msg[1..-1].collect do |a|
73
+ Recorder === a ? a.__call__(orig) : a
74
+ end
75
+ obj = args.shift
76
+
77
+ obj.__send__( sym, *args )
78
+ end
79
+
80
+ def method_missing( sym, *args, &blk )
81
+ self.__class__.new( [ sym, self, *args ] )
82
+ end
83
+
84
+ end
85
+
86
+
87
+
88
+ # _____ _
89
+ # |_ _|__ ___| |_
90
+ # | |/ _ \/ __| __|
91
+ # | | __/\__ \ |_
92
+ # |_|\___||___/\__|
93
+ #
94
+
95
+ =begin test
96
+
97
+ require 'test/unit'
98
+
99
+ #class Object
100
+ # def &(o)
101
+ # self && o
102
+ # end
103
+ #end
104
+
105
+ class TCRecorder < Test::Unit::TestCase
106
+
107
+ class Z
108
+ def name ; 'George' ; end
109
+ def age ; 12 ; end
110
+ end
111
+
112
+ def setup
113
+ @z = Z.new
114
+ end
115
+
116
+ def test_001
117
+ r = Recorder.new
118
+ q = proc { |x| (x.name == 'George') & (x.age > 10) }
119
+ x = q[r]
120
+ assert( x.__call__(@z) )
121
+ end
122
+
123
+ end
124
+
125
+ =end
@@ -1,14 +1,209 @@
1
- warn 'ALPHAWARE! rtals.rb is still under development.'
1
+ #--
2
+ # RubyTals
3
+ # Copyright (c) 2006 Thomas Sawyer
4
+ #
5
+ # Ruby License
6
+ #
7
+ # This module is free software. You may use, modify, and/or redistribute this
8
+ # software under the same terms as Ruby.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE.
13
+ #++
2
14
 
3
- require 'rexml'
15
+ require 'rexml/document'
16
+
17
+ # RubyTals
18
+ #
19
+ # RubyTals is a Ruby variation on Zope Page Templates and it's TAL specification.
20
+ # It differs from TAL in that it is specifically geared for use by Ruby.
21
+ #
22
+ # == Usage
23
+ #
24
+ # s = %q{
25
+ # <html>
26
+ # <body>
27
+ # <h1 rtal:content="x">[X]</h1>
28
+ # <div rtal:each="animal" rtal:do="a">
29
+ # <b rtal:content="a">[ANIMAL]</b>
30
+ # </div>
31
+ # <div rtal:if="animal.size > 1">
32
+ # There are <b rtal:body="animal.size">[ANIMAL SIZE]</b> animals.
33
+ # </div>
34
+ # </body>
35
+ # </html>
36
+ # }
37
+ #
38
+ # x = 'Our Little Zoo'
39
+ # animal = ['Zebra', 'Monkey', 'Tiger' ]
40
+ # out = ''
41
+ #
42
+ # prg = RubyTals.compile( s )
43
+ # puts eval(prg)
44
+ #
45
+ #
46
+ # == Note
47
+ #
48
+ # WARNING! This library is only minimally functional at this point.
49
+ # If you would like to use it please consider improving upon it!
50
+ #
51
+ # Presently rTAL clauses can run arbitraty Ruby code. Although
52
+ # upping the safety level before executing a compiled template
53
+ # should be sufficiently protective in most cases, perhaps it would
54
+ # be better to limit valid expressions to single object references,
55
+ # ie. 'this.that', and then use a substitution of '.' for '/'.
56
+ # Not only would this be highly protective, it would also be more
57
+ # compatible with the original TAL spec; albiet this isn't exacty
58
+ # how TALs interprets the '/' divider.
59
+ #
60
+ # On the other hand perhaps it is too much restraint. For instance
61
+ # it would require the if-clause in the above exmaple to be
62
+ # something like:
63
+ #
64
+ # <div rtal:if="animal/plenty">
65
+ #
66
+ # and have a definition in the evaluateing code:
67
+ #
68
+ # def animal.plenty
69
+ # size > 1
70
+ # end
71
+ #
72
+ # It's a classic Saftey vs. Usability trade-off.
73
+ # And something to consider for the future.
74
+ #
75
+ # == Author(s)
76
+ #
77
+ # * Thomas Sawyer
78
+ #
4
79
 
5
80
  module RubyTals
6
81
 
7
- def parse( xmlstr )
82
+ def self.compile( xmlstr )
83
+ rxml = REXML::Document.new( xmlstr.strip )
84
+ parse( rxml )
85
+ end
86
+
87
+ #def self.evaluate( xomp, out='' )
88
+ # eval xomp
89
+ #end
90
+
91
+ def self.parse( xml )
92
+ building = ''
93
+ body = []
94
+
95
+ xml.each do |elem|
96
+ #p elem.class
97
+
98
+ tag, mode = [], nil
99
+ case elem
100
+ when REXML::Element
101
+
102
+ attributes, ruby_attributes = {}, {}
103
+ elem.attributes.each { |k, v|
104
+ if k =~ /^ruby:/i
105
+ ruby_attributes[k.sub(/^rtal:/i,'')] = v
106
+ else
107
+ attributes[k] = v
108
+ end
109
+ }
110
+
111
+ if ruby_attributes.empty?
112
+ tag = add_tag( elem.name, parse( elem ), attributes )
113
+
114
+ else
115
+ if bd = ruby_attributes["content"]
116
+ tag << "out << #{bd}.to_s"
117
+ elsif bd = ruby_attributes["replace"]
118
+ tag << "out << #{bd}.to_s"
119
+ mode = :replace
120
+ else
121
+ tag << parse( elem )
122
+ end
123
+
124
+ if cond = ( ruby_attributes["if"] || ruby_attributes["condition"] )
125
+ #mode = :replace
126
+ tag = ([ "if #{cond}" ].concat( tag ) << "end")
127
+ end
128
+
129
+ if enum = ( ruby_attributes["each"] || ruby_attributes["repeat"] )
130
+ loopf = "#{enum}.each do"
131
+ if d = ruby_attributes["do"]
132
+ loopf << " |#{d}|"
133
+ end
134
+ tag = ([ loopf ].concat( tag ) << "end")
135
+ end
136
+
137
+ unless mode == :replace #unless attributes.empty? #
138
+ tag = add_tag( elem.name, tag, attributes )
139
+ end
140
+
141
+ end
142
+
143
+ else
144
+ tag << "out << #{elem.to_s.inspect}"
8
145
 
9
- rxml = REXML::load( xmlstr )
146
+ end
10
147
 
148
+ body.concat tag
149
+ end
150
+
151
+ building << body.flatten.join("\n")
152
+ return building
153
+ end
154
+
155
+ def self.add_tag( name, body, attributes={} )
156
+ b = []
157
+ if attributes.empty?
158
+ b << "out << '<#{name}>'"
159
+ b << body
160
+ b << "out << '</#{name}>'"
161
+ else
162
+ s = ''
163
+ s << "out << '<#{name} "
164
+ s << attributes.collect { |k,v| %{#{k}="#{v}"} }.join(' ')
165
+ s << ">'"
166
+ b << s
167
+ b << body
168
+ b << "out << '</#{name}>'"
169
+ end
170
+ b
171
+ end
172
+
173
+ def self.loop_structure
11
174
 
12
175
  end
13
176
 
14
177
  end
178
+
179
+
180
+
181
+
182
+ =begin
183
+
184
+ s = %q{
185
+ <html>
186
+ <body>
187
+ <test>This is a test.</test>
188
+ <h1 rtal:content="x">[X]</h1>
189
+ <div rtal:each="animal" rtal:do="a">
190
+ <b rtal:content="a">[ANIMAL]</b>
191
+ </div>
192
+ <div rtal:if="animal.size >= 1">
193
+ <b rtal:body="animal.size">[ANIMAL SIZE]</b>
194
+ </div>
195
+ </body>
196
+ </html>
197
+ }
198
+
199
+ x = '10' # problem with numbers
200
+ animal = ['Zebra', 'Monkey', 'Tiger' ]
201
+ out = ''
202
+
203
+ prg = RubyTals.compile( s )
204
+ puts
205
+ puts prg
206
+ puts
207
+ puts eval(prg)
208
+
209
+ =end