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,70 +1,35 @@
1
- # TITLE:
2
- #
3
- # String Interpolation
4
- #
5
- # SUMMARY:
6
- #
7
- # Provides a method of extenally using
8
- # Ruby string interpolation mechinism.
9
- #
10
- # This library also providea a couple
11
- # aliases for % as sprintf and format.
12
- #
13
- # CREDIT:
14
- #
15
- # - Thomas Sawyer
16
- #
17
- # TODO:
18
- #
19
- # - The String::format and String::sprintf methods
20
- # really not very useful and will likely be
21
- # deprecated eventually, since they are already
22
- # included in Kernel.
23
-
24
- #
25
1
  class String
26
2
 
27
- # Interpolate.
28
-
29
- def self.interpolate(&str)
30
- eval "%{#{str.call}}", str.binding
31
- end
3
+ class << self
4
+
5
+ # Interpolate. Provides a means of extenally using
6
+ # Ruby string interpolation mechinism.
7
+ #
8
+ # try = "hello"
9
+ # str = "\#{try}!!!"
10
+ # String.interpolate{ str } #=> "hello!!!"
11
+ #
12
+ # NOTE: The block neccessary in order to get
13
+ # then binding of the caller.
14
+ #
15
+ # CREDIT: Trans
16
+
17
+ def interpolate(&str)
18
+ eval "%{#{str.call}}", str.binding
19
+ end
32
20
 
33
- #
21
+ # Module method tied to Kernel#format.
22
+ public :format
34
23
 
35
- def self.format(*args)
36
- Kernel.format(*args)
37
- end
24
+ # Module method tied to Kernel#sprintf.
25
+ public :sprintf
38
26
 
39
- def self.sprintf(*args)
40
- Kernel.format(*args)
41
27
  end
42
28
 
43
- #
44
-
29
+ # Alias for % as format.
45
30
  alias_method :format, :%
46
31
 
32
+ # Alias for % as sprintf.
47
33
  alias_method :sprintf, :%
48
- end
49
-
50
34
 
51
- # _____ _
52
- # |_ _|__ ___| |_
53
- # | |/ _ \/ __| __|
54
- # | | __/\__ \ |_
55
- # |_|\___||___/\__|
56
- #
57
- =begin test
58
-
59
- require 'test/unit'
60
-
61
- class TestStringInterpolate < Test::Unit::TestCase
62
-
63
- def test_interpolate
64
- a = 1
65
- assert_equal('this is 1', String.interpolate{ 'this is #{a}' })
66
- end
67
-
68
- end
69
-
70
- =end
35
+ end
@@ -1,17 +1,3 @@
1
- # TITLE:
2
- #
3
- # String Natural Comparison
4
- #
5
- # SUMMARY:
6
- #
7
- # String comparison extensions.
8
- #
9
- # AUTHORS:
10
- #
11
- # - Alan Davies
12
- # - Martin Pool
13
-
14
- #
15
1
  class String
16
2
 
17
3
  # 'Natural order' comparison of strings, e.g.
@@ -24,6 +10,11 @@ class String
24
10
  #
25
11
  # "Hello.10".natcmp("Hello.1") #=> -1
26
12
  #
13
+ # TODO: Invert case flag?
14
+ #
15
+ # CREDIT: Alan Davies
16
+ # CREDIT: Martin Pool
17
+ #
27
18
  #--
28
19
  # Adapted from:
29
20
  #
@@ -95,28 +86,3 @@ class String
95
86
  end
96
87
 
97
88
  end
98
-
99
-
100
- # _____ _
101
- # |_ _|__ ___| |_
102
- # | |/ _ \/ __| __|
103
- # | | __/\__ \ |_
104
- # |_|\___||___/\__|
105
- #
106
- =begin test
107
-
108
- require 'test/unit'
109
-
110
- class TestStringCompare < Test::Unit::TestCase
111
-
112
- def test_natcmp
113
- assert( -1, "my_prog_v1.1.0".natcmp("my_prog_v1.2.0") )
114
- assert( -1, "my_prog_v1.2.0".natcmp("my_prog_v1.10.0") )
115
- assert( 1, "my_prog_v1.2.0".natcmp("my_prog_v1.1.0") )
116
- assert( 1, "my_prog_v1.10.0".natcmp("my_prog_v1.2.0") )
117
- assert( 0, "my_prog_v1.0.0".natcmp("my_prog_v1.0.0") )
118
- end
119
-
120
- end
121
-
122
- =end
@@ -1,27 +1,25 @@
1
- # TITLE:
2
- #
3
- # String NChar
4
- #
5
- # SUMMARY:
6
- #
7
- # String extensions for accessing and manipulating
8
- # a front or end number of characters.
9
- #
10
- # AUTHORS:
11
- #
12
- # - Thomas Sawyer
13
-
14
- #
15
1
  class String
16
2
 
17
- # CREDIT Lucas Carlson and Blaine Cook
18
-
3
+ # Does a string start with the given prefix.
19
4
  #
5
+ # "hello".starts_with?("he") #=> true
6
+ # "hello".starts_with?("to") #=> false
7
+ #
8
+ # CREDIT: Lucas Carlson
9
+ # CREDIT: Blaine Cook
10
+
20
11
  def starts_with?(prefix)
21
12
  self.index(prefix) == 0
22
13
  end
23
14
 
15
+ # Does a string end with the given suffix?
24
16
  #
17
+ # "hello".ends_with?("lo") #=> true
18
+ # "hello".ends_with?("to") #=> false
19
+ #
20
+ # CREDIT: Lucas Carlson
21
+ # CREDIT: Blaine Cook
22
+
25
23
  def ends_with?(suffix)
26
24
  self.rindex(suffix) == size - suffix.size
27
25
  end
@@ -33,6 +31,13 @@ class String
33
31
  # Alternatively a replacement string can be given, which will
34
32
  # replace the _n_ characters.
35
33
  #
34
+ # str = "this is text"
35
+ # str.nchar(4) #=> "this"
36
+ # str.nchar(4, 'that') #=> "that"
37
+ # str #=> "that is text"
38
+ #
39
+ # CREDIT: ?
40
+
36
41
  def nchar(n, replacement=nil)
37
42
  if replacement
38
43
  s = self.dup
@@ -43,15 +48,13 @@ class String
43
48
  end
44
49
  end
45
50
 
51
+ # Left chomp.
46
52
  #
47
- def lchomp!(match)
48
- if index(match) == 0
49
- self[0...match.size] = ''
50
- self
51
- end
52
- end
53
-
53
+ # "help".lchomp("h") #=> "elp"
54
+ # "help".lchomp("k") #=> "help"
54
55
  #
56
+ # CREDIT: Trans
57
+
55
58
  def lchomp(match)
56
59
  if index(match) == 0
57
60
  self[match.size..-1]
@@ -60,29 +63,18 @@ class String
60
63
  end
61
64
  end
62
65
 
63
- end
64
-
65
-
66
-
67
- # _____ _
68
- # |_ _|__ ___| |_
69
- # | |/ _ \/ __| __|
70
- # | | __/\__ \ |_
71
- # |_|\___||___/\__|
72
- #
73
- =begin test
74
-
75
- require 'test/unit'
76
-
77
- class TestStringIndex < Test::Unit::TestCase
66
+ # In-place left chomp.
67
+ #
68
+ # "help".lchomp("h") #=> "elp"
69
+ # "help".lchomp("k") #=> "help"
70
+ #
71
+ # CREDIT: Trans
78
72
 
79
- def test_nchar
80
- assert_equal( "abc", "abcxyz".nchar(3) )
81
- assert_equal( "xyz", "abcxyz".nchar(-3) )
82
- assert_equal( "HIxyz", "abcxyz".nchar(3, 'HI') )
83
- assert_equal( "abcHI", "abcxyz".nchar(-3, 'HI') )
73
+ def lchomp!(match)
74
+ if index(match) == 0
75
+ self[0...match.size] = ''
76
+ self
84
77
  end
85
-
86
78
  end
87
79
 
88
- =end
80
+ end
@@ -0,0 +1,13 @@
1
+ class String
2
+
3
+ # Removes occurances of a string or regexp.
4
+ #
5
+ # "HELLO HELLO" - "LL" #=> "HEO HEO"
6
+ #
7
+ # CREDIT: Benjamin David Oakes
8
+
9
+ def -(pattern)
10
+ self.gsub(pattern, '')
11
+ end
12
+
13
+ end
@@ -1,62 +1,62 @@
1
- # TITLE:
2
- #
3
- # String Enumeration Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # String extensions providing common enumerations.
8
- #
9
- # CREDIT:
10
- #
11
- # - Thomas Sawyer
12
-
13
- #
14
1
  class String
15
2
 
16
- # Upacks string into bytes.
17
- #
18
- def bytes
19
- self.unpack('C*')
3
+ unless (RUBY_VERSION[0,3] == '1.9')
4
+
5
+ # Upacks string into bytes.
6
+ #
7
+ #
8
+
9
+ def bytes
10
+ self.unpack('C*')
11
+ end
12
+
13
+ # Returns an array of characters.
14
+ #
15
+ # "abc\n123".lines #=> ["abc","123"]
16
+
17
+ def lines
18
+ self.split(/\n/)
19
+ end
20
+
21
+ # Iterates through each character. This is a little faster than
22
+ # using #chars b/c it does not create the intermediate array.
23
+ #
24
+ # a = ''
25
+ # "HELLO".each_character{ |c| a << #{c.downcase} }
26
+ # a #=> 'hello'
27
+
28
+ def each_char # :yield:
29
+ size.times do |i|
30
+ yield(self[i,1])
31
+ end
32
+ end
33
+
20
34
  end
21
35
 
36
+ # Alias for each_char.
37
+
38
+ alias_method :each_character, :each_char
39
+
22
40
  # Returns an array of characters.
23
41
  #
24
42
  # "abc".chars #=> ["a","b","c"]
25
- #
43
+
26
44
  def chars
27
45
  self.split(//)
28
46
  end
29
47
 
30
- # Returns an array of characters.
31
- #
32
- # "abc\n123".lines #=> ["abc","123"]
33
- #
34
- def lines
35
- self.split(/\n/)
36
- end
37
-
38
48
  # Returns an array of characters.
39
49
  #
40
50
  # "abc 123".words #=> ["abc","123"]
41
- #
51
+
42
52
  def words
43
53
  self.split(/\s+/)
44
54
  end
45
55
 
46
- # Iterates through each character.
47
- #
48
- def each_character # :yield:
49
- split(//).each { |c|
50
- yield( c )
51
- }
52
- end
53
-
54
- alias :each_char :each_character
55
-
56
56
  # Iterate through each word of a string.
57
57
  #
58
58
  # "a string".each_word { |word, range| ... }
59
- #
59
+
60
60
  def each_word( &yld )
61
61
  rest_of_string = self
62
62
  wordfind = /([-'\w]+)/
@@ -76,64 +76,3 @@ class String
76
76
  end
77
77
 
78
78
  end
79
-
80
-
81
-
82
- # _____ _
83
- # |_ _|__ ___| |_
84
- # | |/ _ \/ __| __|
85
- # | | __/\__ \ |_
86
- # |_|\___||___/\__|
87
- #
88
- =begin test
89
-
90
- require 'test/unit'
91
-
92
- class TestStringPartitions < Test::Unit::TestCase
93
-
94
- def test_bytes
95
- s = "abc"
96
- assert_equal( s.unpack('C*'), s.bytes )
97
- end
98
-
99
- def test_chars
100
- assert_equal( ["a","b","c"], "abc".chars )
101
- assert_equal( ["a","b","\n","c"], "ab\nc".chars )
102
- end
103
-
104
- def test_lines
105
- assert_equal( ['a','b','c'], "a\nb\nc".lines )
106
- end
107
-
108
- def test_words_01
109
- x = "a b c\nd e"
110
- assert_equal( ['a','b','c','d','e'], x.words )
111
- end
112
-
113
- def test_words_02
114
- x = "ab cd\nef"
115
- assert_equal( ['ab','cd','ef'], x.words )
116
- end
117
-
118
- def test_words_03
119
- x = "ab cd \n ef-gh"
120
- assert_equal( ['ab','cd','ef-gh'], x.words )
121
- end
122
-
123
- def test_each_char
124
- a = []
125
- i = "this"
126
- i.each_char{ |w| a << w }
127
- assert_equal( ['t', 'h', 'i', 's'], a )
128
- end
129
-
130
- def test_each_word
131
- a = []
132
- i = "this is a test"
133
- i.each_word{ |w| a << w }
134
- assert_equal( ['this', 'is', 'a', 'test'], a )
135
- end
136
-
137
- end
138
-
139
- =end