rubybreaker 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/NEWS +6 -46
  2. data/README.md +30 -19
  3. data/TODO +22 -20
  4. data/VERSION +1 -1
  5. data/bin/rubybreaker +11 -2
  6. data/lib/rubybreaker.rb +31 -11
  7. data/lib/rubybreaker/debug.rb +5 -49
  8. data/lib/rubybreaker/{context.rb → debug/context.rb} +0 -0
  9. data/lib/rubybreaker/debug/debug.rb +61 -0
  10. data/lib/rubybreaker/{error.rb → debug/error.rb} +1 -1
  11. data/lib/rubybreaker/runtime.rb +3 -2
  12. data/lib/rubybreaker/runtime/inspector.rb +20 -13
  13. data/lib/rubybreaker/runtime/monitor.rb +21 -13
  14. data/lib/rubybreaker/runtime/object_wrapper.rb +3 -1
  15. data/lib/rubybreaker/runtime/type_system.rb +3 -2
  16. data/lib/rubybreaker/test/testcase.rb +0 -1
  17. data/lib/rubybreaker/type/type.rb +1 -1
  18. data/lib/rubybreaker/type/type_grammar.treetop +1 -1
  19. data/lib/rubybreaker/type/type_unparser.rb +1 -1
  20. data/lib/rubybreaker/util.rb +3 -11
  21. data/test/integrated/tc_both_broken_breakable.rb +27 -0
  22. data/test/ts_integrated.rb +1 -0
  23. data/webpage/index.html +30 -19
  24. data/webpage/rdoc/RubyBreaker.html +127 -10
  25. data/webpage/rdoc/RubyBreaker/Breakable.html +1 -5
  26. data/webpage/rdoc/RubyBreaker/Broken.html +2 -6
  27. data/webpage/rdoc/RubyBreaker/Broken/BrokenEigen.html +3 -6
  28. data/webpage/rdoc/RubyBreaker/Context.html +6 -10
  29. data/webpage/rdoc/RubyBreaker/Errors.html +2 -6
  30. data/webpage/rdoc/RubyBreaker/Errors/InternalError.html +3 -7
  31. data/webpage/rdoc/RubyBreaker/Errors/InvalidSubtypeCheck.html +3 -7
  32. data/webpage/rdoc/RubyBreaker/Errors/InvalidTypeConstruction.html +2 -6
  33. data/webpage/rdoc/RubyBreaker/Errors/SubtypeFailure.html +2 -6
  34. data/webpage/rdoc/RubyBreaker/Errors/TypeError.html +3 -7
  35. data/webpage/rdoc/RubyBreaker/Errors/UserError.html +3 -7
  36. data/webpage/rdoc/RubyBreaker/Main.html +33 -20
  37. data/webpage/rdoc/RubyBreaker/ObjectPosition.html +4 -8
  38. data/webpage/rdoc/RubyBreaker/Position.html +7 -11
  39. data/webpage/rdoc/RubyBreaker/RubyTypeUtils.html +1 -5
  40. data/webpage/rdoc/RubyBreaker/Runtime.html +1 -5
  41. data/webpage/rdoc/RubyBreaker/Runtime/Inspector.html +25 -18
  42. data/webpage/rdoc/RubyBreaker/Runtime/MethodInfo.html +1 -5
  43. data/webpage/rdoc/RubyBreaker/Runtime/Monitor.html +4 -8
  44. data/webpage/rdoc/RubyBreaker/Runtime/MonitorInstaller.html +20 -43
  45. data/webpage/rdoc/RubyBreaker/Runtime/MonitorSwitch.html +7 -11
  46. data/webpage/rdoc/RubyBreaker/Runtime/MonitorUtils.html +6 -10
  47. data/webpage/rdoc/RubyBreaker/Runtime/ObjectWrapper.html +7 -11
  48. data/webpage/rdoc/RubyBreaker/Runtime/Pluggable.html +1 -5
  49. data/webpage/rdoc/RubyBreaker/Runtime/TypePlaceholder.html +1 -5
  50. data/webpage/rdoc/RubyBreaker/Runtime/TypeSigParser.html +1 -5
  51. data/webpage/rdoc/RubyBreaker/Runtime/TypeSystem.html +8 -12
  52. data/webpage/rdoc/RubyBreaker/TestCase.html +1 -6
  53. data/webpage/rdoc/RubyBreaker/TypeComparer.html +1 -5
  54. data/webpage/rdoc/RubyBreaker/TypeDefs.html +1 -5
  55. data/webpage/rdoc/RubyBreaker/TypeDefs/AnyType.html +1 -5
  56. data/webpage/rdoc/RubyBreaker/TypeDefs/BlockType.html +1 -5
  57. data/webpage/rdoc/RubyBreaker/TypeDefs/DuckType.html +1 -5
  58. data/webpage/rdoc/RubyBreaker/TypeDefs/FusionType.html +1 -5
  59. data/webpage/rdoc/RubyBreaker/TypeDefs/MethodListType.html +1 -5
  60. data/webpage/rdoc/RubyBreaker/TypeDefs/MethodType.html +1 -5
  61. data/webpage/rdoc/RubyBreaker/TypeDefs/NilType.html +1 -5
  62. data/webpage/rdoc/RubyBreaker/TypeDefs/NominalType.html +1 -5
  63. data/webpage/rdoc/RubyBreaker/TypeDefs/OptionalType.html +1 -5
  64. data/webpage/rdoc/RubyBreaker/TypeDefs/OrType.html +1 -5
  65. data/webpage/rdoc/RubyBreaker/TypeDefs/SelfType.html +1 -5
  66. data/webpage/rdoc/RubyBreaker/TypeDefs/Type.html +1 -5
  67. data/webpage/rdoc/RubyBreaker/TypeDefs/VarLengthType.html +1 -5
  68. data/webpage/rdoc/RubyBreaker/TypeUnparser.html +1 -5
  69. data/webpage/rdoc/RubyBreaker/Typing.html +1 -5
  70. data/webpage/rdoc/RubyBreaker/{Utilities.html → Util.html} +8 -9
  71. data/webpage/rdoc/created.rid +15 -14
  72. data/webpage/rdoc/index.html +1 -5
  73. data/webpage/rdoc/js/search_index.js +1 -1
  74. data/webpage/rdoc/table_of_contents.html +22 -36
  75. metadata +9 -7
  76. data/webpage/rdoc/RubyBreaker/Debug.html +0 -411
  77. data/webpage/rdoc/RubyBreaker/Kernel.html +0 -259
@@ -48,7 +48,7 @@ module RubyBreaker
48
48
 
49
49
  end
50
50
 
51
- class TypeError < ::UserError
51
+ class TypeError < UserError
52
52
  end
53
53
 
54
54
  class SubtypeFailure < TypeError
@@ -41,7 +41,7 @@ module RubyBreaker
41
41
  end
42
42
 
43
43
  end
44
-
44
+
45
45
  # This module is included for "broken" classes.
46
46
  module Broken
47
47
 
@@ -85,7 +85,8 @@ module RubyBreaker
85
85
  meth_type.types << t
86
86
  else
87
87
  # then upgrade it
88
- placeholder.meth_type_map[t.meth_name] = MethodListType.new([meth_type, t])
88
+ placeholder.meth_type_map[t.meth_name] =
89
+ MethodListType.new([meth_type, t])
89
90
  end
90
91
  else
91
92
  placeholder.meth_type_map[t.meth_name] = t
@@ -1,6 +1,6 @@
1
1
  #--
2
- # This file defines Inspector which finds the type placeholder for a
3
- # module.
2
+ # This file defines the type inspector which fetches the type information
3
+ # gathered or documented in a Breakable, Broken, or hybrid module.
4
4
 
5
5
  require_relative "util"
6
6
  require_relative "monitor"
@@ -9,24 +9,26 @@ module RubyBreaker
9
9
 
10
10
  module Runtime
11
11
 
12
- # This module inspects a Breakable module and retrieves type information
13
- # if there is any.
12
+ # This module inspects a Breakable module, a Broken module, or a hybrid
13
+ # module to fetch the type information for each method.
14
14
  module Inspector
15
15
 
16
- # This method inspects the module for specified method name. It
17
- # returns the method type or method list type for the given method. If
18
- # no method exists or if there is no type information for the method,
19
- # it returns nil
16
+ # This method inspects the module for the type of the specified
17
+ # method. It returns the method type or method list type for the given
18
+ # method, by looking at, first, the placeholder for the Breakable
19
+ # side of the module, and then, the placeholder for the Broken side of
20
+ # the module. If no method exists or if there is no type information
21
+ # for the method, it returns nil.
20
22
  def self.inspect_meth(mod, mname)
21
23
  mname = mname.to_sym
22
24
  if Breakable::TYPE_PLACEHOLDER_MAP.has_key?(mod)
23
25
  placeholder = Breakable::TYPE_PLACEHOLDER_MAP[mod]
24
- elsif Broken::TYPE_PLACEHOLDER_MAP.has_key?(mod)
25
- placeholder = Broken::TYPE_PLACEHOLDER_MAP[mod]
26
- else
27
- # TODO
28
26
  end
29
27
  t = placeholder.meth_type_map[mname] if placeholder
28
+ if !t && Broken::TYPE_PLACEHOLDER_MAP.has_key?(mod)
29
+ placeholder = Broken::TYPE_PLACEHOLDER_MAP[mod]
30
+ t = placeholder.meth_type_map[mname] if placeholder
31
+ end
30
32
  return t
31
33
  end
32
34
 
@@ -56,10 +58,15 @@ module RubyBreaker
56
58
  mtypes[im] = mtype if mtype
57
59
  }
58
60
  end
61
+ mm = Broken::TYPE_PLACEHOLDER_MAP[mod]
62
+ if mm
63
+ mm.meth_type_map.each_pair {|im,mtype|
64
+ mtypes[im] = mtype if mtype
65
+ }
66
+ end
59
67
  return mtypes
60
68
  end
61
69
 
62
-
63
70
  end
64
71
 
65
72
  end
@@ -6,9 +6,8 @@
6
6
 
7
7
  dir = File.dirname(__FILE__)
8
8
  require_relative "util"
9
- require_relative "type_placeholder"
10
- require_relative "../context"
11
9
  require_relative "../debug"
10
+ require_relative "type_placeholder"
12
11
  require_relative "pluggable"
13
12
  require_relative "type_system"
14
13
 
@@ -56,12 +55,12 @@ module RubyBreaker
56
55
  def initialize(); @switch = true end
57
56
 
58
57
  def turn_on();
59
- Debug.msg("Switch turned on")
58
+ RubyBreaker.log("Switch turned on")
60
59
  @switch = true;
61
60
  end
62
61
 
63
62
  def turn_off();
64
- Debug.msg("Switch turned off")
63
+ RubyBreaker.log("Switch turned off")
65
64
  @switch = false;
66
65
  end
67
66
 
@@ -120,7 +119,7 @@ module RubyBreaker
120
119
  # this is what the renamed method
121
120
  stub_meth_name = get_alt_meth_name(meth_name)
122
121
 
123
- Debug.msg("Route to #{stub_meth_name}",CONTEXT)
122
+ RubyBreaker.log("Route to #{stub_meth_name}", :debug, CONTEXT)
124
123
 
125
124
  # short-circuit if switch was off--i.e., no monitoring
126
125
  if !switch
@@ -143,7 +142,7 @@ module RubyBreaker
143
142
 
144
143
  mm.monitor_before_method(obj, meth_info)
145
144
 
146
- Debug.msg("monitor_before_method ended")
145
+ RubyBreaker.log("monitor_before_method ended")
147
146
 
148
147
  # we are going to turn the switch back on
149
148
  GLOBAL_MONITOR_SWITCH.turn_on()
@@ -197,7 +196,7 @@ module RubyBreaker
197
196
  def self.rename_meth(recv, meth_name)
198
197
  alt_meth_name = MonitorUtils.get_alt_meth_name(meth_name)
199
198
  recv.module_eval("alias :\"#{alt_meth_name}\" :\"#{meth_name}\"")
200
- Debug.msg("Adding alternate method for #{meth_name}")
199
+ RubyBreaker.log("Adding alternate method for #{meth_name}")
201
200
  recv.module_eval <<-EOF
202
201
  def #{meth_name}(*args, &blk)
203
202
  RubyBreaker::Runtime::MonitorUtils.route(self,
@@ -210,18 +209,27 @@ module RubyBreaker
210
209
 
211
210
  # Installs an module (class) monitor to the object.
212
211
  def self.install_module_monitor(mod)
213
- Debug.short_msg("Installing module monitor for #{mod}")
212
+
213
+ RubyBreaker.log("Installing module monitor for #{mod}")
214
+
214
215
  Breakable::MONITOR_MAP[mod] = Monitor.new(mod, DEFAULT_TYPE_SYSTEM)
215
216
  Breakable::TYPE_PLACEHOLDER_MAP[mod] = TypePlaceholder.new
217
+
216
218
  meth_type_map = []
217
219
  meths = mod.instance_methods(false)
220
+
221
+ # RubyBreaker now supports the hybrid of Breakable and Broken. Here,
222
+ # see if any methods are already broken.
223
+ broken_meth_type_map = Inspector.inspect_all(mod)
224
+ broken_meths = broken_meth_type_map.keys
225
+
218
226
  meths.each do |m|
219
- self.rename_meth(mod,m)
227
+ # As long as the method is not "Broken" yet, it is considered
228
+ # Breakable (if the module is declared to be Breakable).
229
+ unless broken_meths.include?(m)
230
+ self.rename_meth(mod,m)
231
+ end
220
232
  end
221
- Debug.feed_line()
222
- end
223
-
224
- def self.report(mod)
225
233
  end
226
234
 
227
235
  end
@@ -1,6 +1,8 @@
1
1
  #--
2
2
  # This program keeps track of every method call to a wrapped object.
3
3
 
4
+ require_relative "../debug"
5
+
4
6
  module RubyBreaker
5
7
 
6
8
  module Runtime
@@ -66,7 +68,7 @@ module RubyBreaker
66
68
 
67
69
  # This method missing method redirects all other method calls.
68
70
  def method_missing(mname,*args,&blk)
69
- Debug.msg("Method_missing for #{mname}")
71
+ ::RubyBreaker.log("Method_missing for #{mname}")
70
72
  if GLOBAL_MONITOR_SWITCH.switch
71
73
  @__rubybreaker_type.add_meth(mname)
72
74
  retval = @__rubybreaker_obj.send(mname,*args,&blk)
@@ -10,6 +10,7 @@ require_relative "object_wrapper"
10
10
  require_relative "type_placeholder"
11
11
  require_relative "../type"
12
12
  require_relative "../typing"
13
+ require_relative "../debug"
13
14
 
14
15
  module RubyBreaker
15
16
 
@@ -192,7 +193,7 @@ module RubyBreaker
192
193
  end
193
194
  end
194
195
 
195
- Debug.msg("In module monitor_before #{meth_name}")
196
+ RubyBreaker.log("In module monitor_before #{meth_name}")
196
197
 
197
198
  meth_type = meth_type_map[meth_name]
198
199
 
@@ -241,7 +242,7 @@ module RubyBreaker
241
242
  args = meth_info.args
242
243
  blk = meth_info.blk
243
244
 
244
- Debug.msg("In module monitor_after #{meth_name}")
245
+ RubyBreaker.log("In module monitor_after #{meth_name}")
245
246
 
246
247
  meth_type_map = Breakable::TYPE_PLACEHOLDER_MAP[mod].meth_type_map
247
248
 
@@ -25,7 +25,6 @@ module RubyBreaker
25
25
  alias :__run :run
26
26
 
27
27
  def run(*args,&blk)
28
- # RubyBreaker::Utilities.rb_print("Running " + args[0].to_s)
29
28
  RubyBreaker::TestCase.setup()
30
29
  __run(*args,&blk)
31
30
  RubyBreaker::TestCase.teardown()
@@ -17,7 +17,7 @@
17
17
  #
18
18
 
19
19
  require_relative "../util"
20
- require_relative "../context.rb"
20
+ require_relative "../debug"
21
21
 
22
22
  module RubyBreaker
23
23
 
@@ -232,7 +232,7 @@ grammar TypeGrammar
232
232
  pos = RubyBreaker::Position.get()
233
233
  pos.col = interval.first
234
234
  begin
235
- mod_name = RubyBreaker::Utilities.camelize(text_value)
235
+ mod_name = RubyBreaker::Util.camelize(text_value)
236
236
  mod = eval mod_name
237
237
  t = RubyBreaker::NominalType.new(mod,pos)
238
238
  rescue
@@ -37,7 +37,7 @@ module RubyBreaker
37
37
  # print method.
38
38
  def self.unparse_pp(pp,t)
39
39
  if t.instance_of?(NominalType)
40
- tname = Utilities.underscore(t.mod)
40
+ tname = Util.underscore(t.mod)
41
41
  tokens = tname.split("/")
42
42
  tname = tokens.last if tokens.size > 1
43
43
  pp.text(tname)
@@ -4,7 +4,9 @@
4
4
 
5
5
  module RubyBreaker
6
6
 
7
- module Utilities
7
+ # This module has utility functions that are useful across all components
8
+ # in the project.
9
+ module Util
8
10
 
9
11
  # File activesupport/lib/active_support/inflector/methods.rb, line 48
10
12
  def self.underscore(camel_cased_word)
@@ -28,14 +30,4 @@ module RubyBreaker
28
30
 
29
31
  end
30
32
 
31
- # http://mentalized.net/journal/2010/04/02/suppress_warnings_from_ruby/
32
- module Kernel
33
- def suppress_warning
34
- original_verbosity = $VERBOSE
35
- $VERBOSE = nil
36
- result = yield
37
- $VERBOSE = original_verbosity
38
- return result
39
- end
40
- end
41
33
  end
@@ -0,0 +1,27 @@
1
+ require "test/unit"
2
+ require_relative "../../lib/rubybreaker"
3
+
4
+ class IntegratedBothBrokenBreakableTest < Test::Unit::TestCase
5
+ include RubyBreaker
6
+ include RubyBreaker::TestCase
7
+
8
+ class A
9
+ include RubyBreaker::Breakable
10
+ include RubyBreaker::Broken
11
+ typesig("foo(fixnum[to_s]) -> string")
12
+ def foo(x); x.to_s end
13
+ def bar(x); x.to_sym end
14
+ end
15
+
16
+ def test_both_broken_and_breakable
17
+ # A.new.foo(1)
18
+ A.new.bar("abc")
19
+ a_foo_meth_type = Runtime::Inspector.inspect_meth(A, :foo)
20
+ a_bar_meth_type = Runtime::Inspector.inspect_meth(A, :bar)
21
+ str = RubyBreaker::TypeUnparser.unparse(a_foo_meth_type)
22
+ assert_equal("foo(fixnum[to_s]) -> string", str)
23
+ str = RubyBreaker::TypeUnparser.unparse(a_bar_meth_type)
24
+ assert_equal("bar(string[to_sym]) -> symbol", str)
25
+ end
26
+
27
+ end
@@ -4,3 +4,4 @@ require_relative "integrated/tc_method_missing"
4
4
  require_relative "integrated/tc_simple1"
5
5
  require_relative "integrated/tc_inherit_broken"
6
6
  require_relative "integrated/tc_class_methods"
7
+ require_relative "integrated/tc_both_broken_breakable"
data/webpage/index.html CHANGED
@@ -197,10 +197,20 @@ signature <code>bar(fixnum[to_s]) -&gt; string</code>, which means it takes an o
197
197
  has <code>Fixnum</code>'s <code>to_s</code> method and returns a string. More detail on the type
198
198
  annotation language will be explained in later section.</p>
199
199
 
200
- <p>It is possible to include either <code>Breakable</code> or <code>Broken</code> in an eigen-class
201
- to document class methods. To make this easier, RubyBreaker will
202
- automatically support auto-documentation and manual documentation of class
203
- methods if the original module is declared as <code>Breakable</code> or <code>Broken</code>,
200
+ <h3>Hybrid of Breakable and Broken</h3>
201
+
202
+ <p>Starting from version 0.0.3, RubyBreaker allows a module to be declared as
203
+ <code>Breakable</code> and <code>Broken</code> at the same time. If a method has a corresponding
204
+ type signature (manually documented) somewhere, then RubyBreaker will not
205
+ monitor it during runtime. All other methods will be instrumented and
206
+ monitored by RubyBreaker.</p>
207
+
208
+ <h3>Class Methods</h3>
209
+
210
+ <p>It is possible to include <code>Breakable</code> and/or <code>Broken</code> in an eigen-class to
211
+ document class methods. To make this easier, RubyBreaker will automatically
212
+ support auto-documentation and manual documentation of class methods if the
213
+ original module is declared as <code>Breakable</code> and/or <code>Broken</code>,
204
214
  respectively--that is, up to immediate eigen class level of a "nominal"
205
215
  module. The following example shows how class methods can be
206
216
  auto-documented and manually documented, respectively.</p>
@@ -221,11 +231,6 @@ class B
221
231
  end
222
232
  </code></pre>
223
233
 
224
- <p>Keep in mind that <code>Broken</code> module always wins against <code>Breakable</code>. In other
225
- words, if a module is declared as both <code>Broken</code> and <code>Breakable</code>, it is
226
- treated as <code>Broken</code>. Future versions of RubyBreaker will support a hybrid of
227
- the two modules, but it remains as a limitation in the current version.</p>
228
-
229
234
  <h3>Program Entry Point</h3>
230
235
 
231
236
  <p>In Ruby, as soon as a file is <code>require</code>d, the execution of that file begins.
@@ -301,8 +306,8 @@ and returns a <code>String</code> object. Note that these types are in lowercase
301
306
  indicating they are objects and not modules or classes themselves.</p>
302
307
 
303
308
  <p>There are several types that represent an object: nominal, duck, fusion,
304
- nil, 'any', and block. Each type signature itself represents a method type
305
- or a method list type (explained below).</p>
309
+ nil, 'any', 'or', optional, variable-length, and block. Each type signature
310
+ itself represents a method type or a method list type (explained below).</p>
306
311
 
307
312
  <h3>Nominal Type</h3>
308
313
 
@@ -355,6 +360,20 @@ other type is not a subtype of <code>?</code>. This becomes a bit complicated fo
355
360
  method or block argument types because of their contra-variance
356
361
  characteristic. Please refer to the section <em>Subtyping</em>.</p>
357
362
 
363
+ <h3>Or Type</h3>
364
+
365
+ <p>Any above types can be "or"ed together, using <code>||</code>, to represent an object
366
+ that can be either one or the other. It <em>does</em> not represent an object that
367
+ has to be both (which is not supported by RubyBreaker).</p>
368
+
369
+ <h3>Optional Argument Type and Variable-Length Argument Type</h3>
370
+
371
+ <p>Another useful features of Ruby are the optional argument type and the
372
+ variable-length argument type. The former represents an argument that has a
373
+ default value (and therefore does not have to be provided). The latter
374
+ represents zero or more arguments of the same type. These are denoted by
375
+ suffices, <code>?</code> and <code>*</code>, respectively.</p>
376
+
358
377
  <h3>Block Type</h3>
359
378
 
360
379
  <p>One of the Ruby's prominent features is the block argument. It allows
@@ -370,14 +389,6 @@ However, <em>keep in mind</em> that RubyBreaker <em>cannot</em> automatically do
370
389
  block types due to <code>yield</code> being a language construct rather than a method,
371
390
  which means it cannot be captured by meta-programming!</p>
372
391
 
373
- <h3>Optional Argument Type and Variable-Length Argument Type</h3>
374
-
375
- <p>Another useful features of Ruby are the optional argument type and the
376
- variable-length argument type. The former represents an argument that has a
377
- default value (and therefore does not have to be provided). The latter
378
- represents zero or more arguments of the same type. These are denoted by
379
- suffices, <code>?</code> and <code>*</code>, respectively.</p>
380
-
381
392
  <h3>Method Type and Method List Types</h3>
382
393
 
383
394
  <p>Method type is similar to the block type, but it represents an actual method
@@ -47,9 +47,9 @@
47
47
  <nav id="file-list-section" class="section">
48
48
  <h3 class="section-header">Defined In</h3>
49
49
  <ul>
50
- <li>lib/rubybreaker/context.rb
51
- <li>lib/rubybreaker/debug.rb
52
- <li>lib/rubybreaker/error.rb
50
+ <li>lib/rubybreaker/debug/context.rb
51
+ <li>lib/rubybreaker/debug/debug.rb
52
+ <li>lib/rubybreaker/debug/error.rb
53
53
  <li>lib/rubybreaker/runtime/inspector.rb
54
54
  <li>lib/rubybreaker/runtime/monitor.rb
55
55
  <li>lib/rubybreaker/runtime/object_wrapper.rb
@@ -96,8 +96,14 @@
96
96
 
97
97
  <ul class="link-list">
98
98
 
99
+ <li><a href="#method-c-error">::error</a>
100
+
101
+ <li><a href="#method-c-log">::log</a>
102
+
99
103
  <li><a href="#method-c-monitor">::monitor</a>
100
104
 
105
+ <li><a href="#method-c-verbose">::verbose</a>
106
+
101
107
  </ul>
102
108
  </nav>
103
109
 
@@ -120,8 +126,6 @@
120
126
 
121
127
  <li><a href="./RubyBreaker/Context.html">RubyBreaker::Context</a>
122
128
 
123
- <li><a href="./RubyBreaker/Debug.html">RubyBreaker::Debug</a>
124
-
125
129
  <li><a href="./RubyBreaker/Errors.html">RubyBreaker::Errors</a>
126
130
 
127
131
  <li><a href="./RubyBreaker/Errors/InternalError.html">RubyBreaker::Errors::InternalError</a>
@@ -136,8 +140,6 @@
136
140
 
137
141
  <li><a href="./RubyBreaker/Errors/UserError.html">RubyBreaker::Errors::UserError</a>
138
142
 
139
- <li><a href="./RubyBreaker/Kernel.html">RubyBreaker::Kernel</a>
140
-
141
143
  <li><a href="./RubyBreaker/Main.html">RubyBreaker::Main</a>
142
144
 
143
145
  <li><a href="./RubyBreaker/ObjectPosition.html">RubyBreaker::ObjectPosition</a>
@@ -206,7 +208,7 @@
206
208
 
207
209
  <li><a href="./RubyBreaker/Typing.html">RubyBreaker::Typing</a>
208
210
 
209
- <li><a href="./RubyBreaker/Utilities.html">RubyBreaker::Utilities</a>
211
+ <li><a href="./RubyBreaker/Util.html">RubyBreaker::Util</a>
210
212
 
211
213
  </ul>
212
214
  </nav>
@@ -292,6 +294,81 @@ monitor.</p>
292
294
  <h3 class="section-header">Public Class Methods</h3>
293
295
 
294
296
 
297
+ <div id="method-c-error" class="method-detail ">
298
+
299
+ <div class="method-heading">
300
+ <span class="method-name">error</span><span
301
+ class="method-args">(err, level=:error, &blk)</span>
302
+ <span class="method-click-advice">click to toggle source</span>
303
+ </div>
304
+
305
+
306
+ <div class="method-description">
307
+
308
+ <p>This method is for reporting an error to the user. It will immediately show
309
+ the error message but also log it.</p>
310
+
311
+
312
+
313
+ <div class="method-source-code" id="error-source">
314
+ <pre><span class="ruby-comment"># File lib/rubybreaker/debug/debug.rb, line 38</span>
315
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">error</span>(<span class="ruby-identifier">err</span>, <span class="ruby-identifier">level</span>=<span class="ruby-value">:error</span>, &amp;<span class="ruby-identifier">blk</span>)
316
+ <span class="ruby-identifier">msg</span> = <span class="ruby-identifier">err</span>.<span class="ruby-identifier">to_s</span>
317
+ <span class="ruby-identifier">msg</span> = <span class="ruby-node">&quot;#{msg} : #{yield}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">blk</span>
318
+ <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[#{level.to_s.upcase}] #{msg}&quot;</span>
319
+ <span class="ruby-constant">LOGGER</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">level</span>, <span class="ruby-identifier">msg</span>) <span class="ruby-keyword">if</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">OPTIONS</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:debug</span>]
320
+ <span class="ruby-keyword">end</span></pre>
321
+ </div><!-- error-source -->
322
+
323
+ </div>
324
+
325
+
326
+
327
+
328
+ </div><!-- error-method -->
329
+
330
+
331
+ <div id="method-c-log" class="method-detail ">
332
+
333
+ <div class="method-heading">
334
+ <span class="method-name">log</span><span
335
+ class="method-args">(str, level=:debug, context=nil, &blk)</span>
336
+ <span class="method-click-advice">click to toggle source</span>
337
+ </div>
338
+
339
+
340
+ <div class="method-description">
341
+
342
+ <p>This method logs a non-error (or error) message but with the provided
343
+ context.</p>
344
+
345
+
346
+
347
+ <div class="method-source-code" id="log-source">
348
+ <pre><span class="ruby-comment"># File lib/rubybreaker/debug/debug.rb, line 47</span>
349
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">str</span>, <span class="ruby-identifier">level</span>=<span class="ruby-value">:debug</span>, <span class="ruby-identifier">context</span>=<span class="ruby-keyword">nil</span>, &amp;<span class="ruby-identifier">blk</span>)
350
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">OPTIONS</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:debug</span>]
351
+ <span class="ruby-identifier">msg</span> = <span class="ruby-identifier">str</span>.<span class="ruby-identifier">to_s</span>
352
+ <span class="ruby-identifier">msg</span> = <span class="ruby-node">&quot;#{msg} : #{yield}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">blk</span>
353
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">context</span>
354
+ <span class="ruby-identifier">output</span> = <span class="ruby-string">&quot;&quot;</span>
355
+ <span class="ruby-identifier">pp</span> = <span class="ruby-constant">PrettyPrint</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">output</span>)
356
+ <span class="ruby-identifier">context</span>.<span class="ruby-identifier">format_with_msg</span>(<span class="ruby-identifier">pp</span>,<span class="ruby-identifier">msg</span>)
357
+ <span class="ruby-identifier">pp</span>.<span class="ruby-identifier">flush</span>
358
+ <span class="ruby-identifier">msg</span> = <span class="ruby-identifier">output</span>
359
+ <span class="ruby-keyword">end</span>
360
+ <span class="ruby-constant">LOGGER</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">level</span>, <span class="ruby-identifier">msg</span>)
361
+ <span class="ruby-keyword">end</span></pre>
362
+ </div><!-- log-source -->
363
+
364
+ </div>
365
+
366
+
367
+
368
+
369
+ </div><!-- log-method -->
370
+
371
+
295
372
  <div id="method-c-monitor" class="method-detail ">
296
373
 
297
374
  <div class="method-heading">
@@ -303,12 +380,13 @@ monitor.</p>
303
380
 
304
381
  <div class="method-description">
305
382
 
306
- <p>Just redirecting</p>
383
+ <p>This is the manual indicator for the program entry point. It simply
384
+ redirects to the monitor setup code.</p>
307
385
 
308
386
 
309
387
 
310
388
  <div class="method-source-code" id="monitor-source">
311
- <pre><span class="ruby-comment"># File lib/rubybreaker.rb, line 209</span>
389
+ <pre><span class="ruby-comment"># File lib/rubybreaker.rb, line 229</span>
312
390
  <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">monitor</span>()
313
391
  <span class="ruby-constant">Main</span>.<span class="ruby-identifier">setup</span>()
314
392
  <span class="ruby-keyword">end</span></pre>
@@ -322,6 +400,45 @@ monitor.</p>
322
400
  </div><!-- monitor-method -->
323
401
 
324
402
 
403
+ <div id="method-c-verbose" class="method-detail ">
404
+
405
+ <div class="method-heading">
406
+ <span class="method-name">verbose</span><span
407
+ class="method-args">(str) { || ... }</span>
408
+ <span class="method-click-advice">click to toggle source</span>
409
+ </div>
410
+
411
+
412
+ <div class="method-description">
413
+
414
+ <p>This method will display verbose message. It is not for debugging but to
415
+ inform users of each stage in the analysis.</p>
416
+
417
+
418
+
419
+ <div class="method-source-code" id="verbose-source">
420
+ <pre><span class="ruby-comment"># File lib/rubybreaker/debug/debug.rb, line 24</span>
421
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">verbose</span>(<span class="ruby-identifier">str</span>, &amp;<span class="ruby-identifier">blk</span>)
422
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">OPTIONS</span>) <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:verbose</span>] <span class="ruby-operator">||</span> <span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:debug</span>])
423
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">blk</span>
424
+ <span class="ruby-identifier">msg</span> = <span class="ruby-keyword">yield</span>
425
+ <span class="ruby-identifier">msg</span> = <span class="ruby-node">&quot;#{str} : #{msg}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">str</span>
426
+ <span class="ruby-keyword">else</span>
427
+ <span class="ruby-identifier">msg</span> = <span class="ruby-identifier">str</span>
428
+ <span class="ruby-keyword">end</span>
429
+ <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">msg</span> <span class="ruby-keyword">if</span> <span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:verbose</span>]
430
+ <span class="ruby-constant">LOGGER</span>.<span class="ruby-identifier">info</span> <span class="ruby-identifier">msg</span> <span class="ruby-keyword">if</span> <span class="ruby-constant">OPTIONS</span>[<span class="ruby-value">:debug</span>]
431
+ <span class="ruby-keyword">end</span></pre>
432
+ </div><!-- verbose-source -->
433
+
434
+ </div>
435
+
436
+
437
+
438
+
439
+ </div><!-- verbose-method -->
440
+
441
+
325
442
  </section><!-- public-class-method-details -->
326
443
 
327
444
  </section><!-- 5Buntitled-5D -->