kyanite 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/0 start all Tests.bat +23 -0
- data/History.txt +4 -0
- data/License.txt +21 -0
- data/Manifest.txt +88 -0
- data/PostInstall.txt +4 -0
- data/README.txt +48 -0
- data/Rakefile.rb +79 -0
- data/init.rb +2 -0
- data/lib/kyanite.rb +39 -0
- data/lib/kyanite/array.rb +5 -0
- data/lib/kyanite/array/array.rb +172 -0
- data/lib/kyanite/array/array2.rb +140 -0
- data/lib/kyanite/array/matrix2.rb +120 -0
- data/lib/kyanite/array_of_enumerables.rb +2 -0
- data/lib/kyanite/array_of_numerics.rb +2 -0
- data/lib/kyanite/array_of_strings.rb +2 -0
- data/lib/kyanite/basics.rb +60 -0
- data/lib/kyanite/dictionary.rb +116 -0
- data/lib/kyanite/enumerable.rb +7 -0
- data/lib/kyanite/enumerable/enumerable_enumerables.rb +70 -0
- data/lib/kyanite/enumerable/enumerable_numerics.rb +171 -0
- data/lib/kyanite/enumerable/enumerable_strings.rb +58 -0
- data/lib/kyanite/enumerable/structure.rb +170 -0
- data/lib/kyanite/general.rb +8 -0
- data/lib/kyanite/general/callerutils.rb +128 -0
- data/lib/kyanite/general/classutils.rb +246 -0
- data/lib/kyanite/general/kernel.rb +105 -0
- data/lib/kyanite/general/nil.rb +64 -0
- data/lib/kyanite/general/object.rb +86 -0
- data/lib/kyanite/general/true_false.rb +65 -0
- data/lib/kyanite/general/undoable.rb +24 -0
- data/lib/kyanite/hash.rb +170 -0
- data/lib/kyanite/matrix2.rb +2 -0
- data/lib/kyanite/nil.rb +3 -0
- data/lib/kyanite/numeric.rb +4 -0
- data/lib/kyanite/numeric/float.rb +26 -0
- data/lib/kyanite/numeric/integer.rb +34 -0
- data/lib/kyanite/numeric/numeric.rb +45 -0
- data/lib/kyanite/operation.rb +5 -0
- data/lib/kyanite/operation/call_tracker.rb +69 -0
- data/lib/kyanite/operation/rake.rb +101 -0
- data/lib/kyanite/operation/regexp.rb +23 -0
- data/lib/kyanite/operation/unit_test.rb +53 -0
- data/lib/kyanite/optimizer.rb +119 -0
- data/lib/kyanite/rake.rb +2 -0
- data/lib/kyanite/range.rb +54 -0
- data/lib/kyanite/set.rb +219 -0
- data/lib/kyanite/smart_load_path.rb +2 -0
- data/lib/kyanite/string.rb +13 -0
- data/lib/kyanite/string/cast.rb +104 -0
- data/lib/kyanite/string/chars.rb +184 -0
- data/lib/kyanite/string/chars_const.rb +190 -0
- data/lib/kyanite/string/diff.rb +78 -0
- data/lib/kyanite/string/div.rb +19 -0
- data/lib/kyanite/string/include.rb +43 -0
- data/lib/kyanite/string/list.rb +84 -0
- data/lib/kyanite/string/mgsub.rb +35 -0
- data/lib/kyanite/string/nested.rb +253 -0
- data/lib/kyanite/string/random.rb +69 -0
- data/lib/kyanite/string/split.rb +136 -0
- data/lib/kyanite/symbol.rb +19 -0
- data/lib/kyanite/tree.rb +99 -0
- data/lib/kyanite/undoable.rb +2 -0
- data/lib/kyanite/unit_test.rb +2 -0
- data/test/_start_all.rb +17 -0
- data/test/array/test_array.rb +106 -0
- data/test/array/test_matrix2.rb +162 -0
- data/test/enumerable/test_enumerable_enumerables.rb +46 -0
- data/test/enumerable/test_enumerable_numerics.rb +93 -0
- data/test/enumerable/test_enumerable_strings.rb +22 -0
- data/test/enumerable/test_structure.rb +220 -0
- data/test/general/test_classutils.rb +45 -0
- data/test/general/test_nil.rb +44 -0
- data/test/general/test_object.rb +49 -0
- data/test/general/test_true_false.rb +28 -0
- data/test/numeric/test_numeric_integer.rb +28 -0
- data/test/string/test_cast.rb +108 -0
- data/test/string/test_chars.rb +255 -0
- data/test/string/test_diff.rb +95 -0
- data/test/string/test_list.rb +141 -0
- data/test/string/test_nested.rb +361 -0
- data/test/string/test_split.rb +187 -0
- data/test/test_dictionary.rb +128 -0
- data/test/test_hash.rb +59 -0
- data/test/test_optimizer.rb +150 -0
- data/test/test_range.rb +41 -0
- data/test/test_set.rb +210 -0
- data/test/test_tree.rb +94 -0
- metadata +217 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
|
2
|
+
require 'kyanite/array/array'
|
3
|
+
|
4
|
+
class Array
|
5
|
+
|
6
|
+
# Liefert nil, wenn das erste Element empty ist, sonst self.
|
7
|
+
# Wird von Array2 und Matrix2 verwendet.
|
8
|
+
# Tests: TestMatrix2#test_fehlerhalte_matrix
|
9
|
+
#
|
10
|
+
def row_to_nil #:nodoc:
|
11
|
+
return nil if self[0].empty?
|
12
|
+
return self
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class NilClass # :nodoc:
|
18
|
+
def row_to_nil; nil; end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Ein Array2 ist eine spezielle Form von Array, n�mlich immer zweidimensional. Siehe auch Matrix2!
|
22
|
+
#
|
23
|
+
# Ein Array2 kann <b>in jeder Zeile eine verschiedene Anzahl Spalten </b> haben (im Gegensatz zu Instanzen der Klasse Matrix2!)
|
24
|
+
# Jede Zeile hat einen Zeilenheader (Zelle 0), einen Spaltenheader gibt es nicht.
|
25
|
+
class Array2 < Array
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
# Schreibt den Wert einer Zelle. Siehe auch set_row! und set_column!
|
30
|
+
# Stattdessen kann man auch schreiben:
|
31
|
+
# myarray[r][c] = neuerwert
|
32
|
+
#
|
33
|
+
# Tests: TestMatrix2#test_matrix_zellen_und_zeilen
|
34
|
+
def set_element!(i,j,wert)
|
35
|
+
self[i][j] = wert.dup
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
# Liefert eine bestimmte Zeile zur�ck.
|
40
|
+
#
|
41
|
+
# Tests: TestMatrix2#test_matrix_zellen_und_zeilen
|
42
|
+
def row(i)
|
43
|
+
return self.at(i)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# Setzt den Wert einer Zeile.
|
48
|
+
#
|
49
|
+
# Tests: TestMatrix2#test_matrix_zellen_und_zeilen
|
50
|
+
def set_row!(i,wert)
|
51
|
+
self[i] = wert.dup
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# Wieviele Zeilen hat das Array2?
|
56
|
+
#
|
57
|
+
# Tests: TestMatrix2#test_matrix_zellen_und_zeilen
|
58
|
+
def row_size
|
59
|
+
size
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
# Gibt das Array2 menschenlesbar aus.
|
65
|
+
# Beispielaufruf:
|
66
|
+
# pp germany.adms_and_orte.inspect
|
67
|
+
def inspect
|
68
|
+
analyze = Array.new
|
69
|
+
analyze = self.collect do | zeile |
|
70
|
+
( zeile.collect { | zelle | zelle.inspect } ).join(" | ")
|
71
|
+
end # zeile
|
72
|
+
return analyze
|
73
|
+
end # inspect
|
74
|
+
|
75
|
+
|
76
|
+
# Liefert eine bereinigte Kopie des Array2.
|
77
|
+
# Level=0:: Platzhalter f�r den More-Link durch echten More-Link ersetzen
|
78
|
+
# Level=1:: Zeilen ohne Zeilenheader werden gel�scht
|
79
|
+
#
|
80
|
+
def clean4view(level = 0)
|
81
|
+
new = self.collect { |zeile|
|
82
|
+
if zeile[1].nil? && level >= 1
|
83
|
+
nil
|
84
|
+
elsif zeile[-1] == :more
|
85
|
+
zeile[0..-2] << zeile[0].dup.more!
|
86
|
+
else
|
87
|
+
zeile
|
88
|
+
end
|
89
|
+
}
|
90
|
+
return Array2.new(new.compact)
|
91
|
+
end # clean4view
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
# In-place-Variante von clean4view.
|
96
|
+
def clean4view!(level = 0)
|
97
|
+
self.replace(self.clean4view(level))
|
98
|
+
end
|
99
|
+
|
100
|
+
end # class Array2
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
|
2
|
+
require 'kyanite/array/array2'
|
3
|
+
|
4
|
+
# Datenstruktur f�r streng-zweidimensionale Matritzen. Erbt die Methoden von Array2 und Array. Beispiele siehe TestMatrix2.
|
5
|
+
#
|
6
|
+
# Eine Matrix2 ist eine spezielle Form von Array2, sie hat <b>in jeder Zeile die gleiche Anzahl Spalten</b>.
|
7
|
+
# Jede Zeile hat einen Zeilenheader row(0), jede Spalte einen Spaltenheader column(0).
|
8
|
+
#
|
9
|
+
# Man k�nnte auch die Standard-Library Matrix verwenden, aber die ist langsam, fehlerhaft und eher auf numerische Werte zugeschnitten denn auf beliebige Objekte.
|
10
|
+
#
|
11
|
+
# noch nicht implementiert: append!(top | bottom | left | right)
|
12
|
+
class Matrix2 < Array2
|
13
|
+
|
14
|
+
# Liefert eine bestimmte Spalte zur�ck.
|
15
|
+
# Dabei wird die Matrix2 vorher mit clean4view!(0) behandelt, d.h. sie ver�ndert sich ggf.!
|
16
|
+
#
|
17
|
+
# Tests: TestMatrix2#test_spalten
|
18
|
+
def column(j)
|
19
|
+
clean4view!(0)
|
20
|
+
return self.transpose.at(j)
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# Setzt den Wert einer Spalte.
|
25
|
+
# Dabei wird die Matrix2 vorher mit clean4view!(0) behandelt, d.h. sie ver�ndert sich ggf.!
|
26
|
+
#
|
27
|
+
# Tests: TestMatrix2#test_spalten
|
28
|
+
def set_column!(j,wert)
|
29
|
+
clean4view!(0)
|
30
|
+
transpose!
|
31
|
+
wertdup = wert.dup
|
32
|
+
|
33
|
+
self[j] = wert.dup
|
34
|
+
transpose!
|
35
|
+
return wertdup
|
36
|
+
end
|
37
|
+
|
38
|
+
# Wieviele Spalten hat die Tabelle? Ma�geblich daf�r ist die Header-Spalte!
|
39
|
+
def column_size
|
40
|
+
self[0].size
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# Liefert eine bereinigte Kopie der Matrix2.
|
45
|
+
# Level=0:: Resize to Header, d.h. alle Zeilen werden auf die L�nge der ersten Zeile angepasst (beschnitten oder mit nil aufgef�llt)
|
46
|
+
# Level=1:: Zeilen ohne Zeilenheader werden gel�scht
|
47
|
+
# Level=2:: Spalten ohne Spaltenheader werden gel�scht
|
48
|
+
#
|
49
|
+
# Test: TestMatrix2#test_resize_to_header
|
50
|
+
#
|
51
|
+
def clean4view(level = 0)
|
52
|
+
|
53
|
+
# Level 0 : Resize to Header, d.h. alle Zeilen werden auf die L�nge der ersten Zeile angepasst (beschnitten oder mit nil aufgef�llt)
|
54
|
+
cs = self.column_size
|
55
|
+
new = self.collect { |zeile|
|
56
|
+
zs = zeile.size
|
57
|
+
if zs == cs
|
58
|
+
zeile
|
59
|
+
elsif zs > cs
|
60
|
+
zeile[0, cs]
|
61
|
+
else # zs < cs
|
62
|
+
zeile + Array.new(cs-zs)
|
63
|
+
end }
|
64
|
+
return Matrix2.new(new) if level == 0 # Level 0
|
65
|
+
|
66
|
+
|
67
|
+
#Level 1 : Zeilen ohne Zeilenheader werden gel�scht
|
68
|
+
new.collect! { | zeile | zeile.row_to_nil }
|
69
|
+
new.compact!
|
70
|
+
return Matrix2.new(new) if level == 1 # Level 1
|
71
|
+
|
72
|
+
|
73
|
+
# Level 2 : Spalten ohne Spaltenheader werden gel�scht
|
74
|
+
new.transpose!
|
75
|
+
new.collect! { | spalte | spalte.row_to_nil }
|
76
|
+
new.compact!
|
77
|
+
new.transpose!
|
78
|
+
return Matrix2.new(new) # Level 2
|
79
|
+
end # def clean4view
|
80
|
+
|
81
|
+
|
82
|
+
# In-place-Variante von clean4view.
|
83
|
+
def clean4view!(level = 0)
|
84
|
+
self.replace(self.clean4view(level))
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
end # class Matrix2
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
|
2
|
+
# Required eine Auswahl wichtiger Kyanite-Libs
|
3
|
+
|
4
|
+
$KCODE = 'UTF8'
|
5
|
+
|
6
|
+
# ----------------------------------------------------------------
|
7
|
+
# innerhalb von Verzeichnissen
|
8
|
+
#
|
9
|
+
|
10
|
+
# require 'kyanite/array'
|
11
|
+
require 'kyanite/array/array' # aber nicht array2 und matrix2
|
12
|
+
|
13
|
+
# require 'kyanite/general'
|
14
|
+
# require 'kyanite/general/callerutils'
|
15
|
+
require 'kyanite/general/classutils'
|
16
|
+
require 'kyanite/general/kernel'
|
17
|
+
require 'kyanite/general/nil'
|
18
|
+
require 'kyanite/general/object'
|
19
|
+
# require 'kyanite/general/optimizer'
|
20
|
+
require 'kyanite/general/true_false'
|
21
|
+
# require 'kyanite/general/undoable'
|
22
|
+
|
23
|
+
require 'kyanite/numeric'
|
24
|
+
# require 'kyanite/operation' # nur manuell
|
25
|
+
|
26
|
+
# require 'kyanite/string'
|
27
|
+
# require 'kyanite/string/cast'
|
28
|
+
# require 'kyanite/string/chars'
|
29
|
+
# require 'kyanite/string/diff'
|
30
|
+
# require 'kyanite/string/div'
|
31
|
+
require 'kyanite/string/include'
|
32
|
+
# require 'kyanite/string/list'
|
33
|
+
require 'kyanite/string/mgsub'
|
34
|
+
# require 'kyanite/string/nested'
|
35
|
+
# require 'kyanite/string/random'
|
36
|
+
# require 'kyanite/string/split'
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
# ----------------------------------------------------------------
|
42
|
+
# Einzeldateien
|
43
|
+
#
|
44
|
+
|
45
|
+
# require 'kyanite/basics' # diese Datei
|
46
|
+
# require 'kyanite/dictionary'
|
47
|
+
require 'kyanite/hash'
|
48
|
+
# require 'kyanite/matrix2'
|
49
|
+
# require 'kyanite/nil' # ist schon in general
|
50
|
+
require 'kyanite/range'
|
51
|
+
# require 'kyanite/set'
|
52
|
+
require 'kyanite/symbol'
|
53
|
+
# require 'kyanite/tree'
|
54
|
+
# require 'kyanite/unit_test' # nur für Tests
|
55
|
+
|
56
|
+
# ----------------------------------------------------------------
|
57
|
+
# Außerhalb
|
58
|
+
#
|
59
|
+
|
60
|
+
require 'pp'
|
@@ -0,0 +1,116 @@
|
|
1
|
+
|
2
|
+
require 'facets/dictionary'
|
3
|
+
require 'kyanite/enumerable' # is_collection?
|
4
|
+
|
5
|
+
class Dictionary
|
6
|
+
|
7
|
+
def fetch_by_index(index)
|
8
|
+
@hash[order[index]]
|
9
|
+
end
|
10
|
+
|
11
|
+
def first_key
|
12
|
+
order.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def last_key
|
16
|
+
order.last
|
17
|
+
end
|
18
|
+
|
19
|
+
def -(other)
|
20
|
+
(self.to_a - other.to_a).to_dictionary
|
21
|
+
end
|
22
|
+
|
23
|
+
def unshift( k,v )
|
24
|
+
unless @hash.include?( k )
|
25
|
+
@order.unshift( k )
|
26
|
+
@hash.store( k,v )
|
27
|
+
true
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def each_with_index
|
35
|
+
order.each_with_index { |k,i| yield( k, @hash[k], i ) }
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
class Hash
|
44
|
+
|
45
|
+
# :section: Cast
|
46
|
+
# TODO: effizienter
|
47
|
+
def to_dictionary
|
48
|
+
result = Dictionary.new
|
49
|
+
self.each do | key, value |
|
50
|
+
result[key] = value
|
51
|
+
end
|
52
|
+
result
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
class Array
|
59
|
+
|
60
|
+
# :section: Cast
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
# Liefert ein Dictionary (das ist ein geordneter Hash)
|
65
|
+
#
|
66
|
+
# TODO: effizienter
|
67
|
+
def to_dictionary
|
68
|
+
result = Dictionary.new
|
69
|
+
self.each do | zeile |
|
70
|
+
result << zeile
|
71
|
+
end
|
72
|
+
result
|
73
|
+
end
|
74
|
+
|
75
|
+
#funktioniert nicht
|
76
|
+
def to_dictionary2 # :nodoc:
|
77
|
+
Dictionary.new(self.flatten)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
class NilClass
|
84
|
+
def fetch_by_index(*a); nil; end
|
85
|
+
def to_dictionary; Dictionary.new; end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
# ---------------------------------------------------------
|
91
|
+
# Ausprobieren
|
92
|
+
#
|
93
|
+
if $0 == __FILE__
|
94
|
+
|
95
|
+
require 'perception'
|
96
|
+
test = Dictionary[ 'a', 1, 'b', 2, 'c', 3 ]
|
97
|
+
see test
|
98
|
+
see
|
99
|
+
see
|
100
|
+
see test.order
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|