debug_helper 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +22 -22
  3. data/README.md +848 -218
  4. data/lib/debug_helper.rb +79 -160
  5. data/lib/debug_helper/array_handler.rb +12 -0
  6. data/lib/debug_helper/dir_handler.rb +19 -0
  7. data/lib/debug_helper/each_pair_handler.rb +13 -0
  8. data/lib/debug_helper/each_with_index_handler.rb +11 -0
  9. data/lib/debug_helper/exception_handler.rb +14 -0
  10. data/lib/debug_helper/file_handler.rb +29 -0
  11. data/lib/debug_helper/generic_handler.rb +12 -0
  12. data/lib/debug_helper/handler.rb +102 -0
  13. data/lib/debug_helper/hash_handler.rb +19 -0
  14. data/lib/debug_helper/io_handler.rb +15 -0
  15. data/lib/debug_helper/match_data_handler.rb +17 -0
  16. data/lib/debug_helper/object_handler.rb +13 -0
  17. data/lib/debug_helper/open_struct_handler.rb +16 -0
  18. data/lib/debug_helper/range_handler.rb +14 -0
  19. data/lib/debug_helper/regexp_handler.rb +16 -0
  20. data/lib/debug_helper/set_handler.rb +12 -0
  21. data/lib/debug_helper/string_handler.rb +17 -0
  22. data/lib/debug_helper/struct_handler.rb +18 -0
  23. data/lib/debug_helper/symbol_handler.rb +15 -0
  24. data/lib/debug_helper/version.rb +3 -3
  25. data/markdown/readme/Rakefile +36 -6
  26. data/markdown/readme/class_inclusions.md +10 -3
  27. data/markdown/readme/class_links.md +10 -3
  28. data/markdown/readme/classes/array/circular/show.md +4 -2
  29. data/markdown/readme/classes/array/circular/show.yaml +4 -2
  30. data/markdown/readme/classes/array/mixed/show.md +6 -3
  31. data/markdown/readme/classes/array/mixed/show.yaml +6 -3
  32. data/markdown/readme/classes/array/nested/show.md +6 -3
  33. data/markdown/readme/classes/array/nested/show.yaml +6 -3
  34. data/markdown/readme/classes/array/simple/show.md +2 -1
  35. data/markdown/readme/classes/array/simple/show.yaml +2 -1
  36. data/markdown/readme/classes/dir/simple/show.md +28 -0
  37. data/markdown/readme/classes/dir/simple/show.rb +4 -0
  38. data/markdown/readme/classes/dir/simple/show.yaml +11 -0
  39. data/markdown/readme/classes/dir/simple/template.md +9 -0
  40. data/markdown/readme/classes/dir/template.md +3 -0
  41. data/markdown/readme/classes/exception/simple/show.md +44 -0
  42. data/markdown/readme/classes/exception/simple/show.rb +22 -0
  43. data/markdown/readme/classes/exception/simple/show.yaml +9 -0
  44. data/markdown/readme/classes/exception/simple/template.md +9 -0
  45. data/markdown/readme/classes/exception/template.md +3 -0
  46. data/markdown/readme/classes/file/simple/show.md +3 -3
  47. data/markdown/readme/classes/file/simple/show.yaml +3 -3
  48. data/markdown/readme/classes/hash/circular/show.md +12 -4
  49. data/markdown/readme/classes/hash/circular/show.yaml +12 -4
  50. data/markdown/readme/classes/hash/mixed/show.md +14 -6
  51. data/markdown/readme/classes/hash/mixed/show.yaml +14 -6
  52. data/markdown/readme/classes/hash/nested/show.md +24 -9
  53. data/markdown/readme/classes/hash/nested/show.yaml +24 -9
  54. data/markdown/readme/classes/hash/simple/show.md +10 -4
  55. data/markdown/readme/classes/hash/simple/show.yaml +10 -4
  56. data/markdown/readme/classes/io/simple/show.md +23 -0
  57. data/markdown/readme/classes/io/simple/show.rb +4 -0
  58. data/markdown/readme/classes/io/simple/show.yaml +6 -0
  59. data/markdown/readme/classes/io/simple/template.md +9 -0
  60. data/markdown/readme/classes/io/template.md +3 -0
  61. data/markdown/readme/classes/match_data/multiple_captures/show.md +33 -0
  62. data/markdown/readme/classes/match_data/multiple_captures/show.rb +4 -0
  63. data/markdown/readme/classes/match_data/multiple_captures/show.yaml +16 -0
  64. data/markdown/readme/classes/match_data/multiple_captures/template.md +9 -0
  65. data/markdown/readme/classes/match_data/named_captures/show.md +31 -0
  66. data/markdown/readme/classes/match_data/named_captures/show.rb +4 -0
  67. data/markdown/readme/classes/match_data/named_captures/show.yaml +14 -0
  68. data/markdown/readme/classes/match_data/named_captures/template.md +9 -0
  69. data/markdown/readme/classes/match_data/simple/show.md +25 -0
  70. data/markdown/readme/classes/match_data/simple/show.rb +4 -0
  71. data/markdown/readme/classes/match_data/simple/show.yaml +8 -0
  72. data/markdown/readme/classes/match_data/simple/template.md +9 -0
  73. data/markdown/readme/classes/match_data/template.md +7 -0
  74. data/markdown/readme/classes/object/object/show.md +23 -0
  75. data/markdown/readme/classes/object/object/show.rb +8 -0
  76. data/markdown/readme/classes/object/object/show.yaml +2 -0
  77. data/markdown/readme/classes/object/object/template.md +9 -0
  78. data/markdown/readme/classes/object/template.md +1 -7
  79. data/markdown/readme/classes/open_struct/circular/show.md +40 -0
  80. data/markdown/readme/classes/open_struct/circular/show.rb +8 -0
  81. data/markdown/readme/classes/open_struct/circular/show.yaml +17 -0
  82. data/markdown/readme/classes/open_struct/circular/template.md +11 -0
  83. data/markdown/readme/classes/open_struct/mixed/show.md +51 -0
  84. data/markdown/readme/classes/open_struct/mixed/show.rb +5 -0
  85. data/markdown/readme/classes/open_struct/mixed/show.yaml +33 -0
  86. data/markdown/readme/classes/open_struct/mixed/template.md +9 -0
  87. data/markdown/readme/classes/open_struct/nested/show.md +73 -0
  88. data/markdown/readme/classes/open_struct/nested/show.rb +14 -0
  89. data/markdown/readme/classes/open_struct/nested/show.yaml +46 -0
  90. data/markdown/readme/classes/open_struct/nested/template.md +9 -0
  91. data/markdown/readme/classes/open_struct/simple/show.md +41 -0
  92. data/markdown/readme/classes/open_struct/simple/show.rb +5 -0
  93. data/markdown/readme/classes/open_struct/simple/show.yaml +23 -0
  94. data/markdown/readme/classes/open_struct/simple/template.md +9 -0
  95. data/markdown/readme/classes/open_struct/template.md +9 -0
  96. data/markdown/readme/classes/range/exclude_end/show.md +22 -0
  97. data/markdown/readme/classes/range/exclude_end/show.rb +4 -0
  98. data/markdown/readme/classes/range/exclude_end/show.yaml +5 -0
  99. data/markdown/readme/classes/range/exclude_end/template.md +9 -0
  100. data/markdown/readme/classes/range/include_end/show.md +22 -0
  101. data/markdown/readme/classes/range/include_end/show.rb +4 -0
  102. data/markdown/readme/classes/range/include_end/show.yaml +5 -0
  103. data/markdown/readme/classes/range/include_end/template.md +9 -0
  104. data/markdown/readme/classes/range/template.md +5 -0
  105. data/markdown/readme/classes/regexp/named_captures/show.md +28 -0
  106. data/markdown/readme/classes/regexp/named_captures/show.rb +4 -0
  107. data/markdown/readme/classes/regexp/named_captures/show.yaml +11 -0
  108. data/markdown/readme/classes/regexp/named_captures/template.md +9 -0
  109. data/markdown/readme/classes/regexp/simple/show.md +24 -0
  110. data/markdown/readme/classes/regexp/simple/show.rb +4 -0
  111. data/markdown/readme/classes/regexp/simple/show.yaml +7 -0
  112. data/markdown/readme/classes/regexp/simple/template.md +9 -0
  113. data/markdown/readme/classes/regexp/template.md +5 -0
  114. data/markdown/readme/classes/set/circular/show.md +4 -2
  115. data/markdown/readme/classes/set/circular/show.yaml +4 -2
  116. data/markdown/readme/classes/set/mixed/show.md +6 -3
  117. data/markdown/readme/classes/set/mixed/show.yaml +6 -3
  118. data/markdown/readme/classes/set/nested/show.md +6 -3
  119. data/markdown/readme/classes/set/nested/show.yaml +6 -3
  120. data/markdown/readme/classes/set/simple/show.md +2 -1
  121. data/markdown/readme/classes/set/simple/show.yaml +2 -1
  122. data/markdown/readme/classes/string/multiline/show.md +2 -1
  123. data/markdown/readme/classes/string/multiline/show.yaml +2 -1
  124. data/markdown/readme/classes/string/simple/show.md +2 -1
  125. data/markdown/readme/classes/string/simple/show.yaml +2 -1
  126. data/markdown/readme/classes/struct/circular/show.md +34 -8
  127. data/markdown/readme/classes/struct/circular/show.yaml +34 -8
  128. data/markdown/readme/classes/struct/mixed/show.md +21 -6
  129. data/markdown/readme/classes/struct/mixed/show.yaml +21 -6
  130. data/markdown/readme/classes/struct/nested/show.md +36 -9
  131. data/markdown/readme/classes/struct/nested/show.yaml +36 -9
  132. data/markdown/readme/classes/struct/simple/show.md +17 -4
  133. data/markdown/readme/classes/struct/simple/show.yaml +17 -4
  134. data/markdown/readme/classes/symbol/simple/show.md +2 -1
  135. data/markdown/readme/classes/symbol/simple/show.yaml +2 -1
  136. data/markdown/readme/options/depth/show.md +30 -15
  137. data/markdown/readme/options/depth/show.yaml +30 -15
  138. data/markdown/readme/template.md +8 -8
  139. metadata +88 -14
  140. data/markdown/readme/classes/object/datetime/show.md +0 -18
  141. data/markdown/readme/classes/object/datetime/show.rb +0 -4
  142. data/markdown/readme/classes/object/datetime/show.yaml +0 -1
  143. data/markdown/readme/classes/object/datetime/template.md +0 -9
  144. data/markdown/readme/classes/object/range/show.md +0 -19
  145. data/markdown/readme/classes/object/range/show.rb +0 -4
  146. data/markdown/readme/classes/object/range/show.yaml +0 -2
  147. data/markdown/readme/classes/object/range/template.md +0 -9
  148. data/markdown/readme/classes/object/regexp/show.md +0 -19
  149. data/markdown/readme/classes/object/regexp/show.rb +0 -4
  150. data/markdown/readme/classes/object/regexp/show.yaml +0 -2
  151. data/markdown/readme/classes/object/regexp/template.md +0 -9
data/lib/debug_helper.rb CHANGED
@@ -1,7 +1,31 @@
1
+ require 'ostruct'
1
2
  require 'set'
2
3
  require 'yaml'
3
4
 
4
- require 'debug_helper/version'
5
+ require_relative 'debug_helper/version'
6
+
7
+ require_relative 'debug_helper/handler'
8
+
9
+ require_relative 'debug_helper/each_with_index_handler'
10
+ require_relative 'debug_helper/array_handler'
11
+ require_relative 'debug_helper/set_handler'
12
+
13
+ require_relative 'debug_helper/each_pair_handler'
14
+ require_relative 'debug_helper/hash_handler'
15
+ require_relative 'debug_helper/struct_handler'
16
+
17
+ require_relative 'debug_helper/dir_handler'
18
+ require_relative 'debug_helper/exception_handler'
19
+ require_relative 'debug_helper/file_handler'
20
+ require_relative 'debug_helper/generic_handler'
21
+ require_relative 'debug_helper/io_handler'
22
+ require_relative 'debug_helper/match_data_handler'
23
+ require_relative 'debug_helper/object_handler'
24
+ require_relative 'debug_helper/open_struct_handler'
25
+ require_relative 'debug_helper/regexp_handler'
26
+ require_relative 'debug_helper/string_handler'
27
+ require_relative 'debug_helper/symbol_handler'
28
+ require_relative 'debug_helper/range_handler'
5
29
 
6
30
  class DebugHelper
7
31
 
@@ -21,12 +45,10 @@ class DebugHelper
21
45
 
22
46
  def self.show(obj, message = obj.class, options = {})
23
47
  debug_helper = DebugHelper.new(obj, message, options)
24
- x = debug_helper.send(:_show, obj, message, info = {})
25
- puts x.to_yaml
48
+ s = debug_helper.show(obj, message, info = {})
49
+ puts s.to_yaml
26
50
  end
27
51
 
28
- private
29
-
30
52
  def initialize(obj, message, options)
31
53
  self.obj = obj
32
54
  self.message = message
@@ -34,170 +56,67 @@ class DebugHelper
34
56
  self.object_ids = []
35
57
  end
36
58
 
37
- def _show(obj, message, info)
38
- if object_ids.include?(obj.object_id)
39
- s = show_object(obj, message, info)
40
- elsif depth == object_ids.size
41
- s = show_object(obj, message, info)
42
- else
43
- object_ids.push(obj.object_id)
44
- s = case
45
- when obj.kind_of?(Array)
46
- show_array(obj, message, info)
47
- when obj.kind_of?(Hash)
48
- show_hash(obj, message, info)
49
- when obj.kind_of?(Set)
50
- show_array(obj, message, info)
51
- when obj.kind_of?(Struct)
52
- show_struct(obj, message, info)
53
- # when obj.kind_of?(Range)
54
- else
55
- show_object(obj, message, info)
56
- end
57
- object_ids.pop
58
- end
59
- s
60
- end
61
-
62
- def show_array(obj, message, info)
63
- content = {}
64
- obj.each_with_index do |item, i|
65
- content.store("Element #{i}", _show(item, nil, {}))
66
- end
67
- attrs = {
68
- :message => message,
69
- :size => obj.size,
70
- }
71
- _show_item(obj.class.name, content, attrs, info)
59
+ def object_seen?(obj)
60
+ object_ids.include?(obj.object_id)
72
61
  end
73
62
 
74
- def show_hash(obj, message, info)
75
- content = {}
76
- obj.each_with_index do |pair, i|
77
- key, value = *pair
78
- pair = {'Key' => _show(key, nil, {}), 'Value' => _show(value, nil, {})}
79
- content.store("Pair #{i}", pair)
80
- end
81
- attrs = {
82
- :size => obj.size,
83
- :default => obj.default,
84
- :default_proc => obj.default_proc,
85
- :message => message,
86
- }
87
- _show_item(obj.class.name, content, attrs, info)
63
+ def depth_reached?
64
+ depth == object_ids.size
88
65
  end
89
66
 
90
- def show_object(obj, message, info)
91
- methods = methods_for_object(obj)
92
- if methods.nil?
93
- message_info = message.nil? ? '' : " (message='#{message}')"
94
- "#{obj.class.name}#{message_info} #{obj.inspect}"
67
+ def show(obj, message, info)
68
+ handler = nil
69
+ if object_seen?(obj) || depth_reached?
70
+ handler = GenericHandler.new(self, obj, message, info)
71
+ s = handler.show
95
72
  else
96
- content = {}
97
- attrs = {:message => message}
98
- methods[:instance].each do |instance_method|
99
- value = obj.send(instance_method)
100
- if instance_method == :size
101
- attrs.store(:size, value)
102
- else
103
- content.store(instance_method.to_s, value)
73
+ object_ids.push(obj.object_id)
74
+ begin
75
+ # If there's a handler for the class, use it.
76
+ # Note that the class may be a custom class, not defined here,
77
+ # but instead defined outside this project.
78
+ # So if the user of this library has defined DebugHelper::FooHandler
79
+ # and the object is a Foo, that handler will be selected and called.
80
+ handler_class_name = "DebugHelper::#{obj.class.name}Handler"
81
+ handler_class = Object.const_get(handler_class_name)
82
+ handler = handler_class.new(method(__method__), obj, message, info)
83
+ rescue
84
+ # If there's not a handler for the class, try using :kind_of?.
85
+ [
86
+ Array,
87
+ Dir,
88
+ Exception,
89
+ File,
90
+ IO,
91
+ Hash,
92
+ OpenStruct,
93
+ Range,
94
+ Set,
95
+ String,
96
+ Struct,
97
+ # There's no method Symbol.new, so cannot instantiate a subclass.
98
+ # Symbol,
99
+ ].each do |klass|
100
+ if obj.kind_of?(klass)
101
+ handler_class_name = "DebugHelper::#{klass.name}Handler"
102
+ handler_class = Object.const_get(handler_class_name)
103
+ handler = handler_class.new(method(__method__), obj, message, info)
104
+ break
105
+ end
104
106
  end
105
107
  end
106
- methods[:class].each do |pair|
107
- class_method, arguments = *pair
108
- value = Object.const_get(obj.class.to_s).send(class_method, *arguments)
109
- content.store(class_method.to_s, value)
108
+ if handler.nil?
109
+ if obj.instance_of?(Object)
110
+ handler_class= ObjectHandler
111
+ else
112
+ handler_class = GenericHandler
113
+ end
114
+ handler = handler_class.new(self, obj, message, info)
110
115
  end
111
- _show_item(obj.class.name, content, attrs, info)
112
- end
113
- end
114
-
115
- def show_struct(obj, message, info)
116
- content = {}
117
- i = 0
118
- obj.each_pair do |member|
119
- member_name, value = *member
120
- pair = {'Name' => member_name, 'Value' => _show(value, nil, {})}
121
- content.store("Member #{i}", pair)
122
- i += 1
123
- end
124
- attrs = {
125
- :message => message,
126
- :size => obj.size,
127
- }
128
- _show_item(obj.class.name, content, attrs, info)
129
- end
130
-
131
- def _show_item(class_name, content, attrs, info)
132
- message = attrs[:message]
133
- unless message.nil?
134
- attrs[:message] = "'#{message}'"
135
- end
136
- label = label(class_name, attrs)
137
- info.store(label, content)
138
- info
139
- end
140
-
141
- def label(class_name, attrs)
142
- a = []
143
- attrs.each_pair do |key, value|
144
- a.push("#{key}=#{value}") unless value.nil?
116
+ s = handler.show
117
+ object_ids.pop
145
118
  end
146
- return class_name if a.empty?
147
- attrs_s = a.join(' ')
148
- "#{class_name} (#{attrs_s})"
149
- end
150
-
151
- def methods_for_object(obj)
152
- methods = case
153
- when obj.kind_of?(File)
154
- {
155
- # The instance forms of some of these require the file to be open.
156
- :class => {
157
- :absolute_path => [obj.path],
158
- :atime => [obj.path],
159
- :ctime => [obj.path],
160
- :executable? => [obj.path],
161
- :exist? => [obj.path],
162
- :ftype => [obj.path],
163
- :mtime => [obj.path],
164
- :path => [obj.path],
165
- :pipe? => [obj.path],
166
- :readable? => [obj.path],
167
- :realpath => [obj.path],
168
- :setgid? => [obj.path],
169
- :setuid? => [obj.path],
170
- :size => [obj.path],
171
- :socket? => [obj.path],
172
- :symlink? => [obj.path],
173
- :writable? => [obj.path],
174
- },
175
- :instance => [],
176
- }
177
- when obj.kind_of?(String)
178
- {
179
- :class => {},
180
- :instance => [
181
- :to_s,
182
- :size,
183
- :encoding,
184
- :ascii_only?,
185
- :bytesize,
186
- ]
187
- }
188
- when obj.kind_of?(Symbol)
189
- {
190
- :class => {},
191
- :instance => [
192
- :to_s,
193
- :size,
194
- :encoding,
195
- ]
196
- }
197
- else
198
- nil
199
- end
200
- methods
119
+ s
201
120
  end
202
121
 
203
122
  end
@@ -0,0 +1,12 @@
1
+ class DebugHelper
2
+
3
+ class ArrayHandler < EachWithIndexHandler
4
+
5
+ def calls_for_instance
6
+ [
7
+ [:size],
8
+ ]
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ class DebugHelper
2
+
3
+ class DirHandler < Handler
4
+
5
+ def calls_for_instance
6
+ [
7
+ [:path],
8
+ ]
9
+ end
10
+
11
+ def calls_for_class
12
+ [
13
+ [:entries, obj.path],
14
+ [:exist?, obj.path],
15
+ ]
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ class DebugHelper
2
+
3
+ class EachPairHandler < Handler
4
+
5
+ attr_accessor :pair_names
6
+
7
+ def each_pair?
8
+ true
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ class DebugHelper
2
+
3
+ class EachWithIndexHandler < Handler
4
+
5
+ def each_with_index?
6
+ true
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,14 @@
1
+ class DebugHelper
2
+
3
+ class ExceptionHandler < Handler
4
+
5
+ def calls_for_instance
6
+ [
7
+ [:message],
8
+ [:cause],
9
+ [:backtrace],
10
+ ]
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,29 @@
1
+ class DebugHelper
2
+
3
+ class FileHandler < Handler
4
+
5
+ def calls_for_class
6
+ path = obj.path
7
+ [
8
+ [:absolute_path, path],
9
+ [:atime, path],
10
+ [:ctime, path],
11
+ [:executable?, path],
12
+ [:exist?, path],
13
+ [:ftype, path],
14
+ [:mtime, path],
15
+ [:path, path],
16
+ [:pipe?, path],
17
+ [:readable?, path],
18
+ [:realpath, path],
19
+ [:setgid?, path],
20
+ [:setuid?, path],
21
+ [:size, path],
22
+ [:socket?, path],
23
+ [:symlink?, path],
24
+ [:writable?, path],
25
+ ]
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,12 @@
1
+ class DebugHelper
2
+
3
+ class GenericHandler < Handler
4
+
5
+ def show
6
+ message_info = message.nil? ? '' : " (message='#{message}')"
7
+ "#{obj.class.name}#{message_info} #{obj.inspect}"
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,102 @@
1
+ class DebugHelper
2
+
3
+ class Handler
4
+
5
+ attr_accessor :show_method, :obj, :message, :info, :attrs, :content
6
+
7
+ def initialize(show_method, obj, message, info)
8
+ self.show_method = show_method
9
+ self.obj = obj
10
+ self.message = message
11
+ self.info = info
12
+ self.attrs = {}
13
+ self.content = {}
14
+ show
15
+ end
16
+
17
+ def show
18
+ gather
19
+ finish
20
+ end
21
+
22
+ def gather
23
+ calls_for_instance.each do |call_info|
24
+ method = call_info.shift
25
+ unless obj.respond_to?(method)
26
+ message = "Instance of #{obj.class} does not respond to method #{method}"
27
+ raise NoMethodError.new(message, method)
28
+ end
29
+ args = call_info
30
+ if args.empty?
31
+ value = obj.send(method)
32
+ else
33
+ value = obj.send(method, *args)
34
+ end
35
+ content.store(method.to_s, value)
36
+ end
37
+ calls_for_class.each do |call_info|
38
+ klass = Object.const_get(obj.class.name)
39
+ method = call_info.shift
40
+ unless klass.respond_to?(method)
41
+ message = "#{obj.class} does not respond to method #{method}"
42
+ raise NoMethodError.new(message, method)
43
+ end
44
+ args = call_info
45
+ if args.empty?
46
+ value = klass.send(method)
47
+ else
48
+ value = klass.send(method, *args)
49
+ end
50
+ content.store(method.to_s, value)
51
+ end
52
+ if each_with_index?
53
+ obj.each_with_index do |item, i|
54
+ self.content.store("Element #{i}", show_method.call(item, nil, {}))
55
+ end
56
+ end
57
+ if each_pair?
58
+ pair_name, key_name, value_name = *pair_names
59
+ i = 0
60
+ obj.each_pair do |key, value|
61
+ pair = {key_name => show_method.call(key, nil, {}), value_name => show_method.call(value, nil, {})}
62
+ self.content.store("#{pair_name} #{i}", pair)
63
+ i += 1
64
+ end
65
+ end
66
+ end
67
+
68
+ def finish
69
+ attrs[:message] = "'#{message}'" unless message.nil?
70
+ self.info.store(label, content)
71
+ info
72
+ end
73
+
74
+ def label
75
+ a = []
76
+ attrs.each_pair do |key, value|
77
+ a.push("#{key}=#{value}") unless value.nil?
78
+ end
79
+ return self.obj.class.name if a.empty?
80
+ attrs_s = a.join(' ')
81
+ "#{self.obj.class.name} (#{attrs_s})"
82
+ end
83
+
84
+ def calls_for_instance
85
+ []
86
+ end
87
+
88
+ def calls_for_class
89
+ []
90
+ end
91
+
92
+ def each_with_index?
93
+ false
94
+ end
95
+
96
+ def each_pair?
97
+ false
98
+ end
99
+
100
+ end
101
+
102
+ end