kyanite 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/0 start all Tests.bat +23 -0
  2. data/History.txt +4 -0
  3. data/License.txt +21 -0
  4. data/Manifest.txt +88 -0
  5. data/PostInstall.txt +4 -0
  6. data/README.txt +48 -0
  7. data/Rakefile.rb +79 -0
  8. data/init.rb +2 -0
  9. data/lib/kyanite.rb +39 -0
  10. data/lib/kyanite/array.rb +5 -0
  11. data/lib/kyanite/array/array.rb +172 -0
  12. data/lib/kyanite/array/array2.rb +140 -0
  13. data/lib/kyanite/array/matrix2.rb +120 -0
  14. data/lib/kyanite/array_of_enumerables.rb +2 -0
  15. data/lib/kyanite/array_of_numerics.rb +2 -0
  16. data/lib/kyanite/array_of_strings.rb +2 -0
  17. data/lib/kyanite/basics.rb +60 -0
  18. data/lib/kyanite/dictionary.rb +116 -0
  19. data/lib/kyanite/enumerable.rb +7 -0
  20. data/lib/kyanite/enumerable/enumerable_enumerables.rb +70 -0
  21. data/lib/kyanite/enumerable/enumerable_numerics.rb +171 -0
  22. data/lib/kyanite/enumerable/enumerable_strings.rb +58 -0
  23. data/lib/kyanite/enumerable/structure.rb +170 -0
  24. data/lib/kyanite/general.rb +8 -0
  25. data/lib/kyanite/general/callerutils.rb +128 -0
  26. data/lib/kyanite/general/classutils.rb +246 -0
  27. data/lib/kyanite/general/kernel.rb +105 -0
  28. data/lib/kyanite/general/nil.rb +64 -0
  29. data/lib/kyanite/general/object.rb +86 -0
  30. data/lib/kyanite/general/true_false.rb +65 -0
  31. data/lib/kyanite/general/undoable.rb +24 -0
  32. data/lib/kyanite/hash.rb +170 -0
  33. data/lib/kyanite/matrix2.rb +2 -0
  34. data/lib/kyanite/nil.rb +3 -0
  35. data/lib/kyanite/numeric.rb +4 -0
  36. data/lib/kyanite/numeric/float.rb +26 -0
  37. data/lib/kyanite/numeric/integer.rb +34 -0
  38. data/lib/kyanite/numeric/numeric.rb +45 -0
  39. data/lib/kyanite/operation.rb +5 -0
  40. data/lib/kyanite/operation/call_tracker.rb +69 -0
  41. data/lib/kyanite/operation/rake.rb +101 -0
  42. data/lib/kyanite/operation/regexp.rb +23 -0
  43. data/lib/kyanite/operation/unit_test.rb +53 -0
  44. data/lib/kyanite/optimizer.rb +119 -0
  45. data/lib/kyanite/rake.rb +2 -0
  46. data/lib/kyanite/range.rb +54 -0
  47. data/lib/kyanite/set.rb +219 -0
  48. data/lib/kyanite/smart_load_path.rb +2 -0
  49. data/lib/kyanite/string.rb +13 -0
  50. data/lib/kyanite/string/cast.rb +104 -0
  51. data/lib/kyanite/string/chars.rb +184 -0
  52. data/lib/kyanite/string/chars_const.rb +190 -0
  53. data/lib/kyanite/string/diff.rb +78 -0
  54. data/lib/kyanite/string/div.rb +19 -0
  55. data/lib/kyanite/string/include.rb +43 -0
  56. data/lib/kyanite/string/list.rb +84 -0
  57. data/lib/kyanite/string/mgsub.rb +35 -0
  58. data/lib/kyanite/string/nested.rb +253 -0
  59. data/lib/kyanite/string/random.rb +69 -0
  60. data/lib/kyanite/string/split.rb +136 -0
  61. data/lib/kyanite/symbol.rb +19 -0
  62. data/lib/kyanite/tree.rb +99 -0
  63. data/lib/kyanite/undoable.rb +2 -0
  64. data/lib/kyanite/unit_test.rb +2 -0
  65. data/test/_start_all.rb +17 -0
  66. data/test/array/test_array.rb +106 -0
  67. data/test/array/test_matrix2.rb +162 -0
  68. data/test/enumerable/test_enumerable_enumerables.rb +46 -0
  69. data/test/enumerable/test_enumerable_numerics.rb +93 -0
  70. data/test/enumerable/test_enumerable_strings.rb +22 -0
  71. data/test/enumerable/test_structure.rb +220 -0
  72. data/test/general/test_classutils.rb +45 -0
  73. data/test/general/test_nil.rb +44 -0
  74. data/test/general/test_object.rb +49 -0
  75. data/test/general/test_true_false.rb +28 -0
  76. data/test/numeric/test_numeric_integer.rb +28 -0
  77. data/test/string/test_cast.rb +108 -0
  78. data/test/string/test_chars.rb +255 -0
  79. data/test/string/test_diff.rb +95 -0
  80. data/test/string/test_list.rb +141 -0
  81. data/test/string/test_nested.rb +361 -0
  82. data/test/string/test_split.rb +187 -0
  83. data/test/test_dictionary.rb +128 -0
  84. data/test/test_hash.rb +59 -0
  85. data/test/test_optimizer.rb +150 -0
  86. data/test/test_range.rb +41 -0
  87. data/test/test_set.rb +210 -0
  88. data/test/test_tree.rb +94 -0
  89. 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,2 @@
1
+
2
+ require 'kyanite/enumerable/enumerable_enumerables'
@@ -0,0 +1,2 @@
1
+
2
+ require 'kyanite/enumerable/enumerable_numerics'
@@ -0,0 +1,2 @@
1
+
2
+ require 'kyanite/enumerable/enumerable_strings'
@@ -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
+