vcs 0.1 → 0.2.148

Sign up to get free protection for your applications and to get access to all the features.
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,254 @@
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
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: abstract.rb 210 2005-05-05 19:59:45Z ertai $
7
+
8
+
9
+ #FIXME: find a way to be thread safe.
10
+
11
+
12
+ require 'module/instance_method_visibility'
13
+
14
+
15
+ module Concrete; end
16
+
17
+
18
+ # When this module is included into a class, this class can't be instantiate
19
+ # any more until the Concrete module is included too. This module cannot be
20
+ # included if the Concrete module has been included before in one of the
21
+ # class' superclass.
22
+ module Abstract
23
+
24
+ def self.included(klass)
25
+ super
26
+ if klass.include?(Concrete)
27
+ raise(TypeError, "#{klass} - cannot make abstract a concrete class")
28
+ end
29
+ klass.module_eval do
30
+ class << self
31
+ unless private_method_defined?(:concrete_new)
32
+ alias_method :concrete_new, :new
33
+ visibility = instance_method_visibility('new')
34
+ def new(*args, &block)
35
+ raise(TypeError, "cannot instantiate an abstract class #{name}")
36
+ end
37
+ send(visibility, :new)
38
+ private :concrete_new
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ end # module Abstract
45
+
46
+
47
+ # Include this module in an abstract class to make it concrete and so, to be
48
+ # able to instantiate it again. This module can be included if and only if the
49
+ # Abstract module has been included before in one of the class' superclass.
50
+ module Concrete
51
+
52
+ def self.included(klass)
53
+ super
54
+ unless klass.include?(Abstract)
55
+ raise(TypeError, "#{klass} - not an abstract class")
56
+ end
57
+ klass.module_eval do
58
+ class << self
59
+ visibility = instance_method_visibility('new')
60
+ def new(*args, &block)
61
+ concrete_new(*args, &block)
62
+ end
63
+ send(visibility, :new)
64
+ end
65
+
66
+ def is_a?(klass)
67
+ klass == Abstract ? false : super(klass)
68
+ end
69
+ end
70
+ end
71
+
72
+ end # module Concrete
73
+
74
+
75
+ class Class
76
+
77
+ def abstract
78
+ include Abstract
79
+ end
80
+
81
+ def concrete
82
+ include Concrete
83
+ end
84
+
85
+ def abstract?
86
+ include?(Abstract) ? (not include?(Concrete)) : false;
87
+ end
88
+
89
+ end # class Class
90
+
91
+
92
+ if (not defined? ABSTRACT_TESTED) and (defined? TEST_MODE or __FILE__ == $0)
93
+ ABSTRACT_TESTED = true
94
+
95
+
96
+ require 'test/unit/ui/yaml/testrunner'
97
+ require 'singleton'
98
+
99
+
100
+ class AbstractTest < Test::Unit::TestCase
101
+
102
+ class R; end
103
+
104
+ class A
105
+ include Abstract
106
+
107
+ attr_reader :initialized
108
+
109
+ def initialize(toto=nil)
110
+ @initialized = true
111
+ end
112
+
113
+ end
114
+
115
+ class B < A; end
116
+
117
+ def test_abstract
118
+ assert_nothing_raised { R.new }
119
+ assert(A.include?(Abstract))
120
+ assert_raises(TypeError) { A.new }
121
+ assert_raises(TypeError) { B.new }
122
+ assert_raises(TypeError) do
123
+ AbstractTest.module_eval %q{
124
+ class D
125
+ include Concrete
126
+ include Abstract
127
+ end
128
+ }
129
+ end
130
+ end
131
+
132
+ class C < A
133
+ include Concrete
134
+
135
+ attr_reader :toto
136
+
137
+ def initialize(toto=nil)
138
+ super
139
+ @toto = toto
140
+ end
141
+ end
142
+
143
+ class CC < C; end
144
+
145
+ def test_concrete
146
+ assert_raises(TypeError) do
147
+ AbstractTest.module_eval %q{ class D; include Concrete; end }
148
+ end
149
+ assert(C.new.initialized)
150
+ assert_nil(C.new.toto)
151
+ assert_equal('toto', C.new('toto').toto)
152
+ assert(CC.new.initialized)
153
+ assert_equal(SC.instance, SC.instance)
154
+ assert_equal(SCC.instance, SCC.instance)
155
+ assert_not_equal(SC.instance, SCC.instance)
156
+ end
157
+
158
+ class SA
159
+ include Singleton
160
+ include Abstract
161
+
162
+ attr_reader :initialized
163
+
164
+ def initialize(toto=nil)
165
+ @initialized = true
166
+ end
167
+
168
+ end
169
+
170
+ class SB < SA; end
171
+
172
+ def test_abstract_singleton
173
+ assert(SA.include?(Abstract))
174
+ assert_raises(NoMethodError) { SA.new }
175
+ assert_raises(TypeError) { SA.instance }
176
+ assert_raises(NoMethodError) { SB.new }
177
+ assert_raises(TypeError) { SB.instance }
178
+ assert_raises(TypeError) do
179
+ AbstractTest.module_eval %q{
180
+ class SD; include Concrete; include Abstract; end
181
+ }
182
+ end
183
+ end
184
+
185
+ class SC < SA
186
+ include Concrete
187
+
188
+ end
189
+
190
+ class SCC < SC; end
191
+
192
+ def test_concrete_singleton
193
+ assert_raises(TypeError) do
194
+ AbstractTest.module_eval %q{ class SD; include Concrete; end }
195
+ end
196
+ assert_raises(NoMethodError) { SC.new }
197
+ assert(SC.instance.initialized)
198
+ assert(SCC.instance.initialized)
199
+ assert_equal(SC.instance, SC.instance)
200
+ assert_equal(SCC.instance, SCC.instance)
201
+ assert_not_equal(SC.instance, SCC.instance)
202
+ end
203
+
204
+ class IsA; include Abstract; end
205
+ class IsB < IsA; include Concrete; end
206
+
207
+ def test_is_a
208
+ assert(! IsB.new.is_a?(Abstract))
209
+ assert(IsB.new.is_a?(IsA))
210
+ assert(IsB.include?(Abstract))
211
+ end
212
+
213
+ def test_abstract?
214
+ assert(IsA.abstract?)
215
+ assert(! IsB.abstract?)
216
+ end
217
+
218
+ class AArg
219
+ include Abstract
220
+
221
+ attr_reader :arg
222
+
223
+ def initialize(arg)
224
+ @arg = arg
225
+ end
226
+
227
+ end
228
+
229
+ class CArg < AArg
230
+ include Concrete
231
+ end
232
+
233
+ def test_arg
234
+ assert_nothing_raised { CArg.new('toto') }
235
+ assert_raises(ArgumentError) { CArg.new }
236
+ end
237
+
238
+ class AA_; include Abstract; end
239
+ class BB_ < AA_; include Abstract; end
240
+ class CC_ < BB_; include Concrete; end
241
+ class DD_ < CC_; include Concrete; end
242
+
243
+ def test_double_abstract
244
+ assert_raises(TypeError) { AA_.new }
245
+ assert_raises(TypeError) { BB_.new }
246
+ assert_nothing_raised { CC_.new }
247
+ assert_nothing_raised { DD_.new }
248
+ end
249
+
250
+ end # class AbstractTest
251
+
252
+
253
+ end
254
+
@@ -0,0 +1,85 @@
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
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: abstract_node.rb 186 2005-04-03 00:07:45Z ertai $
7
+
8
+
9
+ require 'abstract'
10
+ require 'array_each_pair'
11
+
12
+ class AbstractNode
13
+ include Abstract
14
+
15
+ def initialize(data=nil, *sub_nodes)
16
+ @data = data
17
+ self.each_node { |sub_node| check_sub_node_type(sub_node) }
18
+ end
19
+
20
+ attr_reader :data, :sub_nodes
21
+
22
+ def [](index)
23
+ @sub_nodes[index]
24
+ end
25
+
26
+ def []=(index, sub_node)
27
+ check_sub_node_type(sub_node)
28
+ @sub_nodes[index] = sub_node
29
+ end
30
+
31
+ def merge!(sub_nodes)
32
+ sub_nodes.each { |index, sub_node| self[index] = sub_node }
33
+ end
34
+
35
+ def each_pair(&block)
36
+ @sub_nodes.each_pair { |index, sub_node| block[index, sub_node] }
37
+ end
38
+
39
+ def each_node(&block)
40
+ @sub_nodes.each_pair { |index, sub_node| block[sub_node] }
41
+ end
42
+
43
+ alias :each :each_node
44
+
45
+ def each_index(&block)
46
+ @sub_nodes.each_pair { |index, sub_node| block[index] }
47
+ end
48
+
49
+ def delete(index)
50
+ @sub_nodes.delete(index)
51
+ end
52
+
53
+ def nb_sub_nodes
54
+ @sub_nodes.size
55
+ end
56
+
57
+ alias size nb_sub_nodes
58
+ alias length nb_sub_nodes
59
+
60
+ def leaf?
61
+ @sub_nodes.empty?
62
+ end
63
+
64
+ def pre_depth_first(index=nil, &block)
65
+ block[index, self]
66
+ @sub_nodes.each_pair do |index, sub_node|
67
+ sub_node.pre_depth_first(index, &block)
68
+ end
69
+ nil
70
+ end
71
+
72
+ # FIXME: implement me
73
+ # def breadth_first(&block)
74
+ # end
75
+
76
+ protected
77
+ def check_sub_node_type(sub_node)
78
+ unless sub_node.is_a?(self.class)
79
+ raise(TypeError, "`#{sub_node}' - must be a #{self.class}")
80
+ end
81
+ end
82
+
83
+ end # class AbstractNode
84
+
85
+
@@ -0,0 +1,140 @@
1
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
+ # License:: GNU General Public License (GPL).
4
+ # Revision:: $Id$
5
+
6
+ require 'string_ex'
7
+
8
+ module Algorithms
9
+
10
+ class SimulatedAnnealing
11
+
12
+ # Example:
13
+ #
14
+ # obj = MySimulatedAnnealingObject.new
15
+ #
16
+ # SimulatedAnnealing.new(
17
+ # :support => obj,
18
+ # :global_thresold => 200,
19
+ # :step_multiplicator => 0.63,
20
+ # :initial_temperature => 10,
21
+ # :initial_cost => obj.cost,
22
+ # :iteration_modulus => 500, # display status once a 500
23
+ # :step_modulus => 5000 # change the temperature once a 5000
24
+ # )
25
+ #
26
+ def initialize ( opts )
27
+ @support = opts[:support]
28
+ @global_thresold = opts[:global_thresold]
29
+ @step_multiplicator = opts[:step_multiplicator]
30
+ @temperature = opts[:initial_temperature]
31
+ @cur_cost = opts[:initial_cost]
32
+ @output = opts[:output] || STDOUT
33
+ @iteration_modulus = opts[:iteration_modulus] || 1
34
+ @step_modulus = opts[:step_modulus] || 1
35
+ @progression = ' '
36
+ @diff_cost = 0
37
+ @iteration = 0
38
+ @probability_threshold = 0
39
+ end
40
+
41
+
42
+ def run
43
+ @output.puts '---'
44
+ while @cur_cost > @global_thresold
45
+ # puts "Iteration(#{it}) #{@cur_cost}"
46
+ @transition = @support.choose_transition()
47
+ @diff_cost = @support.transition_cost(@cur_cost, @transition)
48
+
49
+ @iteration += 1
50
+ if (@iteration % @step_modulus).zero?
51
+ @temperature *= @step_multiplicator
52
+ end
53
+
54
+ if @diff_cost > 0
55
+ @probability_threshold = Math.exp(- @diff_cost.to_f / @temperature)
56
+ @proba = choose_probability()
57
+ if @proba < @probability_threshold
58
+ progression '+'
59
+ else
60
+ progression ' '
61
+ next
62
+ end
63
+ else
64
+ @probability_threshold = 1
65
+ @proba = 1
66
+ progression((@diff_cost.zero?)? '=' : '-')
67
+ end
68
+
69
+ @support.apply_transition(@transition)
70
+ @cur_cost += @diff_cost
71
+ end
72
+ end
73
+
74
+
75
+ def disp ( output=@output )
76
+ args = [ @progression, @diff_cost.abs, @temperature,
77
+ @proba, @probability_threshold, @cur_cost ]
78
+ fmt = '- { diff: %s%-7d, temp: %-4f, ' +
79
+ 'prob: %-7f, thres: %-7f, cost: %-5s }'
80
+ output.puts fmt % args
81
+ end
82
+
83
+
84
+ def summary
85
+ @output.puts %Q[
86
+ |---
87
+ |Found a mininum: #@cur_cost
88
+ |Temperature at the end: #@temperature
89
+ |Nb iterations: #@iteration
90
+ ].head_cut!
91
+ end
92
+
93
+
94
+ def progression ( x )
95
+ @progression = x
96
+ disp if (@iteration % @iteration_modulus).zero?
97
+ end
98
+
99
+
100
+ def choose_probability
101
+ rand()
102
+ end
103
+
104
+
105
+ module Support
106
+
107
+ def included ( aModule )
108
+
109
+ aModule.module_eval do
110
+
111
+ #
112
+ # Return a transition which can be applied by apply_transition.
113
+ #
114
+ def choose_transition
115
+ raise NotImplementedError
116
+ end
117
+
118
+ #
119
+ # Return a cost difference
120
+ #
121
+ def transition_cost ( current_cost, transition )
122
+ raise NotImplementedError
123
+ end
124
+
125
+ #
126
+ # Apply the given transition to your current object.
127
+ #
128
+ def apply_transition ( transition )
129
+ raise NotImplementedError
130
+ end
131
+
132
+ end
133
+
134
+ end
135
+
136
+ end # module Support
137
+
138
+ end # class SimulatedAnnealing
139
+
140
+ end # module Algorithms