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.
- 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
|