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,97 +0,0 @@
1
- # = TITLE:
2
- #
3
- # Censor
4
- #
5
- # = DESCRIPTION:
6
- #
7
- # Reusable class for filtering and rewriting strings.
8
- #
9
- # = AUTHORS:
10
- #
11
- # - George Moschovitis
12
- # - Trans
13
- #
14
-
15
- # = Censor
16
- #
17
- # Formaly known as TextFilter, this class allows one to define a
18
- # resuable text filter. This is useful for removing or replacing
19
- # cursewords or senstive information from user input.
20
- #
21
- class Censor
22
-
23
- # Abritraty rules.
24
- attr :rules
25
-
26
- # Word-oriented rules.
27
- attr :word_rules
28
-
29
- # New Censor object.
30
- #
31
- def initialize()
32
- @rules = []
33
- @word_rules = []
34
- end
35
-
36
- # Create new rule. A rule consists of a string or regexp
37
- # to match against.
38
- #
39
- # NOTE: The rules must be applied in order! So we cannot
40
- # use a hash because the ordering is not guaranteed. So
41
- # an array is used instead.
42
- #
43
- def rule(match, &edit)
44
- edit = lambda{''} unless edit
45
- @rules << [match, edit]
46
- end
47
-
48
- # Rules that apply only to words. This takes the regular
49
- # expression and add word boundry matches to either side.
50
- #
51
- # filter.word_rule(/damn/){ |w| 'darn' }
52
- #
53
- # Is equivalent to teh regular rule:
54
- #
55
- # filter.rule(/\bdamn\b/){ |w| 'darn' }
56
- #
57
- def word_rule(match, &edit)
58
- edit = lambda{''} unless edit
59
- @word_rules << [/\b#{match}\b/, edit]
60
- end
61
-
62
- # Apply the set of rules (regular expression matches) to
63
- # a string.
64
- #
65
- def filter(string)
66
- rewritten_string = string.dup
67
- rules.each do |match,edit|
68
- rewritten_string.gsub!(match,edit)
69
- end
70
- return (rewritten_string or string)
71
- end
72
-
73
- alias_method :apply, :filter
74
-
75
- # Is the string clear of any matching rules?
76
- #
77
- # Note that running a filter does not necessarily clear a
78
- # a string of all matches, since the filter could apply
79
- # edits that would also match the filter expressions.
80
- #
81
- def censored?(string)
82
- case string
83
- when *matches
84
- false
85
- else
86
- true
87
- end
88
- end
89
-
90
- #
91
- #
92
- def matches
93
- rules.collect{ |match, modify| match }
94
- end
95
-
96
- end
97
-
@@ -1,199 +0,0 @@
1
- # = ClassMethods
2
- #
3
- # Miniframework provides a very convenient way to have modules
4
- # pass along class methods in the inheritance chain.
5
- #
6
- # An oddity of Ruby, when including modules, class/module methods
7
- # are not inherited. To achieve this behavior requires some clever
8
- # Ruby Karate. Instead ClassMethods provides an easy to use and clean
9
- # solution. Simply place the class inheritable methods in a block of
10
- # the special module method #ClassMetods.
11
- #
12
- # module Mix
13
- # def inst_meth
14
- # puts 'inst_meth'
15
- # end
16
- #
17
- # class_methods do
18
- # def class_meth
19
- # "Class Method!"
20
- # end
21
- # end
22
- # end
23
- #
24
- # class X
25
- # include Mix
26
- # end
27
- #
28
- # X.class_meth #=> "Class Method!"
29
- #
30
- # This is equivalent to the original (but still functional) techinique of
31
- # putting the class/module methods in a nested ClassMethods module
32
- # and extending the original module *manually*. Eg.
33
- #
34
- # module Mix
35
- # def inst_meth
36
- # puts 'inst_meth'
37
- # end
38
- #
39
- # module ClassMethods
40
- # def class_meth
41
- # "Class Method!"
42
- # end
43
- # end
44
- #
45
- # extend ClassMethods
46
- # end
47
- #
48
- # class X
49
- # include Mix
50
- # end
51
- #
52
- # X.class_meth #=> "Class Method!"
53
- #
54
- # Also note that #class_inherit is an available alias
55
- # for #class_methods for the sake of backward compatability.
56
- # And #class_extension is alias (potentially) looking forward
57
- # to a future version on Ruby.
58
- #
59
- # == On Topic
60
- #
61
- # Just a quick comment on the need for this behavior.
62
- #
63
- # A module is an encapsulation of code, hence when a module is included
64
- # (or extends), the module itself should have discretion over how it
65
- # effects the receiving class/module. That is the very embodiment of
66
- # encapsulation. Having it otherwise, as Ruby now does, stymies the
67
- # practice --and we end up with "hacks", like this and ClassMethods,
68
- # to compensate.
69
- #
70
- # Ruby would be much improved by making this bevaivor standard.
71
- # And making non-inheritance the exception, which is alwasy easy
72
- # enough to achieve: put the code in a separate (and thus uninherited)
73
- # module.
74
- #
75
- # == Notes
76
- #
77
- # * There are currently two approaches to this, ClassMethods and class_extensions.
78
- # A third is being worked on called Component with the idea that a "component"
79
- # is like a module except that it's class-level methods are mixed-in as well.
80
- # This is an idea solution, however it is less that ideal to implement.
81
- #
82
- # == History
83
- #
84
- # Thanks to Nobu and Ulysses for their original work on this.
85
- #
86
- # == Authors
87
- #
88
- # * Nobu Nakada
89
- # * Thomas Sawyer
90
- # * Ulysses
91
- #
92
- # == Copying
93
- #
94
- # Copyright (c) 2005 Nobu Nakada, Thomas Sawyer
95
- #
96
- # Ruby License
97
- #
98
- # This module is free software. You may use, modify, and/or redistribute this
99
- # software under the same terms as Ruby.
100
- #
101
- # This program is distributed in the hope that it will be useful, but WITHOUT
102
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
103
- # FOR A PARTICULAR PURPOSE.
104
-
105
-
106
- # = ClassMethods
107
- #
108
- # ClassMethods provides an easy to use and clean
109
- # solution. Simply place the class inheritable methods in a block of
110
- # the special module method #ClassMetods.
111
- #
112
- # module Mix
113
- # def inst_meth
114
- # puts 'inst_meth'
115
- # end
116
- #
117
- # class_methods do
118
- # def class_meth
119
- # "Class Method!"
120
- # end
121
- # end
122
- # end
123
- #
124
- # class X
125
- # include Mix
126
- # end
127
- #
128
- # X.class_meth #=> "Class Method!"
129
- #
130
- # This is equivalent to the original (but still functional) techinique of
131
- # putting the class/module methods in a nested ClassMethods module
132
- # and extending the original module *manually*. Eg.
133
- #
134
- # module Mix
135
- # def inst_meth
136
- # puts 'inst_meth'
137
- # end
138
- #
139
- # module ClassMethods
140
- # def class_meth
141
- # "Class Method!"
142
- # end
143
- # end
144
- #
145
- # extend ClassMethods
146
- # end
147
- #
148
- # class X
149
- # include Mix
150
- # end
151
- #
152
- # X.class_meth #=> "Class Method!"
153
- #
154
- # Also note that #class_inherit is an available alias
155
- # for #class_methods for the sake of backward compatability.
156
- # And #class_extension is alias (potentially) looking forward
157
- # to a future version on Ruby.
158
-
159
- class Module
160
-
161
- alias_method :append_features_without_classmethods, :append_features
162
-
163
- def append_features( base )
164
- result = append_features_without_classmethods( base )
165
- if const_defined?( :ClassMethods )
166
- base.extend( self::ClassMethods )
167
- unless base.is_a?( Class )
168
- unless base.const_defined?( :ClassMethods )
169
- base.const_set( :ClassMethods, Module.new )
170
- end
171
- my = self
172
- base::ClassMethods.class_eval do
173
- include my::ClassMethods
174
- end
175
- end
176
- end
177
- result
178
- end
179
-
180
- def class_methods( &yld )
181
- if const_defined?( :ClassMethods )
182
- self::ClassMethods.class_eval( &yld )
183
- else
184
- self.const_set( :ClassMethods, Module.new( &yld ) )
185
- end
186
- extend( self::ClassMethods )
187
- self::ClassMethods
188
- end
189
-
190
- # For compatibility with old rendition.
191
- alias_method :class_inherit, :class_methods
192
-
193
- end
194
-
195
- class Class
196
- undef_method :class_methods
197
- undef_method :class_inherit
198
- end
199
-
@@ -1,99 +0,0 @@
1
- warn "WARNING: facets/consoleutils.rb will be deprecated. Use alternate solution, such as Clio, for future versions."
2
-
3
- # = ConsoleUtils
4
- #
5
- # ConsoleUtils provides methods that are
6
- # generally useful in the context of
7
- # creating console output.
8
- #
9
- module ConsoleUtils
10
-
11
- module_function
12
-
13
- # Convenient method to get simple console reply.
14
-
15
- def ask(question, answers=nil)
16
- print "#{question}"
17
- print " [#{answers}] " if answers
18
- until inp = $stdin.gets ; sleep 1 ; end
19
- inp
20
- end
21
-
22
- # Convenience method for puts. Use this instead of
23
- # puts when the output should be supressed if the
24
- # global $QUIET option is set.
25
-
26
- #def say(statement)
27
- # puts statement #unless quiet? $QUIET
28
- #end
29
-
30
- # Ask for a password. (FIXME: only for unix so far)
31
-
32
- def password(msg=nil)
33
- msg ||= "Enter Password: "
34
- inp = ''
35
-
36
- $stdout << msg
37
-
38
- begin
39
- system "stty -echo"
40
- inp = gets.chomp
41
- ensure
42
- system "stty echo"
43
- end
44
-
45
- return inp
46
- end
47
-
48
- # Console screen width (taken from progress bar)
49
- #
50
- # TODO: Don't know how portable #screen_width is.
51
-
52
- def screen_width(out=STDERR)
53
- default_width = ENV['COLUMNS'] || 80
54
- begin
55
- tiocgwinsz = 0x5413
56
- data = [0, 0, 0, 0].pack("SSSS")
57
- if out.ioctl(tiocgwinsz, data) >= 0 then
58
- rows, cols, xpixels, ypixels = data.unpack("SSSS")
59
- if cols >= 0 then cols else default_width end
60
- else
61
- default_width
62
- end
63
- rescue Exception
64
- default_width
65
- end
66
- end
67
-
68
- # Print a justified line with left and right entries.
69
- #
70
- # A fill option can be given to fill in any empty space
71
- # between the two. And a ratio option can be given which defaults
72
- # to 0.8 (eg. 80/20)
73
-
74
- def print_justified(left, right, options={})
75
- fill = options[:fill] || '.'
76
- fill = ' ' if fill == ''
77
- fill = fill[0,1]
78
-
79
- ratio = options[:ratio] || 0.8
80
- ratio = 1 + ratio if ratio < 0
81
-
82
- width = (@screen_width ||= screen_width) - 1
83
-
84
- #l = (width * ratio).to_i
85
- r = (width * (1 - ratio)).to_i
86
- l = width - r
87
-
88
- left = left[0,l]
89
- right = right[0,r]
90
-
91
- str = fill * width
92
- str[0,left.size] = left
93
- str[width-right.size,right.size] = right
94
-
95
- print str
96
- end
97
-
98
- end
99
-
@@ -1,166 +0,0 @@
1
- # = Crypt
2
- #
3
- # A pure ruby version of crypt(3), a salted one-way hashing of a password.
4
- #
5
- # == History
6
- #
7
- # Adapted by guillaume__dot__pierronnet_at__laposte__dot_net based on
8
- # * http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/325204/index_txt
9
- # which is based on FreeBSD src/lib/libcrypt/crypt.c 1.2
10
- # * http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/lib/libcrypt/crypt.c?rev=1.2&content-type=text/plain
11
- #
12
- # [Original License]
13
- #
14
- # "THE BEER-WARE LICENSE" (Revision 42):
15
- # <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
16
- # can do whatever you want with this stuff. If we meet some day, and you think
17
- # this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
18
- #
19
- # == Authors
20
- #
21
- # * Poul-Henning Kamp
22
- #
23
- # == Copying
24
- #
25
- # Copyright (c) 2002 Poul-Henning Kamp
26
- #
27
- # Ruby License
28
- #
29
- # This module is free software. You may use, modify, and/or redistribute this
30
- # software under the same terms as Ruby.
31
- #
32
- # This program is distributed in the hope that it will be useful, but WITHOUT
33
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
34
- # FOR A PARTICULAR PURPOSE.
35
-
36
- require 'facets/string/xor.rb'
37
-
38
- # = Crypt
39
- #
40
- # A pure ruby version of crypt(3), a salted one-way hashing of a password.
41
- #
42
- module Crypt
43
-
44
- ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
45
-
46
- # A pure ruby version of crypt(3), a salted one-way hashing of a password.
47
- #
48
- # Supported hashing algorithms are: md5, sha1, sha256, sha384, sha512, rmd160.
49
- #
50
- # Only the md5 hashing algorithm is standard and compatible with crypt(3), the others
51
- # are not standard.
52
- #
53
- # Automatically generate a 8-bytes salt if nil.
54
- #
55
- # Output a length hashed and salted string with size of
56
- # magic.size + salt.size + 23.
57
-
58
- def self.crypt(password, algo = :md5, salt = nil, magic='$1$')
59
-
60
- salt ||= generate_salt(8)
61
-
62
- case algo
63
- when :md5
64
- require "digest/md5"
65
- when :sha1
66
- require "digest/sha1"
67
- when :rmd160
68
- require "digest/rmd160"
69
- when :sha256, :sha384, :sha512
70
- require "digest/sha2"
71
- else
72
- raise(ArgumentError, "unknown algorithm")
73
- end
74
- digest_class = Digest.const_get(algo.to_s.upcase)
75
-
76
- # The password first, since that is what is most unknown. Then our magic string. Then the raw salt.
77
- m = digest_class.new
78
- m.update(password + magic + salt)
79
-
80
- # Then just as many characters of the MD5(pw,salt,pw)
81
- mixin = digest_class.new.update(password + salt + password).digest
82
- password.length.times do |i|
83
- m.update(mixin[i % 16].chr)
84
- end
85
-
86
- # Then something really weird...
87
- # Also really broken, as far as I can tell. -m
88
- i = password.length
89
- while i != 0
90
- if (i & 1) != 0
91
- m.update("\x00")
92
- else
93
- m.update(password[0].chr)
94
- end
95
- i >>= 1
96
- end
97
-
98
- final = m.digest
99
-
100
- # and now, just to make sure things don't run too fast
101
- 1000.times do |i|
102
- m2 = digest_class.new
103
-
104
- if (i & 1) != 0
105
- m2.update(password)
106
- else
107
- m2.update(final)
108
- end
109
-
110
- if (i % 3) != 0
111
- m2.update(salt)
112
- end
113
- if (i % 7) != 0
114
- m2.update(password)
115
- end
116
-
117
- if (i & 1) != 0
118
- m2.update(final)
119
- else
120
- m2.update(password)
121
- end
122
-
123
- final = m2.digest
124
- end
125
-
126
- # This is the bit that uses to64() in the original code.
127
-
128
- rearranged = ""
129
-
130
- [ [0, 6, 12], [1, 7, 13], [2, 8, 14], [3, 9, 15], [4, 10, 5] ].each do |a, b, c|
131
-
132
- v = final[a] << 16 | final[b] << 8 | final[c]
133
-
134
- 4.times do
135
- rearranged += ITOA64[v & 0x3f].chr
136
- v >>= 6
137
- end
138
- end
139
-
140
- v = final[11]
141
-
142
- 2.times do
143
- rearranged += ITOA64[v & 0x3f].chr
144
- v >>= 6
145
- end
146
-
147
- magic + salt + '$' + rearranged
148
- end
149
-
150
-
151
- # check the validity of a password against an hashed string
152
-
153
- def self.check(password, hash, algo = :md5)
154
- magic, salt = hash.split('$')[1,2]
155
- magic = '$' + magic + '$'
156
- self.crypt(password, algo, salt, magic) == hash
157
- end
158
-
159
-
160
- # generate a +size+ length random salt
161
-
162
- def self.generate_salt(size)
163
- (1..size).collect { ITOA64[rand(ITOA64.size)].chr }.join("")
164
- end
165
- end
166
-