kyanite 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Div +6 -32
- data/{History.txt → History.rdoc} +8 -0
- data/{License.txt → License.rdoc} +0 -0
- data/Manifest.txt +6 -21
- data/README.rdoc +44 -0
- data/Rakefile.rb +19 -68
- data/console.rb +2 -4
- data/lib/kyanite.rb +151 -14
- data/lib/kyanite/array.rb +127 -4
- data/lib/kyanite/basics.rb +3 -7
- data/lib/kyanite/dictionary.rb +19 -21
- data/lib/kyanite/enumerable/enumerable_enumerables.rb +22 -24
- data/lib/kyanite/enumerable/enumerable_numerics.rb +51 -49
- data/lib/kyanite/enumerable/enumerable_strings.rb +18 -25
- data/lib/kyanite/enumerable/structure.rb +46 -58
- data/lib/kyanite/general/callerutils.rb +30 -28
- data/lib/kyanite/general/classutils.rb +73 -63
- data/lib/kyanite/general/kernel.rb +45 -64
- data/lib/kyanite/general/object.rb +22 -46
- data/lib/kyanite/general/true_false.rb +33 -27
- data/lib/kyanite/general/undoable.rb +12 -16
- data/lib/kyanite/hash.rb +63 -58
- data/lib/kyanite/numeric.rb +14 -1
- data/lib/kyanite/numeric/float.rb +32 -22
- data/lib/kyanite/numeric/integer.rb +12 -20
- data/lib/kyanite/optimizer.rb +41 -24
- data/lib/kyanite/range.rb +42 -22
- data/lib/kyanite/set.rb +56 -63
- data/lib/kyanite/string.rb +1 -2
- data/lib/kyanite/string/cast.rb +61 -37
- data/lib/kyanite/string/chars.rb +66 -36
- data/lib/kyanite/string/chars_const.rb +4 -3
- data/lib/kyanite/string/diff.rb +64 -34
- data/lib/kyanite/string/include.rb +16 -9
- data/lib/kyanite/string/list.rb +38 -8
- data/lib/kyanite/string/misc.rb +64 -0
- data/lib/kyanite/string/nested.rb +39 -22
- data/lib/kyanite/string/random.rb +117 -47
- data/lib/kyanite/string/split.rb +84 -45
- data/lib/kyanite/symbol.rb +30 -21
- data/lib/kyanite/tree.rb +33 -28
- data/test/_start_all.rb +18 -15
- data/test/array/test_array.rb +5 -7
- data/test/enumerable/test_enumerable_enumerables.rb +11 -15
- data/test/enumerable/test_enumerable_numerics.rb +50 -54
- data/test/enumerable/test_enumerable_strings.rb +8 -11
- data/test/enumerable/test_structure.rb +6 -8
- data/test/general/test_classutils.rb +9 -9
- data/test/general/test_object.rb +4 -5
- data/test/general/test_true_false.rb +4 -5
- data/test/numeric/test_numeric_integer.rb +6 -6
- data/test/string/test_cast.rb +4 -5
- data/test/string/test_chars.rb +6 -7
- data/test/string/test_diff.rb +4 -5
- data/test/string/test_list.rb +4 -5
- data/test/string/test_misc.rb +58 -0
- data/test/string/test_nested.rb +4 -5
- data/test/string/test_split.rb +10 -5
- data/test/test_dictionary.rb +4 -6
- data/test/test_hash.rb +5 -7
- data/test/test_optimizer.rb +4 -5
- data/test/test_range.rb +8 -9
- data/test/test_set.rb +7 -7
- data/test/test_tree.rb +7 -10
- data/version.rb +8 -0
- metadata +32 -33
- data/README.txt +0 -47
- data/lib/kyanite/array/array.rb +0 -140
- data/lib/kyanite/array/array2.rb +0 -142
- data/lib/kyanite/array/matrix2.rb +0 -120
- data/lib/kyanite/hoe.rb +0 -2
- data/lib/kyanite/matrix2.rb +0 -2
- data/lib/kyanite/numeric/numeric.rb +0 -54
- data/lib/kyanite/operation.rb +0 -5
- data/lib/kyanite/operation/call_tracker.rb +0 -69
- data/lib/kyanite/operation/hoe.rb +0 -12
- data/lib/kyanite/operation/rake.rb +0 -298
- data/lib/kyanite/operation/regexp.rb +0 -28
- data/lib/kyanite/operation/unit_test.rb +0 -50
- data/lib/kyanite/rake.rb +0 -2
- data/lib/kyanite/smart_load_path.rb +0 -6
- data/lib/kyanite/string/div.rb +0 -28
- data/lib/kyanite/string/mgsub.rb +0 -43
- data/lib/kyanite/unit_test.rb +0 -2
- data/test/array/test_matrix2.rb +0 -166
- data/test/string/test_mgsub.rb +0 -58
@@ -1,17 +1,22 @@
|
|
1
1
|
# ruby encoding: utf-8
|
2
|
+
# ü
|
3
|
+
if $0 == __FILE__
|
4
|
+
require 'drumherum'
|
5
|
+
smart_init
|
6
|
+
end
|
7
|
+
|
2
8
|
class String
|
3
9
|
|
4
|
-
#
|
5
|
-
|
6
|
-
#
|
7
|
-
|
10
|
+
# @!group Miscellaneous
|
11
|
+
|
12
|
+
# @private
|
8
13
|
alias :old_include? :include?
|
9
14
|
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
+
# Now also accepts an Array as input parameter.
|
16
|
+
# The array elements are ORed, i.e. +include?+ is true if +old_include?+ is true for at least one element of the array.
|
17
|
+
# All strings include +''+, +[]+ or +nil+.
|
18
|
+
# +Nil+ does not include anything: +nil.include? => false+
|
19
|
+
#
|
15
20
|
def include?(input)
|
16
21
|
return true if input.nil?
|
17
22
|
return true if input.empty?
|
@@ -35,6 +40,8 @@ if defined? TransparentNil
|
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
43
|
+
|
44
|
+
|
38
45
|
# -----------------------------------------------------------------------------------------
|
39
46
|
# ausprobieren
|
40
47
|
#
|
data/lib/kyanite/string/list.rb
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
# ruby encoding: utf-8
|
2
|
+
# ü
|
3
|
+
if $0 == __FILE__
|
4
|
+
require 'drumherum'
|
5
|
+
smart_init
|
6
|
+
end
|
7
|
+
|
2
8
|
require 'transparent_nil'
|
3
9
|
require 'kyanite/symbol'
|
4
10
|
|
5
11
|
class String
|
6
12
|
|
7
|
-
|
8
|
-
#
|
9
|
-
# See TestKyaniteStringList for tests and examples.
|
13
|
+
|
14
|
+
# @!group Database-Helper
|
10
15
|
|
11
16
|
|
12
|
-
#
|
17
|
+
# Generates WHERE clause from {Array}.
|
18
|
+
#
|
19
|
+
# Example:
|
20
|
+
# array = ['Anna','Birte','Charlie']
|
21
|
+
# "kisses_from = ".list_with(array)
|
22
|
+
# => "kisses_from = 'Anna' OR kisses_from = 'Birte' OR kisses_from = 'Charlie'"
|
23
|
+
#
|
24
|
+
# See tests and more examples {TestKyaniteStringList here}.
|
25
|
+
# @return [String]
|
13
26
|
def list_with( elemente, options = {}, &block )
|
14
27
|
|
15
28
|
options = { :pre => %q{'},
|
@@ -54,9 +67,9 @@ class String
|
|
54
67
|
|
55
68
|
|
56
69
|
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
70
|
+
# Returns SQL-RegExp for searching in Postgres comma-separated list.
|
71
|
+
# @return [String]
|
72
|
+
#
|
60
73
|
def sql_regexp_for_kommaliste
|
61
74
|
'[, ]' + self + '[, ]' + '|' + # match mittendrin
|
62
75
|
'^' + self + '[, ]' + '|' + # match am Anfang
|
@@ -65,7 +78,8 @@ class String
|
|
65
78
|
end
|
66
79
|
|
67
80
|
|
68
|
-
#
|
81
|
+
# Converts MySQL-Enum to {Array}.
|
82
|
+
# @return [Array]
|
69
83
|
#
|
70
84
|
def enum_to_array
|
71
85
|
self[5..-2].gsub("'",'').split(',').collect {|i| [i,i] }
|
@@ -83,3 +97,19 @@ if defined? TransparentNil
|
|
83
97
|
end
|
84
98
|
end
|
85
99
|
|
100
|
+
|
101
|
+
# -----------------------------------------------------------------------------------------
|
102
|
+
# Ausprobieren
|
103
|
+
#
|
104
|
+
if $0 == __FILE__ then
|
105
|
+
|
106
|
+
require 'kyanite/string/chars'
|
107
|
+
array = ['Anna','Birte','Charlie']
|
108
|
+
puts "kisses_from = ".list_with(array)
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# ruby encoding: utf-8
|
2
|
+
# ü
|
3
|
+
if $0 == __FILE__
|
4
|
+
require 'drumherum'
|
5
|
+
smart_init
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
# @!macro string
|
12
|
+
class String
|
13
|
+
|
14
|
+
|
15
|
+
# @!group Miscellaneous
|
16
|
+
|
17
|
+
|
18
|
+
# Counts the number of words.
|
19
|
+
# @return [Integer] number of words
|
20
|
+
def count_words
|
21
|
+
n = 0
|
22
|
+
scan(/\b\S+\b/) { n += 1}
|
23
|
+
n
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
# String substitution like +gsub+, but replaces multible patterns in one turn. Example:
|
28
|
+
# "between".mgsub([[/ee/, 'II'], [/e/, 'E']])
|
29
|
+
# => "bEtwIIn"
|
30
|
+
# Tests {TestKyaniteStringMisc here}.
|
31
|
+
# @return [String]
|
32
|
+
def mgsub(search_and_replace_pairs)
|
33
|
+
patterns = search_and_replace_pairs.collect { |search, replace| search }
|
34
|
+
gsub(Regexp.union(*patterns)) do |match|
|
35
|
+
search_and_replace_pairs.detect{ |search, replace| search =~ match}[1]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
if defined? TransparentNil
|
44
|
+
class NilClass
|
45
|
+
|
46
|
+
# @return 0
|
47
|
+
def count_words; 0; end
|
48
|
+
|
49
|
+
def mgsub(*a); nil; end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
# -----------------------------------------------------------------------------------------
|
57
|
+
# ausprobieren
|
58
|
+
#
|
59
|
+
if $0 == __FILE__ then
|
60
|
+
|
61
|
+
puts "between".mgsub([[/ee/, 'II'], [/e/, 'E']])
|
62
|
+
puts "between".mgsub([])
|
63
|
+
|
64
|
+
end # if
|
@@ -1,21 +1,27 @@
|
|
1
1
|
# ruby encoding: utf-8
|
2
|
+
# ü
|
3
|
+
if $0 == __FILE__
|
4
|
+
require 'drumherum'
|
5
|
+
smart_init
|
6
|
+
end
|
7
|
+
|
2
8
|
class String
|
3
9
|
|
4
10
|
# ---------------------------------------------------------------------------------------------------------------------------------
|
5
|
-
#
|
11
|
+
# @!group Nested
|
6
12
|
# See TestKyaniteStringNested for tests and examples.
|
7
13
|
#
|
8
14
|
|
9
15
|
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
+
# Returns the matching opposite bracket. Examples:
|
17
|
+
# '('.anti -> ')'
|
18
|
+
# '{'.anti -> '}'
|
19
|
+
# ']'.anti -> '['
|
20
|
+
# '<hallo>'.anti -> '</hallo>'
|
21
|
+
# '</hallo>'.anti -> '<hallo>'
|
16
22
|
#
|
17
|
-
# See
|
18
|
-
#
|
23
|
+
# See tests and examples {TestKyaniteStringNested#test_010_anti here}.
|
24
|
+
# @return [String] opposite bracket
|
19
25
|
def anti
|
20
26
|
if self.size == 1
|
21
27
|
return self.tr('([{<)]}>',')]}>([{<')
|
@@ -31,11 +37,12 @@ class String
|
|
31
37
|
|
32
38
|
|
33
39
|
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
40
|
+
# Returns the positions of the next bracket pair. Example:
|
41
|
+
# 'Hello(welt)wort'.index_bracket -> 5..10
|
42
|
+
# See tests and examples {TestKyaniteStringNested#test_020_index_bracket here}.
|
43
|
+
# @return [Range] Positions of brackets
|
44
|
+
# @param start [Integer] Search from this starting position
|
45
|
+
# @param pattern [RegExp, String] Search only this type of bracket
|
39
46
|
#
|
40
47
|
def index_bracket( pattern=nil, start=0, last_found = nil )
|
41
48
|
return nil if self.empty?
|
@@ -73,10 +80,20 @@ class String
|
|
73
80
|
end
|
74
81
|
|
75
82
|
|
76
|
-
#
|
83
|
+
# Applies the block to a hierarchically defined substring of the string.
|
77
84
|
#
|
78
|
-
# See
|
79
|
-
#
|
85
|
+
# See tests and examples {TestKyaniteStringNested#test_030_mask_ungeklammert here}.
|
86
|
+
# @return [String]
|
87
|
+
# @param options [Hash]
|
88
|
+
# @option options [Integer] :level_start
|
89
|
+
# @option options [Integer] :level_end
|
90
|
+
# @option options [Integer] :level_akt
|
91
|
+
# @option options [RegExp, String] :pattern
|
92
|
+
# @option options [Boolean] :skip_empty
|
93
|
+
# @option options [Boolean] :param_level
|
94
|
+
# @option options [Boolean] :with_brackets
|
95
|
+
# @param block [Block]
|
96
|
+
#
|
80
97
|
def mask( options={}, &block )
|
81
98
|
|
82
99
|
# vorbereiten
|
@@ -189,10 +206,10 @@ class String
|
|
189
206
|
end # def
|
190
207
|
|
191
208
|
|
192
|
-
|
193
|
-
#
|
194
|
-
#
|
195
|
-
#
|
209
|
+
|
210
|
+
# Returns the depth of nesting (number of nesting levels).
|
211
|
+
# @return [Integer] Depth of nesting
|
212
|
+
# @param pattern [RegExp, String] Search only this type of bracket
|
196
213
|
def nestinglevel(pattern=/[{<(\[]/)
|
197
214
|
result = 0
|
198
215
|
self.mask( :level_start => 0,
|
@@ -237,7 +254,7 @@ end
|
|
237
254
|
|
238
255
|
if $0 == __FILE__
|
239
256
|
|
240
|
-
|
257
|
+
|
241
258
|
|
242
259
|
end # if
|
243
260
|
|
@@ -1,66 +1,124 @@
|
|
1
1
|
# ruby encoding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
string_random_basis[:password] = password
|
7
|
-
|
8
|
-
de_hauf = [ [ 'ß', 3 ],
|
9
|
-
[ 'ä', 5 ],
|
10
|
-
[ 'ö', 3 ],
|
11
|
-
[ 'ü', 8 ],
|
12
|
-
[ 'a', 51 ],
|
13
|
-
[ 'b', 19 ],
|
14
|
-
[ 'c', 30 ],
|
15
|
-
[ 'd', 51 ],
|
16
|
-
[ 'e', 174 ],
|
17
|
-
[ 'f', 17 ],
|
18
|
-
[ 'g', 30 ],
|
19
|
-
[ 'h', 48 ],
|
20
|
-
[ 'i', 76 ],
|
21
|
-
[ 'j', 3 ],
|
22
|
-
[ 'k', 12 ],
|
23
|
-
[ 'l', 34 ],
|
24
|
-
[ 'm', 25 ],
|
25
|
-
[ 'n', 98 ],
|
26
|
-
[ 'o', 23 ],
|
27
|
-
[ 'p', 8 ],
|
28
|
-
[ 'q', 1 ],
|
29
|
-
[ 'r', 70 ],
|
30
|
-
[ 's', 72 ],
|
31
|
-
[ 't', 61 ],
|
32
|
-
[ 'u', 40 ],
|
33
|
-
[ 'v', 7 ],
|
34
|
-
[ 'w', 19 ],
|
35
|
-
[ 'x', 1 ],
|
36
|
-
[ 'y', 1 ],
|
37
|
-
[ 'z', 11 ]]
|
38
|
-
de_array = []
|
39
|
-
de_hauf.each do | buchstabe, haufigkeit |
|
40
|
-
de_array += [buchstabe]*haufigkeit
|
41
|
-
end
|
42
|
-
string_random_basis[:de] = de_array
|
43
|
-
STRING_RANDOM_BASIS = string_random_basis
|
2
|
+
# ü
|
3
|
+
if $0 == __FILE__
|
4
|
+
require 'drumherum'
|
5
|
+
smart_init
|
44
6
|
end
|
45
7
|
|
8
|
+
|
46
9
|
class String
|
47
10
|
|
11
|
+
unless defined? STRING_RANDOM_BASIS
|
12
|
+
string_random_basis = Hash.new
|
13
|
+
|
14
|
+
password = [('0'..'9'),('A'..'Z'),('a'..'z')].map {|range| range.to_a}.flatten
|
15
|
+
string_random_basis[:password] = password
|
16
|
+
|
17
|
+
de_hauf = [ [ 'ß', 3 ],
|
18
|
+
[ 'ä', 5 ],
|
19
|
+
[ 'ö', 3 ],
|
20
|
+
[ 'ü', 8 ],
|
21
|
+
[ 'a', 51 ],
|
22
|
+
[ 'b', 19 ],
|
23
|
+
[ 'c', 30 ],
|
24
|
+
[ 'd', 51 ],
|
25
|
+
[ 'e', 174 ],
|
26
|
+
[ 'f', 17 ],
|
27
|
+
[ 'g', 30 ],
|
28
|
+
[ 'h', 48 ],
|
29
|
+
[ 'i', 76 ],
|
30
|
+
[ 'j', 3 ],
|
31
|
+
[ 'k', 12 ],
|
32
|
+
[ 'l', 34 ],
|
33
|
+
[ 'm', 25 ],
|
34
|
+
[ 'n', 98 ],
|
35
|
+
[ 'o', 23 ],
|
36
|
+
[ 'p', 8 ],
|
37
|
+
[ 'q', 1 ],
|
38
|
+
[ 'r', 70 ],
|
39
|
+
[ 's', 72 ],
|
40
|
+
[ 't', 61 ],
|
41
|
+
[ 'u', 40 ],
|
42
|
+
[ 'v', 7 ],
|
43
|
+
[ 'w', 19 ],
|
44
|
+
[ 'x', 1 ],
|
45
|
+
[ 'y', 1 ],
|
46
|
+
[ 'z', 11 ]]
|
47
|
+
de_array = []
|
48
|
+
de_hauf.each do | buchstabe, haufigkeit |
|
49
|
+
de_array += [buchstabe]*haufigkeit
|
50
|
+
end
|
51
|
+
string_random_basis[:de] = de_array
|
52
|
+
|
53
|
+
en_hauf = [ [ 'a', 51 ],
|
54
|
+
[ 'b', 19 ],
|
55
|
+
[ 'c', 30 ],
|
56
|
+
[ 'd', 51 ],
|
57
|
+
[ 'e', 174 ],
|
58
|
+
[ 'f', 17 ],
|
59
|
+
[ 'g', 30 ],
|
60
|
+
[ 'h', 48 ],
|
61
|
+
[ 'i', 76 ],
|
62
|
+
[ 'j', 3 ],
|
63
|
+
[ 'k', 12 ],
|
64
|
+
[ 'l', 34 ],
|
65
|
+
[ 'm', 25 ],
|
66
|
+
[ 'n', 98 ],
|
67
|
+
[ 'o', 23 ],
|
68
|
+
[ 'p', 8 ],
|
69
|
+
[ 'q', 1 ],
|
70
|
+
[ 'r', 70 ],
|
71
|
+
[ 's', 72 ],
|
72
|
+
[ 't', 61 ],
|
73
|
+
[ 'u', 40 ],
|
74
|
+
[ 'v', 7 ],
|
75
|
+
[ 'w', 19 ],
|
76
|
+
[ 'x', 1 ],
|
77
|
+
[ 'y', 1 ],
|
78
|
+
[ 'z', 11 ]]
|
79
|
+
en_array = []
|
80
|
+
en_hauf.each do | buchstabe, haufigkeit |
|
81
|
+
en_array += [buchstabe]*haufigkeit
|
82
|
+
end
|
83
|
+
string_random_basis[:en] = en_array
|
84
|
+
|
85
|
+
STRING_RANDOM_BASIS = string_random_basis
|
86
|
+
end
|
87
|
+
|
88
|
+
|
48
89
|
# ---------------------------------------------------------------------------------------------------------------------------------
|
49
|
-
#
|
90
|
+
# @!group Random
|
50
91
|
#
|
51
92
|
|
52
|
-
#
|
93
|
+
# Reorder string in random order. Example:
|
94
|
+
# "Random order".shuffle
|
95
|
+
# => "oeo rdRdnmar"
|
96
|
+
# @return [String]
|
53
97
|
def shuffle(separator=//)
|
54
98
|
split(separator).shuffle.join('')
|
55
99
|
end
|
56
100
|
|
57
|
-
# In-place-
|
101
|
+
# In-place-variant of {#shuffle +shuffle+}.
|
102
|
+
# @return [String]
|
58
103
|
def shuffle!(separator=//)
|
59
104
|
self.replace( shuffle(separator) )
|
60
105
|
end
|
61
106
|
|
62
|
-
|
63
|
-
|
107
|
+
# Generates a random string.
|
108
|
+
# Example:
|
109
|
+
# String.random( :de, 20)
|
110
|
+
# => brräbkpßrdirnenshrnh
|
111
|
+
#
|
112
|
+
# String.random( :en, 20)
|
113
|
+
# => euduwmtenohrtnaeewsc
|
114
|
+
#
|
115
|
+
# String.random( :password, 20)
|
116
|
+
# => PzAAGW2ALsbJRnljI6ho
|
117
|
+
#
|
118
|
+
# @param type [Symbol] Char base with letter frequency of the random string (+:de+, +:en+ or +:password+)
|
119
|
+
# @param size [Integer] Length of the random string
|
120
|
+
# @return [String] Random string
|
121
|
+
def String.random( type=:en, size=16)
|
64
122
|
(0...size).map { STRING_RANDOM_BASIS[type][Kernel.rand(STRING_RANDOM_BASIS[type].size)] }.join
|
65
123
|
end
|
66
124
|
|
@@ -72,3 +130,15 @@ if defined? TransparentNil
|
|
72
130
|
def shuffle!; nil; end
|
73
131
|
end
|
74
132
|
end
|
133
|
+
|
134
|
+
|
135
|
+
# -----------------------------------------------------------------------------------------
|
136
|
+
# Ausprobieren
|
137
|
+
#
|
138
|
+
if $0 == __FILE__ then
|
139
|
+
|
140
|
+
puts String.random( :password, 20)
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
end
|