ruby_ex 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/ChangeLog +693 -0
  2. data/NEWS +74 -0
  3. data/SPEC.dyn.yml +6 -6
  4. data/SPEC.gemspec +14 -0
  5. data/SPEC.yml +4 -4
  6. data/lib/abstract.rb +2 -4
  7. data/lib/abstract_node.rb +1 -2
  8. data/lib/algorithms/simulated_annealing.rb +50 -29
  9. data/lib/attributed_class.rb +50 -21
  10. data/lib/auto_object.rb +102 -0
  11. data/lib/blank_slate.rb +102 -0
  12. data/lib/cache.rb +1 -2
  13. data/lib/choose.rb +165 -163
  14. data/lib/commands.rb +2 -3
  15. data/lib/commands/command.rb +47 -20
  16. data/lib/commands/datas.rb +1 -1
  17. data/lib/commands/datas/composite.rb +5 -1
  18. data/lib/commands/datas/data.rb +102 -5
  19. data/lib/commands/datas/factory.rb +13 -6
  20. data/lib/commands/datas/temp.rb +3 -5
  21. data/lib/commands/factory.rb +1 -1
  22. data/lib/commands/helpers.rb +1 -1
  23. data/lib/commands/pipe.rb +10 -1
  24. data/lib/commands/runners.rb +1 -1
  25. data/lib/commands/runners/exec.rb +1 -1
  26. data/lib/commands/runners/fork.rb +3 -16
  27. data/lib/commands/runners/mock.rb +67 -0
  28. data/lib/commands/runners/runner.rb +5 -3
  29. data/lib/commands/runners/system.rb +1 -1
  30. data/lib/commands/seq.rb +2 -1
  31. data/lib/config_file.rb +10 -2
  32. data/lib/const_regexp.rb +1 -2
  33. data/lib/{dlogger.rb → d_logger.rb} +1 -2
  34. data/lib/daemon.rb +1 -2
  35. data/lib/diff.rb +1 -2
  36. data/lib/drb/drb_observable.rb +1 -2
  37. data/lib/drb/drb_observable_pool.rb +2 -2
  38. data/lib/drb/drb_service.rb +1 -2
  39. data/lib/drb/drb_undumped_attributes.rb +1 -2
  40. data/lib/drb/drb_undumped_indexed_object.rb +1 -2
  41. data/lib/drb/insecure_protected_methods.rb +1 -2
  42. data/lib/drb_ex.rb +2 -2
  43. data/lib/file_type.rb +466 -0
  44. data/lib/generate_id.rb +12 -6
  45. data/lib/genpasswd.rb +22 -0
  46. data/lib/hash_eval.rb +83 -0
  47. data/lib/histogram.rb +1 -2
  48. data/lib/hookable.rb +3 -4
  49. data/lib/hooker.rb +1 -3
  50. data/lib/html_encode.rb +191 -0
  51. data/lib/indexed_node.rb +0 -1
  52. data/lib/io_marshal.rb +4 -2
  53. data/lib/ioo.rb +3 -2
  54. data/lib/kill_all.rb +46 -0
  55. data/lib/labeled_node.rb +0 -1
  56. data/lib/logger_observer.rb +8 -4
  57. data/lib/md5sum.rb +3 -3
  58. data/lib/meta_factory.rb +99 -0
  59. data/lib/method_call.rb +87 -0
  60. data/lib/mocks.rb +12 -0
  61. data/lib/mocks/assertions.rb +50 -0
  62. data/lib/mocks/method_logger.rb +40 -0
  63. data/lib/mocks/mock.rb +64 -0
  64. data/lib/mocks/object.rb +47 -0
  65. data/lib/mocks/observer.rb +38 -0
  66. data/lib/module/autoload_tree.rb +30 -29
  67. data/lib/module/hierarchy.rb +176 -171
  68. data/lib/module/instance_method_visibility.rb +39 -38
  69. data/lib/node.rb +0 -1
  70. data/lib/object_monitor.rb +1 -2
  71. data/lib/object_monitor_activity.rb +1 -2
  72. data/lib/observable.rb +1 -2
  73. data/lib/observable_pool.rb +1 -2
  74. data/lib/{orderedhash.rb → ordered_hash.rb} +41 -5
  75. data/lib/pp_hierarchy.rb +7 -2
  76. data/lib/r_path.rb +307 -0
  77. data/lib/random_generators.rb +7 -20
  78. data/lib/random_generators/random_generator.rb +2 -4
  79. data/lib/random_generators/ruby.rb +4 -2
  80. data/lib/regex_path.rb +124 -0
  81. data/lib/ruby_ex.rb +28 -98
  82. data/lib/safe_eval.rb +1 -2
  83. data/lib/sendmail.rb +14 -17
  84. data/lib/service_manager.rb +1 -2
  85. data/lib/shuffle.rb +6 -2
  86. data/lib/spring.rb +1 -2
  87. data/lib/spring_set.rb +1 -2
  88. data/lib/{symtbl.rb → sym_tbl.rb} +90 -5
  89. data/lib/sym_tbl_gsub.rb +227 -0
  90. data/lib/{synflow.rb → syn_flow.rb} +1 -2
  91. data/lib/text.rb +218 -0
  92. data/lib/timeout_ex.rb +1 -2
  93. data/lib/trace.rb +9 -8
  94. data/lib/uri/druby.rb +1 -2
  95. data/lib/uri/file.rb +1 -1
  96. data/lib/uri/ftp_ex.rb +1 -1
  97. data/lib/uri/http_ex.rb +1 -1
  98. data/lib/uri/mysql.rb +121 -0
  99. data/lib/uri/pgsql.rb +19 -38
  100. data/lib/uri/svn.rb +1 -2
  101. data/lib/uri_ex.rb +45 -3
  102. data/lib/verbose_object.rb +181 -38
  103. data/lib/yaml/chop_header.rb +19 -11
  104. data/lib/yaml/transform.rb +17 -11
  105. data/lib/yaml/yregexpath.rb +11 -5
  106. data/test/algorithms/simulated_annealing_test.rb +2 -2
  107. data/test/resources/foo.tar.gz +0 -0
  108. data/test/resources/tar.gz.log +49 -0
  109. data/test/sanity-suite.yml +5 -7
  110. data/test/sanity/multiple-requires.yml +17 -7
  111. data/test/sanity/single-requires.yml +38 -20
  112. data/test/stress-tests/threads_and_exceptions.yml +13 -0
  113. data/test/test-unit-setup.rb +3 -1
  114. data/test/unit-suite.yml +7 -8
  115. metadata +42 -31
  116. data/lib/algorithms.rb +0 -12
  117. data/lib/ask.rb +0 -100
  118. data/lib/checkout.rb +0 -12
  119. data/lib/dumpable_proc.rb +0 -57
  120. data/lib/filetype.rb +0 -229
  121. data/lib/thread_mutex.rb +0 -11
  122. data/lib/yaml/basenode_ext.rb +0 -63
@@ -1,13 +1,10 @@
1
- # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
- # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
- # License: Gnu General Public License.
1
+ # Copyright:: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author:: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: instance_method_visibility.rb 339 2005-09-06 23:27:27Z ertai $
4
5
 
5
- # $LastChangedBy: polrop $
6
- # $Id: instance_method_visibility.rb 279 2005-06-05 17:46:53Z ertai $
7
6
 
8
- require 'ruby_ex'
9
-
10
- class Module
7
+ module InstanceMethodVisibility
11
8
 
12
9
  def instance_method_visibility(name)
13
10
  if private_method_defined?(name)
@@ -22,50 +19,54 @@ class Module
22
19
  end
23
20
  end
24
21
 
22
+ end # module InstanceMethodVisibility
23
+
24
+ class Module
25
+ include InstanceMethodVisibility
25
26
  end # class Module
26
27
 
28
+ module InstanceMethodVisibility
27
29
 
28
- test_section __FILE__ do
30
+ test_section __FILE__ do
29
31
 
32
+ class InstanceMethodVisibilityTest < Test::Unit::TestCase
30
33
 
34
+ class A
31
35
 
32
- class InstanceMethodVisibilityTest < Test::Unit::TestCase
36
+ def pub; end
37
+ def pri; end
38
+ def pro; end
33
39
 
34
- class A
40
+ public :pub
41
+ private :pri
42
+ protected :pro
35
43
 
36
- def pub; end
37
- def pri; end
38
- def pro; end
44
+ end # class A
39
45
 
40
- public :pub
41
- private :pri
42
- protected :pro
46
+ def test_simple
47
+ assert_equal(:public, A.instance_method_visibility('pub'))
48
+ assert_equal(:private, A.instance_method_visibility('pri'))
49
+ assert_equal(:protected, A.instance_method_visibility('pro'))
50
+ assert_raises(NoMethodError) { A.instance_method_visibility('new') }
51
+ end
43
52
 
44
- end # class A
53
+ class AA
54
+ def f; end
55
+ end
56
+ class BB < AA
57
+ private :f
58
+ end
45
59
 
46
- def test_simple
47
- assert_equal(:public, A.instance_method_visibility('pub'))
48
- assert_equal(:private, A.instance_method_visibility('pri'))
49
- assert_equal(:protected, A.instance_method_visibility('pro'))
50
- assert_raises(NoMethodError) { A.instance_method_visibility('new') }
51
- end
60
+ def test_inheritance
61
+ assert_equal(:public, AA.instance_method_visibility('f'))
62
+ assert(! BB.public_method_defined?('f'))
63
+ assert_equal(:private, BB.instance_method_visibility('f'))
64
+ end
52
65
 
53
- class AA
54
- def f; end
55
- end
56
- class BB < AA
57
- private :f
58
- end
66
+ end # class InstanceMethodVisibilityTest
59
67
 
60
- def test_inheritance
61
- assert_equal(:public, AA.instance_method_visibility('f'))
62
- assert(! BB.public_method_defined?('f'))
63
- assert_equal(:private, BB.instance_method_visibility('f'))
64
68
  end
65
69
 
66
- end # class InstanceMethodVisibilityTest
67
-
68
-
69
- end
70
+ end # module InstanceMethodVisibility
70
71
 
71
72
 
data/lib/node.rb CHANGED
@@ -5,7 +5,6 @@
5
5
  # $LastChangedBy: polrop $
6
6
  # $Id: node.rb 171 2005-03-29 09:12:47Z polrop $
7
7
 
8
- require 'ruby_ex'
9
8
 
10
9
  class Node
11
10
 
@@ -3,10 +3,9 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: object_monitor.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: object_monitor.rb 339 2005-09-06 23:27:27Z ertai $
7
7
 
8
8
 
9
- require 'ruby_ex'
10
9
  require 'observable'
11
10
 
12
11
 
@@ -3,10 +3,9 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: object_monitor_activity.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: object_monitor_activity.rb 339 2005-09-06 23:27:27Z ertai $
7
7
 
8
8
 
9
- require 'ruby_ex'
10
9
  require 'observable'
11
10
 
12
11
 
data/lib/observable.rb CHANGED
@@ -3,10 +3,9 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: observable.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: observable.rb 339 2005-09-06 23:27:27Z ertai $
7
7
 
8
8
 
9
- require 'ruby_ex'
10
9
  require 'observer'
11
10
 
12
11
 
@@ -3,10 +3,9 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: observable_pool.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: observable_pool.rb 339 2005-09-06 23:27:27Z ertai $
7
7
 
8
8
 
9
- require 'ruby_ex'
10
9
  require 'observable'
11
10
  require 'thread'
12
11
 
@@ -18,11 +18,10 @@
18
18
  #
19
19
 
20
20
  # $LastChangedBy: ertai $
21
- # $Id: orderedhash.rb 279 2005-06-05 17:46:53Z ertai $
21
+ # $Id: ordered_hash.rb 339 2005-09-06 23:27:27Z ertai $
22
22
 
23
- require 'ruby_ex'
24
23
 
25
- module OrderedHash_ext
24
+ module OrderedHash
26
25
 
27
26
  def store ( a, b )
28
27
  @order.push a unless has_key? a
@@ -118,6 +117,30 @@ module OrderedHash_ext
118
117
  to_a.to_s
119
118
  end
120
119
 
120
+ def inspect
121
+ arr = to_a.map{ |k, v| "#{k.inspect}=>#{v.inspect}" }
122
+ '{(ordered) ' + arr.join(', ') + ' }'
123
+ end
124
+
125
+ def pretty_print ( q )
126
+ q.group(1, '{(ordered) ', '}') {
127
+ q.seplist(self, nil, :each_pair) {|k, v|
128
+ q.group {
129
+ q.pp k
130
+ q.text '=>'
131
+ q.group(1) {
132
+ q.breakable ''
133
+ q.pp v
134
+ }
135
+ }
136
+ }
137
+ }
138
+ end
139
+
140
+ def pretty_print_cycle(q)
141
+ q.text(empty? ? '{(ordered)}' : '{(ordered) ...}')
142
+ end
143
+
121
144
  def update ( hsh2 )
122
145
  hsh2.each { |k,v| self[k] = v }
123
146
  self
@@ -142,7 +165,7 @@ module OrderedHash_ext
142
165
  !@order.nil?
143
166
  end
144
167
 
145
- end # module OrderedHash_ext
168
+ end # module OrderedHash
146
169
 
147
170
 
148
171
  class OHash < Hash
@@ -151,7 +174,7 @@ class OHash < Hash
151
174
 
152
175
  alias :unordered_keys :keys
153
176
 
154
- include OrderedHash_ext
177
+ include OrderedHash
155
178
 
156
179
  def initialize ( *a )
157
180
  @order = unordered_keys
@@ -227,6 +250,19 @@ test_section __FILE__ do
227
250
  check_ordered({}, [[2, 3], [4, 3]])
228
251
  end
229
252
 
253
+ def test_inspect
254
+ hsh = OHash['z', 1, 'a', 2, 'c', 3]
255
+ hsh2 = OHash['a', 2, 'z', 1, 'c', 3]
256
+ assert_equal('{(ordered) "z"=>1, "a"=>2, "c"=>3 }', hsh.inspect)
257
+ assert_equal('{(ordered) "a"=>2, "z"=>1, "c"=>3 }', hsh2.inspect)
258
+ end
259
+
260
+ def test_pretty_print
261
+ require 'pp'
262
+ hsh = OHash['z', 1, 'a', 2, 'c', 3]
263
+ assert_match(/^\{\(ordered\) /, PP.pp(hsh, ''))
264
+ end
265
+
230
266
  def test_little_ordered
231
267
  a = (0..11).to_a
232
268
  h = OHash[*a]
data/lib/pp_hierarchy.rb CHANGED
@@ -5,9 +5,8 @@
5
5
  # $LastChangedBy: polrop $
6
6
  # $Id: hierarchy.rb 145 2005-01-30 14:16:14Z polrop $
7
7
 
8
- require 'ruby_ex'
9
8
 
10
- class Hash
9
+ module PpHierarchy
11
10
 
12
11
  # Pretty print a hash symbolizing a class hierarchy.
13
12
  def pp_hierarchy(prefix=//, abstract=false)
@@ -27,4 +26,10 @@ class Hash
27
26
  end
28
27
  end
29
28
 
29
+ end # module PpHierarchy
30
+
31
+ class Hash
32
+
33
+ include PpHierarchy
34
+
30
35
  end # class Hash
data/lib/r_path.rb ADDED
@@ -0,0 +1,307 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: r_path.rb 339 2005-09-06 23:27:27Z ertai $
5
+
6
+ require 'regex_path'
7
+
8
+ class Object
9
+
10
+ #
11
+ # RPath is a sort of the well known XPath. XPath is XML and RPath is
12
+ # obviously built for Ruby.
13
+ #
14
+ # When you have a Ruby tree -- by tree I mean a complex data structure with
15
+ # no cycles -- you can search something into it:
16
+ #
17
+ # tree = {
18
+ # :A => {
19
+ # :AA => { :AAA => 'foo' },
20
+ # 'AB' => [ :AB1, 2, 'a b 3' ],
21
+ # },
22
+ # :B => {
23
+ # 'foo' => { :home => 'here', :email => 'foo@foo.com' },
24
+ # 'bar' => { :home => "bar's home", :email => 'bar@foo.bar' },
25
+ # 'baz' => { :home => 'nowhere', :email => 'baz@bar.com' }
26
+ # }
27
+ # }
28
+ #
29
+ # tree.rpath('/A/AA/AAA/') { |x| p x } # => 'foo'
30
+ #
31
+ # But we are dealing with regexp so if you want just this path you need:
32
+ # tree.rpath('/^A$/^AA$/^AAA$/') { |x| p x } # => 'foo'
33
+ #
34
+ # But if you are lazy you can type that:
35
+ # tree.rpath('/A/AA//') { |x| p x } # => 'foo'
36
+ # or
37
+ # tree.rpath('///AAA/') { |x| p x } # => 'foo'
38
+ #
39
+ # tree.rpath('/B//home/nowhere') { |x| p x } # => 'nowhere'
40
+ #
41
+ # But you would prefer get the complete baz record, so to do that you
42
+ # can mark your dezired levels with `*'.
43
+ #
44
+ # tree.rpath('/B//*home/nowhere') { |x| p x[:email] } # => 'baz@bar.com'
45
+ #
46
+ # tree.rpath('/B//*home/ere') { |x| p x[:email] }
47
+ # => 'foo@foo.com'
48
+ # => 'baz@bar.com'
49
+ #
50
+ # tree.rpath('/B//*home/(.*)') { |tree, home| p [home, tree[:email]] }
51
+ # => [ 'here', 'foo@foo.com' ]
52
+ # => [ "bar's home", 'bar@foo.bar' ]
53
+ # => [ 'nowhere', 'baz@bar.com' ]
54
+ #
55
+ def rpath ( re, &block )
56
+ raise ArgumentError, 'no block given' unless block_given?
57
+ re = RegexPath.new(re) unless re.is_a? RegexPath
58
+ regex_path_match(re, nil, [], &block)
59
+ nil
60
+ end
61
+
62
+ #
63
+ # Act like rpath it does not take a block but
64
+ #
65
+ def rpath_select ( re )
66
+ results = []
67
+ re = RegexPath.new(re) unless re.is_a? RegexPath
68
+ regex_path_match(re, nil, []) do |x|
69
+ results << x
70
+ end
71
+ results
72
+ end
73
+
74
+ #
75
+ # Like rpath_select with match datas
76
+ #
77
+ def rpath_select_match_data ( re )
78
+ results = []
79
+ re = RegexPath.new(re) unless re.is_a? RegexPath
80
+ regex_path_match(re, nil, []) do |*a|
81
+ results << a
82
+ end
83
+ results
84
+ end
85
+
86
+ #
87
+ # mode = [:first, :all]
88
+ # rpath_find :all is like rpath_select
89
+ # rpath_find :first is the first element of rpath_select
90
+ #
91
+ def rpath_find ( mode, re )
92
+ results = rpath_select(re)
93
+ case mode
94
+ when :all then results
95
+ when :first then results.first
96
+ else raise "Bad mode `#{mode}' for rpath_find"
97
+ end
98
+ end
99
+
100
+ def regex_path_match ( re, trees, args, &block ) # :nodoc:
101
+ to_s.regex_path_match(re, trees, args, &block)
102
+ end
103
+
104
+ end # class Object
105
+
106
+
107
+
108
+ class Hash
109
+
110
+ def regex_path_match ( re, trees, args, &block ) # :nodoc:
111
+ trees = (trees || []) + [self] if re.starred?
112
+
113
+ if re.empty?
114
+ trees ||= [self]
115
+ trees.each { |tree| block[tree, *args] }
116
+ else
117
+ seg, tail_re = re.split
118
+ each do |key, val|
119
+ match_data = seg =~ key.to_s
120
+ if match_data
121
+ sub_args = args + match_data.to_a[1..-1]
122
+ val.regex_path_match(tail_re, trees, sub_args, &block)
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ end # class Hash
129
+
130
+
131
+ class Array
132
+
133
+ def regex_path_match ( re, trees, args, &block ) # :nodoc:
134
+ each do |x|
135
+ x.regex_path_match(re, trees, args, &block)
136
+ end
137
+ end
138
+
139
+ end # class Array
140
+
141
+
142
+ class String
143
+
144
+ def regex_path_match ( re, trees, args, &block ) # :nodoc:
145
+ seg, tail_re = re.split
146
+
147
+ trees = (trees || []) + [self] if re.starred?
148
+
149
+ if (seg.nil? or match_data = seg =~ self) and tail_re.empty?
150
+ trees ||= [self]
151
+ args = args + match_data.to_a[1..-1] if defined? match_data and match_data
152
+ trees.each { |tree| block[tree, *args] }
153
+ end
154
+ end
155
+
156
+ end # class String
157
+
158
+
159
+ module RPath
160
+
161
+ test_section __FILE__ do
162
+
163
+ class RPathTest < Test::Unit::TestCase
164
+
165
+ def assert_rpath_base ( re, ref, ref_match=[] )
166
+ select = @tree.rpath_select_match_data(re)
167
+ my = []
168
+ select.map { |x, *a| my << a unless a.empty? }
169
+ [ref.flatten, select.map { |a| a.first }, ref_match, my]
170
+ end
171
+
172
+ def assert_rpath ( re, ref, ref_match=[] )
173
+ ref1, my1, ref2, my2 = assert_rpath_base(re, ref, ref_match)
174
+ assert_equal(ref1, my1, 'trees are not equal')
175
+ assert_equal(ref2, my2, 'match datas are not equal')
176
+ end
177
+
178
+ def assert_rpath_set ( re, ref, ref_match=[] )
179
+ ref1, my1, ref2, my2 = assert_rpath_base(re, ref, ref_match)
180
+ assert_equal(ref1.to_set, my1.to_set, 'trees are not equal')
181
+ assert_equal(ref2.to_set, my2.to_set, 'match datas are not equal')
182
+ end
183
+
184
+ def setup
185
+ @tree = {
186
+ 'Name' => 'Foo',
187
+ 'FirstName' => 'Bar',
188
+ 'Emails' => {
189
+ 'home' => 'foo312@coldmail.com',
190
+ 'work' => 'bfoo@staff.com',
191
+ 'edu' => 'bar.foo@school.edu'
192
+ },
193
+ 'Phones' => ['101', '202', '203'],
194
+ 'Deep' => { 'A' => { 'B' => ['1', 2, 'a', '3'], 'C' => '4' } },
195
+ 'users' => [
196
+ {
197
+ 'name' => 'Sea',
198
+ 'tel' => '111'
199
+ },
200
+ {
201
+ 'name' => 'Sex',
202
+ 'tel' => '222'
203
+ },
204
+ {
205
+ 'name' => 'Sun',
206
+ 'tel' => '333'
207
+ },
208
+ {
209
+ 'foo' => 'SeSe',
210
+ 'tel' => '222'
211
+ },
212
+ ]
213
+ }
214
+ end
215
+
216
+ def test_simple
217
+ assert_rpath('Name', ['Foo', 'Bar'])
218
+ assert_rpath('^Name', ['Foo'])
219
+ assert_rpath('tName', ['Bar'])
220
+ assert_rpath('Emails/home', ["foo312@coldmail.com"])
221
+ assert_rpath('Emails/edu', ["bar.foo@school.edu"])
222
+ assert_rpath('Name/home', [])
223
+ assert_rpath('Phone/101', ['101'])
224
+ assert_rpath('Phone/\d0\d', ["101", "202", "203"])
225
+ assert_rpath('Phone/20\d', ["202", "203"])
226
+ assert_rpath('Deep/\d', [])
227
+ assert_rpath('Deep/A', [{"B"=>["1", 2, "a", "3"], "C"=>"4"}])
228
+ assert_rpath('Deep/.*/\d', [])
229
+ assert_rpath('Deep//\d', [])
230
+ assert_rpath('Deep///\d', ['1', '2', '3', '4'])
231
+
232
+ assert_rpath('Name/Foo', ['Foo'])
233
+ assert_rpath('Name/Foo/Bar', [])
234
+ assert_rpath('/E/o/com', ["foo312@coldmail.com", "bfoo@staff.com"])
235
+ assert_rpath('//o/com', ["foo312@coldmail.com", "bfoo@staff.com"])
236
+
237
+ assert_rpath('///Se', ["Sea", "Sex", "SeSe"])
238
+
239
+ assert_rpath('//a/Se', ["Sea", "Sex"])
240
+ assert_rpath('/users/name/Se[ax]', ["Sea", "Sex"])
241
+ assert_rpath('/users//S[eu].', ["Sea", "Sex", 'Sun', 'SeSe'])
242
+ assert_rpath('/users//S[eu].$', ["Sea", "Sex", 'Sun'])
243
+
244
+ assert_rpath('//*a/Sea', ['name' => 'Sea', 'tel' => '111'])
245
+
246
+ assert_rpath('//*a/Se', [{"name"=>"Sea", "tel"=>"111"},
247
+ {"name"=>"Sex", "tel"=>"222"}])
248
+
249
+ assert_rpath('//*a/*Se', [{"name"=>"Sea", "tel"=>"111"}, 'Sea',
250
+ {"name"=>"Sex", "tel"=>"222"}, 'Sex'])
251
+
252
+ assert_rpath('/*/*a/*Se', [@tree, {"name"=>"Sea", "tel"=>"111"}, 'Sea',
253
+ @tree, {"name"=>"Sex", "tel"=>"222"}, 'Sex'])
254
+ end
255
+
256
+ def test_example
257
+ foo = { :home => 'here', :email => 'foo@foo.com' }
258
+ bar = { :home => "bar's home", :email => 'bar@foo.bar' }
259
+ baz = { :home => 'nowhere', :email => 'baz@bar.com' }
260
+ @tree = {
261
+ :A => {
262
+ :AA => { :AAA => 'foo' },
263
+ 'AB' => [ :AB1, 2, 'a b 3' ],
264
+ },
265
+ :B => {
266
+ 'foo' => foo,
267
+ 'bar' => bar,
268
+ 'baz' => baz
269
+ }
270
+ }
271
+
272
+ assert_rpath('/A/AA/AAA/', ['foo'])
273
+
274
+ assert_rpath('/^A$/^AA$/^AAA$/', ['foo'])
275
+
276
+ assert_rpath('/A/AA//', ['foo'])
277
+ assert_rpath('///AAA/', ['foo'])
278
+
279
+ assert_rpath('/B//home/nowhere', ['nowhere'])
280
+
281
+ assert_rpath('/B//*home/nowhere', [baz])
282
+
283
+ assert_rpath_set('/B//*home/ere', [foo, baz])
284
+
285
+ assert_rpath_set('/B//*home/(.*)', [foo, bar, baz],
286
+ [['here'], ["bar's home"], ['nowhere']])
287
+ end
288
+
289
+ def test_match_data
290
+ assert_rpath('^N(a)me', ['Foo'], [['a']])
291
+ assert_rpath('N(a)m(e)', ['Foo', 'Bar'], [["a", "e"], ["a", "e"]])
292
+ assert_rpath('/(.*)/(.*o.*)/(.*com.*)',
293
+ ["foo312@coldmail.com", "bfoo@staff.com"],
294
+ [["Emails", "home", "foo312@coldmail.com"],
295
+ ["Emails", "work", "bfoo@staff.com"]])
296
+ assert_rpath('/users/name/Se([ax])', ["Sea", "Sex"], [["a"], ["x"]])
297
+ end
298
+
299
+ def test_rpath
300
+ assert_nothing_raised { @tree.rpath('/A/AA/AAA/') { |x| } }
301
+ end
302
+
303
+ end # class RPathTest
304
+
305
+ end
306
+
307
+ end # module RPath