facets 2.1.3 → 2.2.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 (303) hide show
  1. data/AUTHORS +14 -12
  2. data/CHANGES +45 -2
  3. data/NOTES +9 -7
  4. data/lib/core/facets/1stclassmethod.rb +15 -11
  5. data/lib/core/facets/array.rb +0 -1
  6. data/lib/core/facets/array/conjoin.rb +40 -8
  7. data/lib/core/facets/array/delete.rb +8 -2
  8. data/lib/core/facets/array/indexable.rb +30 -3
  9. data/lib/core/facets/array/merge.rb +11 -0
  10. data/lib/core/facets/array/only.rb +3 -3
  11. data/lib/core/facets/array/pad.rb +4 -46
  12. data/lib/core/facets/array/rotate.rb +4 -4
  13. data/lib/core/facets/array/select.rb +2 -0
  14. data/lib/core/facets/array/splice.rb +16 -2
  15. data/lib/core/facets/array/stackable.rb +6 -40
  16. data/lib/core/facets/binding.rb +3 -0
  17. data/lib/core/facets/binding/cflow.rb +10 -64
  18. data/lib/core/facets/binding/defined.rb +10 -0
  19. data/lib/core/facets/binding/eval.rb +10 -76
  20. data/lib/core/facets/binding/here.rb +9 -0
  21. data/lib/core/facets/binding/self.rb +10 -0
  22. data/lib/core/facets/binding/vars.rb +0 -45
  23. data/lib/core/facets/boolean.rb +31 -103
  24. data/lib/core/facets/class/descendents.rb +17 -44
  25. data/lib/core/facets/comparable/bound.rb +8 -70
  26. data/lib/core/facets/comparable/cmp.rb +12 -92
  27. data/lib/core/facets/conversion.rb +122 -321
  28. data/lib/core/facets/dir/multiglob.rb +0 -13
  29. data/lib/core/facets/dir/traverse.rb +61 -111
  30. data/lib/core/facets/enumerable.rb +4 -2
  31. data/lib/core/facets/enumerable/cartesian.rb +36 -85
  32. data/lib/core/facets/enumerable/collect.rb +64 -152
  33. data/lib/core/facets/enumerable/combination.rb +40 -42
  34. data/lib/core/facets/enumerable/count.rb +99 -174
  35. data/lib/core/facets/enumerable/each.rb +86 -0
  36. data/lib/core/facets/enumerable/mash.rb +58 -0
  37. data/lib/core/facets/enumerable/permutation.rb +39 -44
  38. data/lib/core/facets/enumerable/probability.rb +16 -90
  39. data/lib/core/facets/enumerable/split.rb +113 -0
  40. data/lib/core/facets/exception/detail.rb +1 -2
  41. data/lib/core/facets/facets.rb +3 -2
  42. data/lib/core/facets/file/read.rb +4 -59
  43. data/lib/core/facets/file/topath.rb +8 -96
  44. data/lib/core/facets/file/write.rb +21 -49
  45. data/lib/core/facets/filetest/root.rb +4 -3
  46. data/lib/core/facets/functor.rb +5 -43
  47. data/lib/core/facets/hash/at.rb +7 -37
  48. data/lib/core/facets/hash/delete.rb +9 -58
  49. data/lib/core/facets/hash/has_keys.rb +4 -43
  50. data/lib/core/facets/hash/insert.rb +5 -38
  51. data/lib/core/facets/hash/inverse.rb +2 -41
  52. data/lib/core/facets/hash/iterate.rb +4 -45
  53. data/lib/core/facets/hash/keyize.rb +24 -92
  54. data/lib/core/facets/hash/merge.rb +4 -38
  55. data/lib/core/facets/hash/new.rb +5 -38
  56. data/lib/core/facets/hash/op.rb +20 -66
  57. data/lib/core/facets/hash/rekey.rb +9 -87
  58. data/lib/core/facets/hash/select.rb +1 -1
  59. data/lib/core/facets/hash/slice.rb +42 -0
  60. data/lib/core/facets/hash/traverse.rb +6 -46
  61. data/lib/core/facets/hash/update.rb +27 -67
  62. data/lib/core/facets/hash/weave.rb +22 -42
  63. data/lib/core/facets/indexable.rb +42 -14
  64. data/lib/core/facets/integer/bitmask.rb +69 -106
  65. data/lib/core/facets/integer/factorial.rb +1 -44
  66. data/lib/core/facets/integer/multiples.rb +27 -22
  67. data/lib/core/facets/integer/of.rb +1 -33
  68. data/lib/core/facets/kernel.rb +4 -2
  69. data/lib/core/facets/kernel/ask.rb +15 -3
  70. data/lib/core/facets/kernel/callstack.rb +38 -69
  71. data/lib/core/facets/kernel/constant.rb +2 -38
  72. data/lib/core/facets/kernel/deepcopy.rb +3 -55
  73. data/lib/core/facets/kernel/dir.rb +2 -0
  74. data/lib/core/facets/kernel/ergo.rb +2 -2
  75. data/lib/core/facets/kernel/instance.rb +51 -120
  76. data/lib/core/facets/kernel/metaid.rb +35 -73
  77. data/lib/core/facets/kernel/object.rb +14 -39
  78. data/lib/core/facets/kernel/op_esc.rb +24 -2
  79. data/lib/core/facets/kernel/populate.rb +6 -69
  80. data/lib/core/facets/kernel/report.rb +28 -33
  81. data/lib/core/facets/kernel/require.rb +7 -21
  82. data/lib/core/facets/kernel/respond.rb +11 -1
  83. data/lib/core/facets/kernel/returning.rb +50 -0
  84. data/lib/core/facets/kernel/silence.rb +12 -24
  85. data/lib/core/facets/kernel/super.rb +12 -76
  86. data/lib/core/facets/kernel/tap.rb +25 -107
  87. data/lib/core/facets/kernel/val.rb +7 -46
  88. data/lib/core/facets/kernel/withattr.rb +6 -64
  89. data/lib/core/facets/matchdata/matchset.rb +8 -50
  90. data/lib/core/facets/module.rb +3 -1
  91. data/lib/core/facets/module/abstract.rb +9 -47
  92. data/lib/core/facets/module/alias.rb +11 -68
  93. data/lib/core/facets/module/attr.rb +36 -15
  94. data/lib/core/facets/module/cattr.rb +8 -76
  95. data/lib/core/facets/module/clone.rb +15 -66
  96. data/lib/core/facets/module/include.rb +54 -114
  97. data/lib/core/facets/module/methods.rb +15 -13
  98. data/lib/core/facets/module/modify.rb +20 -206
  99. data/lib/core/facets/module/name.rb +19 -83
  100. data/lib/core/facets/module/require.rb +48 -53
  101. data/lib/core/facets/module/traits.rb +74 -33
  102. data/lib/core/facets/nilclass/status.rb +25 -2
  103. data/lib/core/facets/numeric/round.rb +24 -89
  104. data/lib/core/facets/proc/bind.rb +16 -59
  105. data/lib/core/facets/proc/compose.rb +6 -40
  106. data/lib/core/facets/proc/fn.rb +2 -0
  107. data/lib/core/facets/range/combine.rb +15 -51
  108. data/lib/core/facets/range/overlap.rb +8 -64
  109. data/lib/core/facets/regexp/arity.rb +6 -41
  110. data/lib/core/facets/stackable.rb +43 -4
  111. data/lib/core/facets/string.rb +2 -0
  112. data/lib/core/facets/string/align.rb +45 -55
  113. data/lib/core/facets/string/blank.rb +2 -46
  114. data/lib/core/facets/string/bracket.rb +14 -87
  115. data/lib/core/facets/string/case.rb +45 -32
  116. data/lib/core/facets/string/crypt.rb +3 -40
  117. data/lib/core/facets/string/filter.rb +7 -49
  118. data/lib/core/facets/string/format.rb +24 -126
  119. data/lib/core/facets/string/indexable.rb +50 -133
  120. data/lib/core/facets/string/interpolate.rb +24 -59
  121. data/lib/core/facets/string/natcmp.rb +5 -39
  122. data/lib/core/facets/string/nchar.rb +37 -45
  123. data/lib/core/facets/string/op.rb +13 -0
  124. data/lib/core/facets/string/partitions.rb +38 -99
  125. data/lib/core/facets/string/range.rb +8 -49
  126. data/lib/core/facets/string/regesc.rb +9 -42
  127. data/lib/core/facets/string/scan.rb +6 -52
  128. data/lib/core/facets/string/splice.rb +8 -13
  129. data/lib/core/facets/string/tabs.rb +16 -153
  130. data/lib/core/facets/symbol.rb +3 -1
  131. data/lib/core/facets/symbol/chomp.rb +11 -29
  132. data/lib/core/facets/symbol/generate.rb +4 -43
  133. data/lib/core/facets/symbol/not.rb +13 -25
  134. data/lib/core/facets/symbol/shadow.rb +2 -40
  135. data/lib/core/facets/symbol/succ.rb +14 -13
  136. data/lib/core/facets/symbol/to_proc.rb +33 -28
  137. data/lib/core/facets/time.rb +1 -0
  138. data/lib/core/facets/time/change.rb +5 -38
  139. data/lib/core/facets/time/elapse.rb +2 -41
  140. data/lib/core/facets/time/stamp.rb +47 -0
  141. data/lib/core/facets/unboundmethod.rb +3 -0
  142. data/lib/core/facets/unboundmethod/arguments.rb +27 -4
  143. data/lib/core/facets/unboundmethod/name.rb +21 -7
  144. data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
  145. data/lib/methods/facets/enumerable/collate.rb +1 -0
  146. data/lib/methods/facets/enumerable/divide.rb +1 -1
  147. data/lib/methods/facets/enumerable/each_by.rb +1 -1
  148. data/lib/methods/facets/enumerable/each_pair.rb +1 -1
  149. data/lib/methods/facets/enumerable/eachn.rb +1 -1
  150. data/lib/methods/facets/enumerable/graph.rb +1 -1
  151. data/lib/methods/facets/enumerable/group_by.rb +1 -1
  152. data/lib/methods/facets/enumerable/inject.rb +1 -0
  153. data/lib/methods/facets/enumerable/map_send.rb +1 -0
  154. data/lib/methods/facets/enumerable/modulate.rb +1 -0
  155. data/lib/methods/facets/enumerable/partition_by.rb +1 -1
  156. data/lib/methods/facets/hash/collate.rb +1 -1
  157. data/lib/methods/facets/hash/except.rb +1 -0
  158. data/lib/methods/facets/hash/graph.rb +1 -1
  159. data/lib/methods/facets/hash/mash.rb +1 -0
  160. data/lib/methods/facets/kernel/Bit.rb +1 -0
  161. data/lib/methods/facets/kernel/complete.rb +1 -1
  162. data/lib/methods/facets/kernel/here.rb +1 -1
  163. data/lib/methods/facets/kernel/non_nil.rb +1 -0
  164. data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
  165. data/lib/methods/facets/kernel/with.rb +1 -1
  166. data/lib/methods/facets/module/class_def.rb +1 -0
  167. data/lib/methods/facets/string/camelcase.rb +1 -0
  168. data/lib/methods/facets/string/op_minus.rb +1 -0
  169. data/lib/methods/facets/string/snakecase.rb +1 -0
  170. data/lib/more/facets/attributes.rb +5 -5
  171. data/lib/more/facets/basicobject.rb +0 -62
  172. data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
  173. data/lib/more/facets/duration.rb +534 -0
  174. data/lib/more/facets/lazy.rb +3 -3
  175. data/lib/more/facets/namespace.rb +23 -71
  176. data/lib/more/facets/rbsystem.rb +42 -8
  177. data/lib/more/facets/stylize.rb +6 -3
  178. data/lib/more/facets/thread.rb +55 -0
  179. data/meta/MANIFEST +49 -18
  180. data/meta/ROLLRC +1 -1
  181. data/meta/project.yaml +2 -2
  182. data/task/install +1 -1
  183. data/task/test/general +8 -2
  184. data/test/unit/array/test_pad.rb +30 -45
  185. data/test/unit/array/test_stackable.rb +14 -28
  186. data/test/unit/binding/test_cflow.rb +34 -49
  187. data/test/unit/binding/test_defined.rb +17 -0
  188. data/test/unit/binding/test_eval.rb +11 -39
  189. data/test/unit/binding/test_here.rb +17 -0
  190. data/test/unit/binding/test_self.rb +17 -0
  191. data/test/unit/binding/test_vars.rb +22 -37
  192. data/test/unit/class/test_descendents.rb +15 -30
  193. data/test/unit/class/test_initializer.rb +1 -8
  194. data/test/unit/comparable/test_bound.rb +38 -53
  195. data/test/unit/comparable/test_cmp.rb +45 -60
  196. data/test/unit/dir/test_traverse.rb +56 -0
  197. data/test/unit/enumerable/test_cartesian.rb +34 -47
  198. data/test/unit/enumerable/test_collect.rb +16 -125
  199. data/test/unit/enumerable/test_combination.rb +1 -8
  200. data/test/unit/enumerable/test_count.rb +51 -66
  201. data/test/unit/enumerable/test_each.rb +77 -0
  202. data/test/unit/enumerable/test_mash.rb +51 -0
  203. data/test/unit/enumerable/test_permutation.rb +1 -7
  204. data/test/unit/enumerable/test_probability.rb +42 -55
  205. data/test/unit/enumerable/test_split.rb +52 -0
  206. data/test/unit/exception/test_detail.rb +19 -0
  207. data/test/unit/file/test_read.rb +34 -0
  208. data/test/unit/file/test_topath.rb +17 -25
  209. data/test/unit/file/test_write.rb +6 -12
  210. data/test/unit/filetest/test_root.rb +14 -0
  211. data/test/unit/hash/test_at.rb +9 -21
  212. data/test/unit/hash/test_delete.rb +22 -37
  213. data/test/unit/hash/test_has_keys.rb +13 -28
  214. data/test/unit/hash/test_insert.rb +9 -23
  215. data/test/unit/hash/test_inverse.rb +11 -26
  216. data/test/unit/hash/test_iterate.rb +16 -31
  217. data/test/unit/hash/test_keyize.rb +40 -55
  218. data/test/unit/hash/test_merge.rb +10 -25
  219. data/test/unit/hash/test_new.rb +9 -24
  220. data/test/unit/hash/test_op.rb +1 -7
  221. data/test/unit/hash/test_rekey.rb +47 -62
  222. data/test/unit/hash/test_traverse.rb +17 -32
  223. data/test/unit/hash/test_update.rb +30 -45
  224. data/test/unit/hash/test_weave.rb +10 -23
  225. data/test/unit/integer/test_bitmask.rb +48 -44
  226. data/test/unit/integer/test_factorial.rb +11 -26
  227. data/test/unit/integer/test_multiples.rb +1 -5
  228. data/test/unit/integer/test_of.rb +14 -29
  229. data/test/unit/kernel/test_callstack.rb +13 -28
  230. data/test/unit/kernel/test_constant.rb +14 -28
  231. data/test/unit/kernel/test_deepcopy.rb +20 -35
  232. data/test/unit/kernel/test_instance.rb +46 -61
  233. data/test/unit/kernel/test_metaid.rb +42 -57
  234. data/test/unit/kernel/test_object.rb +14 -29
  235. data/test/unit/kernel/test_populate.rb +38 -53
  236. data/test/unit/kernel/test_report.rb +1 -7
  237. data/test/unit/kernel/test_returning.rb +16 -0
  238. data/test/unit/kernel/test_silence.rb +8 -23
  239. data/test/unit/kernel/test_super.rb +41 -56
  240. data/test/unit/kernel/test_tap.rb +15 -39
  241. data/test/unit/kernel/test_val.rb +7 -20
  242. data/test/unit/kernel/test_withattr.rb +29 -44
  243. data/test/unit/matchdata/test_matchset.rb +20 -35
  244. data/test/unit/module/test_abstract.rb +15 -30
  245. data/test/unit/module/test_alias.rb +32 -45
  246. data/test/unit/module/test_cattr.rb +39 -54
  247. data/test/unit/module/test_clone.rb +31 -43
  248. data/test/unit/module/test_include.rb +1 -35
  249. data/test/unit/module/test_modify.rb +102 -114
  250. data/test/unit/module/test_name.rb +1 -7
  251. data/test/unit/numeric/test_round.rb +46 -61
  252. data/test/unit/proc/test_bind.rb +29 -44
  253. data/test/unit/proc/test_compose.rb +20 -35
  254. data/test/unit/range/test_combine.rb +14 -29
  255. data/test/unit/range/test_overlap.rb +34 -51
  256. data/test/unit/regexp/test_arity.rb +14 -29
  257. data/test/unit/string/test_align.rb +13 -27
  258. data/test/unit/string/test_blank.rb +12 -27
  259. data/test/unit/string/test_bracket.rb +52 -67
  260. data/test/unit/string/test_case.rb +19 -38
  261. data/test/unit/string/test_crypt.rb +10 -25
  262. data/test/unit/string/test_filter.rb +1 -7
  263. data/test/unit/string/test_format.rb +2 -7
  264. data/test/unit/string/test_indexable.rb +54 -69
  265. data/test/unit/string/test_interpolate.rb +8 -21
  266. data/test/unit/string/test_natcmp.rb +11 -26
  267. data/test/unit/string/test_nchar.rb +1 -14
  268. data/test/unit/string/test_op.rb +14 -0
  269. data/test/unit/string/test_partitions.rb +39 -54
  270. data/test/unit/string/test_range.rb +17 -32
  271. data/test/unit/string/test_regesc.rb +1 -7
  272. data/test/unit/string/test_scan.rb +23 -38
  273. data/test/unit/string/test_stackable.rb +79 -98
  274. data/test/unit/string/test_tabs.rb +1 -7
  275. data/test/unit/symbol/test_chomp.rb +10 -21
  276. data/test/unit/symbol/test_generate.rb +7 -22
  277. data/test/unit/symbol/test_not.rb +10 -25
  278. data/test/unit/symbol/test_shadow.rb +8 -23
  279. data/test/unit/symbol/test_succ.rb +1 -7
  280. data/test/unit/symbol/test_to_proc.rb +1 -7
  281. data/test/unit/test_attributes.rb +1 -1
  282. data/test/unit/test_continuation.rb +13 -0
  283. data/test/unit/test_conversion.rb +1 -14
  284. data/test/unit/test_namespace.rb +30 -3
  285. data/test/unit/test_thread.rb +23 -0
  286. data/test/unit/time/test_change.rb +11 -26
  287. data/test/unit/time/test_elapse.rb +10 -25
  288. data/test/unit/time/test_stamp.rb +28 -0
  289. metadata +65 -25
  290. data/lib/core/facets/array/unzip.rb +0 -14
  291. data/lib/core/facets/continuation.rb +0 -1
  292. data/lib/core/facets/enumerable/collate.rb +0 -104
  293. data/lib/core/facets/kernel/require_esc.rb +0 -44
  294. data/lib/more/facets/mapsend.rb +0 -98
  295. data/lib/more/facets/pp_s.rb +0 -30
  296. data/log/history.rd +0 -38
  297. data/log/todo.rd +0 -4
  298. data/task/special/quickopts +0 -15
  299. data/test/unit/continuation/test_create.rb +0 -28
  300. data/test/unit/enumerable/test_collate.rb +0 -51
  301. data/test/unit/kernel/test_require_esc.rb +0 -29
  302. data/test/unit/test_mapsend.rb +0 -18
  303. data/test/unit/test_pp_s.rb +0 -17
@@ -1,22 +1,10 @@
1
- # TITLE:
2
- #
3
- # Crypt
4
- #
5
- # SUMMARY:
6
- #
7
- # Adds a default salt to crypt.
8
- #
9
- # TODO:
10
- #
11
- # - Deprecate once/if part of Ruby proper.
12
-
13
- #
14
1
  class String
15
2
 
16
3
  alias_method :_crypt, :crypt
17
4
 
18
5
  # Common Unix cryptography method.
19
- #
6
+ # This adds a default salt to the built-in crypt method.
7
+
20
8
  def crypt(salt=nil)
21
9
  salt ||= (
22
10
  (rand(26) + (rand(2) == 0 ? 65 : 97) ).chr +
@@ -26,34 +14,9 @@ class String
26
14
  end
27
15
 
28
16
  # Common Unix cryptography in-place method.
29
- #
17
+
30
18
  def crypt!(salt=nil)
31
19
  replace(crypt(salt))
32
20
  end
33
21
 
34
22
  end
35
-
36
-
37
- # _____ _
38
- # |_ _|__ ___| |_
39
- # | |/ _ \/ __| __|
40
- # | | __/\__ \ |_
41
- # |_|\___||___/\__|
42
- #
43
- =begin test
44
-
45
- require 'test/unit'
46
-
47
- class TestStringCrypt < Test::Unit::TestCase
48
-
49
- def test_crypt
50
- assert_nothing_raised { "abc 123".crypt }
51
- end
52
-
53
- def test_crypt!
54
- assert_nothing_raised { "abc 123".crypt! }
55
- end
56
-
57
- end
58
-
59
- =end
@@ -1,17 +1,3 @@
1
- # TITLE:
2
- #
3
- # String Filter Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # String extension methods which filter or rewrite a string.
8
- #
9
- # CREDIT:
10
- #
11
- # - George Moschovitis
12
- # - Thomas Sawyer
13
-
14
- #
15
1
  class String
16
2
 
17
3
  # Apply a set of rules (regular expression matches) to the string.
@@ -26,6 +12,8 @@ class String
26
12
  #
27
13
  # === Output:
28
14
  # The rewritten string.
15
+ #
16
+ # CREDIT: George Moschovitis
29
17
 
30
18
  def rewrite(string, rules)
31
19
  return nil unless string
@@ -42,6 +30,8 @@ class String
42
30
  #
43
31
  # "a string".word_filter { |word| word =~ /^a/ } #=> "string"
44
32
  #
33
+ # CREDIT: George Moschovitis
34
+
45
35
  def word_filter( &blk )
46
36
  s = self.dup
47
37
  s.word_filter!( &blk )
@@ -51,6 +41,8 @@ class String
51
41
  #
52
42
  # "a string".word_filter { |word| ... }
53
43
  #
44
+ # CREDIT: George Moschovitis
45
+
54
46
  def word_filter! #:yield:
55
47
  rest_of_string = self
56
48
  wordfind = /(\w+)/
@@ -64,39 +56,5 @@ class String
64
56
  end
65
57
  self
66
58
  end
67
- end
68
-
69
-
70
- # _____ _
71
- # |_ _|__ ___| |_
72
- # | |/ _ \/ __| __|
73
- # | | __/\__ \ |_
74
- # |_|\___||___/\__|
75
- #
76
- =begin test
77
-
78
- require 'test/unit'
79
-
80
- class TestStringFilter < Test::Unit::TestCase
81
-
82
- def test_regesc
83
- a = "?"
84
- b = /#{a.regesc}/
85
- assert( b =~ "?" )
86
- end
87
-
88
- def test_word_filter
89
- s = "this is a test"
90
- n = s.word_filter{ |w| "#{w}1" }
91
- assert_equal( 'this1 is1 a1 test1', n )
92
- end
93
-
94
- def test_word_filter!
95
- s = "this is a test"
96
- s.word_filter!{ |w| "#{w}1" }
97
- assert_equal( 'this1 is1 a1 test1', s )
98
- end
99
-
100
- end
101
59
 
102
- =end
60
+ end
@@ -1,20 +1,3 @@
1
- # TITLE:
2
- #
3
- # String Formating Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # String extension methods which formating including folding
8
- # and word wrapping.
9
- #
10
- # CREDIT:
11
- #
12
- # - George Moschovitis
13
- # - Gavin Kistner
14
- # - Dayne Broderson
15
- # - Thomas Sawyer
16
-
17
- #
18
1
  class String
19
2
 
20
3
  # Returns short abstract of long strings (first 'count'
@@ -22,7 +5,8 @@ class String
22
5
  # force_cutoff: break forcibly at 'count' chars. Does not accept
23
6
  # count < 2
24
7
  #
25
- # CREDIT George Moschovitis
8
+ # CREDIT: George Moschovitis
9
+
26
10
  def brief(count = 128, force_cutoff = false, ellipsis="...")
27
11
  return nil if count < 2
28
12
 
@@ -35,7 +19,11 @@ class String
35
19
  end
36
20
  end
37
21
 
22
+ # Cleave a string. Break a string in two parts at
23
+ # the nearest whitespace.
38
24
  #
25
+ # CREDIT: Trans
26
+
39
27
  def cleave(threshold=nil, len=nil)
40
28
  l = (len || size / 2)
41
29
  t = threshold || size
@@ -74,11 +62,12 @@ class String
74
62
  #
75
63
  # "This is a test.\n\nIt clumps lines of text. "
76
64
  #
77
- #--
78
- # One possible flaw with this that might could use a fix:
65
+ # One arguable flaw with this, that might need a fix:
79
66
  # if the given string ends in a newline, it is replaced with
80
67
  # a single space.
81
- #++
68
+ #
69
+ # CREDIT: Trans
70
+
82
71
  def fold(ignore_indented=false)
83
72
  ns = ''
84
73
  i = 0
@@ -107,15 +96,17 @@ class String
107
96
  # 12345
108
97
  # 67890
109
98
  #
110
- def line_wrap(width)
111
- s = gsub(/\t/,' '*4) # tabs default to 4 spaces.
99
+ # CREDIT: Trans
100
+
101
+ def line_wrap(width, tabs=4)
102
+ s = gsub(/\t/,' ' * tabs) # tabs default to 4 spaces
112
103
  s = s.gsub(/\n/,' ')
113
104
  r = s.scan( /.{1,#{width}}/ )
114
105
  r.join("\n") << "\n"
115
106
  end
116
107
 
117
- # ??? This is alternateive from glue: worth providing?
118
-
108
+ # TODO: This is alternateive from glue: worth providing?
109
+ #
119
110
  # Enforces a maximum width of a string inside an
120
111
  # html container. If the string exceeds this maximum width
121
112
  # the string gets wraped.
@@ -138,13 +129,9 @@ class String
138
129
  #
139
130
  # See the test cases to better understand the behaviour!
140
131
 
141
- # def self.wrap(string, width = 20, separator = " ")
142
- # return nil unless string
143
- #
132
+ # def wrap(width = 20, separator = " ")
144
133
  # re = /([^#{separator}]{1,#{width}})/
145
- # wrapped_string = string.scan(re).join(separator)
146
- #
147
- # return wrapped_string
134
+ # scan(re).join(separator)
148
135
  # end
149
136
 
150
137
  # Word wrap a string not exceeding max width.
@@ -157,14 +144,18 @@ class String
157
144
  # is a
158
145
  # test
159
146
  #
160
- # CREDIT Gavin Kistner
161
- # CREDIT Dayne Broderson
147
+ # CREDIT: Gavin Kistner
148
+ # CREDIT: Dayne Broderson
149
+
162
150
  def word_wrap( col_width=80 )
163
151
  self.dup.word_wrap!( col_width )
164
152
  end
165
153
 
166
154
  # As with #word_wrap, but modifies the string in place.
167
155
  #
156
+ # CREDIT: Gavin Kistner
157
+ # CREDIT: Dayne Broderson
158
+
168
159
  def word_wrap!( col_width=80 )
169
160
  self.gsub!( /(\S{#{col_width}})(?=\S)/, '\1 ' )
170
161
  self.gsub!( /(.{1,#{col_width}})(?:\s+|$)/, "\\1\n" )
@@ -186,96 +177,3 @@ class String
186
177
  #end
187
178
 
188
179
  end
189
-
190
-
191
- # _____ _
192
- # |_ _|__ ___| |_
193
- # | |/ _ \/ __| __|
194
- # | | __/\__ \ |_
195
- # |_|\___||___/\__|
196
- #
197
- =begin test
198
-
199
- require 'test/unit'
200
-
201
- class String
202
- include Format
203
- end
204
-
205
- class TestStringFormat < Test::Unit::TestCase
206
-
207
- def test_fold_1
208
- s = "This is\na test.\n\nIt clumps\nlines of text."
209
- o = "This is a test.\n\nIt clumps lines of text."
210
- assert_equal( o, s.fold )
211
- end
212
-
213
- def test_fold_2
214
- s = "This is\na test.\n\n This is pre.\n Leave alone.\n\nIt clumps\nlines of text."
215
- o = "This is a test.\n\n This is pre.\n Leave alone.\n\nIt clumps lines of text."
216
- assert_equal( o, s.fold(true) )
217
- end
218
-
219
- def test_line_wrap
220
- assert_equal "abc\n123\n", "abc123".line_wrap(3)
221
- assert_equal "abcd\n123\n", "abcd123".line_wrap(4)
222
- end
223
-
224
- def test_word_wrap
225
- assert_equal "abcde\n12345\nxyzwu\n", "abcde 12345 xyzwu".word_wrap(5)
226
- assert_equal "abcd\n1234\nxyzw\n", "abcd 1234 xyzw".word_wrap(4)
227
- assert_equal "abc\n123\n", "abc 123".word_wrap(4)
228
- assert_equal "abc \n123\n", "abc 123".word_wrap(4)
229
- assert_equal "abc \n123\n", "abc 123".word_wrap(4)
230
- end
231
-
232
- def test_word_wrap!
233
- w = "abcde 12345 xyzwu" ; w.word_wrap!(5)
234
- assert_equal("abcde\n12345\nxyzwu\n", w)
235
- w = "abcd 1234 xyzw" ; w.word_wrap!(4)
236
- assert_equal("abcd\n1234\nxyzw\n", w)
237
- w = "abc 123" ; w.word_wrap!(4)
238
- assert_equal "abc\n123\n", w
239
- w = "abc 123" ; w.word_wrap!(4)
240
- assert_equal("abc \n123\n", w)
241
- w = "abc 123" ; w.word_wrap!(4)
242
- assert_equal("abc \n123\n", w)
243
- end
244
-
245
- # def test_word_wrap
246
- # assert_equal "abcde-\n12345-\nxyzwu\n", "abcde12345xyzwu".word_wrap(6,2)
247
- # assert_equal "abcd-\n1234-\nxyzw\n", "abcd1234xyzw".word_wrap(5,2)
248
- # assert_equal "abc \n123\n", "abc 123".word_wrap(4,2)
249
- # assert_equal "abc \n123\n", "abc 123".word_wrap(4,2)
250
- # assert_equal "abc \n123\n", "abc 123".word_wrap(4,2)
251
- # end
252
-
253
- def test_cleave_nospaces
254
- assert_equal [ 'whole', '' ], 'whole'.cleave
255
- assert_equal [ 'Supercalifragilisticexpialidocious', '' ],
256
- 'Supercalifragilisticexpialidocious'.cleave
257
- end
258
-
259
- def test_cleave_exact_middle
260
- assert_equal [ 'fancy', 'split' ], 'fancy split'.cleave
261
- assert_equal [ 'All good Rubyists', 'know how to party' ],
262
- 'All good Rubyists know how to party'.cleave
263
- end
264
-
265
- def test_cleave_closer_to_start
266
- assert_equal [ 'short', 'splitter' ], 'short splitter'.cleave
267
- assert_equal [ 'Four score and', 'seven years ago...' ],
268
- 'Four score and seven years ago...'.cleave
269
- assert_equal [ 'abc def', 'ghijklm nop' ],
270
- 'abc def ghijklm nop'.cleave
271
- end
272
-
273
- def test_cleave_closer_to_end
274
- assert_equal [ 'extended', 'split' ], 'extended split'.cleave
275
- assert_equal [ 'abc defghi', 'jklm nop' ],
276
- 'abc defghi jklm nop'.cleave
277
- end
278
-
279
- end
280
-
281
- =end
@@ -1,35 +1,60 @@
1
- # TITLE:
2
- #
3
- # String Indexable
4
- #
5
- # SUMMARY:
6
- #
7
- # Includes the Indexable mixin into String.
8
- #
9
- # String's Indexable methods are modified to also
10
- # accept pattern matching.
11
- #
12
- # CREDIT:
13
- #
14
- # - Thomas Sawyer
15
- #
16
- # TODO:
17
- #
18
- # - The index_all method could probably be defined for Indexable in general too.
19
-
20
1
  require 'facets/string/splice'
21
2
  require 'facets/string/scan'
22
3
  require 'facets/indexable'
23
4
 
24
5
  class String
6
+
25
7
  include Indexable
26
8
 
9
+ # An extraneous feature, but make String more ploymorphic
10
+ # with Array.
11
+ #
12
+ # "HELLO".at(2) #=> "L"
13
+
14
+ def at(index)
15
+ case index
16
+ when Fixnum
17
+ self[index].chr
18
+ else
19
+ self[index]
20
+ end
21
+ end
22
+
23
+ # Like index but returns an array of all index locations.
24
+ # The reuse flag allows the trailing portion of a match to be
25
+ # reused for subsquent matches.
26
+ #
27
+ # "abcabcabc".index_all('a') #=> [0,3,6]
28
+ #
29
+ # "bbb".index_all('bb', false) #=> [0]
30
+ # "bbb".index_all('bb', true) #=> [0,1]
31
+ #
32
+ # TODO: Culd probably be defined for Indexable in general too.
33
+
34
+ def index_all(s, reuse=false)
35
+ s = Regexp.new(Regexp.escape(s)) unless Regexp===s
36
+ ia = []; i = 0
37
+ while (i = index(s,i))
38
+ ia << i
39
+ i += (reuse ? 1 : $~[0].size)
40
+ end
41
+ ia
42
+ end
43
+
44
+ #Or should this be like #split? or self + '/' + other?
45
+ #alias / []
46
+
47
+ #-----------------------------------------------------------------
48
+ # The following methods override Indexable to better suit String.
49
+ #-----------------------------------------------------------------
50
+
27
51
  # Returns the first separation of a string.
28
52
  # Default seperation is by character.
29
53
  #
30
54
  # "Hello World".first #=> "H"
31
55
  # "Hello World".first(' ') #=> "Hello"
32
56
  #
57
+
33
58
  def first(pattern=//)
34
59
  case pattern
35
60
  when Regexp, String
@@ -44,6 +69,7 @@ class String
44
69
  #
45
70
  # "Hello World".last(' ') #=> "World"
46
71
  #
72
+
47
73
  def last(pattern=//)
48
74
  case pattern
49
75
  when Regexp, String
@@ -70,6 +96,7 @@ class String
70
96
  # a.first!(' ') #=> "Hello"
71
97
  # a #=> "World"
72
98
  #
99
+
73
100
  def first!(pattern=//)
74
101
  case pattern
75
102
  when Regexp, String
@@ -101,6 +128,7 @@ class String
101
128
  # a.last!(' ') #=> "World"
102
129
  # a #=> "Hello"
103
130
  #
131
+
104
132
  def last!(pattern=//)
105
133
  case pattern
106
134
  when Regexp, String
@@ -115,11 +143,12 @@ class String
115
143
  end
116
144
  end
117
145
 
118
- # TODO Should Strin#first= replace first char as in Indexable?
146
+ # TODO: Should Strin#first= replace first char as in Indexable?
119
147
 
120
148
  # Prepends to a string.
121
149
  #
122
150
  # "Hello World".first = "Hello," #=> "Hello, Hello World"
151
+
123
152
  def first=(x)
124
153
  insert(0, x.to_s)
125
154
  end
@@ -128,121 +157,9 @@ class String
128
157
  #
129
158
  # "Hello World".last = ", Bye." #=> "Hello World, Bye."
130
159
  #
160
+
131
161
  def last=(str)
132
162
  self << str
133
163
  end
134
164
 
135
- # THE REMAINING METHODS ARE STRING SPECIFIC.
136
-
137
- # Like index but returns an array of all index locations.
138
- # The reuse flag allows the trailing portion of a match to be
139
- # reused for subsquent matches.
140
- #
141
- # "abcabcabc".index_all('a') #=> [0,3,6]
142
- #
143
- # "bbb".index_all('bb', false) #=> [0]
144
- # "bbb".index_all('bb', true) #=> [0,1]
145
- #
146
- def index_all(s, reuse=false)
147
- s = Regexp.new(Regexp.escape(s)) unless Regexp===s
148
- ia = []; i = 0
149
- while (i = index(s,i))
150
- ia << i
151
- i += (reuse ? 1 : $~[0].size)
152
- end
153
- ia
154
- end
155
-
156
- # An extraneous feature, but make String more ploymorphic
157
- # with Array.
158
-
159
- def at(index)
160
- case index
161
- when Fixnum
162
- self[index].chr
163
- else
164
- self[index]
165
- end
166
- end
167
-
168
- #Or should this be like #split? or self + '/' + other?
169
- #alias / []
170
-
171
165
  end
172
-
173
-
174
-
175
- # _____ _
176
- # |_ _|__ ___| |_
177
- # | |/ _ \/ __| __|
178
- # | | __/\__ \ |_
179
- # |_|\___||___/\__|
180
- #
181
- =begin test
182
-
183
- require 'test/unit'
184
-
185
- class TestStringIndexable < Test::Unit::TestCase
186
-
187
- def test_first
188
- assert_equal( "a", "abcxyz".first )
189
- assert_equal( "ax", "ax by cz".first(' ') )
190
- assert_equal( "a", "a\nb\nc".first("\n") )
191
- end
192
-
193
- def test_first_eq
194
- s = "abc"
195
- s.first = "123"
196
- assert_equal( "123abc", s )
197
- s = "a\nbc"
198
- s.first = "123"
199
- assert_equal( "123a\nbc", s )
200
- end
201
-
202
- def test_first!
203
- s = "a\nbc"
204
- s.first!("\n")
205
- assert_equal( "bc", s )
206
- end
207
-
208
- def test_last
209
- assert_equal( "z", "abcxyz".last )
210
- assert_equal( "cz", "ax by cz".last(' ') )
211
- assert_equal( "c", "a\nb\nc".last("\n") )
212
- end
213
-
214
- def test_last_eq
215
- s = "abc"
216
- s.last = "123"
217
- assert_equal( "abc123", s )
218
- s = "a\nbc"
219
- s.last = "123"
220
- assert_equal( "a\nbc123", s )
221
- end
222
-
223
- def test_last!
224
- s = "abc"
225
- s.last!
226
- assert_equal( "ab", s )
227
- s = "a b c"
228
- s.last!(' ')
229
- assert_equal( "a b", s )
230
- end
231
-
232
- def test_index_all
233
- assert_equal( [0,4,8], "a123a567a9".index_all(/a/) )
234
- end
235
-
236
- def test_index_all_with_string
237
- assert_equal( [0,4,8], "a123a567a9".index_all('a') )
238
- end
239
-
240
- def test_index_all_with_regexp_reuse
241
- assert_equal( [0,4,8], "a123a567a9".index_all(/a/, true) )
242
- assert_equal( [0], "bbb".index_all('bb', false) )
243
- assert_equal( [0,1], "bbb".index_all('bb', true) )
244
- end
245
-
246
- end
247
-
248
- =end