kyanite 0.3.1
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/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
|
+
|