Class: TaskJuggler::Log

Inherits:
Monitor
  • Object
show all
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

Class Method Details

.activityObject

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, message)
  return if @@level == 0

  @@stack << segment
  Log.msg { ">> [#{segment}] #{message}" }
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, message = nil)
  return if @@level == 0

  Log.msg { "<< [#{segment}] #{message}" } if message
  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
  bar = '=' * full + ' ' * (length - full)
  label = (percent * 100.0).to_i.to_s + '%'
  bar[length / 2 - label.length / 2, label.length] = label
  $stdout.print("#{@@progressMeter} [" +
                Term::ANSIColor.green("#{bar}") + "]\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

.silentObject

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(message)
  return if @@silent

  $stdout.puts message
end

.stopProgressMeterObject

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