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,7 @@
1
+
2
+ require 'kyanite/enumerable/enumerable_enumerables'
3
+ require 'kyanite/enumerable/enumerable_numerics'
4
+ require 'kyanite/enumerable/enumerable_strings'
5
+ require 'kyanite/enumerable/structure'
6
+
7
+
@@ -0,0 +1,70 @@
1
+
2
+ module Enumerable
3
+
4
+ # In-place-Variante von transpose.
5
+ def transpose!
6
+ self.replace(self.transpose)
7
+ end
8
+
9
+
10
+ end
11
+
12
+ # Enumerable, EnumerableNumerics, EnumerableStrings, EnumerableEnumerables
13
+ #
14
+ # ==Aufzählungen aufzählbarer Objekte
15
+ # Für zweidimensionale Enumerables bzw. Aufzählungen von Objekten, die wiederum aufzählbar sind.
16
+ # Ein ArrayOfEnumerables inkludiert dieses Modul.
17
+ #
18
+ module EnumerableEnumerables
19
+
20
+ # Macht das Enumerable rechteckig.
21
+ # Maßgeblich ist die erste Zeile.
22
+ #
23
+ # Tests und Beispiele siehe TestKyaniteEnumerableEnumerables.
24
+ def rectangle
25
+ qsize = self[0].size
26
+ result = []
27
+ self.each do |zeile|
28
+ size_diff = qsize - zeile.size
29
+ # so lassen oder zuschneiden
30
+ if size_diff <= 0
31
+ result << zeile[0..qsize-1]
32
+ # ergänzen
33
+ else
34
+ result << zeile + ([nil] * size_diff)
35
+ end # if
36
+ end # each zeile
37
+ result
38
+ end # def
39
+
40
+ end
41
+
42
+ # Array, ArrayOfNumerics, ArrayOfStrings, ArrayOfEnumerables
43
+ #
44
+ # Ein ArrayOfEnumerables ist ein Array mit inkludiertem Modul EnumerableEnumerables
45
+ #
46
+ class ArrayOfEnumerables < Array
47
+ include EnumerableEnumerables
48
+ end
49
+
50
+
51
+ class Array
52
+
53
+ # Liefert ein ArrayOfEnumerables (das ist ein Array mit inkludiertem Modul EnumerableEnumerables)
54
+ def to_array_of_enumerables
55
+ ArrayOfEnumerables.new(self)
56
+ end
57
+ end
58
+
59
+
60
+ class NilClass
61
+ def transpose!; nil; end
62
+ def transpose; nil; end
63
+ def rectangle; nil; end
64
+ end
65
+
66
+
67
+
68
+
69
+
70
+
@@ -0,0 +1,171 @@
1
+
2
+ # Enumerable, EnumerableNumerics, EnumerableStrings, EnumerableEnumerables
3
+ #
4
+ # ==Aufzählungen numerischer Objekte
5
+ # Ein ArrayOfNumerics inkludiert dieses Modul.
6
+ #
7
+ module EnumerableNumerics
8
+
9
+
10
+ # ======================================================================================
11
+ # :section: Mittelwerte
12
+ #
13
+
14
+ # Arithmetrischer Mittelwert
15
+ # Tests und Beispiele siehe TestKyaniteEnumerableNumerics.
16
+ #
17
+ def mean
18
+ self.inject(0.0) { |sum, i | sum += i } / self.length.to_f
19
+ end
20
+ alias avg mean
21
+ alias average mean
22
+ alias mean_arithmetric mean
23
+
24
+ # Harmonischer Mittelwert
25
+ #
26
+ # Normalerweise ist der harmonische Mittelwert nur für positive Zahlen sinnvoll definiert.
27
+ # Mit der Option <tt>:allow_negative => true </tt>kann man aber auch negative Zahlen mit einbeziehen.
28
+ # Dann wird der harmonische Mittelwert aller positiven Elemente mit dem
29
+ # harmonische Mittelwert aller negativen Elemente verrechnet (als gewichtetes arithmetisches Mittel).
30
+ #
31
+ # Tests und Beispiele siehe TestKyaniteEnumerableNumerics.
32
+ #
33
+ def mean_harmonic( options={} )
34
+ return 0 if self.empty?
35
+ return self.first if self.size == 1
36
+ allow_negative = options[:allow_negative] || false
37
+ unless allow_negative
38
+ summe = 0
39
+ self.each { |x| summe += ( 1.0/x ) }
40
+ return self.size / summe
41
+
42
+ else
43
+ positives = []
44
+ negatives = []
45
+ self.each do |e|
46
+ if e >= 0
47
+ positives << e
48
+ else
49
+ negatives << -e
50
+ end
51
+ end #each
52
+ if positives.size > 0
53
+ if negatives.size > 0
54
+ return ( positives.mean_harmonic(:allow_negative => false) * positives.size -
55
+ negatives.mean_harmonic(:allow_negative => false) * negatives.size
56
+ ) / (positives.size + negatives.size).to_f
57
+ else
58
+ return positives.mean_harmonic(:allow_negative => false)
59
+ end
60
+ else
61
+ return -negatives.mean_harmonic(:allow_negative => false)
62
+ end
63
+
64
+ end #if allow_negative
65
+ end #def
66
+
67
+
68
+ # Geometrischer Mittelwert
69
+ def mean_geometric
70
+ self.product**( 1.0/self.size )
71
+ end
72
+
73
+
74
+
75
+ # ======================================================================================
76
+ # :section: Summe, Produkt, Parallelschaltung
77
+ #
78
+
79
+
80
+ # Summe
81
+ #
82
+ # Methode darf nicht sum heißen, kollidiert sonst schnell mit ActiveRecord.
83
+ # Tests und Beispiele siehe TestKyaniteEnumerableNumerics.
84
+ #
85
+ def summation
86
+ self.inject(0.0) { |sum, i | sum += i }
87
+ end
88
+
89
+
90
+ # Produkt
91
+ #
92
+ # Tests und Beispiele siehe TestKyaniteEnumerableNumerics.
93
+ #
94
+ def product
95
+ self.inject(1.0) { |prd, i | prd *= i }
96
+ end
97
+ alias prd product
98
+
99
+
100
+ # Ergebnis entspricht der Parallelschaltung von Widerständen.
101
+ # Tests und Beispiele siehe TestKyaniteEnumerableNumerics.
102
+ #
103
+ def parallel
104
+ mean_harmonic / size
105
+ end
106
+
107
+
108
+
109
+ end #class
110
+
111
+
112
+
113
+ # Array, ArrayOfNumerics, ArrayOfStrings, ArrayOfEnumerables
114
+ #
115
+ # Ein ArrayOfNumerics ist ein Array mit inkludiertem Modul EnumerableNumerics
116
+ #
117
+ class ArrayOfNumerics < Array
118
+ include EnumerableNumerics
119
+ end
120
+
121
+
122
+
123
+ class Array
124
+
125
+ # Liefert ein ArrayOfNumerics (das ist ein Array mit inkludiertem Modul EnumerableNumerics)
126
+ def to_array_of_numerics
127
+ ArrayOfNumerics.new(self)
128
+ end
129
+
130
+ end
131
+
132
+
133
+
134
+ class NilClass
135
+ def average; nil; end
136
+ def avg; nil; end
137
+ def mean; nil; end
138
+ def mean_arithmetric; nil; end
139
+ def mean_geometric; nil; end
140
+ def mean_harmonic(*a); nil; end
141
+ def parallel(*a); nil; end
142
+ def prd; nil; end
143
+ def product; nil; end
144
+ def sum; nil; end
145
+ def summation; nil; end
146
+ end
147
+
148
+
149
+ # ==================================================================================
150
+ # Ausprobieren
151
+ #
152
+ if $0 == __FILE__
153
+ require 'perception'
154
+ class Array
155
+ include EnumerableNumerics
156
+ end
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+ end
166
+
167
+
168
+
169
+
170
+
171
+
@@ -0,0 +1,58 @@
1
+
2
+ # Enumerable, EnumerableNumerics, EnumerableStrings, EnumerableEnumerables
3
+ #
4
+ # ==Aufzählungen textueller Objekte
5
+ # Ein ArrayOfStrings inkludiert dieses Modul.
6
+ #
7
+ module EnumerableStrings
8
+
9
+
10
+ # Bsp.:
11
+ # ['lut', 'lutm', 'lutmi', 'lutmil', 'lutmila', 'lutrika', 'lutrik', 'lutri', 'lutr', 'lut'].palindrom_rumpf =>
12
+ # ['lutm', 'lutmi', 'lutmil', 'lutmila', 'lutrika', 'lutrik', 'lutri', 'lutr']
13
+ # d.h. vorne und hinten wird alles Gleiche weggestrichen.
14
+ #
15
+ # Tests und Beispiele siehe TestKyaniteEnumerableStrings.
16
+ #
17
+ def palindrom_rumpf
18
+ result = self.dup
19
+ 0.upto( size/2 - 1 ) do |i|
20
+ if result[0] == result[-1]
21
+ result.delete_at(0)
22
+ result.delete_at(-1)
23
+ end
24
+ end
25
+ result
26
+ end
27
+
28
+
29
+
30
+
31
+ end
32
+
33
+
34
+
35
+ # Array, ArrayOfNumerics, ArrayOfStrings, ArrayOfEnumerables
36
+ #
37
+ # Ein ArrayOfStrings ist ein Array mit inkludiertem Modul EnumerableStrings
38
+ #
39
+ class ArrayOfStrings < Array
40
+ include EnumerableStrings
41
+ end
42
+
43
+
44
+
45
+ class Array
46
+
47
+ # Liefert ein ArrayOfStrings (das ist ein Array mit inkludiertem Modul EnumerableStrings)
48
+ def to_array_of_strings
49
+ ArrayOfStrings.new(self)
50
+ end
51
+
52
+ end
53
+
54
+
55
+
56
+
57
+
58
+
@@ -0,0 +1,170 @@
1
+
2
+ #
3
+ # is_collection?
4
+ #
5
+
6
+ class Object
7
+
8
+ # Enthält ein Objekt mehrere Objekte?
9
+ # String und Range gelten nicht als Collection.
10
+ #
11
+ # Tests & Beispiele siehe TestKyaniteEnumerableStructure.
12
+ def is_collection?; false; end
13
+ end
14
+
15
+
16
+ module Enumerable
17
+
18
+ # Enthält ein Objekt mehrere Objekte?
19
+ # String und Range gelten nicht als Collection.
20
+ #
21
+ # Tests & Beispiele siehe TestKyaniteEnumerableStructure.
22
+ def is_collection?; true; end
23
+ end
24
+
25
+
26
+ class String # :nodoc:
27
+ def is_collection?; false; end
28
+ end
29
+
30
+
31
+ class Range # :nodoc:
32
+ def is_collection?; false; end
33
+ end
34
+
35
+
36
+
37
+
38
+ #
39
+ # Distribution
40
+ #
41
+
42
+
43
+ # Enumerable, EnumerableNumerics, EnumerableStrings, EnumerableEnumerables
44
+ #
45
+ # ==Allgemeine Aufzählungen
46
+ #
47
+ module Enumerable
48
+
49
+ # Liefert die Verteilung der size
50
+ # oder die Verteilung der class
51
+ # oder die Verteilung eines anderen Merkmals der aufgezählten Elemente.
52
+ #
53
+ # Tests & Beispiele siehe TestKyaniteEnumerableStructure.
54
+ #
55
+ def distribution( mode = :size)
56
+ verteilung = Hash.new
57
+ each do | element |
58
+ value = element.respond(mode)
59
+ if verteilung.has_key?(value)
60
+ verteilung[value] += 1
61
+ else
62
+ verteilung[value] = 1
63
+ end # if
64
+ end #each
65
+ verteilung.to_a.sort
66
+ end
67
+
68
+
69
+
70
+
71
+ #
72
+ # contentclass
73
+ #
74
+
75
+ # Was für Objekte beinhaltet die Collection?
76
+ # Liefert die Klasse der Contentelemente, oder <tt>Object</tt> wenn es verschiedene sind.
77
+ #
78
+ # Parameter ist die Genauigkeit, mit der der Inhalt geprüft wird.
79
+ # :precision => 1 nur das erste Element wird geprüft
80
+ # :precision => 2 das erste und das letzte Element werden geprüft (STANDARD)
81
+ # :precision => :all alle Elemente werden geprüft
82
+ # :ignore_nil => true NilClass wird nicht aufgeführt (STANDARD)
83
+ # :ignore_nil => false NilClass wird mit aufgeführt
84
+ #
85
+ # Tests & Beispiele siehe TestKyaniteEnumerableStructure.
86
+ #
87
+ def contentclass( options={} )
88
+ precision = options[:precision] || 2
89
+ ignore_nil = options[:ignore_nil]; ignore_nil = true if ignore_nil.nil?
90
+ return nil if self.empty?
91
+ case precision
92
+
93
+ when 1
94
+ result = self.first.class
95
+ if ( result == NilClass && ignore_nil )
96
+ return self.compact.contentclass( :precision => precision, :ignore_nil => false )
97
+ else
98
+ return result
99
+ end
100
+
101
+ when 2
102
+ f = self.first.class
103
+ l = self.last.class
104
+ if ( (f == NilClass || l == NilClass) && ignore_nil )
105
+ return self.compact.contentclass( :precision => precision, :ignore_nil => false )
106
+ end
107
+ if f == l
108
+ return f
109
+ else
110
+ result = f.ancestors & l.ancestors
111
+ #see result - [Object, Kernel, Precision, Perception::NumericI, PP::ObjectMixin, KyaniteKernel]
112
+ return Numeric if result.include?(Numeric)
113
+ return Enumerable if result.include?(Enumerable)
114
+ return Object
115
+ end
116
+
117
+ when :all
118
+ unless ( self.kind_of?(Hash) || self.kind_of?(Dictionary) )
119
+ c = self.collect {|e| e.class}
120
+ else
121
+ c = self.collect {| key, value | value.class}
122
+ end
123
+ c = c - [NilClass] if ignore_nil
124
+ c.uniq!
125
+ if c.empty?
126
+ return nil if ignore_nil
127
+ return NilClass
128
+ end
129
+ return c[0] if c.size == 1
130
+ result = c[0].ancestors
131
+ c[1..-1].each do |e|
132
+ result = result & e.ancestors
133
+ end
134
+ #see result - [Object, Kernel, Precision, Perception::NumericI, PP::ObjectMixin, KyaniteKernel]
135
+ return Numeric if result.include?(Numeric)
136
+ return Enumerable if result.include?(Enumerable)
137
+ return Object
138
+
139
+ else # case precision
140
+ raise ArgumentError, ':precision should be 1, 2 or :all'
141
+ end #case
142
+
143
+ end #def
144
+
145
+ end #module
146
+
147
+
148
+
149
+
150
+
151
+
152
+ # ==================================================================================
153
+ # Ausprobieren
154
+ #
155
+ if $0 == __FILE__
156
+
157
+ require 'kyanite/smart_load_path'; smart_load_path
158
+ class Array
159
+ include Enumerable
160
+ end
161
+ require 'perception'
162
+
163
+ test = [ ]
164
+ see test.contentclass(:precision => :all)
165
+
166
+
167
+
168
+ end
169
+
170
+