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