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.
- 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
|