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,2 @@
1
+
2
+ require 'kyanite/operation/rake'
@@ -0,0 +1,54 @@
1
+
2
+ require 'facets/range/combine'
3
+ require 'facets/range/within'
4
+ require 'kyanite/enumerable' # is_collection? ist f�r Ranges false
5
+
6
+
7
+ # Aus Facets eingef�gt:
8
+ # * umbrella(r)
9
+ # * within?
10
+ # * combine(r)
11
+ #
12
+ class Range
13
+
14
+ # Invertiert den Range, mit dem ein Ausschnitt eines Strings oder eines Arrays bestimmt wird.
15
+ # Liefert einen Range, mit dem der inverse Teil des Strings ausgew�hlt werden kann.
16
+ # Beispiele siehe TestKyaniteRange.
17
+ #
18
+ def invert_index
19
+
20
+ # hinteren Teil ausgeben
21
+ if first == 0
22
+ return (1..0) if last == -1 # leer
23
+ return (last+1..-1) # hinterer Teil
24
+
25
+ # vorderen Teil ausgeben
26
+ else
27
+ return (0..first-1) if last == -1 # vorderer Teil
28
+
29
+ end
30
+
31
+ # �u�ere Teile ausgeben
32
+ return [(first..-1).invert_index, (0..last).invert_index]
33
+ end # def
34
+
35
+
36
+
37
+ end # class
38
+
39
+
40
+
41
+
42
+
43
+ class NilClass
44
+ def invert_index; nil; end
45
+ def umbrella(*a); nil; end
46
+ def combine(*a); nil; end
47
+ def within?(*a); nil; end
48
+ end
49
+
50
+
51
+
52
+
53
+
54
+
@@ -0,0 +1,219 @@
1
+
2
+ require 'set'
3
+ require 'kyanite/enumerable' # is_collection?
4
+ require 'kyanite/general/kernel' # silence_warnings
5
+ require 'kyanite/dictionary' # Geordneter Hash
6
+ require 'kyanite/symbol' # damit man auch Symbols aufnehmen kann
7
+ require 'kyanite/hash' # Korrektur der Methoden hash und eql?
8
+
9
+
10
+ # Set OrderedSet SortedSet Array
11
+ #
12
+ # = Unterschiede der verschiedenen Set-Klassen
13
+ # * Ein {Set}[http://www.ruby-doc.org/core/classes/Set.html] ist ungeordnet.
14
+ # Beispiele: TestKyaniteSet#test_set
15
+ # * Ein OrderedSet ist geordnet, es behält die ursprüngliche Reihenfolge, wird aber nicht kontinuierlich neu sortiert.
16
+ # Es sei denn, man sorgt dafür mit Dictionary#order_by
17
+ # Beispiele: TestKyaniteSet#test_ordered_set
18
+ # * Ein {SortedSet}[http://www.ruby-doc.org/core/classes/SortedSet.html] ist geordnet und sortiert. Es behält immer die Sortierung.
19
+ # Beispiele: TestKyaniteSet#test_sorted_set
20
+ #
21
+ class Set
22
+
23
+ # Fügt das Element an das Set an.
24
+ def push(elt)
25
+ self << elt
26
+ end
27
+
28
+
29
+ # Vergleichsoperator, Standardsortierung: Size
30
+ def <=>(other)
31
+ self.size <=> other.size
32
+ end
33
+
34
+ # def hash_raw
35
+ # @hash
36
+ # end
37
+
38
+ # Liefert irgendein Element.
39
+ def first
40
+ @hash.each do |key, value|
41
+ return key
42
+ end
43
+ end #def
44
+
45
+
46
+ # Liefert irgendein anderes Element.
47
+ def last
48
+ first = nil
49
+ @hash.each do |key, value|
50
+ if first.nil?
51
+ first = key
52
+ next
53
+ else
54
+ return key
55
+ end #if
56
+ end #do
57
+ end #def
58
+
59
+ end
60
+
61
+
62
+ # Set OrderedSet SortedSet Array
63
+ #
64
+ # Ein OrderedSet ist geordnet, es behält die ursprüngliche Reihenfolge, wird aber nicht kontinuierlich neu sortiert.
65
+ # Es sei denn, man sorgt dafür mit Dictionary#order_by
66
+ #
67
+ class OrderedSet < Set
68
+
69
+ def initialize(enum = nil, &block) # :yields: o
70
+ @hash ||= Dictionary.new
71
+ enum.nil? and return
72
+ if block
73
+ enum.each { |o| add(block[o]) }
74
+ else
75
+ merge(enum)
76
+ end
77
+ end
78
+
79
+
80
+ # Liefert das n-te Element.
81
+ def [](index)
82
+ @hash.order[index]
83
+ end
84
+
85
+
86
+ def zugrundeliegendes_dictionary # :nodoc:
87
+ @hash
88
+ end
89
+
90
+ # Liefert ein entsprechendes Array.
91
+ # Diese Methode ist schnell. Es muss nichts umgeformt werden. Andere Methoden können also gerne auf to_a basieren.
92
+ def to_a
93
+ @hash.order
94
+ end
95
+
96
+
97
+ def ==(other)
98
+ silence_warnings do
99
+ self.to_a.to_set == other.to_a.to_set
100
+ end
101
+ end
102
+
103
+ # Wie Array#index
104
+ def index(object)
105
+ self.to_a.index(object)
106
+ end
107
+
108
+ def each
109
+ to_a.each { |e| yield( e ) }
110
+ self
111
+ end
112
+
113
+ def order_by( &block )
114
+ @hash.order_by( &block )
115
+ end
116
+
117
+ def first
118
+ self[0]
119
+ end
120
+
121
+ def last
122
+ self[-1]
123
+ end
124
+
125
+
126
+
127
+ end # class
128
+
129
+
130
+ # Set OrderedSet SortedSet Array
131
+ #
132
+ # Ein {SortedSet}[http://www.ruby-doc.org/core/classes/SortedSet.html] ist geordnet und sortiert. Es behält immer die Sortierung.
133
+ # Beispiele: TestKyaniteSet#test_sorted_set
134
+ #
135
+ class SortedSet
136
+
137
+ # Liefert das n-te Element.
138
+ # ineffizient!!
139
+ def [](index)
140
+ self.to_a[index]
141
+ end
142
+
143
+ def first
144
+ self[0]
145
+ end
146
+
147
+ def last
148
+ self[-1]
149
+ end
150
+
151
+ # das war mal auskommentiert, wird aber von nat_lang gebraucht
152
+ def unshift(e) # :nodoc:
153
+ self << e
154
+ end
155
+
156
+ def to_sorted_set
157
+ self
158
+ end
159
+
160
+ end # class
161
+
162
+
163
+
164
+
165
+
166
+ class Array
167
+
168
+ # Liefert ein OrderedSet, das dem Array entspricht.
169
+ # Übersicht über die verschiedenen Set-Klassen siehe Set.
170
+ # Tests siehe TestKyaniteSet#test_ordered_set
171
+ def to_ordered_set
172
+ OrderedSet.new(self)
173
+ end
174
+
175
+ # Liefert ein SortedSet, das dem Array entspricht.
176
+ # Übersicht über die verschiedenen Set-Klassen siehe Set.
177
+ # Tests siehe TestKyaniteSet#test_sorted_set
178
+ def to_sorted_set
179
+ SortedSet.new(self)
180
+ end
181
+
182
+
183
+ end # class
184
+
185
+
186
+
187
+
188
+ class NilClass
189
+ def to_set; Set.new; end
190
+ def to_sorted_set; SortedSet.new; end
191
+ def to_ordered_set; OrderedSet.new; end
192
+ end
193
+
194
+
195
+ class Object
196
+ def to_set; Set.new([self]); end
197
+ end
198
+
199
+
200
+ # ==================================================================================
201
+ # Ausprobieren
202
+ #
203
+ if $0 == __FILE__
204
+
205
+ require 'perception'
206
+ test = [:a, :b, :c].to_ordered_set
207
+ see :test # .inspect_see
208
+ see_pp test
209
+ seee.process_print( test, :method => :pp )
210
+ see :test# .inspect_see
211
+
212
+ end
213
+
214
+
215
+
216
+
217
+
218
+
219
+
@@ -0,0 +1,2 @@
1
+
2
+ require 'kyanite/general/kernel'
@@ -0,0 +1,13 @@
1
+
2
+ require 'kyanite/enumerable'
3
+
4
+ require 'kyanite/string/cast'
5
+ require 'kyanite/string/chars'
6
+ require 'kyanite/string/diff'
7
+ require 'kyanite/string/div'
8
+ require 'kyanite/string/include'
9
+ require 'kyanite/string/list'
10
+ require 'kyanite/string/mgsub'
11
+ require 'kyanite/string/nested'
12
+ require 'kyanite/string/random'
13
+ require 'kyanite/string/split'
@@ -0,0 +1,104 @@
1
+
2
+ require 'kyanite/numeric/integer'
3
+
4
+
5
+ class String
6
+
7
+ # ---------------------------------------------------------------------------------------------------------------------------------
8
+ # :section: Umwandeln
9
+ # Siehe auch KlippsteinMail::String#to_email_address und KlippsteinMail::String#to_domain
10
+
11
+
12
+
13
+ # Wandelt einen String in den plausibelsten Identifier um:
14
+ # self.strip.to_integer_optional
15
+ #
16
+ # Tests & Beispiele siehe TestString#test_to_identifier
17
+ def to_identifier
18
+ self.strip.to_integer_optional
19
+ end
20
+
21
+
22
+ # Wandelt einen String in einen Integer, auch dann, wenn die Zahl hinten angehängt wurde.
23
+ # Im Gegensatz zu to_i wird nil zurückgegeben, wenn keine Zahl drin war.
24
+ #
25
+ # Beispiele & Tests siehe TestString#test_to_integer
26
+ def to_integer
27
+ return nil unless self =~ /\d/
28
+ firsttry = self.to_i
29
+ return firsttry if firsttry != 0
30
+ return self.scan(/\d+/)[0].to_i
31
+ end
32
+
33
+
34
+ # Wandelt einen String in einen Integer.
35
+ # Im Gegensatz zu to_i wird self zurückgegeben, wenn der String nicht mit einer Zahl beginnt.
36
+ # Leere Strings werden in NIL umgewandelt.
37
+ #
38
+ # Beispiele & Tests siehe TestString#test_to_integer_optional
39
+ def to_integer_optional
40
+ return nil if self.empty?
41
+ return self unless (self =~ /^\d/ || self =~ /^-\d/ )
42
+ return self.to_i
43
+ end
44
+
45
+
46
+ def to_nil
47
+ return self unless self.empty?
48
+ nil
49
+ end
50
+
51
+
52
+
53
+
54
+ unless defined? HEX_CHARS
55
+ HEX_CHARS = '0123456789abcdef'.freeze
56
+ end
57
+
58
+ def to_x
59
+ hex = ''
60
+ each_byte { |byte|
61
+ # To get a hex representation for a char we just utilize
62
+ # the quotient and the remainder of division by base 16.
63
+ q, r = byte.divmod(16)
64
+ hex << HEX_CHARS[q] << HEX_CHARS[r]
65
+ }
66
+ hex
67
+ end
68
+
69
+
70
+ def from_x
71
+ str, q, first = '', 0, false
72
+ each_byte { |byte|
73
+ # Our hex chars are 2 bytes wide, so we have to keep track
74
+ # of whether it's the first or the second of the two.
75
+ #
76
+ # NOTE: inject with each_slice(2) would be a natural fit,
77
+ # but it's kind of slow...
78
+ if first = !first
79
+ q = HEX_CHARS.index(byte)
80
+ else
81
+ # Now we got both parts, so let's do the
82
+ # inverse of divmod(16): q * 16 + r
83
+ str << q * 16 + HEX_CHARS.index(byte)
84
+ end
85
+ }
86
+ str
87
+ end
88
+
89
+
90
+ end
91
+
92
+
93
+ class NilClass
94
+ def to_identifier; nil; end
95
+ def to_integer; nil; end
96
+ def to_integer_optional; nil; end
97
+ def to_nil(*a); nil; end
98
+ def to_x; nil; end
99
+ def from_x; nil; end
100
+ end
101
+
102
+
103
+
104
+
@@ -0,0 +1,184 @@
1
+
2
+ # Multibyte-Unterstützung von ActiveSupport
3
+ $KCODE = 'UTF8'
4
+ require 'active_support'
5
+
6
+ # reicht aber noch nicht, damit funktioniert tr noch nicht.
7
+ # Hier hilft jcode.
8
+ require 'jcode'
9
+
10
+ require 'kyanite/string/mgsub'
11
+ require 'kyanite/string/chars_const'
12
+
13
+
14
+ unless defined? MYSQL_REPLACES
15
+ MYSQL_REPLACES = [
16
+ [/ä/, 'a'],
17
+ [/ö/, 'o'],
18
+ [/ü/, 'u'],
19
+ [/Ä/, 'a'],
20
+ [/Ö/, 'o'],
21
+ [/Ü/, 'u'],
22
+ [/ss/, 'ß'],
23
+ [/SS/, 'ß']
24
+ ]
25
+ end
26
+
27
+
28
+
29
+
30
+
31
+
32
+ class String
33
+
34
+ # ---------------------------------------------------------------------------------------------------------------------------------
35
+ # :section: clear / format text
36
+ #
37
+
38
+ # Reduziert den String auf ein Base94-Encoding.
39
+ # * Wandelt àáâăäãāåạąæảấầắằÀÁÂĂÄÃĀÅẠĄÆẢẤẦẮẰ usw. in aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAA usw. um
40
+ # * entfernt anschließend alle Nicht-Asciizeichen
41
+ # * entfernt außerdem alle nichtdruckbaren Asciizeichen
42
+ # * Vorsicht: Newlines werden auch entfernt
43
+ #
44
+ #
45
+ # Tests & Beispiele siehe TestKyaniteStringClear
46
+ def reduce94( options={} )
47
+ dup.reduce94!
48
+ end
49
+
50
+ def reduce94!( options={} )
51
+ self.tr!(TR_FULL, TR_REDUCED)
52
+ self.delete!('^ -~')
53
+ self
54
+ end
55
+
56
+ # Reduziert den String auf ein Base53-Encoding,
57
+ # bestehend aus Großbuchstaben, Minuszeichen und zu Kleinbuchstaben umgeformten Sonderzeichen.
58
+ # Alle reduzierten Zeichen sind aber *klein*, streng genommen handelt es sich also um ein Base52-Encoding.
59
+ # Wandelt z.B. àáâăäãāåạąæảấầắằÀÁÂĂÄÃĀÅẠĄÆẢẤẦẮẰ usw. in aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa usw. um.
60
+ #
61
+ #
62
+ # Tests & Beispiele siehe TestKyaniteStringClear
63
+ def reduce53( options={} )
64
+ dup.reduce53!(options)
65
+ end
66
+
67
+
68
+ def reduce53!( options={} )
69
+ if options[:camelcase]
70
+ self.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1-\2')
71
+ self.gsub!(/([a-z\d])([A-Z])/,'\1-\2')
72
+ end
73
+ self.tr!('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
74
+ self.gsub!( 'ß', options[:german_sz] ) if options[:german_sz]
75
+ self.tr!(TR_FULL, TR_REDUCED.downcase)
76
+ unless options[:space]
77
+ self.delete!('^- A-Za-z')
78
+ else
79
+ self.tr!('^- A-Za-z', ' ')
80
+ end
81
+ self.gsub!(/-+/, ' ')
82
+ self.gsub!(/\s+/, ' ')
83
+ self.strip!
84
+ self.gsub!(/ /, '-')
85
+ self
86
+ end
87
+
88
+
89
+
90
+
91
+ # Formt einen String so um, dass man auch mit utf8_general_ci verglichene Strings wiedererkennen kann
92
+ #
93
+ # Tests & Beispiele siehe TestKyaniteStringClear
94
+ def mysqlize
95
+ self.mb_chars.tidy_bytes.mgsub(MYSQL_REPLACES).downcase.to_s
96
+ end
97
+
98
+
99
+
100
+ # macht die nötigen Korrekturen für EmailAddress und Domain.
101
+ #
102
+ # Tests & Beispiele siehe TestKyaniteStringClear
103
+ # def strip_downcase_iconv
104
+ #to #from
105
+ # Iconv.new('iso-8859-1','utf-8').iconv(self.strip.downcase2)
106
+ # rescue
107
+ # self.strip.downcase2
108
+ # end
109
+
110
+
111
+
112
+ # ---------------------------------------------------------------------------------------------------------------------------------
113
+ # :section: Groß- und Kleinschreibung
114
+ #
115
+
116
+ # Ein Überschreiben von downcase führt in Kombination mit ActiveSupport zu seltsamen Ergebnissen!
117
+ def downcase2
118
+ self.tr(TR_UPCASE, TR_DOWNCASE).downcase
119
+ end
120
+
121
+ def downcase2!
122
+ self.tr!(TR_UPCASE, TR_DOWNCASE).downcase!
123
+ end
124
+
125
+
126
+ # Ein Überschreiben von upcase führt in Kombination mit ActiveSupport zu seltsamen Ergebnissen!
127
+ def upcase2
128
+ self.tr(TR_DOWNCASE, TR_UPCASE).upcase
129
+ end
130
+
131
+ def upcase2!
132
+ self.tr!(TR_DOWNCASE, TR_UPCASE).upcase!
133
+ end
134
+
135
+
136
+ # Erster Buchstabe groß?
137
+ def capitalized?
138
+ self =~ TR_UPCASE_ALL_REGEXP
139
+ end
140
+
141
+ def upcase?
142
+ (self == self.upcase)
143
+ end
144
+
145
+ def downcase?
146
+ (self == self.upcase)
147
+ end
148
+
149
+ end
150
+
151
+
152
+
153
+
154
+
155
+ class NilClass
156
+ def reduce94; nil; end
157
+ def reduce94!; nil; end
158
+ def reduce53; nil; end
159
+ def reduce53!; nil; end
160
+ def capitalized?; false; end
161
+ def downcase2; nil; end
162
+ def downcase2!; nil; end
163
+ def mysqlize; nil; end
164
+ # def strip_downcase_iconv; nil; end
165
+ def upcase2; nil; end
166
+ def upcase2!; nil; end
167
+ end
168
+
169
+
170
+ # -----------------------------------------------------------------------------------------
171
+ # Ausprobieren
172
+ #
173
+ if $0 == __FILE__ then
174
+
175
+ require 'perception'
176
+
177
+ see 'Höllo'.reduce53
178
+
179
+
180
+
181
+ end
182
+
183
+
184
+