kyanite 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/0 start all Tests.bat +23 -0
- data/History.txt +4 -0
- data/License.txt +21 -0
- data/Manifest.txt +88 -0
- data/PostInstall.txt +4 -0
- data/README.txt +48 -0
- data/Rakefile.rb +79 -0
- data/init.rb +2 -0
- data/lib/kyanite.rb +39 -0
- data/lib/kyanite/array.rb +5 -0
- data/lib/kyanite/array/array.rb +172 -0
- data/lib/kyanite/array/array2.rb +140 -0
- data/lib/kyanite/array/matrix2.rb +120 -0
- data/lib/kyanite/array_of_enumerables.rb +2 -0
- data/lib/kyanite/array_of_numerics.rb +2 -0
- data/lib/kyanite/array_of_strings.rb +2 -0
- data/lib/kyanite/basics.rb +60 -0
- data/lib/kyanite/dictionary.rb +116 -0
- data/lib/kyanite/enumerable.rb +7 -0
- data/lib/kyanite/enumerable/enumerable_enumerables.rb +70 -0
- data/lib/kyanite/enumerable/enumerable_numerics.rb +171 -0
- data/lib/kyanite/enumerable/enumerable_strings.rb +58 -0
- data/lib/kyanite/enumerable/structure.rb +170 -0
- data/lib/kyanite/general.rb +8 -0
- data/lib/kyanite/general/callerutils.rb +128 -0
- data/lib/kyanite/general/classutils.rb +246 -0
- data/lib/kyanite/general/kernel.rb +105 -0
- data/lib/kyanite/general/nil.rb +64 -0
- data/lib/kyanite/general/object.rb +86 -0
- data/lib/kyanite/general/true_false.rb +65 -0
- data/lib/kyanite/general/undoable.rb +24 -0
- data/lib/kyanite/hash.rb +170 -0
- data/lib/kyanite/matrix2.rb +2 -0
- data/lib/kyanite/nil.rb +3 -0
- data/lib/kyanite/numeric.rb +4 -0
- data/lib/kyanite/numeric/float.rb +26 -0
- data/lib/kyanite/numeric/integer.rb +34 -0
- data/lib/kyanite/numeric/numeric.rb +45 -0
- data/lib/kyanite/operation.rb +5 -0
- data/lib/kyanite/operation/call_tracker.rb +69 -0
- data/lib/kyanite/operation/rake.rb +101 -0
- data/lib/kyanite/operation/regexp.rb +23 -0
- data/lib/kyanite/operation/unit_test.rb +53 -0
- data/lib/kyanite/optimizer.rb +119 -0
- data/lib/kyanite/rake.rb +2 -0
- data/lib/kyanite/range.rb +54 -0
- data/lib/kyanite/set.rb +219 -0
- data/lib/kyanite/smart_load_path.rb +2 -0
- data/lib/kyanite/string.rb +13 -0
- data/lib/kyanite/string/cast.rb +104 -0
- data/lib/kyanite/string/chars.rb +184 -0
- data/lib/kyanite/string/chars_const.rb +190 -0
- data/lib/kyanite/string/diff.rb +78 -0
- data/lib/kyanite/string/div.rb +19 -0
- data/lib/kyanite/string/include.rb +43 -0
- data/lib/kyanite/string/list.rb +84 -0
- data/lib/kyanite/string/mgsub.rb +35 -0
- data/lib/kyanite/string/nested.rb +253 -0
- data/lib/kyanite/string/random.rb +69 -0
- data/lib/kyanite/string/split.rb +136 -0
- data/lib/kyanite/symbol.rb +19 -0
- data/lib/kyanite/tree.rb +99 -0
- data/lib/kyanite/undoable.rb +2 -0
- data/lib/kyanite/unit_test.rb +2 -0
- data/test/_start_all.rb +17 -0
- data/test/array/test_array.rb +106 -0
- data/test/array/test_matrix2.rb +162 -0
- data/test/enumerable/test_enumerable_enumerables.rb +46 -0
- data/test/enumerable/test_enumerable_numerics.rb +93 -0
- data/test/enumerable/test_enumerable_strings.rb +22 -0
- data/test/enumerable/test_structure.rb +220 -0
- data/test/general/test_classutils.rb +45 -0
- data/test/general/test_nil.rb +44 -0
- data/test/general/test_object.rb +49 -0
- data/test/general/test_true_false.rb +28 -0
- data/test/numeric/test_numeric_integer.rb +28 -0
- data/test/string/test_cast.rb +108 -0
- data/test/string/test_chars.rb +255 -0
- data/test/string/test_diff.rb +95 -0
- data/test/string/test_list.rb +141 -0
- data/test/string/test_nested.rb +361 -0
- data/test/string/test_split.rb +187 -0
- data/test/test_dictionary.rb +128 -0
- data/test/test_hash.rb +59 -0
- data/test/test_optimizer.rb +150 -0
- data/test/test_range.rb +41 -0
- data/test/test_set.rb +210 -0
- data/test/test_tree.rb +94 -0
- metadata +217 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
# -----------------------------------------------------------------------------------------
|
4
|
+
# Nil -- hier nur Ruby Core-Methoden!
|
5
|
+
#
|
6
|
+
|
7
|
+
class NilClass
|
8
|
+
|
9
|
+
# Spezielle Rückgaben
|
10
|
+
|
11
|
+
def <<(element); [element]; end
|
12
|
+
def empty?; true; end
|
13
|
+
def length; 0; end
|
14
|
+
def size; 0; end
|
15
|
+
def count(*a); 0; end
|
16
|
+
def split(*a); []; end
|
17
|
+
def =~(other); false; end
|
18
|
+
def include?(*a); false; end # redundante Definition
|
19
|
+
|
20
|
+
# Rückgabe nil
|
21
|
+
def -(other); nil; end
|
22
|
+
def +(other); nil; end
|
23
|
+
def <(*a); nil; end
|
24
|
+
def <=>(*a); nil; end
|
25
|
+
def >(*a); nil; end
|
26
|
+
def abs; nil; end
|
27
|
+
def chop; nil; end
|
28
|
+
def clear; nil; end
|
29
|
+
def code; nil; end
|
30
|
+
def collect(&block); nil; end
|
31
|
+
def compact; nil; end
|
32
|
+
def downcase; nil; end
|
33
|
+
def dup; nil; end
|
34
|
+
def each(*a); nil; end
|
35
|
+
# def first; nil; end
|
36
|
+
def grep(*a); nil; end
|
37
|
+
def gsub!(*a); nil; end
|
38
|
+
def gsub(*a); nil; end
|
39
|
+
def join; nil; end
|
40
|
+
# def last; nil; end
|
41
|
+
def pop(*a); nil; end
|
42
|
+
def push(*a); nil; end
|
43
|
+
def split(*a); nil; end
|
44
|
+
def strip!(*a); nil; end
|
45
|
+
def strip(*a); nil; end
|
46
|
+
def sub(*a); nil; end
|
47
|
+
def to_i; nil; end
|
48
|
+
def to_integer; nil; end
|
49
|
+
def to_sym; nil; end
|
50
|
+
def uniq!; nil; end
|
51
|
+
def uniq; nil; end
|
52
|
+
def [](*a); nil; end
|
53
|
+
def []=(*a); nil; end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
|
2
|
+
# Multibyte-Unterstützung von ActiveSupport
|
3
|
+
$KCODE = 'UTF8'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
class Object
|
7
|
+
|
8
|
+
# <tt> false </tt>
|
9
|
+
#
|
10
|
+
# Test siehe TestTrueFalse#test_blank.
|
11
|
+
def blank?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
# Quelle: Facets http://facets.rubyforge.org/quick/rdoc/core/classes/Kernel.html#M000379
|
16
|
+
def respond(sym, *args)
|
17
|
+
return nil if not respond_to?(sym)
|
18
|
+
send(sym, *args)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def deep_copy
|
23
|
+
Marshal.load( Marshal.dump( self ) )
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
# Ist ein Objekt numerisch?
|
28
|
+
#
|
29
|
+
# Tests & Beispiele siehe TestObject#test_is_numeric
|
30
|
+
def is_numeric?
|
31
|
+
Float self
|
32
|
+
rescue Exception => e
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# <tt> false </tt>
|
38
|
+
def empty?
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
# Liefert nil, wenn die Condition erfüllt ist. Sonst self.
|
47
|
+
#
|
48
|
+
def to_nil(condition = :empty)
|
49
|
+
return nil if self.respond(condition.to_s + '?')
|
50
|
+
return self
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# Liefert nil, wenn die Condition nicht erfüllt ist. Sonst self.
|
55
|
+
#
|
56
|
+
def to_nil_unless(condition = :empty)
|
57
|
+
return nil unless self.respond(condition.to_s + '?')
|
58
|
+
return self
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# Findet den Namen einer Ruby-Konstanten anhand seines Wertes.
|
63
|
+
# Funktioniert so nicht. Seltsamersweise funktioniert es aber, wenn man den Quelltext dieser Methode direkt ausführt.
|
64
|
+
# Verwendet in der Info-Ansicht des Scaffoldings.
|
65
|
+
#
|
66
|
+
def name_of_constant(wert_der_konstanten)
|
67
|
+
Object.constants.find { |c| Object.const_get(c) == wert_der_konstanten}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
class NilClass
|
75
|
+
|
76
|
+
def blank?; false; end
|
77
|
+
def is_numeric?; false; end
|
78
|
+
def to_nil; nil; end
|
79
|
+
def to_nil_unless(*a); nil; end
|
80
|
+
def name_of_constant(*a); nil; end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class TrueClass
|
4
|
+
|
5
|
+
# <tt> 1 </tt>
|
6
|
+
def to_i; 1; end
|
7
|
+
|
8
|
+
# <tt> self </tt>
|
9
|
+
def strip; self; end
|
10
|
+
|
11
|
+
# <tt> self </tt>
|
12
|
+
def dup; self; end
|
13
|
+
|
14
|
+
def <=>(other)
|
15
|
+
return 1 if ! other
|
16
|
+
return 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def blank?; false; end
|
20
|
+
|
21
|
+
|
22
|
+
end # class
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
class FalseClass
|
29
|
+
|
30
|
+
# <tt> 0 </tt>
|
31
|
+
def to_i; 0; end
|
32
|
+
|
33
|
+
# <tt> self </tt>
|
34
|
+
def strip; self; end
|
35
|
+
|
36
|
+
# <tt> self </tt>
|
37
|
+
def dup; self; end
|
38
|
+
|
39
|
+
# TestTrueFalse#test_raumschiff_operator
|
40
|
+
def <=>(other)
|
41
|
+
return -1 if other
|
42
|
+
return 0
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# umdefiniert!
|
47
|
+
#
|
48
|
+
# TestTrueFalse#test_blank
|
49
|
+
def blank?; self; end
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module Undoable
|
3
|
+
|
4
|
+
@@undoable_history = Hash.new
|
5
|
+
|
6
|
+
def save(method=:dup)
|
7
|
+
return if self == @@undoable_history[self.object_id] # nichts zu tun
|
8
|
+
@@undoable_history[self.object_id] = self.send(method)
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_and_keep
|
12
|
+
@@undoable_history[self.object_id]
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_and_delete
|
16
|
+
@@undoable_history.delete(self.object_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.clear
|
20
|
+
@@undoable_history.clear
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
end
|
data/lib/kyanite/hash.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
|
2
|
+
require 'facets/hash/merge' # Methoden reverse_merge, reverse_merge!
|
3
|
+
require 'active_support/core_ext/hash/slice' # Slice a hash to include only the given keys.
|
4
|
+
require 'kyanite/enumerable' # is_collection?
|
5
|
+
|
6
|
+
class Hash
|
7
|
+
include ActiveSupport::CoreExtensions::Hash::Slice
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# Aus {Facets/Hash}[http://facets.rubyforge.org/api/core/classes/Hash.html] eingefügt:
|
12
|
+
# * *reverse_merge* <tt>(other_hash) </tt> Beispiel: <tt>options.reverse_merge!(:key => default_value)</tt>
|
13
|
+
#
|
14
|
+
#
|
15
|
+
# ==Generelle Anmerkungen zu Hashes
|
16
|
+
# * Definiert man in irgendeinem Objekt die Methode <tt>==(other)</tt>, so muss man auch die Methode +hash+ neu definieren!
|
17
|
+
# * Rubys +delete+ und +delete_if+ verändern den Hash! Siehe TestHash#test_delete
|
18
|
+
#
|
19
|
+
#
|
20
|
+
class Hash
|
21
|
+
|
22
|
+
|
23
|
+
if RUBY_VERSION < "1.9"
|
24
|
+
# Credit: Paul Murur http://mucur.name/posts/when-is-a-set-not-a-set
|
25
|
+
# Create a hash based on the keys and values.
|
26
|
+
def hash
|
27
|
+
keys.hash + values.hash + (default ? default.hash : 0)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Credit: Paul Murur http://mucur.name/posts/when-is-a-set-not-a-set
|
31
|
+
# To determine whether two hashes are the same, compare
|
32
|
+
# their hashes.
|
33
|
+
def eql?(other)
|
34
|
+
hash == other.hash
|
35
|
+
end
|
36
|
+
end # Ruby Version
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
# Entfernt alle Key-Value-Paare mit <b>nil-Keys</b> in-place.
|
41
|
+
#
|
42
|
+
# Tests: TestHash#test_delete
|
43
|
+
def compact_keys!
|
44
|
+
delete_if {|key, value| key.nil? }
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# Entfernt alle alle Key-Value-Paare mit <b>nil-Values</b> in-place.
|
49
|
+
#
|
50
|
+
# Tests: TestHash#test_compact
|
51
|
+
def compact_values!
|
52
|
+
delete_if {|key, value| value.nil? }
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# Entfernt das Key-Value-Paar mit einem bestimmten Key in-place.
|
57
|
+
# Rückgabe ist der modifizierte Hash (im Gegensatz zur +delete+-Methode, die das entfernte Key-Value-Paar zurückgibt! ).
|
58
|
+
def delete_key(key)
|
59
|
+
delete_if { |k,v| k == key }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Entfernt alle Key-Value-Paare mit einem bestimmten Value in-place.
|
63
|
+
#
|
64
|
+
def delete_value(value)
|
65
|
+
delete_if { |k,v| v == value }
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# erzwingt ein Array der Länge 1, wenn sowohl Einzelwerte als auch Arrays erlaubt sind.
|
70
|
+
# Beispiel:<tt> inputoptions = options.arrayize(:skip, :debug) </tt>
|
71
|
+
#
|
72
|
+
def arrayize(*keys)
|
73
|
+
keys.each do |k|
|
74
|
+
if self[k] && !self[k].respond_to?(:first)
|
75
|
+
self[k] = [self[k]]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
# Greift auf den Hash mit nicht-ganz-passenden Schlüsseln zu
|
84
|
+
def fuzzyget(key, level = 3)
|
85
|
+
try = self[key]
|
86
|
+
return try if try || level <= 0
|
87
|
+
try = self[key.to_s.downcase2]
|
88
|
+
return try if try || level <= 1
|
89
|
+
try = self[key.to_s.mysqlize]
|
90
|
+
return try if try || level <= 2
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# Liefert die Verteilung der Size / Class / etc. aller Values.
|
95
|
+
# Die Keys werden ignoriert.
|
96
|
+
#
|
97
|
+
def distribution( mode = :size)
|
98
|
+
verteilung = Hash.new
|
99
|
+
each do | key, element |
|
100
|
+
value = element.respond(mode)
|
101
|
+
if verteilung.has_key?(value)
|
102
|
+
verteilung[value] += 1
|
103
|
+
else
|
104
|
+
verteilung[value] = 1
|
105
|
+
end # if
|
106
|
+
end #each
|
107
|
+
verteilung.to_a.sort
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# liefert irgendein Value
|
112
|
+
def first
|
113
|
+
self.each do |key, value|
|
114
|
+
return value
|
115
|
+
end
|
116
|
+
end #def
|
117
|
+
|
118
|
+
|
119
|
+
# liefert irgendein anderes Value
|
120
|
+
def last
|
121
|
+
first = nil
|
122
|
+
self.each do |key, value|
|
123
|
+
if first.nil?
|
124
|
+
first = value
|
125
|
+
next
|
126
|
+
else
|
127
|
+
return value
|
128
|
+
end #if
|
129
|
+
end #do
|
130
|
+
end #def
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
end #class
|
137
|
+
|
138
|
+
|
139
|
+
class NilClass
|
140
|
+
def compact_keys!; nil; end
|
141
|
+
def compact_values!; nil; end
|
142
|
+
def delete_key(*a); nil; end
|
143
|
+
def delete_value(*a); nil; end
|
144
|
+
def arrayize(*a); nil; end
|
145
|
+
def fuzzyget(*a); nil; end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
# ---------------------------------------------------------
|
152
|
+
# Ausprobieren
|
153
|
+
#
|
154
|
+
if $0 == __FILE__
|
155
|
+
|
156
|
+
require 'perception'
|
157
|
+
test = {:b => 2, :a => 1, :c => 3}
|
158
|
+
see test.first
|
159
|
+
see test.last
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
|
170
|
+
|
data/lib/kyanite/nil.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
Infinity = 1.0/0 unless defined? Infinity
|
3
|
+
Googol = 10**100 unless defined? Googol
|
4
|
+
|
5
|
+
|
6
|
+
class Float
|
7
|
+
|
8
|
+
# 1.9 == 1.8 + 0.1 => false
|
9
|
+
# 1.9.approx(1.8 + 0.1) => true
|
10
|
+
# 98.6.approx(98.66) => false
|
11
|
+
# 98.6.approx(98.66, 0.001) => true
|
12
|
+
# Copyright 2006 O'Reilly Media, Ruby Cookbook, by Lucas Carlson and Leonard Richardson
|
13
|
+
#
|
14
|
+
def approx(other, relative_epsilon=Float::EPSILON, epsilon=Float::EPSILON)
|
15
|
+
difference = other - self
|
16
|
+
return true if difference.abs <= epsilon
|
17
|
+
relative_error = (difference / (self > other ? self : other)).abs
|
18
|
+
return relative_error <= relative_epsilon
|
19
|
+
end
|
20
|
+
# http://oreilly.com/catalog/9780596523695/
|
21
|
+
# Ruby Cookbook, by Lucas Carlson and Leonard Richardson
|
22
|
+
# Copyright 2006 O'Reilly Media
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
end
|