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,50 +0,0 @@
1
- # = Uninheritable
2
- #
3
- # Allows an object to declare itself as unable to be subclassed. The
4
- # technique behind this is very simple (redefinition of #inherited), so this
5
- # just provides an easier way to do the same thing with a consistent error
6
- # message.
7
- #
8
- # == Usage
9
- #
10
- # class A
11
- # extend Uninheritable
12
- # end
13
- #
14
- # class B < A; end # => raises TypeError
15
- #
16
- # == AUTHORS
17
- #
18
- # * Austin Ziegler
19
- #
20
- # == COPYRIGHT
21
- #
22
- # Copyright (c) 2003 Austin Ziegler
23
- #
24
- # == LICENSE
25
- #
26
- # Ruby License
27
- #
28
- # This module is free software. You may use, modify, and/or redistribute this
29
- # software under the same terms as Ruby.
30
- #
31
- # This program is distributed in the hope that it will be useful, but WITHOUT
32
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
33
- # FOR A PARTICULAR PURPOSE.
34
- #
35
-
36
- # = Uninheritable
37
- #
38
- # Allows an object to declare itself as unable to be subclassed. The
39
- # technique behind this is very simple (redefinition of #inherited), so this
40
- # just provides an easier way to do the same thing with a consistent error
41
- # message.
42
- #
43
- module Uninheritable
44
- # Redefines a class's #inherited definition to prevent subclassing of the
45
- # class extended by this module.
46
- def inherited(klass)
47
- raise TypeError, "Class #{self} cannot be subclassed."
48
- end
49
- end
50
-
@@ -1,112 +0,0 @@
1
- # = XmlHash
2
- #
3
- # WARNING: This is a work in progress!!!
4
-
5
- #
6
- module Hash2Xml
7
- extend self
8
-
9
- def convert(root, content)
10
- convert_tag(root, '*' => content)
11
- end
12
-
13
- private
14
-
15
- #
16
-
17
- def convert_tag(tag, node)
18
- subn = node.delete('*')
19
- atts = node.collect{ |k,v| %[#{k}="#{v}"] }
20
- body = convert_body(subn)
21
-
22
- start_tag = "#{tag} #{atts}".strip
23
-
24
- if body.to_s.empty?
25
- "<#{start_tag}/>"
26
- else
27
- "<#{start_tag}>#{body}</#{tag}>"
28
- end
29
- end
30
-
31
- #
32
-
33
- def convert_body(node)
34
- case node
35
- when Array
36
- node.collect do |subn|
37
- convert_body(subn)
38
- end
39
- when Hash
40
- node.collect do |tag, subn|
41
- case subn
42
- when Hash
43
- convert_tag(tag, subn)
44
- when Array
45
- subn.collect do |e|
46
- case e
47
- when Hash
48
- convert_tag(tag, e)
49
- else
50
- convert_tag(tag, '*' => e)
51
- end
52
- end
53
- else
54
- convert_tag(tag, '*' => subn)
55
- end
56
- end
57
- else
58
- node.to_s
59
- end
60
- end
61
-
62
- end
63
-
64
-
65
- class Hash
66
-
67
- def to_xml(root='root')
68
- Blow::Hash2Xml.convert(root, self)
69
- end
70
-
71
- end
72
-
73
-
74
-
75
- if $0 == __FILE__
76
-
77
- # case 1
78
-
79
- h = { 'a' => 1, 'b' => 2 }
80
-
81
- puts Blow::Hash2Xml.convert('root', h)
82
-
83
- # case 2
84
-
85
- h = { 'a' => [ 1, 2 ], 'b' => 2 }
86
-
87
- puts Blow::Hash2Xml.convert('root', h)
88
-
89
- # case 3
90
-
91
- h = {
92
- 'a' => [ 'x', 'y' ],
93
- 'b' => [ '1', '2' ],
94
- 'c' => [
95
- { 'k' => 'hi', '*' => 'fudge' }
96
- ]
97
- }
98
-
99
- puts Blow::Hash2Xml.convert('root', h)
100
-
101
- end
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
@@ -1,259 +0,0 @@
1
- # = XOXO
2
- #
3
- # XOXO is a Ruby XOXO parser and generator. It provides
4
- # a Ruby API similar to Marshal and YAML (though more
5
- # specific) to load and dump XOXO[http://microformats.org/wiki/xoxo],
6
- # an simple, open outline format written in standard XHTML and
7
- # suitable for embedding in (X)HTML, Atom, RSS, and arbitrary XML.
8
- #
9
- # == Author
10
- #
11
- # * Christian Neukirchen
12
- #
13
- # == Thanks
14
- #
15
- # Special thanks go to Christian Neukirchen for xoxo.rb.
16
- # http://chneukirchen.org/repos/xoxo-rb/.
17
- #
18
- # == Copyright
19
- #
20
- # Copyright (C) 2006 Christian Neukirchen
21
- #
22
- # Ruby License
23
- #
24
- # This module is free software. You may use, modify, and/or redistribute this
25
- # software under the same terms as Ruby.
26
- #
27
- # This program is distributed in the hope that it will be useful, but WITHOUT
28
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
29
- # FOR A PARTICULAR PURPOSE.
30
-
31
- require 'rexml/parsers/pullparser'
32
-
33
- # = XOXO
34
- #
35
- # XOXO is a Ruby XOXO parser and generator. It provides
36
- # a Ruby API similar to Marshal and YAML (though more
37
- # specific) to load and dump XOXO[http://microformats.org/wiki/xoxo],
38
- # an simple, open outline format written in standard XHTML and
39
- # suitable for embedding in (X)HTML, Atom, RSS, and arbitrary XML.
40
- #
41
- module XOXO
42
-
43
- # xoxo.rb version number
44
- #VERSION = "0.1"
45
-
46
- # Load and return a XOXO structure from the String, IO or StringIO or _xoxo_.
47
- #
48
- def self.load(xoxo)
49
- structs = Parser.new(xoxo).parse.structs
50
- while structs.kind_of?(Array) && structs.size == 1
51
- structs = structs.first
52
- end
53
- structs
54
- end
55
-
56
- # Return a XOXO string corresponding to the Ruby object +struct+,
57
- # translated to the following rules:
58
- #
59
- # * Arrays become ordered lists <tt><ol></tt>.
60
- # * Hashes become definition lists <tt><dl></tt>, keys are
61
- # stringified with +to_s+.
62
- # * Everything else becomes stringified with +to_s+ and wrapped in
63
- # appropriate list elements (<tt><li></tt> or <tt><dt></tt>/<tt><dd></tt>).
64
- #
65
- # Additionally, you can pass these options on the _options_ hash:
66
- # <tt>:html_wrap</tt> => +true+:: Wrap the XOXO with a basic XHTML 1.0
67
- # Transitional header.
68
- # <tt>:css</tt> => _css_:: Reference _css_ as stylesheet for the
69
- # wrapped XOXO document.
70
- #
71
- def self.dump(struct, options={})
72
- struct = [struct] unless struct.kind_of? Array
73
-
74
- if options[:html_wrap]
75
- result = <<EOF.strip
76
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
77
- http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
78
- <html xmlns="http://www.w3.org/1999/xhtml"><head profile=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
79
- EOF
80
- if options[:css]
81
- result << %Q[<style type="text/css" >@import "#{options[:css]}";</style>]
82
- end
83
-
84
- result << "</head><body>" << make_xoxo(struct, 'xoxo') << "</body></html>"
85
- else
86
- result = make_xoxo(struct, 'xoxo')
87
- end
88
-
89
- result
90
- end
91
-
92
- private
93
-
94
- def self.make_xoxo(struct, class_name=nil)
95
- s = ''
96
- case struct
97
- when Array
98
- if class_name
99
- s << %Q[<ol class="#{class_name}">]
100
- else
101
- s << "<ol>"
102
- end
103
- struct.each { |item|
104
- s << "<li>" << make_xoxo(item) << "</li>"
105
- }
106
- s << "</ol>"
107
-
108
- when Hash
109
- d = struct.dup
110
- if d.has_key? 'url'
111
- s << '<a href="' << d['url'].to_s << '" '
112
- text = d.fetch('text') { d.fetch('title', d['url']) }
113
- %w[title rel type].each { |tag|
114
- if d.has_key? tag
115
- s << tag.to_s << '="' << make_xoxo(d.delete(tag)) << '" '
116
- end
117
- }
118
- s << '>' << make_xoxo(text) << '</a>'
119
- d.delete 'text'
120
- d.delete 'url'
121
- end
122
-
123
- unless d.empty?
124
- s << "<dl>"
125
- d.each { |key, value|
126
- s << "<dt>" << key.to_s << "</dt><dd>" << make_xoxo(value) << "</dd>"
127
- }
128
- s << "</dl>"
129
- end
130
-
131
- when String
132
- s << struct
133
-
134
- else
135
- s << struct.to_s # too gentle?
136
- end
137
-
138
- s
139
- end
140
- end
141
-
142
- class XOXO::Parser # :nodoc:
143
- CONTAINER_TAGS = %w{dl ol ul}
144
-
145
- attr_reader :structs
146
-
147
- def initialize(xoxo)
148
- @parser = REXML::Parsers::PullParser.new(xoxo)
149
-
150
- @textstack = ['']
151
- @xostack = []
152
- @structs = []
153
- @tags = []
154
- end
155
-
156
- def parse
157
- while @parser.has_next?
158
- res = @parser.pull
159
-
160
- if res.start_element?
161
- @tags << res[0]
162
-
163
- case res[0]
164
- when "a"
165
- attrs = normalize_attrs res[1]
166
- attrs['url'] = attrs['href']
167
- attrs.delete 'href'
168
- push attrs
169
- @textstack << ''
170
-
171
- when "dl"
172
- push({})
173
-
174
- when "ol", "ul"
175
- push []
176
-
177
- when "li", "dt", "dd"
178
- @textstack << ''
179
-
180
- end
181
- elsif res.end_element?
182
- @tags.pop
183
-
184
- case res[0]
185
- when "a"
186
- val = @textstack.pop
187
- unless val.empty?
188
- val = '' if @xostack.last['title'] == val
189
- val = '' if @xostack.last['url'] == val
190
- @xostack.last['text'] = val unless val.empty?
191
- end
192
- @xostack.pop
193
-
194
- when "dl", "ol", "ul"
195
- @xostack.pop
196
-
197
- when "li"
198
- val = @textstack.pop
199
- while @structs.last != @xostack.last
200
- val = @structs.pop
201
- @xostack.last << val
202
- end
203
- @xostack.last << val if val.kind_of? String
204
-
205
- when "dt"
206
- # skip
207
-
208
- when "dd"
209
- val = @textstack.pop
210
- key = @textstack.pop
211
-
212
- val = @structs.pop if @structs.last != @xostack.last
213
- @xostack.last[key] = val
214
-
215
- end
216
- elsif res.text?
217
- unless @tags.empty? || CONTAINER_TAGS.include?(@tags.last)
218
- @textstack.last << res[0]
219
- end
220
- end
221
- end
222
-
223
- self
224
- end
225
-
226
- private
227
-
228
- def normalize_attrs(attrs)
229
- attrs.keys.find_all { |k, v| k != k.downcase }.each { |k, v|
230
- v = v.downcase if k == "rel" || k == "type"
231
- attrs.delete k
232
- attrs[k.downcase] = v
233
- }
234
- attrs
235
- end
236
-
237
- def push(struct)
238
- if struct == {} && @structs.last.kind_of?(Hash) &&
239
- @structs.last.has_key?('url') &&
240
- @structs.last != @xostack.last
241
- # put back the <a>-made one for extra def's
242
- @xostack << @structs.last
243
- else
244
- @structs << struct
245
- @xostack << @structs.last
246
- end
247
- end
248
- end
249
-
250
-
251
- class Object
252
-
253
- # Dump object as XOXO.
254
-
255
- def to_xoxo(*args)
256
- XOXO.dump(self,*args)
257
- end
258
-
259
- end
@@ -1,490 +0,0 @@
1
- #require 'zlib'
2
- #require 'facets/minitar'
3
-
4
- # = ZipUtils
5
- #
6
- # Function module for compression methods.
7
- #
8
- # TODO: Much of this shells out. It would be best to internalize.
9
- #
10
- module ZipUtils
11
-
12
- COMPRESS_FORMAT = {
13
- '.tar.gz' => 'tar_gzip',
14
- '.tgz' => 'tar_gzip',
15
- '.tar.bz2' => 'tar_bzip2',
16
- '.zip' => 'zip'
17
- }
18
-
19
- ###############
20
- module_function
21
- ###############
22
-
23
- # Compress folder or file based on given extension.
24
- # Supported extensions are:
25
- # * .tar.gz
26
- # * .tgz
27
- # * .tar.bz2
28
- # * .zip
29
- #
30
- # TODO: support gzip and bzip2 as well.
31
- def compress(folder, file, options={})
32
- format = COMPRESS_FORMAT[File.extname(file)]
33
- if format
34
- send(format, folder, file, options)
35
- else
36
- raise ArgumentError, "unknown compression format -- #{format_extension}"
37
- end
38
- end
39
-
40
- #
41
- #
42
- def gzip(file, option={})
43
- require 'zlib'
44
- fname = File.basename(file) + '.gz'
45
- if options[:dryrun] or options[:verbose]
46
- puts "gzip #{file}"
47
- end
48
- Zlib::GzipWriter.open(fname) do |gz|
49
- gz.write(File.read(file))
50
- end unless options[:dryrun] or options[:noop]
51
- return File.expand_path(fname)
52
- end
53
-
54
- #
55
- #
56
- def ungzip(file, options={})
57
- require 'zlib'
58
- fname = File.basename(file).chomp(File.extname(file))
59
- if options[:dryrun] or options[:verbose]
60
- puts "ungzip #{file}"
61
- end
62
- Zlib::GzipReader.open(file) do |gz|
63
- File.open(fname, 'wb'){ |f| f << gz.read }
64
- end unless options[:dryrun] or options[:noop]
65
- return File.expand_path(fname)
66
- end
67
-
68
- #
69
- #
70
- def bzip2(file, option={})
71
- cmd = "bzip2 #{file}"
72
- puts cmd if options[:dryrun] or options[:verbose]
73
- system cmd unless options[:dryrun] or options[:noop]
74
- return File.expand_path(file + '.bz2')
75
- end
76
-
77
- alias_method :bzip, :bzip2
78
-
79
- #
80
- #
81
- def unbzip2(file, options={})
82
- cmd = "unbzip2 #{file}"
83
- puts cmd if options[:dryrun] or options[:verbose]
84
- system cmd unless options[:dryrun] or options[:noop]
85
- return File.expand_path(file.chomp(File.extname(file)))
86
- end
87
-
88
- alias_method :unbzip, :unbzip2
89
-
90
- #
91
- #
92
- def tar(folder, file=nil, options={})
93
- require 'facets/minitar'
94
- file ||= File.basename(File.expand_path(folder)) + '.tar'
95
- cmd = "tar -cf #{file} #{folder}"
96
- puts cmd if options[:verbose] or options[:dryrun]
97
- unless options[:noop] or options[:dryrun]
98
- gzIO = File.open(file, 'wb')
99
- Archive::Tar::Minitar.pack(folder, gzIO)
100
- end
101
- return File.expand_path(file)
102
- end
103
-
104
- #
105
- #
106
- def untar(file, options={})
107
- require 'facets/minitar'
108
- #file ||= File.basename(File.expand_path(folder)) + '.tar'
109
- cmd = "untar #{file}"
110
- puts cmd if options[:verbose] or options[:dryrun]
111
- unless options[:noop] or options[:dryrun]
112
- gzIO = File.open(file, 'wb')
113
- Archive::Tar::Minitar.unpack(gzIO)
114
- end
115
- return File.expand_path(file)
116
- end
117
-
118
- # Tar Gzip
119
- #
120
- def tar_gzip(folder, file=nil, options={})
121
- require 'zlib'
122
- require 'facets/minitar'
123
- file ||= File.basename(File.expand_path(folder)) + '.tar.gz' # '.tgz' which ?
124
- cmd = "tar --gzip -czf #{file} #{folder}"
125
- puts cmd if options[:verbose] or options[:dryrun]
126
- unless options[:noop] or options[:dryrun]
127
- gzIO = Zlib::GzipWriter.new(File.open(file, 'wb'))
128
- Archive::Tar::Minitar.pack(folder, gzIO)
129
- end
130
- return File.expand_path(file)
131
- end
132
-
133
- alias_method :tar_z, :tar_gzip
134
-
135
- #def tgz(folder, file=nil, options={})
136
- # file ||= File.basename(File.expand_path(folder)) + '.tgz'
137
- # tar_gzip(folder, file, options)
138
- #end
139
-
140
- # Untar Gzip
141
- #
142
- # TODO: Write unified untar_gzip function.
143
- def untar_gzip(file, options={})
144
- untar(ungzip(file, options), options)
145
- end
146
-
147
- alias_method :untar_z, :untar_gzip
148
-
149
- # Tar Bzip2
150
- #
151
- def tar_bzip2(folder, file=nil, options={})
152
- # name of file to create
153
- file ||= File.basename(File.expand_path(folder)) + '.tar.bz2'
154
- cmd = "tar --bzip2 -cf #{file} #{folder}"
155
- puts cmd if options[:dryrun] or options[:verbose]
156
- system cmd unless options[:dryrun] or options[:noop]
157
- return File.expand_path(file)
158
- end
159
-
160
- alias_method :tar_bzip, :tar_bzip2
161
-
162
- alias_method :tar_j, :tar_bzip2
163
-
164
- # Untar Bzip2
165
- #
166
- def untar_bzip2(file, options={})
167
- cmd = "tar --bzip2 -xf #{file}"
168
- puts cmd if options[:dryrun] or options[:verbose]
169
- system cmd unless options[:dryrun] or options[:noop]
170
- end
171
-
172
- alias_method :untar_bzip, :untar_bzip2
173
-
174
- alias_method :untar_j, :untar_bzip2
175
-
176
- # Zip
177
- #
178
- def zip(folder, file=nil, options={})
179
- raise ArgumentError if folder == '.*'
180
- file ||= File.basename(File.expand_path(folder)) + '.zip'
181
- cmd = "zip -rqu #{file} #{folder}"
182
- puts cmd if options[:dryrun] or options[:verbose]
183
- system cmd unless options[:dryrun] or options[:noop]
184
- return File.expand_path(file)
185
- end
186
-
187
- # Unzip
188
- #
189
- def unzip(file, options={})
190
- cmd = "unzip #{file}"
191
- puts cmd if options[:dryrun] or options[:verbose]
192
- system cmd unless options[:dryrun] or options[:noop]
193
- end
194
-
195
- end #module ZipUtils
196
-
197
- # Verbose version of ZipUtils.
198
- #
199
- # This is the same as passing :verbose flag to ZipUtils methods.
200
-
201
- module ZipUtils::Verbose
202
- module_function
203
-
204
- def compress(format_extension, folder, file=nil, options={})
205
- options[:verbose] = true
206
- ZipUtils.tar_gzip(format_extension, folder, file, options)
207
- end
208
-
209
- def gzip(file, options={})
210
- options[:verbose] = true
211
- ZipUtils.gzip(file, options)
212
- end
213
-
214
- def ungzip(file, options={})
215
- options[:verbose] = true
216
- ZipUtils.ungzip(file, options)
217
- end
218
-
219
- def bzip2(file, options={})
220
- options[:verbose] = true
221
- ZipUtils.bzip2(file, options)
222
- end
223
-
224
- alias_method :bzip, :bzip2
225
-
226
- def unbzip2(file, options={})
227
- options[:verbose] = true
228
- ZipUtils.unbzip2(file, options)
229
- end
230
-
231
- alias_method :unbzip, :unbzip2
232
-
233
- def tar(folder, file=nil, options={})
234
- options[:verbose] = true
235
- ZipUtils.tar(folder, file, options)
236
- end
237
-
238
- def untar(file, options={})
239
- options[:verbose] = true
240
- ZipUtils.untar(file, options)
241
- end
242
-
243
- def tar_gzip(folder, file=nil, options={})
244
- options[:verbose] = true
245
- ZipUtils.tar_gzip(folder, file, options)
246
- end
247
-
248
- def untar_gzip(file, options={})
249
- options[:verbose] = true
250
- ZipUtils.untar_gzip(file, options)
251
- end
252
-
253
- def tar_bzip2(folder, file=nil, options={})
254
- options[:verbose] = true
255
- ZipUtils.untar_bzip2(folder, file, options)
256
- end
257
-
258
- def untar_bzip2(file, options={})
259
- options[:verbose] = true
260
- ZipUtils.untar_bzip2(file, options)
261
- end
262
-
263
- def zip(folder, file=nil, options={})
264
- options[:verbose] = true
265
- ZipUtils.unzip(folder, file, options)
266
- end
267
-
268
- def unzip(file, options={})
269
- options[:verbose] = true
270
- ZipUtils.unzip(file, options)
271
- end
272
- end
273
-
274
- # NoWrite Version of ZipUtils.
275
- #
276
- # This is the same as passing :noop flag to ZipUtils methods.
277
-
278
- module ZipUtils::NoWrite
279
- module_function
280
-
281
- def compress(format_extension, folder, file=nil, options={})
282
- options[:noop] = true
283
- ZipUtils.tar_gzip(format_extension, folder, file, options)
284
- end
285
-
286
- def gzip(file, options={})
287
- options[:noop] = true
288
- ZipUtils.gzip(file, options)
289
- end
290
-
291
- def ungzip(file, options={})
292
- options[:noop] = true
293
- ZipUtils.ungzip(file, options)
294
- end
295
-
296
- def bzip2(file, options={})
297
- options[:noop] = true
298
- ZipUtils.bzip2(file, options)
299
- end
300
-
301
- alias_method :bzip, :bzip2
302
-
303
- def unbzip2(file, options={})
304
- options[:noop] = true
305
- ZipUtils.unbzip2(file, options)
306
- end
307
-
308
- alias_method :unbzip, :unbzip2
309
-
310
- def tar(folder, file=nil, options={})
311
- options[:noop] = true
312
- ZipUtils.tar(folder, file, options)
313
- end
314
-
315
- def untar(file, options={})
316
- options[:noop] = true
317
- ZipUtils.untar(file, options)
318
- end
319
-
320
- def tar_gzip(folder, file=nil, options={})
321
- options[:noop] = true
322
- ZipUtils.tar_gzip(folder, file, options)
323
- end
324
-
325
- def untar_gzip(file, options={})
326
- options[:noop] = true
327
- ZipUtils.untar_gzip(file, options)
328
- end
329
-
330
- def tar_bzip2(folder, file=nil, options={})
331
- options[:noop] = true
332
- ZipUtils.untar_bzip2(folder, file, options)
333
- end
334
-
335
- alias_method :tar_bzip, :tar_bzip2
336
-
337
- def untar_bzip2(file, options={})
338
- options[:noop] = true
339
- ZipUtils.untar_bzip2(file, options)
340
- end
341
-
342
- alias_method :untar_bzip, :untar_bzip2
343
-
344
- def zip(folder, file=nil, options={})
345
- options[:noop] = true
346
- ZipUtils.unzip(folder, file, options)
347
- end
348
-
349
- def unzip(file, options={})
350
- options[:noop] = true
351
- ZipUtils.unzip(file, options)
352
- end
353
- end
354
-
355
- # Dry-run verions of ZipUtils.
356
- #
357
- # This is the same as passing the :dryrun flag to ZipUtils.
358
- # Which is also equivalent to passing :noop and :verbose together.
359
-
360
- module ZipUtils::DryRun
361
- module_function
362
-
363
- def compress(format_extension, folder, file=nil, options={})
364
- options[:dryrun] = true
365
- ZipUtils.tar_gzip(format_extension, folder, file, options)
366
- end
367
-
368
- def gzip(file, options={})
369
- options[:dryrun] = true
370
- ZipUtils.gzip(file, options)
371
- end
372
-
373
- def ungzip(file, options={})
374
- options[:dryrun] = true
375
- ZipUtils.ungzip(file, options)
376
- end
377
-
378
- def bzip2(file, options={})
379
- options[:dryrun] = true
380
- ZipUtils.bzip2(file, options)
381
- end
382
-
383
- alias_method :bzip, :bzip2
384
-
385
- def unbzip2(file, options={})
386
- options[:dryrun] = true
387
- ZipUtils.unbzip2(file, options)
388
- end
389
-
390
- alias_method :unbzip, :unbzip2
391
-
392
- def tar(folder, file=nil, options={})
393
- options[:dryrun] = true
394
- ZipUtils.tar(folder, file, options)
395
- end
396
-
397
- def untar(file, options={})
398
- options[:dryrun] = true
399
- ZipUtils.untar(file, options)
400
- end
401
-
402
- def tar_gzip(folder, file=nil, options={})
403
- options[:dryrun] = true
404
- ZipUtils.tar_gzip(folder, file, options)
405
- end
406
-
407
- def untar_gzip(file, options={})
408
- options[:dryrun] = true
409
- ZipUtils.untar_gzip(file, options)
410
- end
411
-
412
- def tar_bzip2(folder, file=nil, options={})
413
- options[:dryrun] = true
414
- ZipUtils.untar_bzip2(folder, file, options)
415
- end
416
-
417
- alias_method :tar_bzip, :tar_bzip2
418
-
419
- def untar_bzip2(file, options={})
420
- options[:dryrun] = true
421
- ZipUtils.untar_bzip2(file, options)
422
- end
423
-
424
- alias_method :untar_bzip, :untar_bzip2
425
-
426
- def zip(folder, file=nil, options={})
427
- options[:dryrun] = true
428
- ZipUtils.unzip(folder, file, options)
429
- end
430
-
431
- def unzip(file, options={})
432
- options[:dryrun] = true
433
- ZipUtils.unzip(file, options)
434
- end
435
- end
436
-
437
-
438
-
439
- # OLD VERSION
440
- # #
441
- # # DryRun version of ZipUtils.
442
- # #
443
- #
444
- # module DryRun
445
- # module_function
446
- #
447
- # def compress( format, folder, to_file=nil )
448
- # send(FORMAT_TO_COMPRESS[format], folder, to_file)
449
- # end
450
- #
451
- # # Tar Gzip
452
- #
453
- # def tar_gzip( folder, to_file=nil )
454
- # to_file ||= File.basename(File.expand_path(folder)) + '.tar.gz'
455
- # puts "tar --gzip -czf #{to_file} #{folder}"
456
- # end
457
- #
458
- # # Untar Gzip
459
- #
460
- # def untar_gzip( file )
461
- # puts "tar --gzip -xzf #{file}"
462
- # end
463
- #
464
- # # Tar Bzip2
465
- #
466
- # def tar_bzip( folder, to_file=nil )
467
- # puts "tar --bzip2 -cf #{to_file} #{folder}"
468
- # end
469
- # alias_method :tar_bz2, :tar_bzip
470
- #
471
- # # Untar Bzip2
472
- #
473
- # def untar_bzip( file )
474
- # puts "tar --bzip2 -xf #{file}"
475
- # end
476
- # alias_method :untar_bz2, :untar_bzip
477
- #
478
- # # Zip
479
- #
480
- # def zip( folder, to_file=nil )
481
- # puts "zip -cf #{to_file} #{folder}"
482
- # end
483
- #
484
- # # Unzip
485
- #
486
- # def unzip( file )
487
- # puts "zip -xf #{file}"
488
- # end
489
- #
490
- # end