vcs 0.1 → 0.2.148

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 (132) hide show
  1. data/Rakefile +17 -3
  2. data/bin/vcs +57 -34
  3. data/doc/jamis.rb +564 -0
  4. data/ruby_ex/abstract.rb +254 -0
  5. data/ruby_ex/abstract_node.rb +85 -0
  6. data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
  7. data/ruby_ex/array_each_pair.rb +18 -0
  8. data/ruby_ex/ask.rb +101 -0
  9. data/ruby_ex/attributed_class.rb +302 -0
  10. data/ruby_ex/cache.rb +373 -0
  11. data/ruby_ex/checkout.rb +12 -0
  12. data/ruby_ex/choose.rb +271 -0
  13. data/ruby_ex/commands.rb +18 -0
  14. data/ruby_ex/commands/command.rb +401 -0
  15. data/ruby_ex/commands/datas.rb +16 -0
  16. data/ruby_ex/commands/datas/data.rb +33 -0
  17. data/ruby_ex/commands/datas/factory.rb +66 -0
  18. data/ruby_ex/commands/factory.rb +66 -0
  19. data/ruby_ex/commands/helpers.rb +67 -0
  20. data/ruby_ex/commands/pipe.rb +64 -0
  21. data/ruby_ex/commands/runners.rb +17 -0
  22. data/ruby_ex/commands/runners/exec.rb +49 -0
  23. data/ruby_ex/commands/runners/fork.rb +97 -0
  24. data/ruby_ex/commands/runners/runner.rb +107 -0
  25. data/ruby_ex/commands/seq.rb +27 -0
  26. data/ruby_ex/config_file.rb +96 -0
  27. data/ruby_ex/const_regexp.rb +59 -0
  28. data/ruby_ex/daemon.rb +134 -0
  29. data/ruby_ex/diff.rb +667 -0
  30. data/ruby_ex/dlogger.rb +62 -0
  31. data/ruby_ex/drb/dispatcher.rb +252 -0
  32. data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
  33. data/ruby_ex/drb/drb_observable.rb +97 -0
  34. data/ruby_ex/drb/drb_observable_pool.rb +27 -0
  35. data/ruby_ex/drb/drb_service.rb +43 -0
  36. data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
  37. data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
  38. data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
  39. data/ruby_ex/drb/session_client_test.rb +40 -0
  40. data/ruby_ex/drb/session_manager.rb +246 -0
  41. data/ruby_ex/drb/session_server.rb +53 -0
  42. data/ruby_ex/dtime.rb +143 -0
  43. data/ruby_ex/dumpable_proc.rb +63 -0
  44. data/ruby_ex/exception.rb +32 -0
  45. data/ruby_ex/filetype.rb +229 -0
  46. data/ruby_ex/fileutils_ex.rb +44 -0
  47. data/ruby_ex/fold.rb +58 -0
  48. data/ruby_ex/generate_id.rb +44 -0
  49. data/ruby_ex/hookable.rb +262 -0
  50. data/ruby_ex/hooker.rb +54 -0
  51. data/ruby_ex/inactive_timeout.rb +137 -0
  52. data/ruby_ex/indexed_node.rb +66 -0
  53. data/ruby_ex/io_marshal.rb +100 -0
  54. data/ruby_ex/ioo.rb +194 -0
  55. data/ruby_ex/labeled_node.rb +63 -0
  56. data/ruby_ex/logger_observer.rb +23 -0
  57. data/ruby_ex/md5sum.rb +66 -0
  58. data/ruby_ex/mktemp.rb +208 -0
  59. data/ruby_ex/module/attr_once.rb +36 -0
  60. data/ruby_ex/module/autoload_tree.rb +75 -0
  61. data/ruby_ex/module/hierarchy.rb +335 -0
  62. data/ruby_ex/module/instance_method_visibility.rb +73 -0
  63. data/ruby_ex/module_ex.rb +11 -0
  64. data/ruby_ex/node.rb +80 -0
  65. data/ruby_ex/object_monitor.rb +145 -0
  66. data/ruby_ex/object_monitor_activity.rb +33 -0
  67. data/ruby_ex/observable.rb +140 -0
  68. data/ruby_ex/observable_pool.rb +293 -0
  69. data/ruby_ex/orderedhash.rb +252 -0
  70. data/ruby_ex/pathname_ex.rb +152 -0
  71. data/ruby_ex/pp_hierarchy.rb +29 -0
  72. data/ruby_ex/pseudo_cache.rb +190 -0
  73. data/ruby_ex/queue.rb +56 -0
  74. data/ruby_ex/random_generators.rb +25 -0
  75. data/ruby_ex/random_generators/random_generator.rb +31 -0
  76. data/ruby_ex/random_generators/ruby.rb +23 -0
  77. data/ruby_ex/safe_eval.rb +348 -0
  78. data/ruby_ex/sendmail.rb +215 -0
  79. data/ruby_ex/service_manager.rb +121 -0
  80. data/ruby_ex/session/administrable.rb +120 -0
  81. data/ruby_ex/session/client.rb +153 -0
  82. data/ruby_ex/session/const.rb +18 -0
  83. data/ruby_ex/session/dispatcher.rb +184 -0
  84. data/ruby_ex/session/error.rb +21 -0
  85. data/ruby_ex/session/fetchable.rb +57 -0
  86. data/ruby_ex/session/fetcher.rb +62 -0
  87. data/ruby_ex/session/hookable.rb +26 -0
  88. data/ruby_ex/session/profile.rb +110 -0
  89. data/ruby_ex/session/server.rb +582 -0
  90. data/ruby_ex/session/test/administrable_test.rb +337 -0
  91. data/ruby_ex/session/test/basic_test.rb +523 -0
  92. data/ruby_ex/session/test/dispatcher_test.rb +409 -0
  93. data/ruby_ex/session/test/fetchable_test.rb +119 -0
  94. data/ruby_ex/session/test/sub_server_test.rb +188 -0
  95. data/ruby_ex/shuffle.rb +30 -0
  96. data/ruby_ex/spring.rb +136 -0
  97. data/ruby_ex/spring_set.rb +137 -0
  98. data/ruby_ex/string_ex.rb +28 -0
  99. data/ruby_ex/symtbl.rb +106 -0
  100. data/ruby_ex/synflow.rb +474 -0
  101. data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
  102. data/ruby_ex/thread_mutex.rb +10 -0
  103. data/ruby_ex/timeout_ex.rb +81 -0
  104. data/ruby_ex/top_down.rb +73 -0
  105. data/ruby_ex/trace.rb +26 -0
  106. data/ruby_ex/uri/druby.rb +81 -0
  107. data/ruby_ex/uri/file.rb +65 -0
  108. data/ruby_ex/uri/ftp_ex.rb +37 -0
  109. data/ruby_ex/uri/http_ex.rb +43 -0
  110. data/ruby_ex/uri/ssh.rb +92 -0
  111. data/ruby_ex/uri/svn.rb +118 -0
  112. data/ruby_ex/uri_ex.rb +45 -0
  113. data/ruby_ex/verbose_object.rb +30 -0
  114. data/ruby_ex/version.rb +66 -0
  115. data/ruby_ex/yaml/basenode_ext.rb +63 -0
  116. data/ruby_ex/yaml/chop_header.rb +23 -0
  117. data/ruby_ex/yaml/transform.rb +449 -0
  118. data/ruby_ex/yaml/yregexpath.rb +76 -0
  119. data/src/changelog.rb +28 -18
  120. data/src/conflict.rb +20 -0
  121. data/src/diff.rb +18 -0
  122. data/src/diffstat.rb +9 -3
  123. data/src/last_changed_date.rb +18 -0
  124. data/src/mail.rb +33 -65
  125. data/src/message.rb +15 -9
  126. data/src/mycommit.rb +29 -14
  127. data/src/news.rb +24 -3
  128. data/src/status.rb +17 -0
  129. data/src/svn.rb +2 -2
  130. data/src/vcs.rb +24 -3
  131. metadata +124 -5
  132. data/lrdetools.rb +0 -12
@@ -0,0 +1,23 @@
1
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
+ # Copyright:: Copyright (c) 2004 LRDE. All rights reserved.
3
+ # License:: GNU General Public License (GPL).
4
+ # Revision:: $Id: header 98 2004-09-29 12:07:43Z ertai $
5
+
6
+ require 'yaml'
7
+
8
+ module YAML
9
+
10
+ def self.chop_header ( io )
11
+ aStr = io.gets
12
+ unless aStr =~ /^---/
13
+ io.rewind
14
+ raise Exception, "First line is not valid: `#{aLine}'"
15
+ end
16
+ io.each do |aLine|
17
+ break if aLine =~ /^---/
18
+ aStr += aLine
19
+ end
20
+ YAML::load(aStr)
21
+ end
22
+
23
+ end # module YAML
@@ -0,0 +1,449 @@
1
+ # Author:: Marco Tessari <marco.tessari@epita.fr>.
2
+ # Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
3
+ # License:: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: transform.rb 199 2005-04-22 22:37:45Z ertai $
7
+
8
+ # TODO: Raised exception must be completed with a descritpion
9
+ # TODO: Fix bug on Array see test_higher_level_on_array
10
+ # TODO: Comment code.
11
+ # TODO: Write more tests.
12
+ # TODO: Make it stream.
13
+ # TODO: Add the possibility to write '//' to match all node with deep n.
14
+ # TODO: Add the && and ||.
15
+ # TODO: Optimize, skip if no more node to match.
16
+ # TODO: separate dot implemantation.
17
+
18
+ require 'yaml/yregexpath'
19
+
20
+ module YAML
21
+
22
+ class Transformer
23
+ private
24
+
25
+ # FIXME: Implement all ruby types.
26
+ class ::Object # :nodoc:
27
+ def yaml_doc_traverse ( activated )
28
+ raise ArgumentError, "can't traverse class #{self.class}"
29
+ end
30
+ end
31
+
32
+ class ::Hash # :nodoc:
33
+ # FIXME: Are we sure we want to traverse like that? (by stage)
34
+ def yaml_doc_traverse ( activated )
35
+ new_activated = []
36
+ sons = []
37
+ self.each do |key, value|
38
+ activated.each do |n|
39
+ new_activated += n.match(key, value)
40
+ sons << value unless value.is_a?(String)
41
+ end
42
+ end
43
+ activated += new_activated
44
+ sons.yaml_doc_traverse(activated)
45
+ end
46
+ end
47
+
48
+ class ::Array # :nodoc:
49
+ def yaml_doc_traverse ( activated )
50
+ self.each { |e| e.yaml_doc_traverse(activated) }
51
+ end
52
+ end
53
+
54
+ class Node
55
+ attr_reader :name, :values
56
+
57
+ Struct.new( 'Value', :regexp, :remember, :associated )
58
+
59
+ def initialize ( name )
60
+ raise ArgumentError unless name.is_a?(Regexp)
61
+ @name = name
62
+ @values = []
63
+ @uid = @@cpt
64
+ @@cpt += 1
65
+ # Save a node to handle the '#' feature.
66
+ @saved_node_key = nil
67
+ @saved_node_value = nil
68
+ end
69
+ @@cpt = 0
70
+
71
+ # Return the associated nodes of a value
72
+ # Add the value if not present.
73
+ def get_associated ( value, remember=false )
74
+ val = @values.find { |e| e.regexp == value and e.remember == remember }
75
+ if val.nil?
76
+ val = Struct::Value.new(value, remember, [])
77
+ @values << val
78
+ end
79
+ return val.associated
80
+ end
81
+
82
+ # Dottify a node.
83
+ def dottify ( stream )
84
+ # Declare node
85
+ stream << "#{unique_name} [shape=box, color=blue, label=#{self}]\n"
86
+ # Print node links with values
87
+ stream << "#{unique_name} -> { rank=same; "
88
+ @values.each_index { |i| stream << "value#{@uid}_#{i}; " }
89
+ stream << "}\n"
90
+ # Declare each values and links
91
+ @values.each_with_index do |val, i|
92
+ stream << "value#{@uid}_#{i} [shape=box, color=yellow, label=\"/"
93
+ stream << val.regexp.source << '/'
94
+ stream << ' #' if val.remember
95
+ stream << "\"]\n"
96
+ stream << "value#{@uid}_#{i} -> { rank=same; "
97
+ val.associated.each { |match| stream << "#{match.unique_name}; " }
98
+ stream << "} \n"
99
+ val.associated.each { |match| match.dottify(stream) }
100
+ end
101
+ end
102
+
103
+ def match ( key, value )
104
+ return [] unless key =~ @name
105
+ activated = []
106
+ @values.each do |val|
107
+ if ! value.is_a?(String) or value =~ val.regexp
108
+ save_node_set(key, value) if val.remember
109
+ val.associated.each do |n|
110
+ if n.is_a?(Match)
111
+ # There must be a remembered node in the path.
112
+ p self unless has_saved_node?
113
+ n[@saved_node_key, @saved_node_value]
114
+ else
115
+ n.save_node_set(@saved_node_key,
116
+ @saved_node_value) if has_saved_node?
117
+ activated << n
118
+ end
119
+ end
120
+ save_node_reset if val.remember
121
+ end
122
+ end
123
+ save_node_reset
124
+ return activated
125
+ end
126
+
127
+ def save_node_set ( key, value )
128
+ raise RuntimeError unless @saved_node_key.nil?
129
+ @saved_node_key = key
130
+ raise RuntimeError unless @saved_node_value.nil?
131
+ @saved_node_value = value
132
+ end
133
+
134
+ def save_node_reset
135
+ @saved_node_key = nil
136
+ @saved_node_value = nil
137
+ end
138
+
139
+ def has_saved_node?
140
+ return ! (@saved_node_key.nil? and @saved_node_value.nil?)
141
+ end
142
+
143
+ def unique_name
144
+ "node#{@uid}"
145
+ end
146
+
147
+ # Human readable name.
148
+ def to_s
149
+ "\"/#{@name.source}/\""
150
+ end
151
+ end
152
+
153
+ class Root
154
+ attr_reader :children
155
+
156
+ def initialize
157
+ @name = 'root'
158
+ @children = []
159
+ end
160
+
161
+ def dottify ( stream )
162
+ stream << "#{self} [shape=circle, color=red, label=#{self}]\n"
163
+ stream << "#{self} -> { rank=same; "
164
+ @children.each { |e| stream << "#{e.unique_name} " }
165
+ stream << "}\n"
166
+ @children.each { |e| e.dottify(stream) }
167
+ end
168
+
169
+ def to_s
170
+ 'root'
171
+ end
172
+
173
+ alias unique_name to_s
174
+ end
175
+
176
+ class Match
177
+
178
+ def initialize ( name=nil, &block )
179
+ @block = block
180
+ @name = name
181
+ @uid = @@cpt
182
+ @@cpt += 1
183
+ end
184
+ @@cpt = 0
185
+
186
+ def dottify ( stream )
187
+ stream << "match#{@uid} [shape=circle, color=green, label=#{self}]\n"
188
+ end
189
+
190
+ def call ( key, value )
191
+ @block[key, value]
192
+ end
193
+
194
+ alias [] call
195
+
196
+ def unique_name
197
+ "match#{@uid}"
198
+ end
199
+
200
+ def to_s
201
+ @name.nil? ? unique_name : "\"#{@name}\""
202
+ end
203
+ end
204
+
205
+ public
206
+ # Constructor.
207
+ def initialize
208
+ @rootgraph = Root.new
209
+ @graph = []
210
+ @activated = []
211
+ end
212
+
213
+ # Register the given block and compile the path.
214
+ def add ( path, name=nil, &block)
215
+ raise ArgumentError unless (path.kind_of?(YRegexPath))
216
+ raise ArgumentError if (block.nil?)
217
+ current_nodes = path.root ? @rootgraph.children : @graph
218
+ add_segment(path.segments, path.wanted_node_index,
219
+ current_nodes, name, &block)
220
+ end
221
+ alias register add
222
+
223
+ def add_segment ( seg, remember_index, current_nodes, name, &block )
224
+ if (seg.empty?)
225
+ current_nodes << Match.new(name, &block)
226
+ return
227
+ end
228
+ updated = false
229
+ searched_name, searched_value = seg.shift
230
+ searched_value = /.*/ if searched_value.nil?
231
+ current_nodes.collect! do |n|
232
+ if (n.is_a?(Node) and n.name == searched_name)
233
+ updated = true
234
+ update_node(n, searched_value, seg, remember_index, name, &block)
235
+ else
236
+ n
237
+ end
238
+ end
239
+ unless (updated)
240
+ current_nodes << update_node(Node.new(searched_name), searched_value,
241
+ seg, remember_index, name, &block)
242
+ end
243
+ end
244
+ private :add_segment
245
+
246
+ def update_node ( node, value, segment, remember_index, name, &block )
247
+ sons = node.get_associated(value, remember_index == 1)
248
+ add_segment(segment, remember_index - 1, sons, name, &block)
249
+ return node
250
+ end
251
+
252
+ # Print graph in a file in doty format
253
+ def dottify ( filename )
254
+ File.open(filename, 'w') do |f|
255
+ f << <<EOF
256
+ /* Compiled rules graph visualisation by YSLT */
257
+ digraph "Compiled rules" {
258
+ node [style=filled]
259
+ edge [style=solid, arrowtail=none]
260
+ rankdir=LR
261
+ EOF
262
+ @rootgraph.dottify(f)
263
+ @graph.each do |n|
264
+ n.dottify(f)
265
+ end
266
+ f << "}\n"
267
+ end
268
+ end
269
+
270
+ # Reset position to root.
271
+ def reset
272
+ @activated = @rootgraph.children + @graph
273
+ end
274
+
275
+ # Clear compiled rules.
276
+ def clear
277
+ initialize
278
+ end
279
+
280
+ # Traverse an entire YAML tree.
281
+ def traverse ( tree )
282
+ reset
283
+ tree.yaml_doc_traverse(@activated)
284
+ end
285
+
286
+ # Work like XLST.
287
+ # Traverse all tree and return a list of element that match the path.
288
+ def self.traverse ( path, tree, &block )
289
+ p = self.new
290
+ p.add(path, &block)
291
+ p.traverse(tree)
292
+ end
293
+
294
+ end # class Transformer
295
+
296
+ end # module YAML
297
+
298
+ if defined? TEST_MODE or $0 == __FILE__
299
+
300
+ require 'test/unit'
301
+
302
+ class Transformer < Test::Unit::TestCase
303
+
304
+ def test_compiled
305
+ # Initialization.
306
+ engine = nil
307
+ str = ''
308
+ assert_nothing_raised { engine = YAML::Transformer.new }
309
+
310
+ # Build.
311
+ assert_nothing_raised do
312
+ engine.add(YAML::YRegexPath.new('/name')) do |key, value|
313
+ assert_instance_of(String, key)
314
+ str += "#{value} is"
315
+ end
316
+ end
317
+ assert_nothing_raised do
318
+ engine.add(YAML::YRegexPath.new('/name=Akli/boss')) do |key, value|
319
+ assert_instance_of(String, key)
320
+ str += ' a boss'
321
+ end
322
+ end
323
+ assert_nothing_raised do
324
+ engine.add(YAML::YRegexPath.new('/jobs/professor=EPITA/class')) do |k,v|
325
+ assert_instance_of(String, k)
326
+ str += e
327
+ end
328
+ end
329
+ assert_nothing_raised do
330
+ engine.add(YAML::YRegexPath.new('toto#titi'), 'unused') do
331
+ str += 'Why am I HERE???'
332
+ end
333
+ end
334
+
335
+ # Display.
336
+ assert_nothing_raised { engine.dottify('compiled.dot') }
337
+ `dot compiled.dot 2> /dev/null`
338
+ assert_equal(0, $?, 'Cannot display the graph')
339
+
340
+ # Traverse.
341
+ tree = {
342
+ 'name' => 'Akli A.',
343
+ 'tel' => '06932359',
344
+ 'address' => '23 boulevard voltaire',
345
+ 'jobs' => [
346
+ {
347
+ 'professor' => 'EPITA',
348
+ 'boss' => 'MindSuite',
349
+ 'god' => 'world',
350
+ }
351
+ ]
352
+ }
353
+ assert_nothing_raised { engine.traverse(tree) }
354
+ assert_equal(str, 'Akli A. is a boss a boss a boss')
355
+ end
356
+
357
+ def test_unique
358
+ names = []
359
+ tree = {
360
+ 'users' => [
361
+ {
362
+ 'name' => 'Sea',
363
+ 'tel' => '111'
364
+ },
365
+ {
366
+ 'name' => 'Sex',
367
+ 'tel' => '222'
368
+ },
369
+ {
370
+ 'name' => 'Sun',
371
+ 'tel' => '333'
372
+ }
373
+ ]
374
+ }
375
+ YAML::Transformer.traverse(YAML::YRegexPath.new('name=Se'), tree) do
376
+ |k,v| names << v
377
+ end
378
+ assert_equal(['Sea', 'Sex'], names)
379
+ end
380
+
381
+ def test_higher_level_on_hash
382
+ email = ''
383
+ tree = {
384
+ 'Name' => 'Foo',
385
+ 'FirstName' => 'Bar',
386
+ 'Emails' => {
387
+ 'home' => 'foo312@coldmail.com',
388
+ 'work' => 'bfoo@staff.com',
389
+ 'edu' => 'bar.foo@school.edu'
390
+ }
391
+ }
392
+ path = YAML::YRegexPath.new('Emails#.*=.*\.edu')
393
+ YAML::Transformer.traverse(path, tree) do |key, value|
394
+ assert_instance_of(Hash, value)
395
+ email += "#{value['home']}"
396
+ end
397
+ assert_equal('foo312@coldmail.com', email)
398
+ end
399
+
400
+ # def test_higher_level_on_array
401
+ # users = []
402
+ # tree = {
403
+ # 'users' => [
404
+ # {
405
+ # 'name' => 'Sea',
406
+ # 'tel' => '111'
407
+ # },
408
+ # {
409
+ # 'name' => 'Sex',
410
+ # 'tel' => '222'
411
+ # },
412
+ # {
413
+ # 'name' => 'Sun',
414
+ # 'tel' => '333'
415
+ # }
416
+ # ]
417
+ # }
418
+ # YAML::Transformer.traverse(YAML::YRegexPath.new('users#name=Se'), tree) do
419
+ # |key, value|
420
+ # assert_instance_of(Array, value)
421
+ # value.each do |e|
422
+ # users << "#{e['name']} (#{e['tel']})"
423
+ # end
424
+ # end
425
+ # p users
426
+ # #assert_equal(['Sea (111)', 'Sex (222)'], users)
427
+ # end
428
+
429
+ def test_errors
430
+ engine = nil
431
+ assert_nothing_raised { engine = YAML::Transformer.new }
432
+
433
+ # Not an YRegexPath gived.
434
+ assert_raise(ArgumentError) do
435
+ engine.add('/name') { |key, value| str += "error" }
436
+ end
437
+
438
+ # # Block with only one parameter.
439
+ # assert_raise(ArgumentError) do
440
+ # engine.add(YAML::YRegexPath.new('/name')) { |key| str += "error" }
441
+ # end
442
+
443
+ # No block ginven.
444
+ assert_raise(ArgumentError) do
445
+ engine.add(YAML::YRegexPath.new('/name'))
446
+ end
447
+ end
448
+ end
449
+ end