ruby_ex 0.1.1
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/AUTHORS +51 -0
- data/ChangeLog +1763 -0
- data/NEWS +3 -0
- data/README +1 -0
- data/Rakefile +8 -0
- data/SPEC.dyn.yml +10 -0
- data/SPEC.gem.yml +269 -0
- data/SPEC.yml +36 -0
- data/src/abstract.rb +253 -0
- data/src/abstract_node.rb +85 -0
- data/src/algorithms.rb +12 -0
- data/src/algorithms/simulated_annealing.rb +142 -0
- data/src/ask.rb +100 -0
- data/src/attributed_class.rb +303 -0
- data/src/cache.rb +350 -0
- data/src/checkout.rb +12 -0
- data/src/choose.rb +271 -0
- data/src/commands.rb +20 -0
- data/src/commands/command.rb +492 -0
- data/src/commands/datas.rb +16 -0
- data/src/commands/datas/composite.rb +31 -0
- data/src/commands/datas/data.rb +65 -0
- data/src/commands/datas/factory.rb +69 -0
- data/src/commands/datas/temp.rb +26 -0
- data/src/commands/factory.rb +67 -0
- data/src/commands/helpers.rb +81 -0
- data/src/commands/pipe.rb +66 -0
- data/src/commands/runners.rb +16 -0
- data/src/commands/runners/exec.rb +50 -0
- data/src/commands/runners/fork.rb +130 -0
- data/src/commands/runners/runner.rb +140 -0
- data/src/commands/runners/system.rb +57 -0
- data/src/commands/seq.rb +32 -0
- data/src/config_file.rb +95 -0
- data/src/const_regexp.rb +57 -0
- data/src/daemon.rb +135 -0
- data/src/diff.rb +665 -0
- data/src/dlogger.rb +62 -0
- data/src/drb/drb_observable.rb +95 -0
- data/src/drb/drb_observable_pool.rb +27 -0
- data/src/drb/drb_service.rb +44 -0
- data/src/drb/drb_undumped_attributes.rb +56 -0
- data/src/drb/drb_undumped_indexed_object.rb +55 -0
- data/src/drb/insecure_protected_methods.rb +101 -0
- data/src/drb_ex.rb +12 -0
- data/src/dumpable_proc.rb +57 -0
- data/src/filetype.rb +229 -0
- data/src/generate_id.rb +44 -0
- data/src/histogram.rb +222 -0
- data/src/hookable.rb +283 -0
- data/src/hooker.rb +54 -0
- data/src/indexed_node.rb +65 -0
- data/src/io_marshal.rb +99 -0
- data/src/ioo.rb +193 -0
- data/src/labeled_node.rb +62 -0
- data/src/logger_observer.rb +24 -0
- data/src/md5sum.rb +70 -0
- data/src/module/autoload_tree.rb +65 -0
- data/src/module/hierarchy.rb +334 -0
- data/src/module/instance_method_visibility.rb +71 -0
- data/src/node.rb +81 -0
- data/src/object_monitor.rb +143 -0
- data/src/object_monitor_activity.rb +34 -0
- data/src/observable.rb +138 -0
- data/src/observable_pool.rb +291 -0
- data/src/orderedhash.rb +252 -0
- data/src/pp_hierarchy.rb +30 -0
- data/src/random_generators.rb +29 -0
- data/src/random_generators/random_generator.rb +33 -0
- data/src/random_generators/ruby.rb +25 -0
- data/src/ruby_ex.rb +124 -0
- data/src/safe_eval.rb +346 -0
- data/src/sendmail.rb +214 -0
- data/src/service_manager.rb +122 -0
- data/src/shuffle.rb +30 -0
- data/src/spring.rb +134 -0
- data/src/spring_set.rb +134 -0
- data/src/symtbl.rb +108 -0
- data/src/synflow.rb +474 -0
- data/src/thread_mutex.rb +11 -0
- data/src/timeout_ex.rb +79 -0
- data/src/trace.rb +26 -0
- data/src/uri/druby.rb +78 -0
- data/src/uri/file.rb +63 -0
- data/src/uri/ftp_ex.rb +36 -0
- data/src/uri/http_ex.rb +41 -0
- data/src/uri/pgsql.rb +136 -0
- data/src/uri/ssh.rb +87 -0
- data/src/uri/svn.rb +113 -0
- data/src/uri_ex.rb +71 -0
- data/src/verbose_object.rb +70 -0
- data/src/yaml/basenode_ext.rb +63 -0
- data/src/yaml/chop_header.rb +24 -0
- data/src/yaml/transform.rb +450 -0
- data/src/yaml/yregexpath.rb +76 -0
- data/test/algorithms/simulated_annealing_test.rb +102 -0
- data/test/check-pkg-ruby_ex.yml +15 -0
- data/test/check-ruby_ex.yml +12 -0
- data/test/resources/autoload_tree/A.rb +11 -0
- data/test/resources/autoload_tree/B.rb +10 -0
- data/test/resources/autoload_tree/foo/C.rb +18 -0
- data/test/resources/foo.txt +6 -0
- data/test/sanity-suite.yml +12 -0
- data/test/sanity/multiple-requires.yml +20 -0
- data/test/sanity/single-requires.yml +24 -0
- data/test/test-unit-setup.rb +6 -0
- data/test/unit-suite.yml +14 -0
- metadata +269 -0
data/src/dlogger.rb
ADDED
@@ -0,0 +1,62 @@
|
|
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: dlogger.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
require 'ruby_ex'
|
9
|
+
require 'logger'
|
10
|
+
|
11
|
+
# This Logger subclass permit to use more debug levels
|
12
|
+
#
|
13
|
+
# log = DLogger.new(STDERR)
|
14
|
+
# log.level = -1
|
15
|
+
# log.debug1 "You see me"
|
16
|
+
# log.debug2 "You see me"
|
17
|
+
# log.debug3 "You don't see me"
|
18
|
+
#
|
19
|
+
class DLogger < Logger
|
20
|
+
|
21
|
+
def format_severity ( severity )
|
22
|
+
return super if severity >= 0
|
23
|
+
return "DEBUG#{severity.abs + 1}"
|
24
|
+
end
|
25
|
+
private :format_severity
|
26
|
+
|
27
|
+
def method_missing ( meth, progname=nil, *args, &block )
|
28
|
+
return super unless meth.to_s =~ /^debug(\d+)$/ or !args.empty
|
29
|
+
add(-$1.to_i + 1, nil, progname, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
Format = "%s, [%s#%d] %6s -- %s: %s\n"
|
33
|
+
def format_message(severity, timestamp, msg, progname)
|
34
|
+
Format % [severity[0..0], timestamp, $$, severity, progname, msg]
|
35
|
+
end
|
36
|
+
private :format_message
|
37
|
+
|
38
|
+
end # class DLogger
|
39
|
+
|
40
|
+
|
41
|
+
test_section __FILE__ do
|
42
|
+
|
43
|
+
require 'stringio'
|
44
|
+
|
45
|
+
class DLoggerTest < Test::Unit::TestCase
|
46
|
+
|
47
|
+
def test1
|
48
|
+
cout = StringIO.new
|
49
|
+
log = DLogger.new(cout)
|
50
|
+
log.level = -1
|
51
|
+
log.debug1 'You see me'
|
52
|
+
log.debug3 'You don\'t see me'
|
53
|
+
log.debug2 'You see me'
|
54
|
+
cout.rewind
|
55
|
+
ref = /D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG -- : You see me
|
56
|
+
D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG2 -- : You see me/
|
57
|
+
assert_match(ref, cout.readlines.join)
|
58
|
+
end
|
59
|
+
|
60
|
+
end # class DLoggerTest
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,95 @@
|
|
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: drb_observable.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'drb/observer'
|
11
|
+
|
12
|
+
require 'observable'
|
13
|
+
|
14
|
+
|
15
|
+
module DRb
|
16
|
+
|
17
|
+
module DRbObservable
|
18
|
+
include Observable
|
19
|
+
|
20
|
+
undef notify_observers
|
21
|
+
def notify_observers(*args, &block)
|
22
|
+
if defined? @observer_state and @observer_state
|
23
|
+
if defined? @observer_peers
|
24
|
+
for i in @observer_peers.dup
|
25
|
+
begin
|
26
|
+
i.update(*args, &block)
|
27
|
+
rescue
|
28
|
+
delete_observer(i)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
@observer_state = false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def notify_observer(observer, *arg, &block)
|
37
|
+
if defined? @observer_state and @observer_state
|
38
|
+
if defined? @observer_peers
|
39
|
+
if @observer_peers.include?(observer)
|
40
|
+
begin
|
41
|
+
observer.update(*arg, &block)
|
42
|
+
rescue
|
43
|
+
delete_observer(observer)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
@observer_state = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end # module DRbObservable
|
52
|
+
|
53
|
+
end # module DRb
|
54
|
+
|
55
|
+
|
56
|
+
test_section __FILE__ do
|
57
|
+
|
58
|
+
|
59
|
+
module DRb
|
60
|
+
|
61
|
+
class ObservablePoolTest < ::Test::Unit::TestCase
|
62
|
+
|
63
|
+
class Obsv
|
64
|
+
include DRbObservable
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
class Foo
|
69
|
+
|
70
|
+
def update(*args, &block)
|
71
|
+
raise 'toto'
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_simple
|
77
|
+
o = Obsv.new
|
78
|
+
assert_respond_to(o, :list_observers)
|
79
|
+
o.add_observer(Foo.new)
|
80
|
+
assert_equal(1, o.count_observers)
|
81
|
+
o.changed
|
82
|
+
o.notify_observers('msg')
|
83
|
+
assert_equal(0, o.count_observers)
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
end # class ObservablePoolTest
|
88
|
+
|
89
|
+
end # module DRb
|
90
|
+
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
|
@@ -0,0 +1,27 @@
|
|
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: drb_observable_pool.rb 97 2005-01-13 18:20:49Z polrop $
|
7
|
+
|
8
|
+
|
9
|
+
require 'observable_pool'
|
10
|
+
|
11
|
+
require 'drb/drb_observable'
|
12
|
+
|
13
|
+
|
14
|
+
module DRb
|
15
|
+
|
16
|
+
class DRbObservablePool
|
17
|
+
|
18
|
+
class SyncObserver
|
19
|
+
include DRbObservable
|
20
|
+
|
21
|
+
end # class SyncObserver
|
22
|
+
|
23
|
+
end # class DRbObservable
|
24
|
+
|
25
|
+
end # module DRb
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Author:: Nicolas Despres <nicolas.despres@epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
|
3
|
+
# License:: Ruby license.
|
4
|
+
|
5
|
+
# $LastChangedBy: ertai $
|
6
|
+
# $Id: drb_service.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'drb/drb'
|
11
|
+
|
12
|
+
|
13
|
+
module DRb
|
14
|
+
|
15
|
+
class DRbService
|
16
|
+
include DRbUndumped
|
17
|
+
|
18
|
+
def initialize(config={})
|
19
|
+
@config = config
|
20
|
+
@server = nil
|
21
|
+
@uri = nil
|
22
|
+
@front = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :server, :uri, :front
|
26
|
+
|
27
|
+
def start_service(uri)
|
28
|
+
@server = DRb.start_service(uri.nil? ? uri : uri.to_s, @front, @config)
|
29
|
+
@uri = URI.parse(@server.uri)
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop_service
|
33
|
+
@server.stop_service if @server
|
34
|
+
end
|
35
|
+
|
36
|
+
def thread
|
37
|
+
@server.thread if @server
|
38
|
+
end
|
39
|
+
|
40
|
+
end # class DRbService
|
41
|
+
|
42
|
+
end # module DRb
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,56 @@
|
|
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: drb_undumped_attributes.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'drb/drb'
|
11
|
+
|
12
|
+
|
13
|
+
module DRb
|
14
|
+
|
15
|
+
module DRbUndumpedAttributes
|
16
|
+
|
17
|
+
def DRbUndumpedAttributes.append_features(cl)
|
18
|
+
super
|
19
|
+
cl.module_eval do
|
20
|
+
|
21
|
+
def _dump(depth)
|
22
|
+
if self.class.include?(DRb::DRbUndumped)
|
23
|
+
raise(TypeError, 'can\'t dump')
|
24
|
+
end
|
25
|
+
attribs = {}
|
26
|
+
instance_variables.each do |attr|
|
27
|
+
obj = instance_variable_get(attr)
|
28
|
+
begin
|
29
|
+
attribs[attr] = Marshal.dump(obj)
|
30
|
+
rescue TypeError
|
31
|
+
if (defined? LOG) and (not obj.class.include? DRb::DRbUndumped)
|
32
|
+
LOG.warn("#{self.class}._dump") do
|
33
|
+
"can't dump a #{attr}:#{obj.class}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
attribs[attr] = Marshal.dump(DRbObject.new(obj))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
Marshal.dump([self.class, attribs])
|
40
|
+
end
|
41
|
+
|
42
|
+
def self._load(data)
|
43
|
+
klass, attribs = Marshal.load(data)
|
44
|
+
obj = klass.new
|
45
|
+
attribs.each do |attr, value|
|
46
|
+
obj.instance_variable_set(attr, Marshal.load(value))
|
47
|
+
end
|
48
|
+
obj
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end # module DRbUndumpedAttributes
|
55
|
+
|
56
|
+
end # module DRb
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Author:: Nicolas Despres <nicolas.despres@epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2004 TTK Team. All rights reserved.
|
3
|
+
# License:: Ruby license.
|
4
|
+
|
5
|
+
# $LastChangedBy: ertai $
|
6
|
+
# $Id: drb_undumped_indexed_object.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'drb'
|
11
|
+
|
12
|
+
|
13
|
+
module DRb
|
14
|
+
|
15
|
+
module DRbUndumpedIndexedObject
|
16
|
+
|
17
|
+
def DRbUndumpedIndexedObject.append_features(cl)
|
18
|
+
super
|
19
|
+
cl.module_eval do
|
20
|
+
|
21
|
+
def _dump(depth)
|
22
|
+
if self.class.include?(DRb::DRbUndumped)
|
23
|
+
raise(TypeError, 'can\'t dump')
|
24
|
+
end
|
25
|
+
attribs = {}
|
26
|
+
each_pair do |k, v|
|
27
|
+
begin
|
28
|
+
attribs[k] = Marshal.dump(v)
|
29
|
+
rescue TypeError
|
30
|
+
if (defined? LOG) and (not v.class.include? DRb::DRbUndumped)
|
31
|
+
LOG.warn("#{self.class}._dump") do
|
32
|
+
"can't dump a #{k}:#{v.class}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
attribs[k] = Marshal.dump(DRbObject.new(v))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
Marshal.dump([self.class, attribs])
|
39
|
+
end
|
40
|
+
|
41
|
+
def self._load(data)
|
42
|
+
klass, attribs = Marshal.load(data)
|
43
|
+
obj = klass.new
|
44
|
+
attribs.each do |key, value|
|
45
|
+
obj[key] = Marshal.load(value)
|
46
|
+
end
|
47
|
+
obj
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end # module DRbUndumpedIndexedObject
|
54
|
+
|
55
|
+
end # module DRb
|
@@ -0,0 +1,101 @@
|
|
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: insecure_protected_methods.rb 268 2005-06-02 12:39:07Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'drb/drb'
|
11
|
+
|
12
|
+
|
13
|
+
module DRb
|
14
|
+
|
15
|
+
class DRbServer
|
16
|
+
|
17
|
+
alias_method :ori_check_insecure_method, :check_insecure_method
|
18
|
+
def check_insecure_method(obj, msg_id)
|
19
|
+
ori_check_insecure_method(obj, msg_id)
|
20
|
+
if obj.protected_methods.include?(msg_id.to_s)
|
21
|
+
desc = any_to_s(obj)
|
22
|
+
if desc.nil? || desc[0] == '#'
|
23
|
+
desc << ":#{obj.class}"
|
24
|
+
end
|
25
|
+
raise NameError, "protected method `#{msg_id}' called for #{desc}"
|
26
|
+
end
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
end # class DRbServer
|
31
|
+
|
32
|
+
end # module DRb
|
33
|
+
|
34
|
+
|
35
|
+
#
|
36
|
+
# Unit test suite
|
37
|
+
#
|
38
|
+
test_section __FILE__ do
|
39
|
+
|
40
|
+
|
41
|
+
module DRb
|
42
|
+
|
43
|
+
class InsecureProtectedMethodsTest < Test::Unit::TestCase
|
44
|
+
|
45
|
+
class SrvFoo
|
46
|
+
|
47
|
+
def public_request
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
def protected_request
|
52
|
+
end
|
53
|
+
|
54
|
+
end # class Foo
|
55
|
+
|
56
|
+
def setup
|
57
|
+
rd, wr = IO.pipe
|
58
|
+
unless @srv_pid = fork # son
|
59
|
+
rd.close
|
60
|
+
DRb.start_service("druby://localhost:42000", SrvFoo.new)
|
61
|
+
wr.puts('ready')
|
62
|
+
wr.close
|
63
|
+
DRb.thread.join
|
64
|
+
else # father
|
65
|
+
wr.close
|
66
|
+
rd.gets
|
67
|
+
@drb_srv = DRb.start_service
|
68
|
+
@drb_obj = DRbObject.new(nil, "druby://localhost:42000")
|
69
|
+
rd.close
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def teardown
|
74
|
+
@drb_srv.stop_service unless @drb_srv.nil?
|
75
|
+
Process.kill('TERM', @srv_pid)
|
76
|
+
Process.waitpid(@srv_pid)
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Test
|
81
|
+
#
|
82
|
+
def test_simple
|
83
|
+
assert_raises(NameError) { @drb_obj.send(:protected_resquest) }
|
84
|
+
assert_nothing_raised { @drb_obj.public_request }
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Tools
|
89
|
+
#
|
90
|
+
def server_request(req)
|
91
|
+
end
|
92
|
+
|
93
|
+
end # class InsecureProtectedMethodsTest
|
94
|
+
|
95
|
+
|
96
|
+
end # module DRb
|
97
|
+
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
|