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,278 +0,0 @@
1
- require 'facets/functor'
2
-
3
- class String
4
-
5
- # Create a mask.
6
- def to_mask(re=nil)
7
- Mask.new(self,re)
8
- end
9
-
10
- # = Mask
11
- #
12
- class Mask
13
-
14
- ESC = "\032" # ASCII SUBSTITUTE
15
-
16
- class << self
17
-
18
- def [](string, re=nil)
19
- new(string, re)
20
- end
21
-
22
- end # class<< self
23
-
24
- protected
25
-
26
- attr :string
27
-
28
- private
29
-
30
- def initialize(string, re=nil)
31
- @string = string.dup
32
- mask!(re) if re
33
- end
34
-
35
- public
36
-
37
- def inspect ; string.inspect ; end
38
- def to_s ; string ; end
39
-
40
- def [](*a)
41
- string[*a]
42
- end
43
-
44
- def mask(re)
45
- self.class.new(string,re)
46
- end
47
-
48
- def mask!(re)
49
- string.gsub!(re){ |s| ESC * s.size }
50
- end
51
-
52
- # Mask subtraction. Where the characters are the same,
53
- # the result is "empty", where they differ the result
54
- # reflects the last string.
55
- #
56
- # "abc..123" "ab..789."
57
- # - "ab..789." - "abc..123"
58
- # ---------- ----------
59
- # "....789." "..c..123"
60
- #
61
- def -(other)
62
- i = 0
63
- o = ''
64
- while i < string.size
65
- if string[i,1] == other[i,1]
66
- o << ESC
67
- else
68
- o << other[i,1]
69
- end
70
- i += 1
71
- end
72
- self.class.new(o)
73
- end
74
-
75
- # Mask ADD. As long as there is a value other
76
- # then empty the character filters though.
77
- # The last string takes precedence.
78
- #
79
- # "abc..123" "ab..789."
80
- # + "ab..789." + "abc..123"
81
- # ---------- ----------
82
- # "abc.7893" "abc.7123"
83
- #
84
- def +(other)
85
- i = 0
86
- o = ''
87
- while i < string.size
88
- if other[i,1] == ESC
89
- o << string[i,1]
90
- else
91
- o << other[i,1]
92
- end
93
- i += 1
94
- end
95
- self.class.new(o)
96
- end
97
-
98
- # Mask OR is the same as ADD.
99
- alias_method :|, :+
100
-
101
- # Mask XAND. Where the characters are the same, the
102
- # result is the same, where they differ the result
103
- # reflects the later.
104
- #
105
- # "abc..123" "ab..789."
106
- # * "ab..789." | "abc..123"
107
- # ---------- ----------
108
- # "ab..789." "abc..123"
109
- #
110
- def *(other)
111
- i = 0
112
- o = ''
113
- while i < string.size
114
- if (c = string[i,1]) == other[i,1]
115
- o << c
116
- else
117
- o << other[i,1]
118
- end
119
- i += 1
120
- end
121
- self.class.new(o)
122
- end
123
-
124
- # Mask AND. Only where they are
125
- # then same filters through.
126
- #
127
- # "abc..123" "ab..789."
128
- # & "ab..789." | "abc..123"
129
- # ---------- ----------
130
- # "ab......" "ab......"
131
- #
132
- def &(other)
133
- i = 0
134
- o = ''
135
- while i < string.size
136
- if (c = string[i,1]) == other[i,1]
137
- o << c
138
- else
139
- o << ESC
140
- end
141
- i += 1
142
- end
143
- self.class.new(o)
144
- end
145
-
146
- # Mask XOR operation. Only where there
147
- # is an empty slot will the value filter.
148
- #
149
- # "abc..123" "ab..789."
150
- # | "ab..789." | "abc..123"
151
- # ---------- ----------
152
- # "..c.7..3" "..c.7..3"
153
- #
154
- def ^(other)
155
- i = 0
156
- o = ''
157
- while i < string.size
158
- if string[i,1] == ESC
159
- o << other[i,1]
160
- elsif other[i,1] == ESC
161
- o << string[i,1]
162
- else
163
- o << ESC
164
- end
165
- i += 1
166
- end
167
- self.class.new(o)
168
- end
169
-
170
- #
171
- def ==(other)
172
- case other
173
- when String::Mask
174
- string == other.string
175
- else
176
- string == other.to_s
177
- end
178
- end
179
-
180
- # Apply a method to the internal string
181
- # and return a new mask.
182
- def apply(s=nil,*a,&b)
183
- if s
184
- string.send(s,*a,&b).to_mask
185
- else
186
- @_self ||= Functor.new do |op, *a|
187
- string.send(op,*a).to_mask
188
- end
189
- end
190
- end
191
-
192
- def replace(string)
193
- @string = string.to_s
194
- end
195
-
196
- def instance_delegate
197
- @string
198
- end
199
-
200
- # Functor on the interal string.
201
- #def self
202
- # @_self ||= Functor.new do |op, *a|
203
- # @string = @string.send(op, *a)
204
- # end
205
- #end
206
-
207
- # Delegate any missing methods to underlying string.
208
- #
209
- def method_missing(s, *a, &b)
210
- begin
211
- str = string.send(s, *a, &b)
212
- rescue NoMethodError
213
- super(s, *a, &b)
214
- end
215
- end
216
-
217
- end
218
- end
219
-
220
-
221
- =begin spec
222
-
223
- require 'quarry/spec'
224
-
225
- Quarry.spec "String::Mask" do
226
-
227
- x1 = String::Mask["abc..123", '.']
228
- x2 = String::Mask["ab..789.", '.']
229
-
230
- verify "sub" do
231
- r = x1 - x2
232
- a = String::Mask["....789.", '.']
233
- r.assert == a
234
- r = x2 - x1
235
- a = String::Mask["..c..123", '.']
236
- r.assert == a
237
- end
238
-
239
- verify "add" do
240
- r = x1 + x2
241
- a = String::Mask["abc.7893", '.']
242
- r.assert == a
243
- r = x2 + x1
244
- a = String::Mask["abc.7123", '.']
245
- r.assert == a
246
- end
247
-
248
- verify "xand" do
249
- r = x1 * x2
250
- a = String::Mask["ab..789.", '.']
251
- r.assert == a
252
- r = x2 * x1
253
- a = String::Mask["abc..123", '.']
254
- r.assert == a
255
- end
256
-
257
- verify "and" do
258
- r = x1 & x2
259
- a = String::Mask["ab......", '.']
260
- r.assert == a
261
- r = x2 & x1
262
- a = String::Mask["ab......", '.']
263
- r.assert == a
264
- end
265
-
266
- verify "xor" do
267
- r = x1 ^ x2
268
- a = String::Mask["..c.7..3", '.']
269
- r.assert == a
270
- r = x2 ^ x1
271
- a = String::Mask["..c.7..3", '.']
272
- r.assert == a
273
- end
274
-
275
- end
276
-
277
- =end
278
-
@@ -1,65 +0,0 @@
1
- module English
2
-
3
- # = String Obfuscation
4
- #
5
- # The Obfuscate mixin provides a means of applying common
6
- # scrambling patterns to strings.
7
- #
8
- # This module is automatically mixed into the String class, but
9
- # the mixin is designed in such a way that it can be mixed into
10
- # any class that supports the #to_s method.
11
- #
12
- # Examples
13
- #
14
- # "superman".jumble #=> "SUpeRmAn"
15
- #
16
- module Obfuscate
17
-
18
- # Jumble string.
19
- #
20
- #
21
- def jumble
22
- j = ''
23
- to_s.split(//).each_with_index{ |c,i| j << ( i % 2 == 0 ? c.downcase : c.upcase ) }
24
- j
25
- end
26
-
27
- # Dresener Obfuscation.
28
- #
29
- # Scramble the inner characters of words leaving the text still readable
30
- # (research at Cambridge University, code by KurtDresner).
31
- #
32
- # For example, the above text may result in:
33
- #
34
- # Srblamce the iennr cchrteaars of wodrs lvenaig the txet stlil rbeaadle
35
- # (rreceash at Cbamigdre Uverintisy, cdoe by KrneruestDr?)
36
- #
37
- # :credit: Kurt Dresener
38
- def dresner
39
- to_s.gsub(/\B\w+\B/){$&.split(//).sort_by{rand}}
40
- end
41
-
42
- # Include Replace mixin if base class/module supports #replace method.
43
- def self.included(base)
44
- if base.instance_methods.include?('replace') or
45
- base.instance_methods.include?(:replace) # Ruby 1.9
46
- base.module_eval{ include Replace }
47
- end
48
- end
49
-
50
- # TODO: Replace this will dynamic generate of inplace methods.
51
- # But only when the base defines #replace (?) Need to
52
- # think about this some more.
53
- module Replace
54
- def jumble! ; replace(jumble) ; end
55
- def dresner! ; replace(dresner) ; end
56
- end
57
-
58
- end
59
-
60
- end
61
-
62
- class String #:nodoc:
63
- include English::Obfuscate
64
- end
65
-
@@ -1,169 +0,0 @@
1
- class String
2
-
3
- # = String Stylization Extensions
4
- #
5
- # The Stylize mixin provides common transformation to strings.
6
- #
7
- # This module is automatically mixed into the String class, but
8
- # the mixin is designed in such a way that it can be mixed into
9
- # any class that supports the #to_s method.
10
- #
11
- # Examples
12
- #
13
- # "super_man".dasherize #=> "super-man"
14
- #
15
- #--
16
- # TODO: With #pathize, is downcasing really needed? After all paths
17
- # can have capitalize letters ;p
18
- #
19
- # TODO: With #methodize, is downcasing any but the first letter
20
- # really needed? Desipite Matz preference methods can have
21
- # capitalized letters.
22
- #++
23
- module Stylize
24
-
25
- # Ordinalize turns a number string into an ordinal string
26
- # used to denote the position in an ordered sequence such
27
- # as 1st, 2nd, 3rd, 4th.
28
- #
29
- # '1'.ordinalize # => "1st"
30
- # '2'.ordinalize # => "2nd"
31
- # '1002'.ordinalize # => "1002nd"
32
- # '1003'.ordinalize # => "1003rd"
33
- #
34
- def ordinalize
35
- number_string = to_s
36
- if number_string =~ /\d{1,2}$/
37
- number = $1.to_i
38
- if (11..13).include?(number.to_i % 100)
39
- r = "#{number}th"
40
- else
41
- r = case number.to_i % 10
42
- when 1; "#{number}st"
43
- when 2; "#{number}nd"
44
- when 3; "#{number}rd"
45
- else "#{number}th"
46
- end
47
- end
48
- number_string.sub(/\d{1,2}$/, r)
49
- else
50
- number_string
51
- end
52
- end
53
-
54
- # Replaces underscores with dashes in the string.
55
- #
56
- # "puni_puni".dasherize #=> "puni-puni"
57
- #
58
- def dasherize
59
- to_s.gsub(/_/, '-')
60
- end
61
-
62
- # The reverse of +camelize+. Makes an underscored, lowercase form from
63
- # the expression in the string.
64
- #
65
- # Changes '::' to '/' to convert namespaces to paths.
66
- #
67
- # "ActiveRecord".underscore #=> "active_record"
68
- # "ActiveRecord::Errors".underscore #=> active_record/errors
69
- #
70
- def underscore
71
- to_s.
72
- gsub(/::/, '/').
73
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
74
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
75
- tr("-", "_").
76
- downcase
77
- end
78
-
79
- # Converts a module or method name into a unix pathname.
80
- # This method is geared toward code reflection.
81
- #
82
- # "MyModule::MyClass".pathize #=> my_module/my_class
83
- # "my_module__my_class".pathize #=> my_module/my_class
84
- #
85
- # TODO: Make sure that all scenarios return a valid unix path.
86
- # TODO: Make sure it is revertible.
87
- #
88
- # See also #modulize, #methodize
89
- def pathize
90
- to_s.
91
- gsub(/__/, '/').
92
- gsub(/::/, '/').
93
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
94
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
95
- tr("-", "_").
96
- downcase
97
- end
98
-
99
- # Converts a module name into a valid method name.
100
- # This method is geared toward code reflection.
101
- #
102
- # Examples
103
- # "SuperMan".methodize #=> "super_man"
104
- # "SuperMan::Errors".methodize #=> "super_man__errors
105
- # "MyModule::MyClass".methodize #=> "my_module__my_class"
106
- #
107
- # See also #modulize, #pathize
108
- def methodize
109
- to_s.
110
- gsub(/\//, '__').
111
- gsub(/::/, '__').
112
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
113
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
114
- tr("-", "_").
115
- downcase
116
- end
117
-
118
- # Converts a pathized or methodized string into a valid ruby
119
- # class or module name. This method is geared toward code
120
- # reflection.
121
- #
122
- # "camel_case".modulize #=> "CamelCase"
123
- # "camel/case".modulize #=> "Camel::Case"
124
- # "my_module__my_path".modulize #=> "MyModule::MyPath"
125
- #
126
- # See also #methodize, #pathize
127
- def modulize
128
- to_s.
129
- gsub(/__(.?)/){ "::#{$1.upcase}" }.
130
- gsub(/\/(.?)/){ "::#{$1.upcase}" }.
131
- gsub(/(?:_+)([a-z])/){ $1.upcase }.
132
- gsub(/(^|\s+)([a-z])/){ $1 + $2.upcase }
133
- end
134
-
135
- # Removes the module part from a modularized expression.
136
- #
137
- # "English::Style".demodulize #=> "Style"
138
- # "Style".demodulize #=> "Style"
139
- #
140
- #def demodulize
141
- # to_s.gsub(/^.*::/, '')
142
- #end
143
-
144
- # Include Replace mixin if base class/module supports #replace method.
145
- def self.included(base)
146
- if base.instance_methods.include?('replace') or
147
- base.instance_methods.include?(:replace) # Ruby 1.9
148
- base.module_eval{ include Replace }
149
- end
150
- end
151
-
152
- # In place versions of Stylize methods.
153
- module Replace
154
- def ordinalize! ; replace(ordinalize) ; end
155
- def pathize! ; replace(pathize) ; end
156
- def methodize! ; replace(methodize) ; end
157
- def modulize! ; replace(modulize) ; end
158
- def dasherize! ; replace(dasherize) ; end
159
- def underscore! ; replace(underscore) ; end
160
- end
161
-
162
- end
163
-
164
- end
165
-
166
- class String #:nodoc:
167
- include String::Stylize
168
- end
169
-