ruby_ex 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +693 -0
- data/NEWS +74 -0
- data/SPEC.dyn.yml +6 -6
- data/SPEC.gemspec +14 -0
- data/SPEC.yml +4 -4
- data/lib/abstract.rb +2 -4
- data/lib/abstract_node.rb +1 -2
- data/lib/algorithms/simulated_annealing.rb +50 -29
- data/lib/attributed_class.rb +50 -21
- data/lib/auto_object.rb +102 -0
- data/lib/blank_slate.rb +102 -0
- data/lib/cache.rb +1 -2
- data/lib/choose.rb +165 -163
- data/lib/commands.rb +2 -3
- data/lib/commands/command.rb +47 -20
- data/lib/commands/datas.rb +1 -1
- data/lib/commands/datas/composite.rb +5 -1
- data/lib/commands/datas/data.rb +102 -5
- data/lib/commands/datas/factory.rb +13 -6
- data/lib/commands/datas/temp.rb +3 -5
- data/lib/commands/factory.rb +1 -1
- data/lib/commands/helpers.rb +1 -1
- data/lib/commands/pipe.rb +10 -1
- data/lib/commands/runners.rb +1 -1
- data/lib/commands/runners/exec.rb +1 -1
- data/lib/commands/runners/fork.rb +3 -16
- data/lib/commands/runners/mock.rb +67 -0
- data/lib/commands/runners/runner.rb +5 -3
- data/lib/commands/runners/system.rb +1 -1
- data/lib/commands/seq.rb +2 -1
- data/lib/config_file.rb +10 -2
- data/lib/const_regexp.rb +1 -2
- data/lib/{dlogger.rb → d_logger.rb} +1 -2
- data/lib/daemon.rb +1 -2
- data/lib/diff.rb +1 -2
- data/lib/drb/drb_observable.rb +1 -2
- data/lib/drb/drb_observable_pool.rb +2 -2
- data/lib/drb/drb_service.rb +1 -2
- data/lib/drb/drb_undumped_attributes.rb +1 -2
- data/lib/drb/drb_undumped_indexed_object.rb +1 -2
- data/lib/drb/insecure_protected_methods.rb +1 -2
- data/lib/drb_ex.rb +2 -2
- data/lib/file_type.rb +466 -0
- data/lib/generate_id.rb +12 -6
- data/lib/genpasswd.rb +22 -0
- data/lib/hash_eval.rb +83 -0
- data/lib/histogram.rb +1 -2
- data/lib/hookable.rb +3 -4
- data/lib/hooker.rb +1 -3
- data/lib/html_encode.rb +191 -0
- data/lib/indexed_node.rb +0 -1
- data/lib/io_marshal.rb +4 -2
- data/lib/ioo.rb +3 -2
- data/lib/kill_all.rb +46 -0
- data/lib/labeled_node.rb +0 -1
- data/lib/logger_observer.rb +8 -4
- data/lib/md5sum.rb +3 -3
- data/lib/meta_factory.rb +99 -0
- data/lib/method_call.rb +87 -0
- data/lib/mocks.rb +12 -0
- data/lib/mocks/assertions.rb +50 -0
- data/lib/mocks/method_logger.rb +40 -0
- data/lib/mocks/mock.rb +64 -0
- data/lib/mocks/object.rb +47 -0
- data/lib/mocks/observer.rb +38 -0
- data/lib/module/autoload_tree.rb +30 -29
- data/lib/module/hierarchy.rb +176 -171
- data/lib/module/instance_method_visibility.rb +39 -38
- data/lib/node.rb +0 -1
- data/lib/object_monitor.rb +1 -2
- data/lib/object_monitor_activity.rb +1 -2
- data/lib/observable.rb +1 -2
- data/lib/observable_pool.rb +1 -2
- data/lib/{orderedhash.rb → ordered_hash.rb} +41 -5
- data/lib/pp_hierarchy.rb +7 -2
- data/lib/r_path.rb +307 -0
- data/lib/random_generators.rb +7 -20
- data/lib/random_generators/random_generator.rb +2 -4
- data/lib/random_generators/ruby.rb +4 -2
- data/lib/regex_path.rb +124 -0
- data/lib/ruby_ex.rb +28 -98
- data/lib/safe_eval.rb +1 -2
- data/lib/sendmail.rb +14 -17
- data/lib/service_manager.rb +1 -2
- data/lib/shuffle.rb +6 -2
- data/lib/spring.rb +1 -2
- data/lib/spring_set.rb +1 -2
- data/lib/{symtbl.rb → sym_tbl.rb} +90 -5
- data/lib/sym_tbl_gsub.rb +227 -0
- data/lib/{synflow.rb → syn_flow.rb} +1 -2
- data/lib/text.rb +218 -0
- data/lib/timeout_ex.rb +1 -2
- data/lib/trace.rb +9 -8
- data/lib/uri/druby.rb +1 -2
- data/lib/uri/file.rb +1 -1
- data/lib/uri/ftp_ex.rb +1 -1
- data/lib/uri/http_ex.rb +1 -1
- data/lib/uri/mysql.rb +121 -0
- data/lib/uri/pgsql.rb +19 -38
- data/lib/uri/svn.rb +1 -2
- data/lib/uri_ex.rb +45 -3
- data/lib/verbose_object.rb +181 -38
- data/lib/yaml/chop_header.rb +19 -11
- data/lib/yaml/transform.rb +17 -11
- data/lib/yaml/yregexpath.rb +11 -5
- data/test/algorithms/simulated_annealing_test.rb +2 -2
- data/test/resources/foo.tar.gz +0 -0
- data/test/resources/tar.gz.log +49 -0
- data/test/sanity-suite.yml +5 -7
- data/test/sanity/multiple-requires.yml +17 -7
- data/test/sanity/single-requires.yml +38 -20
- data/test/stress-tests/threads_and_exceptions.yml +13 -0
- data/test/test-unit-setup.rb +3 -1
- data/test/unit-suite.yml +7 -8
- metadata +42 -31
- data/lib/algorithms.rb +0 -12
- data/lib/ask.rb +0 -100
- data/lib/checkout.rb +0 -12
- data/lib/dumpable_proc.rb +0 -57
- data/lib/filetype.rb +0 -229
- data/lib/thread_mutex.rb +0 -11
- data/lib/yaml/basenode_ext.rb +0 -63
data/lib/timeout_ex.rb
CHANGED
data/lib/trace.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
# Copyright
|
2
|
-
# Author
|
3
|
-
# License
|
1
|
+
# Copyright:: Copyright (c) 2004, 2005 Nicolas Despres. All rights reserved.
|
2
|
+
# Author:: Nicolas Despres <polrop@lrde.epita.fr>.
|
3
|
+
# License:: Gnu General Public License.
|
4
|
+
# Revision:: $Id: trace.rb 339 2005-09-06 23:27:27Z ertai $
|
4
5
|
|
5
|
-
|
6
|
-
# $Id: trace.rb 279 2005-06-05 17:46:53Z ertai $
|
7
|
-
|
8
|
-
|
9
|
-
module Kernel
|
6
|
+
module Trace
|
10
7
|
|
11
8
|
def trace_on
|
12
9
|
set_trace_func proc { |event, file, line, id, binding, classname|
|
@@ -23,4 +20,8 @@ module Kernel
|
|
23
20
|
set_trace_func nil
|
24
21
|
end
|
25
22
|
|
23
|
+
end # module Trace
|
24
|
+
|
25
|
+
module Kernel
|
26
|
+
include Trace
|
26
27
|
end # module Kernel
|
data/lib/uri/druby.rb
CHANGED
data/lib/uri/file.rb
CHANGED
data/lib/uri/ftp_ex.rb
CHANGED
data/lib/uri/http_ex.rb
CHANGED
data/lib/uri/mysql.rb
ADDED
@@ -0,0 +1,121 @@
|
|
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: mysql.rb 310 2005-06-27 07:14:36Z ertai $
|
5
|
+
|
6
|
+
require 'uri_ex'
|
7
|
+
|
8
|
+
module URI
|
9
|
+
|
10
|
+
class MySQL < Generic
|
11
|
+
|
12
|
+
SCHEME = 'mysql'.freeze
|
13
|
+
DEFAULT_HOST = 'localhost'.freeze
|
14
|
+
DEFAULT_PORT = 3306
|
15
|
+
DEFAULT_QUERY = ''.freeze
|
16
|
+
DUMP = 'mysqldump'.to_cmd.freeze
|
17
|
+
|
18
|
+
COMPONENT = [
|
19
|
+
:scheme,
|
20
|
+
:userinfo,
|
21
|
+
:host,
|
22
|
+
:path,
|
23
|
+
:query
|
24
|
+
].freeze
|
25
|
+
|
26
|
+
|
27
|
+
def self.build ( args )
|
28
|
+
tmp = Util::make_components_hash(self, args)
|
29
|
+
return super(tmp)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def mk_connection_opts
|
34
|
+
opts = []
|
35
|
+
opts << '-h' << @host
|
36
|
+
opts << '-P' << @port if @port != DEFAULT_PORT
|
37
|
+
opts << '-p' << @password if @password
|
38
|
+
opts << '-u' << @user if @user
|
39
|
+
opts
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def mk_dump_opts ( out=nil )
|
44
|
+
opts = %w[ -C ]
|
45
|
+
opts << '-r' << out if out
|
46
|
+
base, table = pathname.split
|
47
|
+
base, table = base.to_s, table.to_s
|
48
|
+
if base =~ /[\.\/]/
|
49
|
+
opts << table
|
50
|
+
else
|
51
|
+
if base =~ /\//
|
52
|
+
raise ArgumentError, "Use database/table not #{pathname}"
|
53
|
+
end
|
54
|
+
opts << base << table
|
55
|
+
end
|
56
|
+
opts
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
def save
|
61
|
+
out = TempPath.new('dump', pathname.basename.to_s)
|
62
|
+
cmd = DUMP + mk_connection_opts + mk_dump_opts(out) + mk_custom_opts
|
63
|
+
cmd.run(self.runner)
|
64
|
+
out
|
65
|
+
end
|
66
|
+
|
67
|
+
end # class MySQL
|
68
|
+
|
69
|
+
@@schemes[MySQL::SCHEME.upcase] = MySQL
|
70
|
+
|
71
|
+
test_section __FILE__ do
|
72
|
+
class MySQLTest < Test::Unit::TestCase
|
73
|
+
|
74
|
+
def setup
|
75
|
+
assert_nothing_raised do
|
76
|
+
@foo = URI.parse('mysql://foo/qux/bar')
|
77
|
+
@foo_at_bar = URI.parse('mysql://foo:baz@bar/baz/ben')
|
78
|
+
@foo_at_bar_42 = URI.parse('mysql://foo@bar:42/bing')
|
79
|
+
@cmplx = URI.parse('mysql://foo@bar/qux/bob?a=b,c,d=e,f,ghi,jkl=mno')
|
80
|
+
end
|
81
|
+
@all = [ @foo, @foo_at_bar, @foo_at_bar_42, @cmplx ]
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_0_parse_basic
|
85
|
+
@all.each do |uri|
|
86
|
+
assert_kind_of(MySQL, uri)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_with_query
|
91
|
+
ref = %w[-h bar -u foo -C -r out bob -a b -c -d e -f --ghi --jkl mno]
|
92
|
+
assert_equal(ref, @cmplx.mk_connection_opts +
|
93
|
+
@cmplx.mk_dump_opts('out') +
|
94
|
+
@cmplx.mk_custom_opts)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_mk_connection_opts
|
98
|
+
assert_equal(['-h', 'foo'], @foo.mk_connection_opts)
|
99
|
+
assert_equal(%w[-h bar -p baz -u foo], @foo_at_bar.mk_connection_opts)
|
100
|
+
assert_equal(%w[-h bar -P]+[42, '-u', 'foo'],
|
101
|
+
@foo_at_bar_42.mk_connection_opts)
|
102
|
+
assert_equal(["-h", "bar", "-u", "foo"], @cmplx.mk_connection_opts)
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def test_mk_dump_opts
|
107
|
+
base = %w[-C -r out]
|
108
|
+
assert_equal(%w[ -C bar ], @foo.mk_dump_opts())
|
109
|
+
assert_equal(base + ['bar'], @foo.mk_dump_opts('out'))
|
110
|
+
assert_equal(base + ['ben'], @foo_at_bar.mk_dump_opts('out'))
|
111
|
+
assert_equal(base + ['bing'], @foo_at_bar_42.mk_dump_opts('out'))
|
112
|
+
assert_equal(base + ['bob'], @cmplx.mk_dump_opts('out'))
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_save
|
116
|
+
# FIXME
|
117
|
+
end
|
118
|
+
end # class MySQLTest
|
119
|
+
end
|
120
|
+
|
121
|
+
end # module URI
|
data/lib/uri/pgsql.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
2
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
3
|
# License:: Gnu General Public License.
|
4
|
-
# Revision:: $Id: pgsql.rb
|
4
|
+
# Revision:: $Id: pgsql.rb 310 2005-06-27 07:14:36Z ertai $
|
5
5
|
|
6
6
|
require 'uri_ex'
|
7
7
|
|
@@ -13,7 +13,7 @@ module URI
|
|
13
13
|
DEFAULT_HOST = 'localhost'.freeze
|
14
14
|
DEFAULT_PORT = 5432
|
15
15
|
DEFAULT_QUERY = ''.freeze
|
16
|
-
|
16
|
+
DUMP = 'pg_dump'.to_cmd.freeze
|
17
17
|
|
18
18
|
COMPONENT = [
|
19
19
|
:scheme,
|
@@ -39,25 +39,9 @@ module URI
|
|
39
39
|
end
|
40
40
|
|
41
41
|
|
42
|
-
def
|
43
|
-
opts = []
|
44
|
-
|
45
|
-
@query.split(/,/).map do |x|
|
46
|
-
k, v = x.split(/=/)
|
47
|
-
if k.size == 1
|
48
|
-
opts << "-#{k}"
|
49
|
-
else
|
50
|
-
opts << "--#{k}"
|
51
|
-
end
|
52
|
-
opts << v unless v.nil?
|
53
|
-
end
|
54
|
-
opts
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def mk_pg_dump_opts ( out )
|
59
|
-
opts = %w[ -F c -Z 9 -C -f ]
|
60
|
-
opts << out
|
42
|
+
def mk_dump_opts ( out=nil )
|
43
|
+
opts = %w[ -F c -Z 9 -C ]
|
44
|
+
opts << '-f' << out if out
|
61
45
|
base, table = pathname.split
|
62
46
|
base, table = base.to_s, table.to_s
|
63
47
|
if base =~ /[\.\/]/
|
@@ -74,7 +58,7 @@ module URI
|
|
74
58
|
|
75
59
|
def save
|
76
60
|
out = TempPath.new('dump', pathname.basename.to_s)
|
77
|
-
cmd =
|
61
|
+
cmd = DUMP + mk_connection_opts + mk_dump_opts(out) + mk_custom_opts
|
78
62
|
cmd.run(self.runner)
|
79
63
|
out
|
80
64
|
end
|
@@ -87,21 +71,25 @@ module URI
|
|
87
71
|
class PgSQLTest < Test::Unit::TestCase
|
88
72
|
|
89
73
|
def setup
|
90
|
-
assert_nothing_raised { @foo = URI.parse('pgsql://foo/qux/bar') }
|
91
|
-
assert_nothing_raised { @foo_at_bar = URI.parse('pgsql://foo@bar/baz/ben') }
|
92
|
-
assert_nothing_raised { @foo_at_bar_42 = URI.parse('pgsql://foo@bar:42/bing') }
|
93
74
|
assert_nothing_raised do
|
75
|
+
@foo = URI.parse('pgsql://foo/qux/bar')
|
76
|
+
@foo_at_bar = URI.parse('pgsql://foo@bar/baz/ben')
|
77
|
+
@foo_at_bar_42 = URI.parse('pgsql://foo@bar:42/bing')
|
94
78
|
@cmplx = URI.parse('pgsql://foo@bar/qux/bob?a=b,c,d=e,f,ghi,jkl=mno')
|
95
79
|
end
|
80
|
+
@all = [ @foo, @foo_at_bar, @foo_at_bar_42, @cmplx ]
|
96
81
|
end
|
97
82
|
|
98
83
|
def test_0_parse_basic
|
84
|
+
@all.each do |uri|
|
85
|
+
assert_kind_of(PgSQL, uri)
|
86
|
+
end
|
99
87
|
end
|
100
88
|
|
101
89
|
def test_with_query
|
102
90
|
ref = %w[-h bar -U foo -F c -Z 9 -C -f out bob -a b -c -d e -f --ghi --jkl mno]
|
103
91
|
assert_equal(ref, @cmplx.mk_connection_opts +
|
104
|
-
@cmplx.
|
92
|
+
@cmplx.mk_dump_opts('out') +
|
105
93
|
@cmplx.mk_custom_opts)
|
106
94
|
end
|
107
95
|
|
@@ -112,19 +100,12 @@ module URI
|
|
112
100
|
assert_equal(["-h", "bar", "-U", "foo"], @cmplx.mk_connection_opts)
|
113
101
|
end
|
114
102
|
|
115
|
-
def
|
116
|
-
assert_equal([], @foo.mk_custom_opts)
|
117
|
-
assert_equal([], @foo_at_bar.mk_custom_opts)
|
118
|
-
assert_equal([], @foo_at_bar_42.mk_custom_opts)
|
119
|
-
assert_equal(%w[-a b -c -d e -f --ghi --jkl mno], @cmplx.mk_custom_opts)
|
120
|
-
end
|
121
|
-
|
122
|
-
def test_mk_pg_dump_opts
|
103
|
+
def test_mk_dump_opts
|
123
104
|
base = %w[-F c -Z 9 -C -f out]
|
124
|
-
assert_equal(base + ['bar'], @foo.
|
125
|
-
assert_equal(base + ['ben'], @foo_at_bar.
|
126
|
-
assert_equal(base + ['bing'], @foo_at_bar_42.
|
127
|
-
assert_equal(base + ['bob'], @cmplx.
|
105
|
+
assert_equal(base + ['bar'], @foo.mk_dump_opts('out'))
|
106
|
+
assert_equal(base + ['ben'], @foo_at_bar.mk_dump_opts('out'))
|
107
|
+
assert_equal(base + ['bing'], @foo_at_bar_42.mk_dump_opts('out'))
|
108
|
+
assert_equal(base + ['bob'], @cmplx.mk_dump_opts('out'))
|
128
109
|
end
|
129
110
|
|
130
111
|
def test_save
|
data/lib/uri/svn.rb
CHANGED
data/lib/uri_ex.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
2
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
3
|
# License:: Gnu General Public License.
|
4
|
-
# Revision:: $Id: uri_ex.rb
|
4
|
+
# Revision:: $Id: uri_ex.rb 339 2005-09-06 23:27:27Z ertai $
|
5
5
|
|
6
6
|
require 'uri'
|
7
|
-
require 'ruby_ex'
|
8
|
-
require 'commands'
|
9
7
|
|
8
|
+
module UriEx
|
9
|
+
end # module UriEx
|
10
10
|
|
11
11
|
module URI
|
12
12
|
|
@@ -66,6 +66,48 @@ module URI
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
|
70
|
+
def mk_custom_opts
|
71
|
+
opts = []
|
72
|
+
return opts if @query.nil?
|
73
|
+
@query.split(/,/).map do |x|
|
74
|
+
k, v = x.split(/=/)
|
75
|
+
if k.size == 1
|
76
|
+
opts << "-#{k}"
|
77
|
+
else
|
78
|
+
opts << "--#{k}"
|
79
|
+
end
|
80
|
+
opts << v unless v.nil?
|
81
|
+
end
|
82
|
+
opts
|
83
|
+
end
|
84
|
+
|
85
|
+
|
69
86
|
end # module Generic
|
70
87
|
|
88
|
+
|
89
|
+
|
90
|
+
test_section __FILE__ do
|
91
|
+
class GenericTest < Test::Unit::TestCase
|
92
|
+
|
93
|
+
def setup
|
94
|
+
assert_nothing_raised { @foo = URI.parse('http://foo/qux/bar') }
|
95
|
+
assert_nothing_raised do
|
96
|
+
@cmplx = URI.parse('http://foo@bar/qux/bob?a=b,c,d=e,f,ghi,jkl=mno')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_mk_custom_opts
|
101
|
+
assert_equal([], @foo.mk_custom_opts)
|
102
|
+
assert_equal(%w[-a b -c -d e -f --ghi --jkl mno], @cmplx.mk_custom_opts)
|
103
|
+
end
|
104
|
+
|
105
|
+
end # class GenericTest
|
106
|
+
end
|
107
|
+
|
108
|
+
PathList[__FILE__.to_path.dirname + 'uri/**/*.rb'].each do |path|
|
109
|
+
require path.to_s
|
110
|
+
end
|
111
|
+
|
71
112
|
end # module URI
|
113
|
+
|
data/lib/verbose_object.rb
CHANGED
@@ -1,70 +1,213 @@
|
|
1
1
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
2
|
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
3
3
|
# License:: GNU General Public License (GPL).
|
4
|
-
# Revision:: $Id: verbose_object.rb
|
4
|
+
# Revision:: $Id: verbose_object.rb 339 2005-09-06 23:27:27Z ertai $
|
5
5
|
|
6
|
-
require '
|
6
|
+
require 'blank_slate'
|
7
|
+
require 'method_call'
|
7
8
|
|
8
9
|
module Verbosify
|
9
10
|
|
10
|
-
|
11
|
+
attr_accessor :verbose_object_reference
|
12
|
+
attr_reader :verbose_object_options
|
11
13
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
def initialize ( anObject, opts=nil )
|
15
|
+
@verbose_object_reference = anObject
|
16
|
+
self.verbose_object_options = opts
|
17
|
+
end
|
18
|
+
|
19
|
+
def verbose_object_options= ( opts )
|
20
|
+
@verbose_object_reference ||= nil
|
21
|
+
@verbose_object_options = opts || {}
|
22
|
+
unless @verbose_object_options.is_a? Hash
|
23
|
+
raise ArgumentError,
|
24
|
+
"Need a hash of options not a #@verbose_object_options"
|
22
25
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
def __log__ ( *a )
|
28
|
-
STDERR.puts "LOG: #{a.inspect}"
|
26
|
+
if @verbose_object_options[:logger].nil?
|
27
|
+
logger = @verbose_object_options[:logger] = Object.new
|
28
|
+
def logger.log ( obj, *a )
|
29
|
+
STDERR.puts "LOG: #{obj.__id__}: #{a.inspect}"
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
+
def verbose_object?
|
35
|
+
true
|
36
|
+
end
|
34
37
|
|
38
|
+
def verbose_object_send ( m, *a, &b )
|
39
|
+
if @verbose_object_reference.nil?
|
40
|
+
__send__("__blank_slate_#{m}", *a, &b)
|
41
|
+
else
|
42
|
+
@verbose_object_reference.__send__(m, *a, &b)
|
43
|
+
end
|
44
|
+
end
|
35
45
|
|
36
|
-
|
46
|
+
def method_missing ( m, *a, &b )
|
47
|
+
super($1.to_sym) if m.to_s =~ /^__blank_slate_(.+)/
|
48
|
+
verbose_object_method_missing(m, *a, &b)
|
49
|
+
end
|
37
50
|
|
38
|
-
def
|
39
|
-
|
51
|
+
def verbose_object_method_missing ( m, *a, &b )
|
52
|
+
begin
|
53
|
+
@verbose_object_options[:logger].log(self, m, *a)
|
54
|
+
rescue NoMethodError => ex
|
55
|
+
STDERR.puts "No valid logger (#{m}) (#{ex})"
|
56
|
+
end
|
57
|
+
res = verbose_object_send(m, *a, &b)
|
58
|
+
return res if @verbose_object_options[:no_rec]
|
59
|
+
call = MethodCall.new(m, *a, &b)
|
60
|
+
opts = @verbose_object_options.merge(:call => call, :last => self)
|
61
|
+
res.verbosify(opts)
|
40
62
|
end
|
41
63
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
64
|
+
def verbose_object_trace ( action=nil )
|
65
|
+
call = @verbose_object_options[:call]
|
66
|
+
last = @verbose_object_options[:last]
|
67
|
+
return verbose_object_empty_trace(action) if call.nil?
|
68
|
+
if last.__blank_slate_eql? self
|
69
|
+
last = verbose_object_empty_trace(action)
|
70
|
+
else
|
71
|
+
last = last.verbose_object_trace(action)
|
72
|
+
end
|
73
|
+
call.to_ruby(last)
|
49
74
|
end
|
50
75
|
|
51
|
-
def
|
52
|
-
|
76
|
+
def verbose_object_empty_trace ( action )
|
77
|
+
inspect # FIXME
|
78
|
+
end
|
79
|
+
|
80
|
+
end # module Verbosify
|
81
|
+
|
82
|
+
|
83
|
+
class VerboseObject
|
84
|
+
def self.blank_slate_ignore ( name )
|
85
|
+
super or name =~ /^(verbos(ify|e_object)|(nil\?|inspect|send)$)/
|
53
86
|
end
|
87
|
+
include BlankSlate
|
88
|
+
include Verbosify
|
89
|
+
end # class VerboseObject
|
54
90
|
|
55
|
-
|
56
|
-
|
91
|
+
|
92
|
+
class Class
|
93
|
+
|
94
|
+
def verbosify! ( opts=nil )
|
95
|
+
raise TypeError
|
57
96
|
end
|
58
97
|
|
59
|
-
|
60
|
-
|
61
|
-
|
98
|
+
alias_method :old_class_equal, :==
|
99
|
+
def == ( rhs )
|
100
|
+
return object_id == rhs.object_id
|
62
101
|
end
|
63
102
|
|
64
|
-
end # class
|
103
|
+
end # class Class
|
104
|
+
|
65
105
|
|
66
106
|
class Object
|
107
|
+
|
67
108
|
def verbose_object?
|
68
109
|
false
|
69
110
|
end
|
111
|
+
|
112
|
+
def verbosify ( opts=nil )
|
113
|
+
begin
|
114
|
+
verbosify!(opts)
|
115
|
+
rescue TypeError => ex
|
116
|
+
VerboseObject.new(self, opts)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def verbosify! ( opts=nil )
|
121
|
+
unless blank_slate?
|
122
|
+
class << self
|
123
|
+
def self.blank_slate_ignore ( name )
|
124
|
+
VerboseObject.blank_slate_ignore(name)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
extend BlankSlate unless blank_slate?
|
128
|
+
end
|
129
|
+
__blank_slate_extend Verbosify unless verbose_object?
|
130
|
+
self.verbose_object_options = opts
|
131
|
+
self
|
132
|
+
rescue TypeError => ex
|
133
|
+
raise TypeError, "can't make a verbose object from #{self} (#{ex})"
|
134
|
+
end
|
135
|
+
|
70
136
|
end # class Object
|
137
|
+
|
138
|
+
test_section __FILE__ do
|
139
|
+
require 'mocks'
|
140
|
+
|
141
|
+
class TestVerboseObject < ::Test::Unit::TestCase
|
142
|
+
include Mocks::Assertions
|
143
|
+
|
144
|
+
def assert_verbosify ( anObject )
|
145
|
+
assert_nothing_raised { return anObject.verbosify(@opts) }
|
146
|
+
end
|
147
|
+
|
148
|
+
def assert_same_result ( myVerboseObject, refObject, aMethod, *args, &block )
|
149
|
+
assert_nothing_raised do
|
150
|
+
my = myVerboseObject.__send__(aMethod, *args, &block)
|
151
|
+
ref = refObject.__send__(aMethod, *args, &block)
|
152
|
+
assert_equal(ref, my)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def setup
|
157
|
+
@mock_object = Mocks::Object.new
|
158
|
+
@opts = { :logger => @mock_object, :no_rec => false }
|
159
|
+
@str = "foo"
|
160
|
+
@arr = [1, 3, @str.dup, [1, 2]]
|
161
|
+
@hash = { :foo => @arr.dup, :bar => "value" }
|
162
|
+
@num = 42
|
163
|
+
@objs = [@str, @arr, @hash, @num]
|
164
|
+
end
|
165
|
+
|
166
|
+
def teardown
|
167
|
+
end
|
168
|
+
|
169
|
+
def assert_same_result_many ( meth, *args, &block )
|
170
|
+
@objs.each do |element|
|
171
|
+
assert_same_result(assert_verbosify(element.try_dup), element, meth, *args, &block)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_simple
|
176
|
+
assert_same_result_many :size
|
177
|
+
assert_mock [@str, :size], [3, :==, 3],
|
178
|
+
[@arr, :size], [4, :==, 4],
|
179
|
+
[@hash, :size], [2, :==, 2],
|
180
|
+
[@num, :size], [4, :==, 4]
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_class
|
184
|
+
assert_same_result_many :class
|
185
|
+
mock_object.mock_freeze
|
186
|
+
args = mock_object.mock_args.delete_if { |x, y, z| y == :== }
|
187
|
+
assert_equal [[@str, :class], [String, :object_id],
|
188
|
+
[@arr, :class], [Array, :object_id],
|
189
|
+
[@hash, :class], [Hash, :object_id],
|
190
|
+
[@num, :class], [Fixnum, :object_id]], args
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_with_class
|
194
|
+
@class = String
|
195
|
+
@vclass = assert_verbosify @class
|
196
|
+
assert_same_result @vclass, @class, :name
|
197
|
+
mock_object.mock_freeze
|
198
|
+
assert_mock [@class, :name]
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_trace
|
202
|
+
@vrange = assert_verbosify 1..3
|
203
|
+
assert_nothing_raised do
|
204
|
+
@res = (@vrange.map{|x| x + 1}.join(',').size * -4).abs
|
205
|
+
end
|
206
|
+
assert_equal 20, @res
|
207
|
+
assert_equal '(1..3.each { ... }.map { ... }.join(",").size * -4).abs',
|
208
|
+
@res.verbose_object_trace
|
209
|
+
end
|
210
|
+
|
211
|
+
end # class TestVerboseObject
|
212
|
+
|
213
|
+
end
|