facets 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +14 -12
- data/CHANGES +45 -2
- data/NOTES +9 -7
- data/lib/core/facets/1stclassmethod.rb +15 -11
- data/lib/core/facets/array.rb +0 -1
- data/lib/core/facets/array/conjoin.rb +40 -8
- data/lib/core/facets/array/delete.rb +8 -2
- data/lib/core/facets/array/indexable.rb +30 -3
- data/lib/core/facets/array/merge.rb +11 -0
- data/lib/core/facets/array/only.rb +3 -3
- data/lib/core/facets/array/pad.rb +4 -46
- data/lib/core/facets/array/rotate.rb +4 -4
- data/lib/core/facets/array/select.rb +2 -0
- data/lib/core/facets/array/splice.rb +16 -2
- data/lib/core/facets/array/stackable.rb +6 -40
- data/lib/core/facets/binding.rb +3 -0
- data/lib/core/facets/binding/cflow.rb +10 -64
- data/lib/core/facets/binding/defined.rb +10 -0
- data/lib/core/facets/binding/eval.rb +10 -76
- data/lib/core/facets/binding/here.rb +9 -0
- data/lib/core/facets/binding/self.rb +10 -0
- data/lib/core/facets/binding/vars.rb +0 -45
- data/lib/core/facets/boolean.rb +31 -103
- data/lib/core/facets/class/descendents.rb +17 -44
- data/lib/core/facets/comparable/bound.rb +8 -70
- data/lib/core/facets/comparable/cmp.rb +12 -92
- data/lib/core/facets/conversion.rb +122 -321
- data/lib/core/facets/dir/multiglob.rb +0 -13
- data/lib/core/facets/dir/traverse.rb +61 -111
- data/lib/core/facets/enumerable.rb +4 -2
- data/lib/core/facets/enumerable/cartesian.rb +36 -85
- data/lib/core/facets/enumerable/collect.rb +64 -152
- data/lib/core/facets/enumerable/combination.rb +40 -42
- data/lib/core/facets/enumerable/count.rb +99 -174
- data/lib/core/facets/enumerable/each.rb +86 -0
- data/lib/core/facets/enumerable/mash.rb +58 -0
- data/lib/core/facets/enumerable/permutation.rb +39 -44
- data/lib/core/facets/enumerable/probability.rb +16 -90
- data/lib/core/facets/enumerable/split.rb +113 -0
- data/lib/core/facets/exception/detail.rb +1 -2
- data/lib/core/facets/facets.rb +3 -2
- data/lib/core/facets/file/read.rb +4 -59
- data/lib/core/facets/file/topath.rb +8 -96
- data/lib/core/facets/file/write.rb +21 -49
- data/lib/core/facets/filetest/root.rb +4 -3
- data/lib/core/facets/functor.rb +5 -43
- data/lib/core/facets/hash/at.rb +7 -37
- data/lib/core/facets/hash/delete.rb +9 -58
- data/lib/core/facets/hash/has_keys.rb +4 -43
- data/lib/core/facets/hash/insert.rb +5 -38
- data/lib/core/facets/hash/inverse.rb +2 -41
- data/lib/core/facets/hash/iterate.rb +4 -45
- data/lib/core/facets/hash/keyize.rb +24 -92
- data/lib/core/facets/hash/merge.rb +4 -38
- data/lib/core/facets/hash/new.rb +5 -38
- data/lib/core/facets/hash/op.rb +20 -66
- data/lib/core/facets/hash/rekey.rb +9 -87
- data/lib/core/facets/hash/select.rb +1 -1
- data/lib/core/facets/hash/slice.rb +42 -0
- data/lib/core/facets/hash/traverse.rb +6 -46
- data/lib/core/facets/hash/update.rb +27 -67
- data/lib/core/facets/hash/weave.rb +22 -42
- data/lib/core/facets/indexable.rb +42 -14
- data/lib/core/facets/integer/bitmask.rb +69 -106
- data/lib/core/facets/integer/factorial.rb +1 -44
- data/lib/core/facets/integer/multiples.rb +27 -22
- data/lib/core/facets/integer/of.rb +1 -33
- data/lib/core/facets/kernel.rb +4 -2
- data/lib/core/facets/kernel/ask.rb +15 -3
- data/lib/core/facets/kernel/callstack.rb +38 -69
- data/lib/core/facets/kernel/constant.rb +2 -38
- data/lib/core/facets/kernel/deepcopy.rb +3 -55
- data/lib/core/facets/kernel/dir.rb +2 -0
- data/lib/core/facets/kernel/ergo.rb +2 -2
- data/lib/core/facets/kernel/instance.rb +51 -120
- data/lib/core/facets/kernel/metaid.rb +35 -73
- data/lib/core/facets/kernel/object.rb +14 -39
- data/lib/core/facets/kernel/op_esc.rb +24 -2
- data/lib/core/facets/kernel/populate.rb +6 -69
- data/lib/core/facets/kernel/report.rb +28 -33
- data/lib/core/facets/kernel/require.rb +7 -21
- data/lib/core/facets/kernel/respond.rb +11 -1
- data/lib/core/facets/kernel/returning.rb +50 -0
- data/lib/core/facets/kernel/silence.rb +12 -24
- data/lib/core/facets/kernel/super.rb +12 -76
- data/lib/core/facets/kernel/tap.rb +25 -107
- data/lib/core/facets/kernel/val.rb +7 -46
- data/lib/core/facets/kernel/withattr.rb +6 -64
- data/lib/core/facets/matchdata/matchset.rb +8 -50
- data/lib/core/facets/module.rb +3 -1
- data/lib/core/facets/module/abstract.rb +9 -47
- data/lib/core/facets/module/alias.rb +11 -68
- data/lib/core/facets/module/attr.rb +36 -15
- data/lib/core/facets/module/cattr.rb +8 -76
- data/lib/core/facets/module/clone.rb +15 -66
- data/lib/core/facets/module/include.rb +54 -114
- data/lib/core/facets/module/methods.rb +15 -13
- data/lib/core/facets/module/modify.rb +20 -206
- data/lib/core/facets/module/name.rb +19 -83
- data/lib/core/facets/module/require.rb +48 -53
- data/lib/core/facets/module/traits.rb +74 -33
- data/lib/core/facets/nilclass/status.rb +25 -2
- data/lib/core/facets/numeric/round.rb +24 -89
- data/lib/core/facets/proc/bind.rb +16 -59
- data/lib/core/facets/proc/compose.rb +6 -40
- data/lib/core/facets/proc/fn.rb +2 -0
- data/lib/core/facets/range/combine.rb +15 -51
- data/lib/core/facets/range/overlap.rb +8 -64
- data/lib/core/facets/regexp/arity.rb +6 -41
- data/lib/core/facets/stackable.rb +43 -4
- data/lib/core/facets/string.rb +2 -0
- data/lib/core/facets/string/align.rb +45 -55
- data/lib/core/facets/string/blank.rb +2 -46
- data/lib/core/facets/string/bracket.rb +14 -87
- data/lib/core/facets/string/case.rb +45 -32
- data/lib/core/facets/string/crypt.rb +3 -40
- data/lib/core/facets/string/filter.rb +7 -49
- data/lib/core/facets/string/format.rb +24 -126
- data/lib/core/facets/string/indexable.rb +50 -133
- data/lib/core/facets/string/interpolate.rb +24 -59
- data/lib/core/facets/string/natcmp.rb +5 -39
- data/lib/core/facets/string/nchar.rb +37 -45
- data/lib/core/facets/string/op.rb +13 -0
- data/lib/core/facets/string/partitions.rb +38 -99
- data/lib/core/facets/string/range.rb +8 -49
- data/lib/core/facets/string/regesc.rb +9 -42
- data/lib/core/facets/string/scan.rb +6 -52
- data/lib/core/facets/string/splice.rb +8 -13
- data/lib/core/facets/string/tabs.rb +16 -153
- data/lib/core/facets/symbol.rb +3 -1
- data/lib/core/facets/symbol/chomp.rb +11 -29
- data/lib/core/facets/symbol/generate.rb +4 -43
- data/lib/core/facets/symbol/not.rb +13 -25
- data/lib/core/facets/symbol/shadow.rb +2 -40
- data/lib/core/facets/symbol/succ.rb +14 -13
- data/lib/core/facets/symbol/to_proc.rb +33 -28
- data/lib/core/facets/time.rb +1 -0
- data/lib/core/facets/time/change.rb +5 -38
- data/lib/core/facets/time/elapse.rb +2 -41
- data/lib/core/facets/time/stamp.rb +47 -0
- data/lib/core/facets/unboundmethod.rb +3 -0
- data/lib/core/facets/unboundmethod/arguments.rb +27 -4
- data/lib/core/facets/unboundmethod/name.rb +21 -7
- data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
- data/lib/methods/facets/enumerable/collate.rb +1 -0
- data/lib/methods/facets/enumerable/divide.rb +1 -1
- data/lib/methods/facets/enumerable/each_by.rb +1 -1
- data/lib/methods/facets/enumerable/each_pair.rb +1 -1
- data/lib/methods/facets/enumerable/eachn.rb +1 -1
- data/lib/methods/facets/enumerable/graph.rb +1 -1
- data/lib/methods/facets/enumerable/group_by.rb +1 -1
- data/lib/methods/facets/enumerable/inject.rb +1 -0
- data/lib/methods/facets/enumerable/map_send.rb +1 -0
- data/lib/methods/facets/enumerable/modulate.rb +1 -0
- data/lib/methods/facets/enumerable/partition_by.rb +1 -1
- data/lib/methods/facets/hash/collate.rb +1 -1
- data/lib/methods/facets/hash/except.rb +1 -0
- data/lib/methods/facets/hash/graph.rb +1 -1
- data/lib/methods/facets/hash/mash.rb +1 -0
- data/lib/methods/facets/kernel/Bit.rb +1 -0
- data/lib/methods/facets/kernel/complete.rb +1 -1
- data/lib/methods/facets/kernel/here.rb +1 -1
- data/lib/methods/facets/kernel/non_nil.rb +1 -0
- data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
- data/lib/methods/facets/kernel/with.rb +1 -1
- data/lib/methods/facets/module/class_def.rb +1 -0
- data/lib/methods/facets/string/camelcase.rb +1 -0
- data/lib/methods/facets/string/op_minus.rb +1 -0
- data/lib/methods/facets/string/snakecase.rb +1 -0
- data/lib/more/facets/attributes.rb +5 -5
- data/lib/more/facets/basicobject.rb +0 -62
- data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
- data/lib/more/facets/duration.rb +534 -0
- data/lib/more/facets/lazy.rb +3 -3
- data/lib/more/facets/namespace.rb +23 -71
- data/lib/more/facets/rbsystem.rb +42 -8
- data/lib/more/facets/stylize.rb +6 -3
- data/lib/more/facets/thread.rb +55 -0
- data/meta/MANIFEST +49 -18
- data/meta/ROLLRC +1 -1
- data/meta/project.yaml +2 -2
- data/task/install +1 -1
- data/task/test/general +8 -2
- data/test/unit/array/test_pad.rb +30 -45
- data/test/unit/array/test_stackable.rb +14 -28
- data/test/unit/binding/test_cflow.rb +34 -49
- data/test/unit/binding/test_defined.rb +17 -0
- data/test/unit/binding/test_eval.rb +11 -39
- data/test/unit/binding/test_here.rb +17 -0
- data/test/unit/binding/test_self.rb +17 -0
- data/test/unit/binding/test_vars.rb +22 -37
- data/test/unit/class/test_descendents.rb +15 -30
- data/test/unit/class/test_initializer.rb +1 -8
- data/test/unit/comparable/test_bound.rb +38 -53
- data/test/unit/comparable/test_cmp.rb +45 -60
- data/test/unit/dir/test_traverse.rb +56 -0
- data/test/unit/enumerable/test_cartesian.rb +34 -47
- data/test/unit/enumerable/test_collect.rb +16 -125
- data/test/unit/enumerable/test_combination.rb +1 -8
- data/test/unit/enumerable/test_count.rb +51 -66
- data/test/unit/enumerable/test_each.rb +77 -0
- data/test/unit/enumerable/test_mash.rb +51 -0
- data/test/unit/enumerable/test_permutation.rb +1 -7
- data/test/unit/enumerable/test_probability.rb +42 -55
- data/test/unit/enumerable/test_split.rb +52 -0
- data/test/unit/exception/test_detail.rb +19 -0
- data/test/unit/file/test_read.rb +34 -0
- data/test/unit/file/test_topath.rb +17 -25
- data/test/unit/file/test_write.rb +6 -12
- data/test/unit/filetest/test_root.rb +14 -0
- data/test/unit/hash/test_at.rb +9 -21
- data/test/unit/hash/test_delete.rb +22 -37
- data/test/unit/hash/test_has_keys.rb +13 -28
- data/test/unit/hash/test_insert.rb +9 -23
- data/test/unit/hash/test_inverse.rb +11 -26
- data/test/unit/hash/test_iterate.rb +16 -31
- data/test/unit/hash/test_keyize.rb +40 -55
- data/test/unit/hash/test_merge.rb +10 -25
- data/test/unit/hash/test_new.rb +9 -24
- data/test/unit/hash/test_op.rb +1 -7
- data/test/unit/hash/test_rekey.rb +47 -62
- data/test/unit/hash/test_traverse.rb +17 -32
- data/test/unit/hash/test_update.rb +30 -45
- data/test/unit/hash/test_weave.rb +10 -23
- data/test/unit/integer/test_bitmask.rb +48 -44
- data/test/unit/integer/test_factorial.rb +11 -26
- data/test/unit/integer/test_multiples.rb +1 -5
- data/test/unit/integer/test_of.rb +14 -29
- data/test/unit/kernel/test_callstack.rb +13 -28
- data/test/unit/kernel/test_constant.rb +14 -28
- data/test/unit/kernel/test_deepcopy.rb +20 -35
- data/test/unit/kernel/test_instance.rb +46 -61
- data/test/unit/kernel/test_metaid.rb +42 -57
- data/test/unit/kernel/test_object.rb +14 -29
- data/test/unit/kernel/test_populate.rb +38 -53
- data/test/unit/kernel/test_report.rb +1 -7
- data/test/unit/kernel/test_returning.rb +16 -0
- data/test/unit/kernel/test_silence.rb +8 -23
- data/test/unit/kernel/test_super.rb +41 -56
- data/test/unit/kernel/test_tap.rb +15 -39
- data/test/unit/kernel/test_val.rb +7 -20
- data/test/unit/kernel/test_withattr.rb +29 -44
- data/test/unit/matchdata/test_matchset.rb +20 -35
- data/test/unit/module/test_abstract.rb +15 -30
- data/test/unit/module/test_alias.rb +32 -45
- data/test/unit/module/test_cattr.rb +39 -54
- data/test/unit/module/test_clone.rb +31 -43
- data/test/unit/module/test_include.rb +1 -35
- data/test/unit/module/test_modify.rb +102 -114
- data/test/unit/module/test_name.rb +1 -7
- data/test/unit/numeric/test_round.rb +46 -61
- data/test/unit/proc/test_bind.rb +29 -44
- data/test/unit/proc/test_compose.rb +20 -35
- data/test/unit/range/test_combine.rb +14 -29
- data/test/unit/range/test_overlap.rb +34 -51
- data/test/unit/regexp/test_arity.rb +14 -29
- data/test/unit/string/test_align.rb +13 -27
- data/test/unit/string/test_blank.rb +12 -27
- data/test/unit/string/test_bracket.rb +52 -67
- data/test/unit/string/test_case.rb +19 -38
- data/test/unit/string/test_crypt.rb +10 -25
- data/test/unit/string/test_filter.rb +1 -7
- data/test/unit/string/test_format.rb +2 -7
- data/test/unit/string/test_indexable.rb +54 -69
- data/test/unit/string/test_interpolate.rb +8 -21
- data/test/unit/string/test_natcmp.rb +11 -26
- data/test/unit/string/test_nchar.rb +1 -14
- data/test/unit/string/test_op.rb +14 -0
- data/test/unit/string/test_partitions.rb +39 -54
- data/test/unit/string/test_range.rb +17 -32
- data/test/unit/string/test_regesc.rb +1 -7
- data/test/unit/string/test_scan.rb +23 -38
- data/test/unit/string/test_stackable.rb +79 -98
- data/test/unit/string/test_tabs.rb +1 -7
- data/test/unit/symbol/test_chomp.rb +10 -21
- data/test/unit/symbol/test_generate.rb +7 -22
- data/test/unit/symbol/test_not.rb +10 -25
- data/test/unit/symbol/test_shadow.rb +8 -23
- data/test/unit/symbol/test_succ.rb +1 -7
- data/test/unit/symbol/test_to_proc.rb +1 -7
- data/test/unit/test_attributes.rb +1 -1
- data/test/unit/test_continuation.rb +13 -0
- data/test/unit/test_conversion.rb +1 -14
- data/test/unit/test_namespace.rb +30 -3
- data/test/unit/test_thread.rb +23 -0
- data/test/unit/time/test_change.rb +11 -26
- data/test/unit/time/test_elapse.rb +10 -25
- data/test/unit/time/test_stamp.rb +28 -0
- metadata +65 -25
- data/lib/core/facets/array/unzip.rb +0 -14
- data/lib/core/facets/continuation.rb +0 -1
- data/lib/core/facets/enumerable/collate.rb +0 -104
- data/lib/core/facets/kernel/require_esc.rb +0 -44
- data/lib/more/facets/mapsend.rb +0 -98
- data/lib/more/facets/pp_s.rb +0 -30
- data/log/history.rd +0 -38
- data/log/todo.rd +0 -4
- data/task/special/quickopts +0 -15
- data/test/unit/continuation/test_create.rb +0 -28
- data/test/unit/enumerable/test_collate.rb +0 -51
- data/test/unit/kernel/test_require_esc.rb +0 -29
- data/test/unit/test_mapsend.rb +0 -18
- 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
|
-
|
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
|
-
|
111
|
-
|
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
|
-
#
|
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
|
142
|
-
# return nil unless string
|
143
|
-
#
|
132
|
+
# def wrap(width = 20, separator = " ")
|
144
133
|
# re = /([^#{separator}]{1,#{width}})/
|
145
|
-
#
|
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
|