Class: TaskJuggler::Tj3

Inherits:
Tj3AppBase show all
Defined in:
lib/taskjuggler/apps/Tj3.rb

Instance Method Summary collapse

Methods inherited from Tj3AppBase

#main

Methods included from MessageHandler

#critical, #debug, #error, #fatal, #info, #warning

Constructor Details

#initializeTj3

Returns a new instance of Tj3.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/taskjuggler/apps/Tj3.rb', line 24

def initialize
  super

  # tj3 just requires Ruby 1.8.7. All other apps need 1.9.2.
  @mininumRubyVersion = '1.8.7'
  # By default, we're only using 1 CPU core.
  @maxCpuCores = 1
  # Don't generate warnings for differences between time sheet data and
  # the plan.
  @warnTsDeltas = false
  # Don't stop after reading all files.
  @checkSyntax = false
  # Don't generate reports when previous errors have been found.
  @forceReports = false
  # List of requested report IDs.
  @reportIDs = []
  # List of requested report IDs (as regular expressions).
  @reportRegExpIDs = []
  # Don't generate trace reports by default
  @generateTraces = false
  # Should a booking file be generated?
  @freeze = false
  # The cut-off date for the freeze
  @freezeDate = TjTime.new.align(3600)
  # Should bookings be grouped by Task or by Resource (default).
  @freezeByTask = false
  # Generate a list of all defined reports if true.
  @listReports = false
  # Regular expression to select the report IDs to be listed.
  @listReportPattern = '*'
  # Don't generate any reports.
  @noReports = false
  # Treat warnings like errors or not.
  @abortOnWarning = false
  # The directory where generated reports should be put in.
  @outputDir = nil
  # The file names of the time sheet files to check.
  @timeSheets = []
  # The file names of the status sheet files to check.
  @statusSheets = []

  # Show some progress information by default
  TaskJuggler::Log.silent = false
end

Instance Method Details

#appMain(files) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/taskjuggler/apps/Tj3.rb', line 170

def appMain(files)
  if files.empty?
    error('tj3_tjp_file_missing',
          'You must provide at least one .tjp file')
  end
  if @outputDir && !File.directory?(@outputDir)
    error('tj3_outdir_missing',
          "Output directory '#{@outputDir}' does not exist or is not " +
          "a directory!")
  end

  tj = TaskJuggler.new
  tj.maxCpuCores = @maxCpuCores
  tj.warnTsDeltas = @warnTsDeltas
  tj.generateTraces = @generateTraces
  MessageHandlerInstance.instance.abortOnWarning = @abortOnWarning
  keepParser = !@timeSheets.empty? || !@statusSheets.empty?
  return 1 unless tj.parse(files, keepParser)

  return 0 if @checkSyntax

  if !tj.schedule
    return 1 unless @forceReports
  end

  # The checks of time and status sheets is probably only used for
  # debugging.  Normally, this function is provided by tj3client.
  @timeSheets.each do |ts|
    return 1 if !tj.checkTimeSheet(ts) || tj.errors > 0
  end
  @statusSheets.each do |ss|
    return 1 if !tj.checkStatusSheet(ss) || tj.errors > 0
  end

  # Check for freeze mode and generate the booking file if requested.
  if @freeze
    return 1 unless tj.freeze(@freezeDate, @freezeByTask) &&
                    tj.errors == 0
  end

  # List all the reports that match the requested expression.
  tj.listReports(@listReportPattern, true) if @listReports

  return 0 if @noReports

  if @reportIDs.empty? && @reportRegExpIDs.empty?
    return 1 if !tj.generateReports(@outputDir) || tj.errors > 0
  else
    @reportIDs.each do |id|
      return 1 if !tj.generateReport(id, false)
    end
    @reportRegExpIDs.each do |id|
      return 1 if !tj.generateReport(id, true)
    end
  end

  0
end

#processArguments(argv) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/taskjuggler/apps/Tj3.rb', line 69

def processArguments(argv)
  super do
    @opts.banner.prepend(<<'EOT'
This is the main application. It reads in your project files, schedules the
project and generates the reports.

EOT
	)
    @opts.on('--debuglevel N', Integer,
             format("Verbosity of debug output")) do |arg|
      TaskJuggler::Log.level = arg
    end
    @opts.on('--debugmodules x,y,z', Array,
            format('Restrict debug output to a list of modules')) do |arg|
      TaskJuggler::Log.segments = arg
    end
    @opts.on('--freeze',
             format('Generate or update the booking file for ' +
                    'the project. The file will have the same ' +
                    'base name as the project file but has a ' +
                    '-bookings.tji extension.')) do
      @freeze = true
    end
    @opts.on('--freezedate <date>', String,
             format('Use a different date than the current moment' +
                    'as cut-off date for the booking file')) do |arg|
      begin
        @freezeDate = TjTime.new(arg).align(3600)
      rescue TjException => msg
        error('tj3_ivld_freeze_date',
              "Invalid freeze date: #{msg.message}")
      end
    end
    @opts.on('--freezebytask',
             format('Group the bookings in the booking file generated ' +
                    'during a freeze by task instead of by resource.')) do
      @freezeByTask = true
    end
    @opts.on('--check-time-sheet <tji-file>', String,
            format("Check the given time sheet")) do |arg|
      @timeSheets << arg
    end
    @opts.on('--check-status-sheet <tji-file>', String,
            format("Check the given status sheet")) do |arg|
      @statusSheets << arg
    end
    @opts.on('--warn-ts-deltas',
            format('Turn on warnings for requested changes in time ' +
                   'sheets')) do
     @warnTsDeltas = true
    end
    @opts.on('--check-syntax',
            format('Only parse the input files and check the syntax.')) do
     @checkSyntax = true
    end
    @opts.on('--no-reports',
            format('Just schedule the project, but don\'t generate any ' +
                   'reports.')) do
     @noReports = true
    end
    @opts.on('--list-reports <report ID regular expression>', String,
             format('List id, formats and file name of all the defined ' +
                    'reports that have IDs that match the specified ' +
                    'regular expression.')) do |arg|
      @listReports = true
      @listReportPattern = arg
    end
    @opts.on('--report <report ID>', String,
             format('Only generate the report with the specified ID. ' +
                    'This option can be used multiple times.')) do |arg|
      @reportIDs << arg
    end
    @opts.on('--reports <report ID regular expression>', String,
             format('Only generate the reports that have IDs that match ' +
                    'the specified regular expression. This option can ' +
                    'be used multiple times.')) do |arg|
      @reportRegExpIDs << arg
    end
    @opts.on('-f', '--force-reports',
            format('Generate reports despite scheduling errors')) do
      @forceReports = true
    end
    @opts.on('--add-trace',
             format('Append a current data set to all trace reports.')) do
      @generateTraces = true
    end
    @opts.on('--abort-on-warnings',
             format('Abort program on warnings like we do on errors.')) do
      @abortOnWarning = true
    end
    @opts.on('-o', '--output-dir <directory>', String,
            format('Directory the reports should go into')) do |arg|
      @outputDir = arg + (arg[-1] == ?/ ? '' : '/')
    end
    @opts.on('-c N', Integer,
             format('Maximum number of CPU cores to use')) do |arg|
      @maxCpuCores = arg
    end
  end
end