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