/tools/Ruby/lib/ruby/1.8/irb/notifier.rb

http://github.com/agross/netopenspace · Ruby · 145 lines · 105 code · 29 blank · 11 comment · 7 complexity · 328056b5d971ccd5a29503bf98816b8d MD5 · raw file

  1. #
  2. # notifier.rb - output methods used by irb
  3. # $Release Version: 0.9.5$
  4. # $Revision: 16857 $
  5. # $Date: 2008-06-06 17:05:24 +0900 (Fri, 06 Jun 2008) $
  6. # by Keiju ISHITSUKA(keiju@ruby-lang.org)
  7. #
  8. # --
  9. #
  10. #
  11. #
  12. require "e2mmap"
  13. require "irb/output-method"
  14. module IRB
  15. module Notifier
  16. extend Exception2MessageMapper
  17. def_exception :ErrUndefinedNotifier,
  18. "undefined notifier level: %d is specified"
  19. def_exception :ErrUnrecognizedLevel,
  20. "unrecognized notifier level: %s is specified"
  21. def def_notifier(prefix = "", output_method = StdioOutputMethod.new)
  22. CompositeNotifier.new(prefix, output_method)
  23. end
  24. module_function :def_notifier
  25. class AbstructNotifier
  26. def initialize(prefix, base_notifier)
  27. @prefix = prefix
  28. @base_notifier = base_notifier
  29. end
  30. attr_reader :prefix
  31. def notify?
  32. true
  33. end
  34. def print(*opts)
  35. @base_notifier.print prefix, *opts if notify?
  36. end
  37. def printn(*opts)
  38. @base_notifier.printn prefix, *opts if notify?
  39. end
  40. def printf(format, *opts)
  41. @base_notifier.printf(prefix + format, *opts) if notify?
  42. end
  43. def puts(*objs)
  44. if notify?
  45. @base_notifier.puts(*objs.collect{|obj| prefix + obj.to_s})
  46. end
  47. end
  48. def pp(*objs)
  49. if notify?
  50. @base_notifier.ppx @prefix, *objs
  51. end
  52. end
  53. def ppx(prefix, *objs)
  54. if notify?
  55. @base_notifier.ppx @prefix+prefix, *objs
  56. end
  57. end
  58. def exec_if
  59. yield(@base_notifier) if notify?
  60. end
  61. end
  62. class CompositeNotifier<AbstructNotifier
  63. def initialize(prefix, base_notifier)
  64. super
  65. @notifiers = [D_NOMSG]
  66. @level_notifier = D_NOMSG
  67. end
  68. attr_reader :notifiers
  69. def def_notifier(level, prefix = "")
  70. notifier = LeveledNotifier.new(self, level, prefix)
  71. @notifiers[level] = notifier
  72. notifier
  73. end
  74. attr_reader :level_notifier
  75. alias level level_notifier
  76. def level_notifier=(value)
  77. case value
  78. when AbstructNotifier
  79. @level_notifier = value
  80. when Integer
  81. l = @notifiers[value]
  82. Notifier.Raise ErrUndefinedNotifer, value unless l
  83. @level_notifier = l
  84. else
  85. Notifier.Raise ErrUnrecognizedLevel, value unless l
  86. end
  87. end
  88. alias level= level_notifier=
  89. end
  90. class LeveledNotifier<AbstructNotifier
  91. include Comparable
  92. def initialize(base, level, prefix)
  93. super(prefix, base)
  94. @level = level
  95. end
  96. attr_reader :level
  97. def <=>(other)
  98. @level <=> other.level
  99. end
  100. def notify?
  101. @base_notifier.level >= self
  102. end
  103. end
  104. class NoMsgNotifier<LeveledNotifier
  105. def initialize
  106. @base_notifier = nil
  107. @level = 0
  108. @prefix = ""
  109. end
  110. def notify?
  111. false
  112. end
  113. end
  114. D_NOMSG = NoMsgNotifier.new
  115. end
  116. end