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