ruby_ex 0.1.2 → 0.2.0

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