Class: TaskJuggler::Log
- Includes:
- Singleton
- Defined in:
- lib/taskjuggler/Log.rb
Overview
The Log class implements a filter for segmented execution traces. The trace messages are filtered based on their segment name and the nesting level of the segments. The class is a Singleton, so there is only one instance in the program.
Constant Summary collapse
- @@level =
0
- @@stack =
[]
- @@segments =
[]
- @@silent =
true
- @@progress =
0
- @@progressMeter =
+''
Class Method Summary collapse
-
.activity ⇒ Object
This function may only be called when Log#startProgressMeter has been called before.
-
.enter(segment, message) ⇒ Object
This function is used to open a new segment.
-
.exit(segment, message = nil) ⇒ Object
This function is used to close an open segment.
-
.level=(l) ⇒ Object
Set the maximum nesting level that should be shown.
-
.msg(&block) ⇒ Object
Use this function to show a log message within the currently active segment.
-
.progress(percent) ⇒ Object
This function may only be called when Log#startProgressMeter has been called before.
-
.segments=(s) ⇒ Object
The trace output can be limited to a list of segments.
-
.silent ⇒ Object
Return the @@silent value.
-
.silent=(s) ⇒ Object
if
s
is true, progress information will not be shown. -
.startProgressMeter(text) ⇒ Object
The progress meter can be a textual progress bar or some animated character sequence that informs the user about ongoing activities.
-
.status(message) ⇒ Object
Print out a status message unless we are in silent mode.
-
.stopProgressMeter ⇒ Object
This sets the progress meter status to “done” and puts the cursor into the next line again.
Class Method Details
.activity ⇒ Object
This function may only be called when Log#startProgressMeter has been called before. It updates the progress indicator to the next symbol to visualize ongoing activity.
145 146 147 148 149 150 151 |
# File 'lib/taskjuggler/Log.rb', line 145 def Log.activity return if @@silent indicator = %w( - \\ | / ) @@progress = (@@progress.to_i + 1) % indicator.length $stdout.print("#{@@progressMeter} [#{indicator[@@progress]}]\r") end |
.enter(segment, message) ⇒ Object
This function is used to open a new segment. segment
is the name of the segment and message
is a description of it.
62 63 64 65 66 67 |
# File 'lib/taskjuggler/Log.rb', line 62 def Log.enter(segment, ) return if @@level == 0 @@stack << segment Log.msg { ">> [#{segment}] #{}" } end |
.exit(segment, message = nil) ⇒ Object
This function is used to close an open segment. To make this mechanism a bit more robust, it will search the stack of open segments for a segment with that name and will close all nested segments as well.
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/taskjuggler/Log.rb', line 72 def Log.exit(segment, = nil) return if @@level == 0 Log.msg { "<< [#{segment}] #{}" } if if @@stack.include?(segment) loop do m = @@stack.pop break if m == segment end end end |
.level=(l) ⇒ Object
Set the maximum nesting level that should be shown. Segments with a nesting level greater than l will be silently dropped.
38 39 40 |
# File 'lib/taskjuggler/Log.rb', line 38 def Log.level=(l) @@level = l end |
.msg(&block) ⇒ Object
Use this function to show a log message within the currently active segment. The message is the result of the passed block. The block will only be evaluated if the message will actually be shown.
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/taskjuggler/Log.rb', line 87 def Log.msg(&block) return if @@level == 0 offset = 0 unless @@segments.empty? showMessage = false @@stack.each do |segment| # If a segment list is used to filter the output, we look for the # first listed segments on the stack. This and all nested segments # will be shown. if @@segments.include?(segment) offset = @@stack.index(segment) showMessage = true break end end return unless showMessage end if @@stack.length - offset < @@level $stderr.puts ' ' * (@@stack.length - offset) + yield(block) end end |
.progress(percent) ⇒ Object
This function may only be called when Log#startProgressMeter has been called before. It updates the progress bar to the given percent
completion value. The value should be between 0.0 and 1.0.
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/taskjuggler/Log.rb', line 156 def Log.progress(percent) return if @@silent percent = 0.0 if percent < 0.0 percent = 1.0 if percent > 1.0 @@progress = percent length = 16 full = (length * percent).to_i = '=' * full + ' ' * (length - full) label = (percent * 100.0).to_i.to_s + '%' [length / 2 - label.length / 2, label.length] = label $stdout.print("#{@@progressMeter} [" + Term::ANSIColor.green("#{}") + "]\r") end |
.segments=(s) ⇒ Object
The trace output can be limited to a list of segments. Messages not in these segments will be ignored. Messages from segments that are nested into the shown segments will be shown for the next @@level nested segments.
46 47 48 |
# File 'lib/taskjuggler/Log.rb', line 46 def Log.segments=(s) @@segments = s end |
.silent ⇒ Object
Return the @@silent value.
56 57 58 |
# File 'lib/taskjuggler/Log.rb', line 56 def Log.silent @@silent end |
.silent=(s) ⇒ Object
if s
is true, progress information will not be shown.
51 52 53 |
# File 'lib/taskjuggler/Log.rb', line 51 def Log.silent=(s) @@silent = s end |
.startProgressMeter(text) ⇒ Object
The progress meter can be a textual progress bar or some animated character sequence that informs the user about ongoing activities. Call this function to start the progress meter display or to change the info text
. The the meter is active the text cursor is always returned to the start of the same line. Consequent output will overwrite the last meter text.
123 124 125 126 127 128 129 130 131 |
# File 'lib/taskjuggler/Log.rb', line 123 def Log.startProgressMeter(text) return if @@silent maxlen = 60 text = text.ljust(maxlen) text = text[0..maxlen - 1] if text.length_utf8 > maxlen @@progressMeter = text $stdout.print("#{@@progressMeter} ...\r") end |
.status(message) ⇒ Object
Print out a status message unless we are in silent mode.
111 112 113 114 115 |
# File 'lib/taskjuggler/Log.rb', line 111 def Log.status() return if @@silent $stdout.puts end |
.stopProgressMeter ⇒ Object
This sets the progress meter status to “done” and puts the cursor into the next line again.
135 136 137 138 139 140 |
# File 'lib/taskjuggler/Log.rb', line 135 def Log.stopProgressMeter return if @@silent $stdout.print("#{@@progressMeter} [ " + Term::ANSIColor.green("Done") + " ]\n") end |