facets 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. data/HISTORY.rdoc +331 -35
  2. data/MANIFEST +685 -826
  3. data/{doc/guide/notes.rd → NOTES} +0 -0
  4. data/README.rdoc +73 -25
  5. data/Rakefile +245 -2
  6. data/TODO +5 -0
  7. data/demo/hook.rd +47 -0
  8. data/demo/scenario_require.rd +9 -0
  9. data/doc/README.more +24 -6
  10. data/doc/manual/about.rb +47 -0
  11. data/doc/manual/annotations.rdoc +60 -0
  12. data/doc/manual/associations.rdoc +55 -0
  13. data/doc/manual/blockups.rdoc +101 -0
  14. data/doc/manual/capsule.rdoc +34 -0
  15. data/doc/manual/command.rdoc +177 -0
  16. data/doc/manual/core.rdoc +37 -0
  17. data/doc/manual/faq.rdoc +32 -0
  18. data/doc/manual/typecast.html +112 -0
  19. data/lib/core/facets.rb +359 -11
  20. data/lib/core/facets/array/combination.rb +3 -3
  21. data/lib/core/facets/array/index.rb +4 -1
  22. data/lib/core/facets/array/permutation.rb +2 -2
  23. data/lib/core/facets/array/product.rb +1 -1
  24. data/lib/core/facets/binding/eval.rb +1 -1
  25. data/lib/core/facets/denumerable.rb +76 -0
  26. data/lib/core/facets/duplicable.rb +34 -0
  27. data/lib/core/facets/enumerable/count.rb +10 -4
  28. data/lib/core/facets/enumerable/defer.rb +77 -0
  29. data/lib/core/facets/enumerable/each_by.rb +1 -1
  30. data/lib/core/facets/enumerable/every.rb +35 -0
  31. data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
  32. data/lib/core/facets/enumerable/filter.rb +25 -0
  33. data/lib/core/facets/enumerable/group_by.rb +1 -1
  34. data/lib/core/facets/enumerable/none.rb +3 -2
  35. data/lib/core/facets/enumerable/one.rb +3 -2
  36. data/lib/core/facets/enumerable/per.rb +61 -0
  37. data/lib/core/facets/exception/raised.rb +14 -0
  38. data/lib/core/facets/integer/odd.rb +5 -1
  39. data/lib/core/facets/kernel/__dir__.rb +13 -3
  40. data/lib/core/facets/kernel/__here__.rb +14 -0
  41. data/lib/core/facets/kernel/__method__.rb +9 -3
  42. data/lib/core/facets/kernel/ask.rb +1 -0
  43. data/lib/core/facets/kernel/equate.rb +13 -0
  44. data/lib/core/facets/kernel/extension.rb +9 -0
  45. data/lib/core/facets/kernel/identical.rb +4 -0
  46. data/lib/core/facets/kernel/instance_exec.rb +2 -1
  47. data/lib/core/facets/kernel/method.rb +49 -0
  48. data/lib/core/facets/kernel/object_send.rb +2 -2
  49. data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
  50. data/lib/core/facets/kernel/require_all.rb +6 -1
  51. data/lib/core/facets/kernel/require_local.rb +8 -1
  52. data/lib/core/facets/kernel/require_relative.rb +52 -0
  53. data/lib/core/facets/kernel/source_location.rb +13 -0
  54. data/lib/core/facets/kernel/tap.rb +13 -6
  55. data/lib/core/facets/module/attr_setter.rb +57 -0
  56. data/lib/core/facets/module/instance_method.rb +24 -0
  57. data/lib/core/facets/module/module_load.rb +60 -44
  58. data/lib/core/facets/module/module_require.rb +1 -0
  59. data/lib/core/facets/nilclass/to_f.rb +1 -1
  60. data/lib/core/facets/objectspace/op_fetch.rb +3 -0
  61. data/lib/core/facets/proc/curry.rb +4 -3
  62. data/lib/core/facets/string/bytes.rb +10 -4
  63. data/lib/core/facets/string/camelcase.rb +6 -5
  64. data/lib/core/facets/string/chars.rb +5 -1
  65. data/lib/core/facets/string/each_char.rb +1 -1
  66. data/lib/core/facets/string/each_word.rb +1 -1
  67. data/lib/core/facets/string/lines.rb +11 -4
  68. data/lib/core/facets/string/start_with.rb +9 -2
  69. data/lib/core/facets/string/unfold.rb +27 -0
  70. data/lib/core/facets/symbol/succ.rb +3 -3
  71. data/lib/core/facets/symbol/thrown.rb +20 -0
  72. data/lib/core/facets/symbol/to_proc.rb +3 -2
  73. data/lib/core/facets/time/to_time.rb +1 -1
  74. data/lib/core/facets/to_hash.rb +41 -100
  75. data/lib/core/facets/unboundmethod/name.rb +20 -23
  76. data/lib/more/facets/ansicode.rb +1 -10
  77. data/lib/more/facets/autoarray.rb +3 -31
  78. data/lib/more/facets/basicobject.rb +73 -0
  79. data/lib/more/facets/blankslate.rb +2 -66
  80. data/lib/{lore → more}/facets/cgi.rb +0 -0
  81. data/lib/more/facets/class_extend.rb +1 -0
  82. data/lib/{lore → more}/facets/continuation.rb +0 -0
  83. data/lib/{lore → more}/facets/date.rb +3 -3
  84. data/lib/more/facets/enumargs.rb +192 -0
  85. data/lib/more/facets/enumerablepass.rb +2 -216
  86. data/lib/more/facets/enumerator.rb +62 -0
  87. data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
  88. data/lib/more/facets/expirable.rb +13 -41
  89. data/lib/{lore → more}/facets/fileutils.rb +0 -0
  90. data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
  91. data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
  92. data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
  93. data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
  94. data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
  95. data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
  96. data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
  97. data/lib/{lore → more}/facets/getoptlong.rb +0 -0
  98. data/lib/more/facets/hook.rb +2 -29
  99. data/lib/more/facets/inheritor.rb +2 -2
  100. data/lib/more/facets/instance_eval.rb +50 -0
  101. data/lib/more/facets/instance_function.rb +78 -0
  102. data/lib/more/facets/main.rb +20 -15
  103. data/lib/more/facets/memoize.rb +1 -113
  104. data/lib/more/facets/module/attr.rb +83 -0
  105. data/lib/more/facets/module/attr_tester.rb +44 -0
  106. data/lib/more/facets/module/attr_toggler.rb +59 -0
  107. data/lib/more/facets/module/attr_validator.rb +34 -0
  108. data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
  109. data/lib/more/facets/once.rb +59 -0
  110. data/lib/more/facets/openmodule.rb +1 -0
  111. data/lib/more/facets/orderedhash.rb +1 -33
  112. data/lib/{lore → more}/facets/ostruct.rb +0 -0
  113. data/lib/more/facets/ostructable.rb +1 -4
  114. data/lib/more/facets/partial.rb +18 -16
  115. data/lib/{lore → more}/facets/pathname.rb +0 -0
  116. data/lib/more/facets/preinitialize.rb +157 -0
  117. data/lib/{lore → more}/facets/rbconfig.rb +0 -0
  118. data/lib/more/facets/recorder.rb +1 -2
  119. data/lib/{lore → more}/facets/set.rb +0 -0
  120. data/lib/{lore → more}/facets/shellwords.rb +0 -0
  121. data/lib/{lore → more}/facets/uri.rb +0 -0
  122. data/lib/{lore → more}/facets/yaml.rb +0 -0
  123. data/lib/{lore → more}/facets/zlib.rb +0 -0
  124. data/meta/loadpath +0 -1
  125. data/meta/sitemap +4 -0
  126. data/meta/version +1 -1
  127. data/test/core/enumerable/test_count.rb +1 -1
  128. data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
  129. data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
  130. data/test/core/enumerable/test_ewise.rb +23 -0
  131. data/test/core/enumerable/test_per.rb +18 -0
  132. data/test/core/enumerable/test_take.rb +13 -0
  133. data/test/core/kernel/test_deepcopy.rb +1 -1
  134. data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
  135. data/test/core/kernel/test_tap.rb +1 -1
  136. data/test/core/proc/test_curry.rb +11 -0
  137. data/test/core/string/test_bytes.rb +1 -1
  138. data/test/core/string/test_camelcase.rb +23 -6
  139. data/test/core/string/test_lines.rb +1 -1
  140. data/test/core/string/test_unfold.rb +14 -0
  141. data/test/{more → core}/test_blank.rb +0 -0
  142. data/test/{more → core}/test_boolean.rb +0 -0
  143. data/test/{more → core}/test_functor.rb +0 -0
  144. data/test/{lore → more}/test_basicobject.rb +0 -0
  145. data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
  146. data/test/{lore → more}/test_continuation.rb +0 -0
  147. data/test/{lore → more}/test_date.rb +0 -0
  148. data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
  149. data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
  150. data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
  151. data/test/more/test_memoize.rb +1 -1
  152. data/test/{lore → more}/test_ostruct.rb +0 -0
  153. metadata +865 -1016
  154. data/RELEASE +0 -38
  155. data/doc/README.lore +0 -51
  156. data/doc/log/basic_stats/index.html +0 -39
  157. data/doc/log/changelog.html +0 -648
  158. data/doc/log/changelog.txt +0 -217
  159. data/doc/log/stats/index.html +0 -39
  160. data/doc/log/testlog.txt +0 -278
  161. data/doc/notes/CHANGES +0 -2529
  162. data/doc/rdoc/lore/classes/Array.html +0 -176
  163. data/doc/rdoc/lore/classes/CGI.html +0 -191
  164. data/doc/rdoc/lore/classes/Config.html +0 -135
  165. data/doc/rdoc/lore/classes/Continuation.html +0 -113
  166. data/doc/rdoc/lore/classes/Date.html +0 -631
  167. data/doc/rdoc/lore/classes/DateTime.html +0 -583
  168. data/doc/rdoc/lore/classes/Enumerable.html +0 -89
  169. data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
  170. data/doc/rdoc/lore/classes/File.html +0 -128
  171. data/doc/rdoc/lore/classes/FileUtils.html +0 -434
  172. data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
  173. data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
  174. data/doc/rdoc/lore/classes/Kernel.html +0 -135
  175. data/doc/rdoc/lore/classes/Logger.html +0 -229
  176. data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
  177. data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
  178. data/doc/rdoc/lore/classes/NilClass.html +0 -119
  179. data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
  180. data/doc/rdoc/lore/classes/Pathname.html +0 -353
  181. data/doc/rdoc/lore/classes/Set.html +0 -117
  182. data/doc/rdoc/lore/classes/Shellwords.html +0 -111
  183. data/doc/rdoc/lore/classes/String.html +0 -140
  184. data/doc/rdoc/lore/classes/Time.html +0 -154
  185. data/doc/rdoc/lore/classes/URI.html +0 -454
  186. data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
  187. data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
  188. data/doc/rdoc/lore/classes/Zlib.html +0 -188
  189. data/doc/rdoc/lore/created.rid +0 -1
  190. data/doc/rdoc/lore/files/README.html +0 -286
  191. data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
  192. data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
  193. data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
  194. data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
  195. data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
  196. data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
  197. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
  198. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
  199. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
  200. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
  201. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
  202. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
  203. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
  204. data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
  205. data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
  206. data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
  207. data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
  208. data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
  209. data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
  210. data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
  211. data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
  212. data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
  213. data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
  214. data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
  215. data/doc/rdoc/lore/fr_class_index.html +0 -73
  216. data/doc/rdoc/lore/fr_file_index.html +0 -71
  217. data/doc/rdoc/lore/fr_method_index.html +0 -177
  218. data/doc/rdoc/lore/index.html +0 -26
  219. data/doc/rdoc/lore/rdoc-style.css +0 -177
  220. data/doc/release-notes/RELEASE-2.0.5 +0 -8
  221. data/doc/release-notes/RELEASE-2.1.0 +0 -9
  222. data/doc/release-notes/RELEASE-2.1.1 +0 -5
  223. data/doc/release-notes/RELEASE-2.1.2 +0 -6
  224. data/doc/release-notes/RELEASE-2.1.3 +0 -5
  225. data/doc/release-notes/RELEASE-2.2.0 +0 -14
  226. data/doc/release-notes/RELEASE-2.2.1 +0 -4
  227. data/doc/release-notes/RELEASE-2.3.0 +0 -6
  228. data/doc/release-notes/RELEASE-2.4.0 +0 -70
  229. data/doc/release-notes/RELEASE-2.4.1 +0 -8
  230. data/doc/release-notes/RELEASE-2.4.2 +0 -4
  231. data/doc/release-notes/RELEASE-2.4.3 +0 -78
  232. data/doc/release-notes/RELEASE-2.4.4 +0 -38
  233. data/doc/release-notes/RELEASE-2.4.5 +0 -37
  234. data/doc/release-notes/RELEASE-2.5.0 +0 -83
  235. data/lib/core/facets/kernel/instance.rb +0 -19
  236. data/lib/lore/facets/basicobject.rb +0 -14
  237. data/lib/lore/facets/enumerator.rb +0 -67
  238. data/lib/lore/facets/logger.rb +0 -291
  239. data/lib/more/facets/1stclassmethod.rb +0 -140
  240. data/lib/more/facets/advisable.rb +0 -162
  241. data/lib/more/facets/association.rb +0 -210
  242. data/lib/more/facets/attr.rb +0 -209
  243. data/lib/more/facets/basex.rb +0 -37
  244. data/lib/more/facets/bbcode.rb +0 -397
  245. data/lib/more/facets/bicrypt.rb +0 -265
  246. data/lib/more/facets/binreadable.rb +0 -221
  247. data/lib/more/facets/censor.rb +0 -97
  248. data/lib/more/facets/classmethods.rb +0 -199
  249. data/lib/more/facets/consoleutils.rb +0 -99
  250. data/lib/more/facets/crypt.rb +0 -166
  251. data/lib/more/facets/dependency.rb +0 -151
  252. data/lib/more/facets/downloader.rb +0 -281
  253. data/lib/more/facets/duplicable.rb +0 -43
  254. data/lib/more/facets/elementor.rb +0 -133
  255. data/lib/more/facets/filter.rb +0 -121
  256. data/lib/more/facets/heap.rb +0 -22
  257. data/lib/more/facets/infinity.rb +0 -193
  258. data/lib/more/facets/ini.rb +0 -264
  259. data/lib/more/facets/instantise.rb +0 -1
  260. data/lib/more/facets/instantize.rb +0 -95
  261. data/lib/more/facets/interval.rb +0 -282
  262. data/lib/more/facets/iteration.rb +0 -65
  263. data/lib/more/facets/linkedlist.rb +0 -222
  264. data/lib/more/facets/lrucache.rb +0 -157
  265. data/lib/more/facets/matcher.rb +0 -140
  266. data/lib/more/facets/memoizer.rb +0 -74
  267. data/lib/more/facets/minitar.rb +0 -1063
  268. data/lib/more/facets/nackclass.rb +0 -41
  269. data/lib/more/facets/net/smtp_tls.rb +0 -131
  270. data/lib/more/facets/nilstatus.rb +0 -48
  271. data/lib/more/facets/overload.rb +0 -94
  272. data/lib/more/facets/paramix.rb +0 -202
  273. data/lib/more/facets/pool.rb +0 -91
  274. data/lib/more/facets/pqueue.rb +0 -449
  275. data/lib/more/facets/pry.rb +0 -32
  276. data/lib/more/facets/reflection.rb +0 -145
  277. data/lib/more/facets/semaphore.rb +0 -92
  278. data/lib/more/facets/settings.rb +0 -248
  279. data/lib/more/facets/snapshot.rb +0 -209
  280. data/lib/more/facets/sparse_array.rb +0 -809
  281. data/lib/more/facets/string/mask.rb +0 -278
  282. data/lib/more/facets/string/obfuscate.rb +0 -65
  283. data/lib/more/facets/string/stylize.rb +0 -169
  284. data/lib/more/facets/string/words.rb +0 -167
  285. data/lib/more/facets/syncarray.rb +0 -114
  286. data/lib/more/facets/synchash.rb +0 -157
  287. data/lib/more/facets/typecast.rb +0 -261
  288. data/lib/more/facets/uninheritable.rb +0 -50
  289. data/lib/more/facets/xmlhash.rb +0 -112
  290. data/lib/more/facets/xoxo.rb +0 -259
  291. data/lib/more/facets/ziputils.rb +0 -490
  292. data/task/conflicts +0 -63
  293. data/task/coverage.rake +0 -37
  294. data/task/methods +0 -49
  295. data/task/rdoc.rake +0 -17
  296. data/task/setup.rake +0 -38
  297. data/task/test.rake +0 -145
  298. data/test/more/test_advisable.rb +0 -71
  299. data/test/more/test_association.rb +0 -38
  300. data/test/more/test_bbcode.rb +0 -21
  301. data/test/more/test_binreadable.rb +0 -50
  302. data/test/more/test_buildable.rb +0 -73
  303. data/test/more/test_classmethods.rb +0 -56
  304. data/test/more/test_crypt.rb +0 -32
  305. data/test/more/test_dependency.rb +0 -69
  306. data/test/more/test_elementwise.rb +0 -25
  307. data/test/more/test_infinity.rb +0 -40
  308. data/test/more/test_interval.rb +0 -151
  309. data/test/more/test_linkedlist.rb +0 -41
  310. data/test/more/test_lrucache.rb +0 -14
  311. data/test/more/test_overload.rb +0 -160
  312. data/test/more/test_paramix.rb +0 -170
  313. data/test/more/test_prototype.rb +0 -35
  314. data/test/more/test_snapshot.rb +0 -21
  315. data/test/more/test_sparsearray.rb +0 -279
  316. data/test/more/test_syncarray.rb +0 -15
  317. data/test/more/test_synchash.rb +0 -16
  318. data/test/more/test_typecast.rb +0 -54
  319. data/test/more/test_uninheritable.rb +0 -31
  320. data/test/more/test_xoxo.rb +0 -274
  321. data/test/test_facets.rb +0 -9
@@ -1,209 +0,0 @@
1
- # = Snapshot
2
- #
3
- # A lightweight single-depth object state capture.
4
- # The #take_snapshot method reads the object's state,
5
- # which is generally it's collection of instance variables,
6
- # and returns them in a hash. The state can be restored
7
- # with #apply_snapshot.
8
- #
9
- # == Usage
10
- #
11
- # Customer = Struct.new("Customer", :name, :address, :zip)
12
- # joe = Customer.new( "Joe Pitare", "1115 Lila Ln.", 47634 )
13
- #
14
- # # simple transactions
15
- # joe_snap = joe.take_snapshot
16
- # begin
17
- # do_something_with( joe )
18
- # rescue
19
- # joe.apply_snapshot( joe_snap )
20
- # end
21
- #
22
- # joe_snap[:name] => "Joe Pitare"
23
- # joe_snap[:address] => "1115 Lila Ln."
24
- # joe_snap[:zip] => 47634
25
- #
26
- # == Details
27
- #
28
- # Class Snapshot simply represents a collection of objects from
29
- # which snapshots were taken via their methods #take_snapshot.
30
- # It provides methods to add an object to a snapshot
31
- # (Snapshot#add) as well as to restore all objects
32
- # of the snapshot to their state stored in the snapshot (method
33
- # Snapshot#restore).
34
- #
35
- # In Wee, this class is used to backtracking the state of
36
- # components (or decorations/presenters). Components that want
37
- # an undo-facility to be implemented (triggered for example by
38
- # a browsers back-button), have to overwrite the
39
- # Wee::Component#backtrack_state method.
40
- #
41
- # == Todo
42
- #
43
- # * Perhaps extend to offer multiple depths.
44
- # * Should key consitancy be enforced? Currently
45
- # Struct's will have symbol keys while other classes
46
- # will have string keys in the form of "@name".
47
- # * Add other core classes.
48
- # * Convert to Kernel#to_data ?
49
- # * I've been thinking about renaming this to State.
50
- #
51
- # == Authors
52
- #
53
- # * Michael Neumann
54
- #
55
- # == Copying
56
- #
57
- # Copyright (c) 2004 Michael Neumann
58
- #
59
- # Ruby License
60
- #
61
- # This module is free software. You may use, modify, and/or redistribute this
62
- # software under the same terms as Ruby.
63
- #
64
- # This program is distributed in the hope that it will be useful, but WITHOUT
65
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
66
- # FOR A PARTICULAR PURPOSE.
67
-
68
- # = Snapshot
69
- #
70
- # A lightweight single-depth object state capture.
71
- # The #take_snapshot method reads the object's state,
72
- # which is generally it's collection of instance variables,
73
- # and returns them in a hash. The state can be restored
74
- # with #apply_snapshot.
75
- #
76
- # == Usage
77
- #
78
- # Customer = Struct.new("Customer", :name, :address, :zip)
79
- # joe = Customer.new( "Joe Pitare", "1115 Lila Ln.", 47634 )
80
- #
81
- # # simple transactions
82
- # joe_snap = joe.take_snapshot
83
- # begin
84
- # do_something_with( joe )
85
- # rescue
86
- # joe.apply_snapshot( joe_snap )
87
- # end
88
- #
89
- # joe_snap[:name] => "Joe Pitare"
90
- # joe_snap[:address] => "1115 Lila Ln."
91
- # joe_snap[:zip] => 47634
92
- #
93
- # == Details
94
- #
95
- # Class Snapshot simply represents a collection of objects from
96
- # which snapshots were taken via their methods #take_snapshot.
97
- # It provides methods to add an object to a snapshot
98
- # (Snapshot#add) as well as to restore all objects
99
- # of the snapshot to their state stored in the snapshot (method
100
- # Snapshot#restore).
101
- #
102
- # In Wee, this class is used to backtracking the state of
103
- # components (or decorations/presenters). Components that want
104
- # an undo-facility to be implemented (triggered for example by
105
- # a browsers back-button), have to overwrite the
106
- # Wee::Component#backtrack_state method.
107
- #
108
- class Snapshot
109
- def initialize
110
- @objects = Hash.new
111
- end
112
-
113
- def add(object)
114
- oid = object.object_id
115
- @objects[oid] = [object, object.take_snapshot] unless @objects.include?(oid)
116
- end
117
-
118
- def restore
119
- @objects.each_value do
120
- |object, value| object.restore_snapshot(value)
121
- end
122
- end
123
- end
124
-
125
- # Simplist form of a snapshot.
126
- #
127
- #module SnapshotMixin
128
- # def take_snapshot() dup end
129
- # def restore_snapshot(snap) replace(snap) end
130
- #end
131
-
132
- # Implements a value holder. In Wee this is useful for
133
- # backtracking the reference assigned to an instance variable
134
- # (not the object itself!). An example where this is used is the
135
- # <tt>@__decoration</tt> attribute of class Wee::Component.
136
-
137
- class Snapshot::ValueHolder
138
- attr_accessor :value
139
-
140
- def initialize(value=nil)
141
- @value = value
142
- end
143
-
144
- def take_snapshot
145
- @value
146
- end
147
-
148
- def restore_snapshot(value)
149
- @value = value
150
- end
151
- end
152
-
153
- #--
154
- # Extend some base classes of Ruby (Object, Array, String, Hash,
155
- # Struct) for the two methods #take_snapshot and
156
- # #restore_snapshot, required by Snapshot.
157
- #++
158
-
159
- class Object
160
- def take_snapshot
161
- snap = Hash.new
162
- instance_variables.each do |iv|
163
- snap[iv] = instance_variable_get(iv)
164
- end
165
- snap
166
- end
167
-
168
- def to_data
169
- task_snapshot
170
- end
171
-
172
- def restore_snapshot(snap)
173
- instance_variables.each do |iv|
174
- instance_variable_set(iv, snap[iv])
175
- end
176
- end
177
-
178
- def from_data(snap)
179
- restore_snapshot(snap)
180
- end
181
- end
182
-
183
- class Array
184
- def take_snapshot() dup end
185
- def restore_snapshot(snap) replace(snap) end
186
- end
187
-
188
- class String
189
- def take_snapshot() dup end
190
- def restore_snapshot(snap) replace(snap) end
191
- end
192
-
193
- class Hash
194
- def take_snapshot() dup end
195
- def restore_snapshot(snap) replace(snap) end
196
- end
197
-
198
- class Struct
199
- def take_snapshot
200
- snap = Hash.new
201
- each_pair {|k,v| snap[k] = v}
202
- snap
203
- end
204
-
205
- def restore_snapshot(snap)
206
- snap.each_pair {|k,v| send(k.to_s + "=", v)}
207
- end
208
- end
209
-
@@ -1,809 +0,0 @@
1
- #--
2
- # SparseArray
3
- #
4
- # Copyright (c) 2004,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
- # == AUTHOR(s)
16
- #
17
- # * Thamas Sawyer
18
- #
19
- # ==========================================================================
20
- # Revision History ::
21
- # --------------------------------------------------------------------------
22
- # 04.09 Trans * 99% Compatible with Array
23
- # ==========================================================================
24
- #++
25
-
26
- #:title: SparseArray
27
- #
28
- # SparseArray is an implemenation of the Array class using only Hashes.
29
- # Regular Arrays are never used except once to delegate the #pack method,
30
- # and for *args parameters (since there is no way around those is some cases).
31
- # SparseArray is for all practical purposes 100% compatible with Array.
32
- #
33
- # SparseArray is slower then the built in Array class, but not as slow
34
- # as one might expect, since a Hash in general is faster than an Array.
35
- # It might be interesting to see how this would perform if it were
36
- # written in c. Not all that useful, but an interesting example.
37
- #
38
- class SparseArray < Hash
39
-
40
- def self.[](*args)
41
- nha = new
42
- args.each { |a| nha.set(nha.length,a) }
43
- nha
44
- end
45
-
46
- def self.new_h(hsh)
47
- nha = new
48
- nha.replace(hsh)
49
- #nha.reindex!
50
- end
51
-
52
- def initialize(i=0,e=nil)
53
- if i > 0
54
- i.times { self.set(self.length,e) }
55
- end
56
- end
57
-
58
- def &(ha)
59
- nha = self.class.new
60
- (0..self.length-1).each do |i|
61
- if ha.has_value?(self.fetch(i)) and !nha.has_value?(self.fetch(i))
62
- nha.set(nha.length,self.fetch(i))
63
- end
64
- end
65
- nha
66
- end
67
-
68
- def *(j)
69
- if j.kind_of?(String)
70
- return self.join(j)
71
- else
72
- nha = self.class.new
73
- j.times { (0...self.length).each { |i| nha.set(nha.length,self.fetch(i)) } }
74
- return nha
75
- end
76
- end
77
-
78
- def +(ha)
79
- nha = self.dup
80
- (0..ha.length-1).each { |i| nha.set(nha.length,ha.fetch(i)) }
81
- nha
82
- end
83
-
84
- def -(ha)
85
- nha = self.class.new
86
- self.each { |v| nha << v if !ha.has_value?(v) }
87
- #ha.each { |v| nha << i if !self.include?(v) }
88
- nha
89
- end
90
-
91
- def <<(e)
92
- self.set(self.length,e)
93
- self
94
- end
95
-
96
- def <=>(ha)
97
- (0..self.length-1).each do |i|
98
- ieq = (self.fetch(i) <=> ha.fetch(i))
99
- return ieq if ieq != 0
100
- end
101
- self.length <=> ha.length
102
- end
103
-
104
- def ===(ha)
105
- self.==(ha)
106
- end
107
-
108
- alias_method :get, :[]
109
- private :get
110
-
111
- def [](i,l=nil)
112
- if l
113
- i = i...i+l
114
- elsif ! i.kind_of?(Range)
115
- return self.at(i)
116
- end
117
- nha = self.class.new
118
- i.each { |j| nha.set(nha.length,get(j)) if has_key?(j) }
119
- nha
120
- end
121
-
122
- alias set []=
123
- def []=(i,b,c=nil)
124
- if c
125
- rng = (Integer(i)..Integer(i+b))
126
- b = c
127
- elsif i.kind_of? Range
128
- rng = i
129
- else
130
- self.set(Integer(i),b)
131
- return b
132
- end
133
- if b == nil
134
- rng.each { |i| qdelete(i) }
135
- self.reindex!
136
- elsif b.kind_of?(Array) or b.kind_of?(self.class)
137
- j = 0
138
- rng.each { |i| self[i] = b[j]; j+=1 }
139
- else
140
- rng.each { |i| qdelete(i) }
141
- self[rng.fist] = b
142
- self.reindex!
143
- end
144
- end
145
-
146
- def |(ha)
147
- nha = self.dup
148
- ha.each { |v| nha << v if !nha.has_value?(v) }
149
- nha
150
- end
151
-
152
- def assoc(k)
153
- (0...self.length).each { |i| return self.fetch(i) if self.fetch(i)[0] == k }
154
- return nil
155
- end
156
-
157
- def at(i)
158
- i = self.length + i if i <= -1
159
- get(i)
160
- #return nil if i < 0 or i >= self.length
161
- #return self.fetch(i)
162
- end
163
-
164
- # clear okay
165
-
166
- def collect
167
- nha = self.class.new
168
- (0...self.length).each { |i| nha << yield(self.fetch(i)) }
169
- nha
170
- end
171
-
172
- def collect!
173
- nha = self.class.new
174
- (0...self.length).each { |i| nha << yield(self.fetch(i)) }
175
- self.replace(nha)
176
- end
177
-
178
- def compact
179
- nha, j = self.class.new, 0
180
- (0..self.length-1).each do |i|
181
- if self.fetch(i) != nil
182
- nha.set(j,self.fetch(i))
183
- j+=1
184
- end
185
- end
186
- nha
187
- end
188
-
189
- def compact!
190
- if self.has_value?(nil)
191
- nha, j = self.class.new, 0
192
- (0..self.length-1).each do |i|
193
- if self.fetch(i) != nil
194
- nha.set(j,self.fetch(i))
195
- j+=1
196
- end
197
- end
198
- return self.replace(nha)
199
- else
200
- return nil
201
- end
202
- end
203
-
204
- def concat(ha)
205
- (0...ha.length).each { |i| self.set(self.length,ha.fetch(i)) }
206
- self
207
- end
208
-
209
- def count(e=nil)
210
- if block_given?
211
- cnt = 0
212
- (0...self.length).each { |i| cnt += 1 if yield(self.fetch(i)) }
213
- return cnt
214
- else
215
- cnt = 0
216
- (0...self.length).each { |i| cnt += 1 if self.fetch(i) == e }
217
- return cnt
218
- end
219
- end
220
-
221
- alias qdelete delete
222
- private :qdelete
223
-
224
- def delete(e)
225
- if has_value?(e)
226
- qdelete_if { |i,v| v == e }
227
- reindex!
228
- return e
229
- else
230
- return yield if block_given?
231
- return nil
232
- end
233
- end
234
-
235
- def delete_at(i)
236
- if self.has_key?(i)
237
- e = self.fetch(i)
238
- qdelete(i)
239
- reindex!
240
- return e
241
- else
242
- return nil
243
- end
244
- end
245
-
246
- alias qdelete_if delete_if
247
- private :qdelete_if
248
-
249
- def delete_if
250
- qdelete_if { |i,v| yield(v) }
251
- reindex!
252
- end
253
-
254
- def each
255
- (0...self.length).each { |i| yield(self.fetch(i)) }
256
- end
257
-
258
- def each_index
259
- (0...self.length).each { |i| yield(i) }
260
- end
261
-
262
- # empty? okay as is
263
-
264
- def eql?(ha)
265
- return false if self.length != ha.length
266
- return true if (0...self.length).all? { |i| self.fetch(i).eql?(ha.fetch(i)) }
267
- return false
268
- end
269
-
270
- def fill(f,s=nil,l=nil)
271
- if s.kind_of?(Range)
272
- r = s
273
- else
274
- s = 0 if !s
275
- l = self.length - s if !l
276
- r = s...(s+l)
277
- end
278
- r.each{ |i| self.set(i,f) }
279
- self
280
- end
281
-
282
- def first
283
- return nil if self.empty?
284
- self.fetch(0)
285
- end
286
-
287
- def flatten
288
- nha = self.class.new
289
- (0...self.length).each do |i|
290
- sfi = self.fetch(i)
291
- if sfi.kind_of?(self.class) or sfi.kind_of?(Array)
292
- nha.concat(sfi.flatten)
293
- else
294
- nha.set(nha.length,sfi)
295
- end
296
- end
297
- nha
298
- end
299
-
300
- def flatten!
301
- return nil if !self.any? { |e| e.kind_of?(self.class) or e.kind_of?(Array) }
302
- self.replace(self.flatten)
303
- end
304
-
305
- def include?(v)
306
- self.has_value?(v)
307
- end
308
-
309
- # index okay
310
-
311
- def join(sep='')
312
- s = ''
313
- (0...self.length).each { |i| s << "#{self.fetch(i)}#{sep}" }
314
- return s.chomp(sep)
315
- end
316
-
317
- def last
318
- self[self.length-1]
319
- end
320
-
321
- # length okay
322
-
323
- alias map! collect!
324
-
325
- def nitems
326
- cnt = 0
327
- (0...self.length).each { |i| cnt += 1 if self.fetch(i) != nil }
328
- cnt
329
- end
330
-
331
- def pack(*args)
332
- self.to_a.pack(*args)
333
- end
334
-
335
- def pop
336
- self.delete_at(self.length-1)
337
- end
338
-
339
- def push(*e)
340
- self.concat(e)
341
- end
342
-
343
- def rassoc(k)
344
- (0...self.length).each { |i| return self.fetch(i) if self.fetch(i)[1] == k }
345
- return nil
346
- end
347
-
348
- def reindex
349
- nha, j, k, tl = self.class.new, 0, 0, self.length
350
- while k < tl
351
- if self.has_key?(j)
352
- nha.set(k,self.fetch(j))
353
- j+=1; k+=1
354
- else
355
- j+=1
356
- end
357
- end
358
- nha
359
- end
360
-
361
- def reindex!
362
- self.replace(self.reindex)
363
- end
364
-
365
- def reject!
366
- chg=nil
367
- qdelete_if { |i,v| r=yield(v); chg=true if r; r }
368
- return nil if !chg
369
- reindex!
370
- end
371
-
372
- #def replace(ha)
373
- # if ha.length < self.length
374
- # (ha.length..self.length-1).each { |i| self.delete(i) }
375
- # (0..ha.length-1).each { |i| self.set(i,ha[i]) }
376
- # end
377
- #end
378
-
379
- def reverse
380
- nha = self.class.new
381
- (0...self.length).each { |i| nha.set(self.length-1-i,self.fetch(i)) }
382
- nha
383
- end
384
-
385
- def reverse!
386
- (0...self.length/2).each do |i|
387
- ri = self.length-1-i
388
- tmp = self.fetch(ri)
389
- self.set(ri,self.fetch(i))
390
- self.set(i,tmp)
391
- end
392
- self
393
- end
394
-
395
- def reverse_each
396
- i = self.length - 1
397
- while i >= 0
398
- yield(self.fetch(i))
399
- i -= 1
400
- end
401
- end
402
-
403
- def rindex(e)
404
- i = self.length - 1
405
- while i >= 0
406
- return i if self.fetch(i) == e
407
- i -= 1
408
- end
409
- return nil
410
- end
411
-
412
- def shift
413
- e1 = self[0]
414
- tl = self.length - 1
415
- (1..tl).each { |i| self.set(i-1,self.fetch(i)) }
416
- self.delete_at(tl)
417
- e1
418
- end
419
-
420
- # size okay
421
-
422
- def slice(*args)
423
- self[*args]
424
- end
425
-
426
- def slice!(*args)
427
- result = self[*args]
428
- self[*args] = nil
429
- result
430
- end
431
-
432
- def sort
433
- raise "SparseArray does not currently support sorting with blocks" if block_given?
434
- nha = self.dup
435
- qsort(nha,0,nha.length-1)
436
- end
437
-
438
- def qsort(ha, l, r)
439
- l_hold = l
440
- r_hold = r
441
- pivot = ha[l]
442
- while l < r
443
- r -= 1 while (ha[r] <=> pivot) >= 0 and l < r
444
- if l != r
445
- ha[l] = ha[r]
446
- l += 1
447
- end
448
- l += 1 while (ha[l] <=> pivot) <= 0 and l < r
449
- if l != r
450
- ha[r] = ha[l]
451
- r -= 1
452
- end
453
- end
454
- ha[l] = pivot
455
- pivot = l
456
- l = l_hold
457
- r = r_hold
458
- qsort(ha,l,pivot-1) if l < pivot
459
- qsort(ha,pivot+1,r) if r > pivot
460
- ha
461
- end
462
-
463
- def sort!
464
- raise "SparseArray does not currently support sorting with blocks" if block_given?
465
- qsort(self,0,self.length-1)
466
- end
467
-
468
- def to_a
469
- a = []
470
- (0..self.length-1).each { |i| a << self.fetch(i) }
471
- a
472
- end
473
-
474
- def to_ary
475
- self
476
- end
477
-
478
- def to_h
479
- h = Hash.new
480
- self.each { |k,v| h[k] = v }
481
- h
482
- end
483
-
484
- def to_s
485
- self.join
486
- end
487
-
488
- def uniq
489
- nha = self.class.new
490
- (0..self.length-1).each do |i|
491
- nha[nha.length] = self[i] if !nha.has_value?(self[i])
492
- end
493
- nha
494
- end
495
-
496
- def uniq!
497
- j = 0
498
- (1..self.length-1).each do |i|
499
- if !self[0..j].has_value?(self[i])
500
- self[j+1] = self[i]
501
- j+=1
502
- end
503
- end
504
- (j+1..self.length-1).each { |i| qdelete(i) }
505
- end
506
-
507
- def unshift(e)
508
- i = self.length - 1
509
- while i >= 0
510
- self.set(i+1,self.fetch(i))
511
- return i if self.fetch(i) == e
512
- i -= 1
513
- end
514
- self.set(0,e)
515
- self
516
- end
517
-
518
- def values_at(*ix)
519
- nha = self.class.new
520
- ix.each {|i| nha[nha.length] = self.at(i)}
521
- nha
522
- end
523
-
524
- end
525
-
526
-
527
-
528
- =begin test
529
-
530
- # This is a mostly complete testcase for SparseArray.
531
- # SparseArray is tested by comparison to standard Array.
532
-
533
- require 'test/unit'
534
-
535
- class TC_SparseArray < Test::Unit::TestCase
536
-
537
- def aha(a)
538
- return a, SparseArray[*a]
539
- end
540
-
541
- def test_conversions
542
- a, ha = aha [1,3,'a',8,nil,[1]]
543
- assert_equal(ha, ha.to_ary) # these need to be opposite
544
- assert_equal(a, ha.to_a) #
545
- assert_equal(a.to_s, ha.to_s)
546
- end
547
-
548
- def test_set_operations
549
- a, ha = aha [1,3,5,8,9]
550
- b, hb = aha [2,3,6,8,9]
551
- assert_equal(a | b, (ha | hb).to_a)
552
- assert_equal(a & b, (ha & hb).to_a)
553
- assert_equal(a + b, (ha + hb).to_a)
554
- assert_equal(a - b, (ha - hb).to_a)
555
- end
556
-
557
- def test_multiple
558
- a, ha = aha [1,3]
559
- assert_equal(a*3,(ha*3).to_a)
560
- end
561
-
562
- def test_assign
563
- a, ha = aha [1,2,3,4]
564
- a[1..2] = [8,9]
565
- ha[1..2] = [8,9]
566
- assert_equal(a, ha.to_a)
567
- end
568
- def test_assoc
569
- a, ha = aha [[1,2],[3,4],[3,6]]
570
- assert_equal(a.assoc(3), ha.assoc(3).to_a)
571
- end
572
- def test_at
573
- a, ha = aha [4,5,6,6]
574
- assert_equal(a.at(0), ha.at(0))
575
- assert_equal(a.at(2), ha.at(2))
576
- assert_equal(a.at(4), ha.at(4))
577
- assert_equal(a.at(9), ha.at(9))
578
- assert_equal(a.at(-1), ha.at(-1))
579
- assert_equal(a.at(-3), ha.at(-3))
580
- assert_equal(a.at(-4), ha.at(-4))
581
- assert_equal(a.at(-5), ha.at(-5))
582
- end
583
- def test_collect
584
- a, ha = aha [4,5,6,6]
585
- assert_equal(a.collect{|e|e}, ha.collect{|e|e}.to_a)
586
- assert_equal(a.collect!{|e|e}, ha.collect!{|e|e}.to_a)
587
- assert_equal(a,ha.to_a)
588
- end
589
- def test_compact
590
- a, ha = aha [4,nil,5,nil,6]
591
- assert_equal(a.compact, ha.compact.to_a)
592
- end
593
- def test_concat
594
- a, ha = aha [1,3,5,8,9]
595
- b, hb = aha [2,3,6,8,9]
596
- assert_equal(a.concat(b),ha.concat(hb).to_a)
597
- end
598
- def test_count
599
- ha = SparseArray[9,3,9,5,nil,nil,9,3]
600
- assert_equal(2,ha.count)
601
- assert_equal(2,ha.count(3))
602
- assert_equal(3,ha.count{|e|e==9})
603
- end
604
- def test_delete
605
- a, ha = aha [1,3,5,8,9,'a','b','c','c','d']
606
- # test delete
607
- assert_equal(a.delete(1),ha.delete(1))
608
- assert_equal(a,ha.to_a)
609
- assert_equal(a.delete('a'),ha.delete('a'))
610
- assert_equal(a,ha.to_a)
611
- # test delete_at
612
- assert_equal(a.delete_at(0),ha.delete_at(0))
613
- assert_equal(a,ha.to_a)
614
- # test delete_if
615
- assert_equal(a.delete_if{|v|v=='c'},ha.delete_if{|v|v=='c'}.to_a)
616
- assert_equal(a,ha.to_a)
617
- end
618
- def test_each
619
- a, ha = aha [4,'a',nil,'b']
620
- # test each
621
- ca, cha = '', ''
622
- a.each{|e| ca += e.to_s}
623
- ha.each{|e| cha += e.to_s}
624
- assert_equal(ca,cha)
625
- assert_equal(a,ha.to_a)
626
- # test each_index
627
- ca, cha = '', ''
628
- a.each_index{|i| ca += i.to_s}
629
- ha.each_index{|i| cha += i.to_s}
630
- assert_equal(ca,cha)
631
- assert_equal(a,ha.to_a)
632
- end
633
- def test_eql?
634
- a, ha = aha [4,'a',nil,'b']
635
- b, hb = aha [4,'a',nil,'b']
636
- assert_equal(a,b)
637
- assert_equal(ha,hb)
638
- assert_equal(a.eql?(b),ha.eql?(hb))
639
- assert_equal(b.eql?(a),hb.eql?(ha))
640
- assert(ha.eql?(hb))
641
- assert(hb.eql?(ha))
642
- end
643
- def test_empty?
644
- a, ha = aha []
645
- assert_equal(a.empty?,ha.empty?)
646
- a, ha = aha [1,2,3]
647
- assert_equal(a.empty?,ha.empty?)
648
- end
649
- def test_fill
650
- a, ha = aha ['a','b','c','d']
651
- assert_equal(a.fill('x'),ha.fill('x').to_a)
652
- assert_equal(a,ha.to_a)
653
- assert_equal(a.fill('y',2,2),ha.fill('y',2,2).to_a)
654
- assert_equal(a,ha.to_a)
655
- assert_equal(a.fill('z',0..1),ha.fill('z',0..1).to_a)
656
- assert_equal(a,ha.to_a)
657
- end
658
- def test_first
659
- a, ha = aha [2,3,4]
660
- assert_equal(a.first,ha.first)
661
- end
662
- def test_flatten
663
- a, ha = aha [2,[3],'a',[[1,2],4],nil,5]
664
- assert_equal(a.flatten,ha.flatten.to_a)
665
- a, ha = aha [2,[3],'a',[[1,2],4],nil,5]
666
- assert_equal(a.flatten!,ha.flatten!.to_a)
667
- assert_equal(a,ha.to_a)
668
- a, ha = aha [2,3,'a',nil,5]
669
- assert_equal(a.flatten!,ha.flatten!)
670
- end
671
- def test_include?
672
- a, ha = aha ['a','b','c','d']
673
- assert_equal(a.include?('b'),ha.include?('b'))
674
- assert_equal(a.include?('x'),ha.include?('x'))
675
- end
676
- def test_index
677
- a, ha = aha ['a','b','b','c','d']
678
- assert_equal(a.index('b'),ha.index('b'))
679
- assert_equal(a.index('x'),ha.index('x'))
680
- end
681
- def test_join
682
- a, ha = aha [2,3,4]
683
- assert_equal(a.join,ha.join)
684
- assert_equal(a.join(','),ha.join(','))
685
- end
686
- def test_last
687
- a, ha = aha [2,3,4]
688
- assert_equal(a.last,ha.last)
689
- end
690
- def test_length
691
- a, ha = aha [2,3,4]
692
- assert_equal(a.length,ha.length)
693
- end
694
- def test_map!
695
- a, ha = aha [4,5,6,6]
696
- assert_equal(a.map!{|e|e}, ha.map!{|e|e}.to_a)
697
- assert_equal(a,ha.to_a)
698
- end
699
- def test_nitems
700
- a, ha = aha [4,5,nil,6,nil]
701
- assert_equal(a.nitems, ha.nitems)
702
- end
703
- def test_pop
704
- a, ha = aha [4,5,nil,6,nil]
705
- assert_equal(a.pop, ha.pop)
706
- assert_equal(a, ha.to_a)
707
- assert_equal(a.pop, ha.pop)
708
- assert_equal(a, ha.to_a)
709
- end
710
- def test_push
711
- a, ha = aha [4,5,nil,6,nil]
712
- args = [1,2,3]
713
- assert_equal(a.push(*args), ha.push(*args).to_a)
714
- assert_equal(a, ha.to_a)
715
- end
716
- def test_rassoc
717
- a, ha = aha [[1,2],[1,3],[1,3]]
718
- assert_equal(a.rassoc(3), ha.rassoc(3).to_a)
719
- end
720
- def test_reject!
721
- a, ha = aha ['a','b','c','c','d']
722
- assert_equal(a.reject!{|v|v=='c'},ha.reject!{|v|v=='c'}.to_a)
723
- assert_equal(a,ha.to_a)
724
- assert_equal(a.reject!{|v|v=='x'},ha.reject!{|v|v=='x'})
725
- assert_equal(a,ha.to_a)
726
- end
727
- def test_reverse
728
- a, ha = aha ['a','b','c','c','d']
729
- assert_equal(a.reverse,ha.reverse.to_a)
730
- assert_equal(a.reverse!,ha.reverse!.to_a)
731
- assert_equal(a,ha.to_a)
732
- a, ha = aha [1,2,3,'a','b','c']
733
- assert_equal(a.reverse!,ha.reverse!.to_a)
734
- assert_equal(a,ha.to_a)
735
- end
736
- def test_reverse_each
737
- a, ha = aha [4,'a',nil,'b']
738
- # test each
739
- ca, cha = '', ''
740
- a.reverse_each{|e| ca += e.to_s}
741
- ha.reverse_each{|e| cha += e.to_s}
742
- assert_equal(ca,cha)
743
- assert_equal(a,ha.to_a)
744
- end
745
- def test_rindex
746
- a, ha = aha ['a','b','c','c','d']
747
- assert_equal(a.rindex('c'),ha.rindex('c'))
748
- assert_equal(a.rindex('x'),ha.rindex('x'))
749
- end
750
- def test_shift
751
- a, ha = aha ['a','b','c','c','d']
752
- assert_equal(a.shift,ha.shift)
753
- assert_equal(a,ha.to_a)
754
- end
755
-
756
- def test_slice
757
- a, ha = aha [1,2,3,4]
758
- # test []
759
- assert_equal(a[1], ha[1])
760
- assert_equal(a[1..2], ha[1..2].to_a)
761
- assert_equal(a[1...2], ha[1...2].to_a)
762
- assert_equal(a[1..7], ha[1..7].to_a)
763
- assert_equal(a[1,2], ha[1,2].to_a)
764
- # test slice
765
- assert_equal(a.slice(1), ha.slice(1))
766
- assert_equal(a.slice(1..2), ha.slice(1..2).to_a)
767
- assert_equal(a.slice(1...2), ha.slice(1...2).to_a)
768
- assert_equal(a.slice(1...2), ha.slice(1...2).to_a)
769
- assert_equal(a.slice(1,2), ha.slice(1,2).to_a)
770
- # test slice!
771
- assert_equal(a.slice!(1..2), ha.slice!(1..2).to_a)
772
- assert_equal(a, ha.to_a)
773
- end
774
-
775
- def test_sort
776
- a, ha = aha [1,2,3,4]
777
- # test sort
778
- assert_equal(a.sort, ha.sort.to_a)
779
- #assert_equal(a.sort{|x,y| y<=>x}, ha.sort{|x,y| y<=>x}.to_a)
780
- # test sort!
781
- assert_equal(a.sort!, ha.sort!.to_a)
782
- assert_equal(a, ha.to_a)
783
- end
784
-
785
- def test_uniq
786
- a, ha = aha [1,1,2,3,3,4,5,6,6]
787
- assert_equal(a.uniq, ha.uniq.to_a)
788
- end
789
-
790
- def test_uniq!
791
- a, ha = aha [1,1,2,3,3,4,5,6,6]
792
- a.uniq!; ha.uniq!
793
- assert_equal(a, ha.to_a)
794
- end
795
-
796
- def test_values_at
797
- a, ha = aha ['a','b','c','d']
798
- assert_equal(a.values_at(1,3),ha.values_at(1,3).to_a)
799
- end
800
-
801
- def test_unshift
802
- a, ha = aha ['a','b','c','c','d']
803
- assert_equal(a.unshift('x'),ha.unshift('x').to_a)
804
- assert_equal(a,ha.to_a)
805
- end
806
- end
807
-
808
- =end
809
-