core_ex 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +26 -0
- data/NEWS +8 -0
- data/README +1 -0
- data/Rakefile +7 -0
- data/SPEC.dyn.yml +8 -0
- data/SPEC.yml +37 -0
- data/lib/core_ex/attr_once.rb +36 -0
- data/lib/core_ex/dtime.rb +169 -0
- data/lib/core_ex/embedded_tests.rb +33 -0
- data/lib/core_ex/enumerable.rb +173 -0
- data/lib/core_ex/exception.rb +32 -0
- data/lib/core_ex/filelist.rb +464 -0
- data/lib/core_ex/fileutils.rb +44 -0
- data/lib/core_ex/pathname.rb +196 -0
- data/lib/core_ex/require.rb +378 -0
- data/lib/core_ex/string.rb +47 -0
- data/lib/core_ex/temp_path.rb +194 -0
- data/lib/core_ex/test/unit/ui/yaml/testrunner.rb +166 -0
- data/lib/core_ex/time.rb +91 -0
- data/lib/core_ex/version.rb +119 -0
- data/lib/core_ex/yaml.rb +24 -0
- data/lib/core_ex.rb +55 -0
- data/test/check-core_ex.yml +12 -0
- data/test/check-pkg-core_ex.yml +15 -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/require/test_require +1 -0
- data/test/resources/require/test_require_rb.rb +1 -0
- data/test/resources/require/test_require_so.so +1 -0
- data/test/resources/use-from-gems.rb +9 -0
- data/test/resources/yaml_testrunner/unit_test.rb +43 -0
- data/test/sanity/multiple-requires.yml +20 -0
- data/test/sanity/single-requires.yml +24 -0
- data/test/sanity-suite.yml +12 -0
- data/test/test-unit-setup.rb +6 -0
- data/test/unit-suite.yml +14 -0
- metadata +113 -0
data/AUTHORS
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
CoreEx was written by and with the assistance of:
|
3
|
+
|
4
|
+
- Nicolas Despr�s <nicolas.despres@gmail.com>:
|
5
|
+
- Maintenance
|
6
|
+
- Module#attr_once
|
7
|
+
- DTime
|
8
|
+
- Exception extension
|
9
|
+
- Version
|
10
|
+
|
11
|
+
- Nicolas Pouillard <ertai@feydakins.org>:
|
12
|
+
- Maintenance
|
13
|
+
- Current repository administration
|
14
|
+
|
15
|
+
- Enumerable extension
|
16
|
+
- FileList extension
|
17
|
+
- FileUtils extension
|
18
|
+
- Pathname extension
|
19
|
+
- String extension
|
20
|
+
- Time extension
|
21
|
+
- YAML extension
|
22
|
+
|
23
|
+
- embedded_tests
|
24
|
+
- rakefile_base.rf
|
25
|
+
- RequireSystem
|
26
|
+
- TempPath
|
data/NEWS
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
= New in 0.1, 2005-05-31:
|
2
|
+
|
3
|
+
CoreEx is designed to provides a simple but quite useful extension of the
|
4
|
+
standard library of Ruby. So some classes and modules like Pathname, Time,
|
5
|
+
Enumerable, Exception, FileUtils, String, and YAML are extended. There is
|
6
|
+
also some new features like attr_once, DTime, TempPath, Version,
|
7
|
+
embedded_tests, filelist (almost from rake), a common Rakefile, and an
|
8
|
+
extension of the require system.
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Coming Soon.
|
data/Rakefile
ADDED
data/SPEC.dyn.yml
ADDED
data/SPEC.yml
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
Author: The TTK Team.
|
3
|
+
License: Ruby License
|
4
|
+
Revision: '$Id$'
|
5
|
+
|
6
|
+
name: core_ex
|
7
|
+
|
8
|
+
title: CoreEx -- A proposal for a standard library extension.
|
9
|
+
summary: CoreEx is a proposal for a standard library extension.
|
10
|
+
description: >
|
11
|
+
CoreEx is designed to provides a simple but quite useful extension of the
|
12
|
+
standard library of Ruby. So some classes and modules like Pathname, Time,
|
13
|
+
Enumerable, Exception, FileUtils, String, and YAML are extended. There is
|
14
|
+
also some new features like attr_once, DTime, TempPath, Version,
|
15
|
+
embedded_tests, filelist (almost from rake), a common Rakefile, and an
|
16
|
+
extension of the require system.
|
17
|
+
homepage: http://api.feydakins.org/core_ex
|
18
|
+
rubyforge_project: ttk
|
19
|
+
|
20
|
+
root_test_suite: test/check-pkg-core_ex.yml
|
21
|
+
rdoc_dir: doc/html
|
22
|
+
tags_dir: ../../tags
|
23
|
+
|
24
|
+
rdoc_files: !filelist
|
25
|
+
- README
|
26
|
+
- AUTHORS
|
27
|
+
- NEWS
|
28
|
+
- lib/core_ex.rb
|
29
|
+
- lib/core_ex/**/*.rb
|
30
|
+
|
31
|
+
pkg_files: !filelist
|
32
|
+
- lib/**/*.rb
|
33
|
+
- test/**/*
|
34
|
+
- '[A-Z]*'
|
35
|
+
|
36
|
+
#dependencies:
|
37
|
+
# ttk: ~> 0.2.0
|
@@ -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: ertai $
|
6
|
+
# $Id: attr_once.rb 249 2005-05-31 13:23:42Z ertai $
|
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,169 @@
|
|
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: dtime.rb 252 2005-05-31 23:41:42Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'core_ex'
|
10
|
+
require 'core_ex/time'
|
11
|
+
|
12
|
+
|
13
|
+
class DTime
|
14
|
+
|
15
|
+
def initialize(delta)
|
16
|
+
@delta = delta.to_f.abs
|
17
|
+
@min, @sec = @delta.divmod(60)
|
18
|
+
@hour, @min = @min.floor.divmod(60)
|
19
|
+
@day, @hour = @hour.divmod(24)
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :delta, :sec, :min, :hour, :day
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
@delta.to_s.freeze
|
26
|
+
end
|
27
|
+
|
28
|
+
def inspect
|
29
|
+
"#@day days #@hour hours #@min mins #@sec secs".freeze
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_a
|
33
|
+
[ @day, @hour, @min, @sec ].freeze
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_i
|
37
|
+
@delta.to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
alias to_f delta
|
41
|
+
|
42
|
+
def hash
|
43
|
+
@delta.hash
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_hash
|
47
|
+
{ :days => @day, :hours => @hour, :mins => @min, :secs => @sec }.freeze
|
48
|
+
end
|
49
|
+
|
50
|
+
def floor
|
51
|
+
@delta.floor
|
52
|
+
end
|
53
|
+
|
54
|
+
def round
|
55
|
+
@delta.round
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_yaml(opts={})
|
59
|
+
((@day != 0 ? "#@day days " : '') +
|
60
|
+
(@hour != 0 ? "#@hour hours " : '') +
|
61
|
+
(@min != 0 ? "#@min mins " : '') +
|
62
|
+
"#@sec secs").to_yaml(opts)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.diff ( *args, &block )
|
66
|
+
start = Time.now
|
67
|
+
block[*args]
|
68
|
+
return Time.now - start
|
69
|
+
end
|
70
|
+
|
71
|
+
attr_once :to_s, :inspect, :to_a, :to_i, :hash, :to_hash, :floor,
|
72
|
+
:round, :to_yaml
|
73
|
+
|
74
|
+
end # class DTime
|
75
|
+
|
76
|
+
|
77
|
+
test_section __FILE__ do
|
78
|
+
|
79
|
+
class DTimeTest < Test::Unit::TestCase
|
80
|
+
|
81
|
+
def test_simple
|
82
|
+
d = DTime.new(260.33)
|
83
|
+
assert_equal(260, d.delta.floor)
|
84
|
+
assert_equal(20, d.sec.floor)
|
85
|
+
assert_equal(4, d.min)
|
86
|
+
assert_equal(0, d.hour)
|
87
|
+
assert_equal(0, d.day)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_complex
|
91
|
+
d = DTime.new(265678.42000)
|
92
|
+
assert_equal(265678, d.delta.floor)
|
93
|
+
assert_equal(58, d.sec.floor)
|
94
|
+
assert_equal(47, d.min)
|
95
|
+
assert_equal(1, d.hour)
|
96
|
+
assert_equal(3, d.day)
|
97
|
+
assert_equal([ 3, 1, 47 ], d.to_a[0..2])
|
98
|
+
assert_equal(58, d.to_a[3].floor)
|
99
|
+
h = d.to_hash
|
100
|
+
assert_equal(3, h[:days])
|
101
|
+
assert_equal(1, h[:hours])
|
102
|
+
assert_equal(47, h[:mins])
|
103
|
+
assert_equal(58, h[:secs].floor)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_conversion
|
107
|
+
d = DTime.new(260.75)
|
108
|
+
assert_equal('260.75', d.to_s)
|
109
|
+
assert_equal('0 days 0 hours 4 mins 20.75 secs', d.inspect)
|
110
|
+
assert_equal(260, d.to_f.floor)
|
111
|
+
assert_equal(260, d.to_i)
|
112
|
+
assert_equal(260, d.floor)
|
113
|
+
assert_equal(261, d.round)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_negative
|
117
|
+
d = DTime.new(-265678.42000)
|
118
|
+
assert_equal(265678, d.delta.floor)
|
119
|
+
assert_equal(58, d.sec.floor)
|
120
|
+
assert_equal(47, d.min)
|
121
|
+
assert_equal(1, d.hour)
|
122
|
+
assert_equal(3, d.day)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_marshal
|
126
|
+
d = DTime.new(-265678.42000)
|
127
|
+
assert_equal(d.floor, Marshal.load(Marshal.dump(d)).floor)
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_to_yaml
|
131
|
+
d = DTime.new(265678.42000)
|
132
|
+
assert_equal('--- 3 days 1 hours 47 mins 58.4199999999837 secs', d.to_yaml)
|
133
|
+
d = DTime.new(5678.42000)
|
134
|
+
assert_equal('--- 1 hours 34 mins 38.4200000000001 secs', d.to_yaml)
|
135
|
+
d = DTime.new(158.42000)
|
136
|
+
assert_equal('--- 2 mins 38.42 secs', d.to_yaml)
|
137
|
+
d = DTime.new(58.42000)
|
138
|
+
assert_equal('--- 58.42 secs', d.to_yaml)
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_diff
|
142
|
+
@foo = 1
|
143
|
+
d = DTime.diff(42, 43) do |*args|
|
144
|
+
assert_equal([42, 43], args)
|
145
|
+
@foo = 2
|
146
|
+
sleep 0.2
|
147
|
+
@foo = 3
|
148
|
+
end
|
149
|
+
assert_kind_of(DTime, d)
|
150
|
+
assert_equal(3, @foo)
|
151
|
+
assert(d.to_f > 0.2)
|
152
|
+
assert(d.sec > 0.2)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_init_from_dtime
|
156
|
+
c = DTime.new(260.33)
|
157
|
+
d = DTime.new(c)
|
158
|
+
assert_equal(260, d.delta.floor)
|
159
|
+
assert_equal(20, d.sec.floor)
|
160
|
+
assert_equal(4, d.min)
|
161
|
+
assert_equal(0, d.hour)
|
162
|
+
assert_equal(0, d.day)
|
163
|
+
end
|
164
|
+
|
165
|
+
end # class DTimeTest
|
166
|
+
|
167
|
+
|
168
|
+
end
|
169
|
+
|
@@ -0,0 +1,33 @@
|
|
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: embedded_tests.rb 249 2005-05-31 13:23:42Z ertai $
|
5
|
+
|
6
|
+
require 'set'
|
7
|
+
|
8
|
+
module Kernel
|
9
|
+
|
10
|
+
@@test_mode = nil
|
11
|
+
@@files = Set.new
|
12
|
+
|
13
|
+
def test_mode ( aRegexp )
|
14
|
+
raise 'No block needed' if block_given?
|
15
|
+
require 'test/unit'
|
16
|
+
@@test_mode = aRegexp
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_mode?
|
20
|
+
!! @@test_mode
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_section ( __file__, &block )
|
24
|
+
__file__ = Pathname.new(__file__).expand_path
|
25
|
+
if block_given? and __file__.to_s =~ @@test_mode
|
26
|
+
unless @@files.include?(__file__)
|
27
|
+
Kernel.instance_eval(&block)
|
28
|
+
@@files << __file__
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end # module Kernel
|
@@ -0,0 +1,173 @@
|
|
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: enumerable.rb 252 2005-05-31 23:41:42Z ertai $
|
5
|
+
|
6
|
+
require 'core_ex'
|
7
|
+
|
8
|
+
module Enumerable
|
9
|
+
|
10
|
+
# See also Enumerable#inject
|
11
|
+
def fold ( init, each_method=:each, &block )
|
12
|
+
accu = init
|
13
|
+
send(each_method) do |*a|
|
14
|
+
accu = block[accu, *a]
|
15
|
+
end
|
16
|
+
accu
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def foldi ( init, &block )
|
21
|
+
fold(init, :each_with_index, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def sum
|
26
|
+
fold(0) { |accu, x| accu + x }
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def prod
|
31
|
+
fold(1) { |accu, x| accu * x }
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# Basically, do the same as each_with_index but yield the arguments in
|
36
|
+
# reverse order. Thus an array can be assume in certain cases to a hash.
|
37
|
+
def each_pair ( &block )
|
38
|
+
each_with_index { |x, i| block[i, x] }
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def rec_fold ( init, &block )
|
43
|
+
fold(init) do |accu1, *a1|
|
44
|
+
a1.fold(accu1) { |accu2, a2| a2.rec_fold(accu2, &block) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end # module Enumerable
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
class Object
|
53
|
+
|
54
|
+
def rec_fold ( init, &block )
|
55
|
+
block[init, self]
|
56
|
+
end
|
57
|
+
|
58
|
+
end # class Object
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
class String
|
63
|
+
|
64
|
+
def rec_fold ( init, &block )
|
65
|
+
if include? "\n"
|
66
|
+
super
|
67
|
+
else
|
68
|
+
block[init, self]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class String
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
test_section __FILE__ do
|
77
|
+
|
78
|
+
require 'set'
|
79
|
+
require 'generator'
|
80
|
+
|
81
|
+
class EnumerableTest < Test::Unit::TestCase
|
82
|
+
|
83
|
+
def setup
|
84
|
+
@r = 0 .. 10
|
85
|
+
@a = @r.to_a
|
86
|
+
@s = @a.to_set
|
87
|
+
@ak = 'a' .. 'k'
|
88
|
+
@h = Hash[*(@r.zip(@ak).flatten)]
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_fold
|
92
|
+
[[@r, @a], [@a, @a], [@s, @s.to_a]].each do |enum, ref|
|
93
|
+
y = enum.fold([]) { |accu, x| accu << x }
|
94
|
+
assert_equal(ref, y, enum.class)
|
95
|
+
y = enum.fold([]) { |accu, x| [x] + accu }
|
96
|
+
assert_equal(ref.reverse, y, enum.class)
|
97
|
+
y = enum.fold([]) { |accu, x| accu << x ; 42 }
|
98
|
+
assert_equal(42, y, enum.class)
|
99
|
+
end
|
100
|
+
|
101
|
+
y = @h.fold([[], []]) do |accu, x|
|
102
|
+
[ [x.first] + accu.first, [x.last] + accu.last ]
|
103
|
+
end
|
104
|
+
assert_equal(@h.keys.reverse, y.first)
|
105
|
+
assert_equal(@h.values.reverse, y.last)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_foldi
|
109
|
+
[@r, @a, @s, @h].each do |enum|
|
110
|
+
ref = @a
|
111
|
+
y = enum.foldi([]) { |accu, x, i| accu << i }
|
112
|
+
assert_equal(ref, y, enum.class)
|
113
|
+
y = enum.foldi([]) { |accu, x, i| [i] + accu }
|
114
|
+
assert_equal(ref.reverse, y, enum.class)
|
115
|
+
y = enum.foldi([]) { |accu, x, i| accu << i ; 42 }
|
116
|
+
assert_equal(42, y, enum.class)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_sum
|
121
|
+
assert_equal(55, @a.sum)
|
122
|
+
assert_equal(55, @r.sum)
|
123
|
+
assert_equal(55, @s.sum)
|
124
|
+
assert_equal(55, @h.keys.sum)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_prod
|
128
|
+
@r = 1 .. 10
|
129
|
+
@a = @r.to_a
|
130
|
+
@s = @a.to_set
|
131
|
+
@ak = 'a' .. 'k'
|
132
|
+
@h = Hash[*(@r.zip(@ak).flatten)]
|
133
|
+
assert_equal(3628800, @a.prod)
|
134
|
+
assert_equal(3628800, @r.prod)
|
135
|
+
assert_equal(3628800, @s.prod)
|
136
|
+
assert_equal(3628800, @h.keys.prod)
|
137
|
+
end
|
138
|
+
|
139
|
+
def each_pair_checker ( enum, ref )
|
140
|
+
j = 0
|
141
|
+
enum.each_pair do |i, x|
|
142
|
+
assert_equal(j, i)
|
143
|
+
j += 1
|
144
|
+
assert_equal(ref.next, x)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_each_pair
|
149
|
+
each_pair_checker(@a, Generator.new(@a))
|
150
|
+
each_pair_checker(@s, Generator.new(@s))
|
151
|
+
each_pair_checker(@r, Generator.new(@r))
|
152
|
+
y = @h.fold([], :each_pair) { |accu, x| [x] + accu }
|
153
|
+
assert_equal(@h.keys.reverse, y)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_rec_fold
|
157
|
+
h = { 1 => { 2 => 3 }, 4 => { 5 => 6 } }
|
158
|
+
y = h.rec_fold([]) { |accu, *a| [a] + accu }
|
159
|
+
assert_equal([[6], [5], [4], [3], [2], [1]], y)
|
160
|
+
y = @h.rec_fold([]) { |accu, *a| [a] + accu }
|
161
|
+
assert_equal([["k"], [10], ["e"], [4], ["j"], [9], ["d"], [3], ["i"],
|
162
|
+
[8], ["c"], [2], ["h"], [7], ["b"], [1], ["g"], [6], ["a"],
|
163
|
+
[0], ["f"], [5]], y)
|
164
|
+
|
165
|
+
a = [1, [2,3], [[[4], 5]]]
|
166
|
+
y = a.rec_fold(0) { |accu, x| accu + x }
|
167
|
+
assert_equal(a.flatten.sum, y)
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
end # EnumerableTest
|
172
|
+
|
173
|
+
end
|
@@ -0,0 +1,32 @@
|
|
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
|
+
# Revision:: $Id: exception.rb 249 2005-05-31 13:23:42Z ertai $
|
5
|
+
|
6
|
+
|
7
|
+
class Exception
|
8
|
+
|
9
|
+
#FIXME: write a ruby_pp which print exception backtrace exactly as ruby does
|
10
|
+
# by cuting long and repetitive backtrace.
|
11
|
+
|
12
|
+
def long_pp
|
13
|
+
str = short_pp + "\n"
|
14
|
+
backtrace[1..-1].each { |x| str += " from #{x}\n" } if backtrace
|
15
|
+
str.chomp!
|
16
|
+
str
|
17
|
+
end
|
18
|
+
|
19
|
+
def short_pp
|
20
|
+
if backtrace.nil?
|
21
|
+
tiny_pp
|
22
|
+
else
|
23
|
+
"#{backtrace[0]}: #{tiny_pp}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def tiny_pp
|
28
|
+
exc_name = inspect.sub(/^#<(\w+):.+$/, '\1')
|
29
|
+
"#{self} (#{exc_name})"
|
30
|
+
end
|
31
|
+
|
32
|
+
end # class Exception
|