facets 2.8.2 → 2.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/AUTHORS +13 -11
  2. data/HISTORY.rdoc +58 -0
  3. data/lib/core/facets/array/recursive.rb +91 -0
  4. data/lib/core/facets/array/recursively.rb +2 -2
  5. data/lib/core/facets/array/traverse.rb +23 -6
  6. data/lib/core/facets/enumerable/collisions.rb +1 -0
  7. data/lib/core/facets/enumerable/commonality.rb +4 -2
  8. data/lib/core/facets/enumerable/graph.rb +37 -1
  9. data/lib/core/facets/enumerable/mash.rb +1 -39
  10. data/lib/core/facets/enumerable/recursive.rb +75 -0
  11. data/lib/core/facets/enumerable/visit.rb +30 -0
  12. data/lib/core/facets/file/ext.rb +36 -0
  13. data/lib/core/facets/hash/graph.rb +18 -0
  14. data/lib/core/facets/hash/mash.rb +1 -18
  15. data/lib/core/facets/hash/recursive.rb +180 -0
  16. data/lib/core/facets/hash/recursive_merge.rb +6 -0
  17. data/lib/core/facets/hash/recursively.rb +2 -2
  18. data/lib/core/facets/hash/to_module.rb +26 -0
  19. data/lib/core/facets/hash/to_proc.rb +2 -2
  20. data/lib/core/facets/hash/traverse.rb +19 -13
  21. data/lib/core/facets/kernel/assign.rb +63 -0
  22. data/lib/core/facets/kernel/assign_from.rb +45 -0
  23. data/lib/core/facets/kernel/dup.rb +63 -0
  24. data/lib/core/facets/kernel/instance.rb +156 -0
  25. data/lib/core/facets/kernel/instance_assign.rb +1 -22
  26. data/lib/core/facets/kernel/meta_def.rb +4 -0
  27. data/lib/core/facets/kernel/populate.rb +1 -74
  28. data/lib/core/facets/kernel/set_from.rb +2 -0
  29. data/lib/core/facets/kernel/try_dup.rb +1 -0
  30. data/lib/core/facets/module/set.rb +36 -0
  31. data/lib/core/facets/objectspace/reflect.rb +45 -0
  32. data/lib/core/facets/struct/attributes.rb +6 -2
  33. data/lib/core/facets/symbol/op_div.rb +19 -0
  34. data/lib/core/facets/to_hash.rb +12 -0
  35. data/lib/more/facets/casting_hash.rb +172 -0
  36. data/lib/more/facets/pathname.rb +36 -0
  37. data/lib/more/facets/prepend.rb +57 -0
  38. data/lib/more/facets/random.rb +19 -3
  39. data/lib/more/facets/roman.rb +46 -153
  40. data/lib/more/facets/stash.rb +148 -33
  41. data/meta/released +1 -1
  42. data/meta/version +1 -1
  43. data/test/core/array/test_recursive.rb +18 -0
  44. data/test/core/enumerable/test_recursive.rb +18 -0
  45. data/test/core/file/test_ext.rb +31 -0
  46. data/test/core/hash/test_recursive.rb +23 -0
  47. data/test/core/hash/test_to_module.rb +21 -0
  48. data/test/core/kernel/test_assign.rb +57 -0
  49. data/test/core/kernel/test_assign_from.rb +20 -0
  50. data/test/more/test_prepend.rb +28 -0
  51. data/test/more/test_random.rb +40 -4
  52. metadata +39 -10
  53. data/lib/core/facets/kernel/instance_variables.rb +0 -97
  54. data/lib/more/facets/instance_eval.rb +0 -50
  55. data/lib/more/facets/ioredirect.rb +0 -77
  56. data/lib/more/facets/plugin_manager.rb +0 -50
  57. data/test/core/kernel/test_populate.rb +0 -46
@@ -1,65 +1,180 @@
1
- require 'facets/hash/rekey'
2
-
3
- # = Hash
4
- #
5
1
  # Stash is just like Hash, except that all keys are
6
2
  # converted to Strings.
7
3
  #
8
- # This is rather fresh code, so is not yet complete.
9
- # For instnace, it currently does not ensure that default
10
- # keys are strings when using default_proc.
11
- #
4
+ # Note this doesn't yet handle default_proc.
5
+
12
6
  class Stash < Hash
13
7
 
14
- def fetch(k)
15
- super(k.to_s)
8
+ #
9
+ def self.[](*hash)
10
+ s = new
11
+ super(*hash).each{ |k,v| s[k] = v }
12
+ s
16
13
  end
17
14
 
18
- def store(k, v)
19
- super(k.to_s, v)
15
+ #
16
+ def [](key)
17
+ super(convert_key(key))
20
18
  end
21
19
 
22
- def has_key?(k)
23
- super(k.to_s)
20
+ #
21
+ def []=(key,value)
22
+ super(convert_key(key), value)
24
23
  end
25
24
 
26
- def key?(k)
27
- super(k.to_s)
25
+ #
26
+ def <<(other)
27
+ case other
28
+ when Hash
29
+ super(other.rekey{ |key| convert_key(key) })
30
+ when Array
31
+ self[other[0]] = other[1]
32
+ else
33
+ raise ArgumentError
34
+ end
28
35
  end
29
36
 
30
- def [](k)
31
- super(k.to_s)
37
+ #
38
+ def fetch(key)
39
+ super(convert_key(key))
32
40
  end
33
41
 
34
- def []=(k,v)
35
- super(k.to_s, v)
42
+ #
43
+ def store(key, value)
44
+ super(convert_key(key), value)
36
45
  end
37
46
 
38
- def <<(other)
39
- cash other
40
- when Hash
41
- super(other.rekey(&:to_s))
42
- when Array
43
- self[other[0].to_s] = other[1]
47
+ #
48
+ def key?(key)
49
+ super(convert_key(key))
50
+ end
51
+
52
+ #
53
+ def has_key?(key)
54
+ super(convert_key(key))
55
+ end
56
+
57
+ #
58
+ def include?(key)
59
+ super(convert_key(key))
60
+ end
61
+
62
+ #
63
+ def member?(key)
64
+ super(convert_key(key))
65
+ end
66
+
67
+
68
+ # Synonym for Hash#rekey, but modifies the receiver in place (and returns it).
69
+ #
70
+ # foo = { :name=>'Gavin', :wife=>:Lisa }.to_stash
71
+ # foo.rekey!{ |k| k.upcase } #=> { "NAME"=>"Gavin", "WIFE"=>:Lisa }
72
+ # foo.inspect #=> { "NAME"=>"Gavin", "WIFE"=>:Lisa }
73
+ #
74
+ def rekey!(*args, &block)
75
+ # for backward comptability (TODO: DEPRECATE?).
76
+ block = args.pop.to_sym.to_proc if args.size == 1
77
+ if args.empty?
78
+ block = lambda{|k| k} unless block
79
+ keys.each do |k|
80
+ nk = block[k]
81
+ self[nk.to_s]=delete(k) #if nk
82
+ end
44
83
  else
45
- raise ArgumentError
84
+ raise ArgumentError, "3 for 2" if block
85
+ to, from = *args
86
+ self[to] = delete(from) if has_key?(from)
46
87
  end
88
+ self
89
+ end
90
+
91
+ #
92
+ def rekey(*args, &block)
93
+ dup.rekey!(*args, &block)
94
+ end
95
+
96
+ #
97
+ def delete(key)
98
+ super(convert_key(key))
47
99
  end
48
100
 
101
+ #
49
102
  def update(other)
50
- super(other.rekey(&:to_s))
103
+ super(other.rekey{ |key| convert_key(key) })
51
104
  end
52
105
 
106
+ # Same as #update.
53
107
  def merge!(other)
54
- super(other.rekey(&:to_s))
108
+ super(other.rekey{ |key| convert_key(key) })
55
109
  end
56
-
57
- def replace
58
- super(other.rekey(&:to_s))
110
+
111
+ #
112
+ def merge(other)
113
+ super(other.rekey{ |key| convert_key(key) })
114
+ end
115
+
116
+ #
117
+ def replace(other)
118
+ super(other.rekey{ |key| convert_key(key) })
59
119
  end
60
120
 
121
+ #
61
122
  def values_at(*keys)
62
- super(keys.map{|k|k.to_s})
123
+ super(*keys.map{ |key| convert_key(key) })
124
+ end
125
+
126
+ #
127
+ def to_hash
128
+ h = {}
129
+ each{ |k,v| h[k] = v }
130
+ h
131
+ end
132
+
133
+ alias_method :to_h, :to_hash
134
+
135
+ private
136
+
137
+ def convert_key(key)
138
+ key.to_s
139
+ end
140
+
141
+ end
142
+
143
+ class Hash
144
+
145
+ # Convert a Hash to a Stash object.
146
+ def to_stash
147
+ Stash[self]
148
+ end
149
+
150
+ # Synonym for Hash#rekey, but modifies the receiver in place (and returns it).
151
+ #
152
+ # foo = { :name=>'Gavin', :wife=>:Lisa }
153
+ # foo.rekey!{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa }
154
+ # foo.inspect #=> { "name"=>"Gavin", "wife"=>:Lisa }
155
+ #
156
+ # This method comes from Ruby Facets.
157
+
158
+ def rekey!(*args, &block)
159
+ # for backward comptability (TODO: DEPRECATE).
160
+ block = args.pop.to_sym.to_proc if args.size == 1
161
+ if args.empty?
162
+ block = lambda{|k| k.to_sym} unless block
163
+ keys.each do |k|
164
+ nk = block[k]
165
+ self[nk]=delete(k) if nk
166
+ end
167
+ else
168
+ raise ArgumentError, "3 for 2" if block
169
+ to, from = *args
170
+ self[to] = self.delete(from) if self.has_key?(from)
171
+ end
172
+ self
173
+ end
174
+
175
+ # Non-inplace #rekey! method.
176
+ def rekey(*args, &block)
177
+ dup.rekey!(*args, &block)
63
178
  end
64
179
 
65
180
  end
@@ -1 +1 @@
1
- 2010-02-22
1
+ 2010-04-10
@@ -1 +1 @@
1
- 2.8.2
1
+ 2.8.3
@@ -0,0 +1,18 @@
1
+ require 'facets/array/recursive'
2
+ require 'test/unit'
3
+
4
+ class TestArrayRecursive < Test::Unit::TestCase
5
+
6
+ def test_each
7
+ a = []
8
+ [1,2,['a','b']].recursive.each{ |v| a << v }
9
+ assert_equal([1,2,'a','b'], a)
10
+ end
11
+
12
+ def test_map
13
+ a = [1,2,['a','b']].recursive.map{ |v| v.succ }
14
+ assert_equal([2,3,['b','c']], a)
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,18 @@
1
+ require 'facets/enumerable/recursive'
2
+ require 'test/unit'
3
+
4
+ class TestEnumerableRecursive < Test::Unit::TestCase
5
+
6
+ def test_each
7
+ a = []
8
+ [1,2,['a','b']].recursive.each{ |v| a << v }
9
+ assert_equal([1,2,'a','b'], a)
10
+ end
11
+
12
+ def test_map
13
+ a = [1,2,['a','b']].recursive.map{ |v| v.succ }
14
+ assert_equal([2,3,['b','c']], a)
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,31 @@
1
+ require 'facets/file/ext'
2
+ require 'test/unit'
3
+
4
+ class Test_File_Ext < Test::Unit::TestCase
5
+
6
+ # Standard file names.
7
+ def test_ext_standard
8
+ s = 'file.txt'
9
+ assert_equal('txt', File.ext(s))
10
+ assert_equal('file.old', File.ext(s, 'old'))
11
+ assert_equal('file', File.ext(s, ''))
12
+ end
13
+
14
+ # Initially no extension.
15
+ def test_ext_none
16
+ s = 'file'
17
+ assert_equal('', File.ext(s))
18
+ assert_equal('file.txt', File.ext(s, 'txt'))
19
+ assert_equal('file', File.ext(s, ''))
20
+ end
21
+
22
+ # Some non-standard case.
23
+ def test_ext_non_standard
24
+ s = '.profile'
25
+ assert_equal('', File.ext(s))
26
+ assert_equal('.profile.new', File.ext(s, 'new'))
27
+ assert_equal('.profile', File.ext(s, ''))
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,23 @@
1
+ require 'facets/hash/recursive'
2
+ require 'test/unit'
3
+
4
+ class TestHashRecursive < Test::Unit::TestCase
5
+
6
+ def test_each
7
+ a = []
8
+ {:a=>1,:b=>{:c=>3}}.recursive.each{ |k,v| a << [k,v] }
9
+ assert_equal([[:a,1],[:c,3], [:b,{:c=>3}]], a)
10
+ end
11
+
12
+ def test_map_moot
13
+ a = {:a=>1,:b=>{:c=>3}}.recursive.map{ |k,v| [k, v] }
14
+ assert_equal([[:a,1],[:b,[[:c,3]]]], a)
15
+ end
16
+
17
+ def test_map
18
+ a = {:a=>1,:b=>{:c=>3}}.recursive.map{ |k,v| Hash===v ? [k, v.succ] : [k,v] }
19
+ assert_equal([[:a,1],[:b,[[:c,3]]]], a)
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,21 @@
1
+ require 'facets/hash/to_module'
2
+ require 'test/unit'
3
+
4
+ class TC_Hash_To_Module < Test::Unit::TestCase
5
+
6
+ def test_to_module
7
+ h = { :a=>1, :b=>2 }
8
+ m = h.to_module
9
+ assert(Module === m)
10
+ end
11
+
12
+ def test_to_module_methods
13
+ h = { :a=>1, :b=>2 }
14
+ m = h.to_module
15
+ x = Class.new{ include m }.new
16
+ assert_equal( 1, x.a )
17
+ assert_equal( 2, x.b )
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,57 @@
1
+ require 'facets/kernel/assign.rb'
2
+ require 'test/unit'
3
+
4
+ class TestKernelAssign < Test::Unit::TestCase
5
+
6
+ C = Struct.new(:name, :address, :zip)
7
+
8
+ def test_assign_with_arguments
9
+ bob = C.new
10
+
11
+ bob.assign(:name, "Bob Sawyer")
12
+ bob.assign(:address, "123 Maple, Anytown NC")
13
+ bob.assign(:zip, 12345)
14
+
15
+ assert_equal("Bob Sawyer", bob.name)
16
+ assert_equal("123 Maple, Anytown NC", bob.address)
17
+ assert_equal(12345, bob.zip)
18
+ end
19
+
20
+ def test_assign_with_hash
21
+ bob = C.new
22
+
23
+ x = { :name => "Bob Sawyer", :address => "123 Maple, Anytown NC", :zip => 12345 }
24
+
25
+ bob.assign(x)
26
+
27
+ assert_equal(x[:name], bob.name)
28
+ assert_equal(x[:address], bob.address)
29
+ assert_equal(x[:zip], bob.zip)
30
+ end
31
+
32
+ def test_assign_with_assoc_array
33
+ bob = C.new
34
+
35
+ x = [[:name, "Bob Sawyer"], [:address, "123 Maple, Anytown NC"], [:zip, 12345]]
36
+
37
+ bob.assign(x)
38
+
39
+ assert_equal("Bob Sawyer", bob.name)
40
+ assert_equal("123 Maple, Anytown NC", bob.address)
41
+ assert_equal(12345, bob.zip)
42
+ end
43
+
44
+ def test_assign_with_block
45
+ bob = C.new
46
+
47
+ x = lambda {|s| s.name = "Bob Sawyer"; s.address = "123 Maple, Anytown NC"; s.zip = 12345 }
48
+
49
+ bob.assign(&x)
50
+
51
+ assert_equal("Bob Sawyer", bob.name)
52
+ assert_equal("123 Maple, Anytown NC", bob.address)
53
+ assert_equal(12345, bob.zip)
54
+ end
55
+
56
+ end
57
+
@@ -0,0 +1,20 @@
1
+ require 'facets/kernel/assign_from.rb'
2
+ require 'test/unit'
3
+
4
+ class TestKernelAssignFrom < Test::Unit::TestCase
5
+
6
+ C = Struct.new(:name, :address, :zip)
7
+
8
+ def test_assign_from
9
+ bob = C.new("Bob Sawyer", "123 Maple, Anytown NC", 12345)
10
+ joe = C.new("Joe Pitare")
11
+
12
+ joe.assign_from(bob, :address, :zip)
13
+
14
+ assert_equal("Joe Pitare", joe.name)
15
+ assert_equal("123 Maple, Anytown NC", joe.address)
16
+ assert_equal(12345, joe.zip)
17
+ end
18
+
19
+ end
20
+
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ require 'facets/prepend'
3
+
4
+ class TC_Class_Prepend < Test::Unit::TestCase
5
+
6
+ class C
7
+ def f
8
+ "f"
9
+ end
10
+ end
11
+
12
+ module M
13
+ def f
14
+ '{' + super + '}'
15
+ end
16
+ end
17
+
18
+ class C
19
+ prepend M
20
+ end
21
+
22
+ #
23
+ def test_prepend
24
+ c = C.new
25
+ assert_equal("{f}", c.f)
26
+ end
27
+
28
+ end