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.
- data/Rakefile +17 -3
- data/bin/vcs +57 -34
- data/doc/jamis.rb +564 -0
- data/ruby_ex/abstract.rb +254 -0
- data/ruby_ex/abstract_node.rb +85 -0
- data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
- data/ruby_ex/array_each_pair.rb +18 -0
- data/ruby_ex/ask.rb +101 -0
- data/ruby_ex/attributed_class.rb +302 -0
- data/ruby_ex/cache.rb +373 -0
- data/ruby_ex/checkout.rb +12 -0
- data/ruby_ex/choose.rb +271 -0
- data/ruby_ex/commands.rb +18 -0
- data/ruby_ex/commands/command.rb +401 -0
- data/ruby_ex/commands/datas.rb +16 -0
- data/ruby_ex/commands/datas/data.rb +33 -0
- data/ruby_ex/commands/datas/factory.rb +66 -0
- data/ruby_ex/commands/factory.rb +66 -0
- data/ruby_ex/commands/helpers.rb +67 -0
- data/ruby_ex/commands/pipe.rb +64 -0
- data/ruby_ex/commands/runners.rb +17 -0
- data/ruby_ex/commands/runners/exec.rb +49 -0
- data/ruby_ex/commands/runners/fork.rb +97 -0
- data/ruby_ex/commands/runners/runner.rb +107 -0
- data/ruby_ex/commands/seq.rb +27 -0
- data/ruby_ex/config_file.rb +96 -0
- data/ruby_ex/const_regexp.rb +59 -0
- data/ruby_ex/daemon.rb +134 -0
- data/ruby_ex/diff.rb +667 -0
- data/ruby_ex/dlogger.rb +62 -0
- data/ruby_ex/drb/dispatcher.rb +252 -0
- data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
- data/ruby_ex/drb/drb_observable.rb +97 -0
- data/ruby_ex/drb/drb_observable_pool.rb +27 -0
- data/ruby_ex/drb/drb_service.rb +43 -0
- data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
- data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
- data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
- data/ruby_ex/drb/session_client_test.rb +40 -0
- data/ruby_ex/drb/session_manager.rb +246 -0
- data/ruby_ex/drb/session_server.rb +53 -0
- data/ruby_ex/dtime.rb +143 -0
- data/ruby_ex/dumpable_proc.rb +63 -0
- data/ruby_ex/exception.rb +32 -0
- data/ruby_ex/filetype.rb +229 -0
- data/ruby_ex/fileutils_ex.rb +44 -0
- data/ruby_ex/fold.rb +58 -0
- data/ruby_ex/generate_id.rb +44 -0
- data/ruby_ex/hookable.rb +262 -0
- data/ruby_ex/hooker.rb +54 -0
- data/ruby_ex/inactive_timeout.rb +137 -0
- data/ruby_ex/indexed_node.rb +66 -0
- data/ruby_ex/io_marshal.rb +100 -0
- data/ruby_ex/ioo.rb +194 -0
- data/ruby_ex/labeled_node.rb +63 -0
- data/ruby_ex/logger_observer.rb +23 -0
- data/ruby_ex/md5sum.rb +66 -0
- data/ruby_ex/mktemp.rb +208 -0
- data/ruby_ex/module/attr_once.rb +36 -0
- data/ruby_ex/module/autoload_tree.rb +75 -0
- data/ruby_ex/module/hierarchy.rb +335 -0
- data/ruby_ex/module/instance_method_visibility.rb +73 -0
- data/ruby_ex/module_ex.rb +11 -0
- data/ruby_ex/node.rb +80 -0
- data/ruby_ex/object_monitor.rb +145 -0
- data/ruby_ex/object_monitor_activity.rb +33 -0
- data/ruby_ex/observable.rb +140 -0
- data/ruby_ex/observable_pool.rb +293 -0
- data/ruby_ex/orderedhash.rb +252 -0
- data/ruby_ex/pathname_ex.rb +152 -0
- data/ruby_ex/pp_hierarchy.rb +29 -0
- data/ruby_ex/pseudo_cache.rb +190 -0
- data/ruby_ex/queue.rb +56 -0
- data/ruby_ex/random_generators.rb +25 -0
- data/ruby_ex/random_generators/random_generator.rb +31 -0
- data/ruby_ex/random_generators/ruby.rb +23 -0
- data/ruby_ex/safe_eval.rb +348 -0
- data/ruby_ex/sendmail.rb +215 -0
- data/ruby_ex/service_manager.rb +121 -0
- data/ruby_ex/session/administrable.rb +120 -0
- data/ruby_ex/session/client.rb +153 -0
- data/ruby_ex/session/const.rb +18 -0
- data/ruby_ex/session/dispatcher.rb +184 -0
- data/ruby_ex/session/error.rb +21 -0
- data/ruby_ex/session/fetchable.rb +57 -0
- data/ruby_ex/session/fetcher.rb +62 -0
- data/ruby_ex/session/hookable.rb +26 -0
- data/ruby_ex/session/profile.rb +110 -0
- data/ruby_ex/session/server.rb +582 -0
- data/ruby_ex/session/test/administrable_test.rb +337 -0
- data/ruby_ex/session/test/basic_test.rb +523 -0
- data/ruby_ex/session/test/dispatcher_test.rb +409 -0
- data/ruby_ex/session/test/fetchable_test.rb +119 -0
- data/ruby_ex/session/test/sub_server_test.rb +188 -0
- data/ruby_ex/shuffle.rb +30 -0
- data/ruby_ex/spring.rb +136 -0
- data/ruby_ex/spring_set.rb +137 -0
- data/ruby_ex/string_ex.rb +28 -0
- data/ruby_ex/symtbl.rb +106 -0
- data/ruby_ex/synflow.rb +474 -0
- data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
- data/ruby_ex/thread_mutex.rb +10 -0
- data/ruby_ex/timeout_ex.rb +81 -0
- data/ruby_ex/top_down.rb +73 -0
- data/ruby_ex/trace.rb +26 -0
- data/ruby_ex/uri/druby.rb +81 -0
- data/ruby_ex/uri/file.rb +65 -0
- data/ruby_ex/uri/ftp_ex.rb +37 -0
- data/ruby_ex/uri/http_ex.rb +43 -0
- data/ruby_ex/uri/ssh.rb +92 -0
- data/ruby_ex/uri/svn.rb +118 -0
- data/ruby_ex/uri_ex.rb +45 -0
- data/ruby_ex/verbose_object.rb +30 -0
- data/ruby_ex/version.rb +66 -0
- data/ruby_ex/yaml/basenode_ext.rb +63 -0
- data/ruby_ex/yaml/chop_header.rb +23 -0
- data/ruby_ex/yaml/transform.rb +449 -0
- data/ruby_ex/yaml/yregexpath.rb +76 -0
- data/src/changelog.rb +28 -18
- data/src/conflict.rb +20 -0
- data/src/diff.rb +18 -0
- data/src/diffstat.rb +9 -3
- data/src/last_changed_date.rb +18 -0
- data/src/mail.rb +33 -65
- data/src/message.rb +15 -9
- data/src/mycommit.rb +29 -14
- data/src/news.rb +24 -3
- data/src/status.rb +17 -0
- data/src/svn.rb +2 -2
- data/src/vcs.rb +24 -3
- metadata +124 -5
- data/lrdetools.rb +0 -12
|
@@ -0,0 +1,63 @@
|
|
|
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: polrop $
|
|
6
|
+
# $Id: node.rb 171 2005-03-29 09:12:47Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'abstract_node'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LabeledNode < AbstractNode
|
|
13
|
+
include Concrete
|
|
14
|
+
|
|
15
|
+
def initialize(data=nil, *sub_nodes)
|
|
16
|
+
if sub_nodes.empty?
|
|
17
|
+
@sub_nodes = {}
|
|
18
|
+
else
|
|
19
|
+
@sub_nodes = sub_nodes.first
|
|
20
|
+
end
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def merge!(sub_nodes)
|
|
25
|
+
sub_nodes.each { |index, sub_node| check_sub_node_type(sub_node) }
|
|
26
|
+
@sub_nodes.merge(sub_nodes)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end # class LabeledNode
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if defined? TEST_MODE or __FILE__ == $0
|
|
33
|
+
|
|
34
|
+
require 'test/unit'
|
|
35
|
+
|
|
36
|
+
class LabeledNodeTest < Test::Unit::TestCase
|
|
37
|
+
|
|
38
|
+
def test_simple
|
|
39
|
+
s11 = LabeledNode.new(11)
|
|
40
|
+
s12 = LabeledNode.new(12)
|
|
41
|
+
s = LabeledNode.new(1, 0 => s11, 1 => s12)
|
|
42
|
+
assert_equal(1, s.data)
|
|
43
|
+
assert_equal(s11, s.sub_nodes[0])
|
|
44
|
+
assert_equal(s12, s.sub_nodes[1])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_crochet_equal
|
|
48
|
+
s = LabeledNode.new(1)
|
|
49
|
+
assert_nothing_raised { s[0] = LabeledNode.new(10) }
|
|
50
|
+
assert_raises(TypeError) { s[1] = nil }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_merge
|
|
54
|
+
s = LabeledNode.new(1)
|
|
55
|
+
s11 = LabeledNode.new(11)
|
|
56
|
+
s12 = LabeledNode.new(12)
|
|
57
|
+
s.merge!({ 0 => s11, 1 => s12 })
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end # class LabeledNodeTest
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
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: polrop $
|
|
6
|
+
# $Id: logger_observer.rb 120 2005-01-22 19:43:06Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'logger'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Logger
|
|
13
|
+
|
|
14
|
+
def update(*args, &block)
|
|
15
|
+
severity = UNKNOWN
|
|
16
|
+
if args.size > 0
|
|
17
|
+
(severity = Severity.cons_get(args[0].to_s.upcase)) rescue NameError
|
|
18
|
+
end
|
|
19
|
+
add(severity, "#{args.inspect} #{block.inspect if block}", $PROGRAME_NAME)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end # class Logger
|
|
23
|
+
|
data/ruby_ex/md5sum.rb
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
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: polrop $
|
|
6
|
+
# $Id: md5sum.rb 88 2005-01-09 21:11:26Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'md5'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class File
|
|
13
|
+
|
|
14
|
+
def self.md5sum(filename)
|
|
15
|
+
md5 = Digest::MD5.new
|
|
16
|
+
IO.foreach(filename) { |l| md5 << l }
|
|
17
|
+
md5
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # module File
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Pathname
|
|
24
|
+
|
|
25
|
+
def md5sum
|
|
26
|
+
md5 = Digest::MD5.new
|
|
27
|
+
each_line { |l| md5 << l }
|
|
28
|
+
md5
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end # class Pathname
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# Unit test suite
|
|
36
|
+
#
|
|
37
|
+
if defined? TEST_MODE or __FILE__ == $0
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
41
|
+
require 'mktemp'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class MD5SumTest < Test::Unit::TestCase
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Tests
|
|
48
|
+
#
|
|
49
|
+
def test_simple
|
|
50
|
+
TempPath.new('src_md5sum') do |tmp_filename|
|
|
51
|
+
assert(system("man printf > #{tmp_filename} 2> /dev/null"),
|
|
52
|
+
'can\'t generate a tmp file from man printf')
|
|
53
|
+
ref_md5sum = ''
|
|
54
|
+
IO.popen("md5sum #{tmp_filename}") do |io|
|
|
55
|
+
ref_md5sum = io.gets.chomp.sub(/\s+#{tmp_filename}$/, '')
|
|
56
|
+
end
|
|
57
|
+
assert_equal(ref_md5sum, File.md5sum(tmp_filename).to_s)
|
|
58
|
+
assert_equal(ref_md5sum, tmp_filename.md5sum.to_s)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end # class MD5SumTest
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
data/ruby_ex/mktemp.rb
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Copyright: Copyright (c) 2004 Nicolas Pouillard. All rights reserved.
|
|
2
|
+
# Author: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
|
3
|
+
# License: Gnu General Public License.
|
|
4
|
+
|
|
5
|
+
# $LastChangedBy: ertai $
|
|
6
|
+
# $Id: mktemp.rb 186 2005-04-03 00:07:45Z ertai $
|
|
7
|
+
|
|
8
|
+
require 'pathname'
|
|
9
|
+
require 'tempfile'
|
|
10
|
+
require 'tmpdir'
|
|
11
|
+
require 'set'
|
|
12
|
+
require 'thread'
|
|
13
|
+
|
|
14
|
+
class TempPath < Pathname
|
|
15
|
+
|
|
16
|
+
@@tmps = Set.new
|
|
17
|
+
@@mutex = Mutex.new
|
|
18
|
+
@@progname = Pathname.new($0).basename
|
|
19
|
+
@@tmpdir = Pathname.new(Dir.tmpdir) + "#{@@progname}.#{$$}"
|
|
20
|
+
@@tmpdir.freeze
|
|
21
|
+
@@initialized = false
|
|
22
|
+
@@clean_planned = false
|
|
23
|
+
@@auto_clean = true
|
|
24
|
+
|
|
25
|
+
# You can use a temporary pathname like that:
|
|
26
|
+
#
|
|
27
|
+
# - # No argument are mandatory.
|
|
28
|
+
# tmp = TempPath.new
|
|
29
|
+
# tmp.open('w') { |f| f << 'foo' }
|
|
30
|
+
# tmp.clean
|
|
31
|
+
#
|
|
32
|
+
# - # You can choose the basename and an extension.
|
|
33
|
+
# TmpPath.new('the_base_file_name', 'rb')
|
|
34
|
+
#
|
|
35
|
+
# - # You can supply a block (recomended).
|
|
36
|
+
# TmpPath.new('foo') do |tmp|
|
|
37
|
+
# tmp.open('w') { |f| << 'foo' }
|
|
38
|
+
# tmp.exist? == true
|
|
39
|
+
# $tmp = tmp
|
|
40
|
+
# end
|
|
41
|
+
# $tmp.exist? == false
|
|
42
|
+
#
|
|
43
|
+
# - # You can make a temporary directory.
|
|
44
|
+
# TmpPath.new('adirectory') do |tmpdir|
|
|
45
|
+
# tmpdir.mkpath
|
|
46
|
+
# $file = tmpdir + 'foo'
|
|
47
|
+
# $file.open('w') { |f| f << 'foo' }
|
|
48
|
+
# end
|
|
49
|
+
# $file.exist? == false
|
|
50
|
+
#
|
|
51
|
+
def initialize ( base=@@progname, ext='', &block )
|
|
52
|
+
if base.to_s =~ /\//
|
|
53
|
+
raise ArgumentError, "bad basename, you give me a pathname #{base}"
|
|
54
|
+
end
|
|
55
|
+
self.class.init
|
|
56
|
+
ext = ".#{ext}" unless ext.empty? or ext[0] == ?.
|
|
57
|
+
res = nil
|
|
58
|
+
@@mutex.synchronize do
|
|
59
|
+
id_tmp = object_id
|
|
60
|
+
while (res = @@tmpdir + "#{base}.#{id_tmp}#{ext}").exist? \
|
|
61
|
+
and not @@tmps.include? res
|
|
62
|
+
id_tmp += 1
|
|
63
|
+
end
|
|
64
|
+
super(res)
|
|
65
|
+
@@tmps << self
|
|
66
|
+
end
|
|
67
|
+
if block_given?
|
|
68
|
+
begin
|
|
69
|
+
block[self.dup]
|
|
70
|
+
ensure
|
|
71
|
+
clean
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# This method remove your temporary pathname.
|
|
77
|
+
# You do not need to call this method if you provide
|
|
78
|
+
# a block when you create a tempfile.
|
|
79
|
+
def clean
|
|
80
|
+
if exist?
|
|
81
|
+
if directory?
|
|
82
|
+
rmtree
|
|
83
|
+
else
|
|
84
|
+
unlink
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def temp?
|
|
90
|
+
true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.init #:nodoc:
|
|
94
|
+
return if @@initialized
|
|
95
|
+
@@mutex.synchronize do
|
|
96
|
+
return if @@initialized
|
|
97
|
+
@@tmpdir.mkpath
|
|
98
|
+
@@initialized = true
|
|
99
|
+
at_exit { clean if @@auto_clean }
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# By default the autoclean is on.
|
|
104
|
+
# But in some case (if you use your temppaths in at_exit)
|
|
105
|
+
# You must disable the autoclean.
|
|
106
|
+
# And manually call TempPath.clean at the very of the program.
|
|
107
|
+
def self.clean ( &block )
|
|
108
|
+
@@mutex.synchronize do
|
|
109
|
+
return if @@clean_planned
|
|
110
|
+
@@clean_planned = true
|
|
111
|
+
end
|
|
112
|
+
begin
|
|
113
|
+
block[] if block_given?
|
|
114
|
+
ensure
|
|
115
|
+
if @@tmpdir.exist?
|
|
116
|
+
@@tmpdir.rmtree
|
|
117
|
+
@@initialized = false
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.auto_clean= ( aBool )
|
|
123
|
+
@@auto_clean = aBool
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.tmpdir
|
|
127
|
+
init
|
|
128
|
+
@@tmpdir
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end # class TempPath
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# This tempfile extension, provide the mktemp function.
|
|
135
|
+
#
|
|
136
|
+
# Example:
|
|
137
|
+
#
|
|
138
|
+
# Tempfile.mktemp('foo', 'rb')
|
|
139
|
+
# => 'foo.111811.432.rb'
|
|
140
|
+
# which follow this format:
|
|
141
|
+
# => 'base.pid.uniq.ext
|
|
142
|
+
#
|
|
143
|
+
# Tempfile.mktemp('bar')
|
|
144
|
+
# => 'foo.111811.134'
|
|
145
|
+
#
|
|
146
|
+
class Tempfile
|
|
147
|
+
|
|
148
|
+
# Almost deprecated use TempPath.
|
|
149
|
+
def self.mktemp ( base=$0, ext='', &block )
|
|
150
|
+
TempPath.new(base, ext, &block)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
end # class Tempfile
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class Pathname
|
|
157
|
+
|
|
158
|
+
def temp?
|
|
159
|
+
false
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end # class Pathname
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
167
|
+
|
|
168
|
+
require 'test/unit'
|
|
169
|
+
class MkTempTest < Test::Unit::TestCase
|
|
170
|
+
|
|
171
|
+
def setup
|
|
172
|
+
@list = []
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def teardown
|
|
176
|
+
@list.each { |l| l.clean }
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def test_interface
|
|
180
|
+
assert_nothing_raised { @foo = Tempfile.mktemp('foo') }
|
|
181
|
+
assert_nothing_raised { @foobar = Tempfile.mktemp('foo', 'bar') }
|
|
182
|
+
assert_match(/\.#{$$}\/foo\.\d+$/, @foo.to_s)
|
|
183
|
+
assert_match(/\.#{$$}\/foo\.\d+\.bar$/, @foobar.to_s)
|
|
184
|
+
assert_nothing_raised { @foo.open('w') { |f| f.puts 'FooFoo' } }
|
|
185
|
+
@list << @foo
|
|
186
|
+
@list << @foobar
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_many
|
|
190
|
+
(0 .. 100).each do |i|
|
|
191
|
+
tmp = Tempfile.mktemp('many')
|
|
192
|
+
tmp.open('w') { |f| f.puts "i: #{i}" }
|
|
193
|
+
assert(tmp.exist?)
|
|
194
|
+
assert_equal("i: #{i}\n", tmp.readlines.join)
|
|
195
|
+
@list << tmp
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def test_temp?
|
|
200
|
+
tmp = Tempfile.mktemp('is_temp')
|
|
201
|
+
assert(tmp.temp?, 'not tmp.temp?')
|
|
202
|
+
assert_nothing_raised { Pathname.new(tmp.to_s).temp? }
|
|
203
|
+
assert(!Pathname.new(tmp.to_s).temp?)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end # class MkTempTest
|
|
207
|
+
|
|
208
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
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: polrop $
|
|
6
|
+
# $Id: attr_once.rb 135 2005-01-28 12:43:31Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Module
|
|
10
|
+
|
|
11
|
+
# You can use this method as you use attr_reader. Must be used only with
|
|
12
|
+
# immutable object.
|
|
13
|
+
#
|
|
14
|
+
# This method is imported from the Date implementation. It provides a way
|
|
15
|
+
# to compute only once the value of getter. Basically, the first time, the
|
|
16
|
+
# getter is used, its result is computed and stored in an attribute with the
|
|
17
|
+
# same name. The second times only the attribute is returned.
|
|
18
|
+
def attr_once(*ids)
|
|
19
|
+
for id in ids
|
|
20
|
+
module_eval <<-"end;", __FILE__, __LINE__
|
|
21
|
+
alias_method :__#{id.to_i}__, :#{id.to_s}
|
|
22
|
+
private :__#{id.to_i}__
|
|
23
|
+
def #{id.to_s}(*args, &block)
|
|
24
|
+
if defined? @__#{id.to_i}__
|
|
25
|
+
@__#{id.to_i}__
|
|
26
|
+
elsif ! self.frozen?
|
|
27
|
+
@__#{id.to_i}__ ||= __#{id.to_i}__(*args, &block)
|
|
28
|
+
else
|
|
29
|
+
__#{id.to_i}__(*args, &block)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end;
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end # class Module
|
|
@@ -0,0 +1,75 @@
|
|
|
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: autoload_tree.rb 217 2005-05-09 12:01:07Z ertai $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'pathname_ex'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Module
|
|
13
|
+
|
|
14
|
+
def autoload_tree(dir, recursive=true, &block)
|
|
15
|
+
pdir = Pathname.new(dir)
|
|
16
|
+
pdir.each_entry do |p|
|
|
17
|
+
next if p.to_s =~ /^\./
|
|
18
|
+
pfull = pdir + p
|
|
19
|
+
if pfull.directory? and recursive
|
|
20
|
+
name = p.to_s.capitalize!
|
|
21
|
+
const_set(name, Module.new) unless const_defined?(name)
|
|
22
|
+
const_get(name).autoload_tree(pfull, recursive, &block)
|
|
23
|
+
elsif pfull.file? and p.to_s =~ /\.rb$/
|
|
24
|
+
autoload(name.to_s, pfull.to_s) if name = block[p]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def autoloaded_module ( file )
|
|
30
|
+
dir = file.sub(/\.rb$/, '').to_path
|
|
31
|
+
autoload_tree(dir) do |path|
|
|
32
|
+
path.basename.to_s.sub(/\.rb$/, '').gsub(/(?:^|_)([a-z])/) { $1.upcase }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end # class Module
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
if (not defined? AUTOLOAD_TREE_TESTED) and
|
|
40
|
+
(defined? TEST_MODE or __FILE__ == $0)
|
|
41
|
+
AUTOLOAD_TREE_TESTED = true
|
|
42
|
+
|
|
43
|
+
require 'test/unit/ui/console/testrunner'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class AutoloadTreeTest < Test::Unit::TestCase
|
|
47
|
+
|
|
48
|
+
if defined? SRC_DIR
|
|
49
|
+
REPO_DIR = SRC_DIR + Pathname.new('../test/resources/autoload_tree')
|
|
50
|
+
else
|
|
51
|
+
REPO_DIR = Pathname.new(__FILE__).dirname +
|
|
52
|
+
Pathname.new('../../test/resources/autoload_tree')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
module AutoloadTree; end
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Test
|
|
59
|
+
#
|
|
60
|
+
def test_autoload_tree
|
|
61
|
+
$: << REPO_DIR
|
|
62
|
+
AutoloadTree.autoload_tree(REPO_DIR) { |p| p.to_s.sub!(/\.rb$/, '') }
|
|
63
|
+
["Foo", "B", "A"].each do |x|
|
|
64
|
+
assert(AutoloadTree.constants.include?(x), "#{x} is missing")
|
|
65
|
+
end
|
|
66
|
+
assert_equal(["C"], AutoloadTree::Foo.constants)
|
|
67
|
+
$:.delete(REPO_DIR)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end # class AutoloadTreeTest
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
|