taskjuggler 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. data/CHANGELOG +160 -0
  2. data/benchmarks/UTF-8-Strings.rb +58 -0
  3. data/data/css/tjreport.css +7 -2
  4. data/doc/AppConfig.html +10 -4
  5. data/doc/Arguments.html +10 -4
  6. data/doc/CHANGELOG.html +171 -5
  7. data/doc/COPYING.html +10 -4
  8. data/doc/Object.html +11 -107
  9. data/doc/README.html +10 -4
  10. data/doc/RuntimeConfig.html +10 -4
  11. data/doc/String.html +16 -11
  12. data/doc/StringIO.html +10 -4
  13. data/doc/TaskJuggler.html +506 -435
  14. data/doc/TaskJuggler/Account.html +10 -4
  15. data/doc/TaskJuggler/AccountAttribute.html +10 -4
  16. data/doc/TaskJuggler/AccountScenario.html +10 -4
  17. data/doc/TaskJuggler/Allocation.html +69 -60
  18. data/doc/TaskJuggler/AllocationAttribute.html +10 -4
  19. data/doc/TaskJuggler/AttributeBase.html +10 -4
  20. data/doc/TaskJuggler/AttributeDefinition.html +10 -4
  21. data/doc/TaskJuggler/BatchProcessor.html +202 -192
  22. data/doc/TaskJuggler/Booking.html +10 -4
  23. data/doc/TaskJuggler/BookingListAttribute.html +10 -4
  24. data/doc/TaskJuggler/BooleanAttribute.html +10 -4
  25. data/doc/TaskJuggler/CSVFile.html +10 -4
  26. data/doc/TaskJuggler/CellSettingPattern.html +10 -4
  27. data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
  28. data/doc/TaskJuggler/Charge.html +10 -4
  29. data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
  30. data/doc/TaskJuggler/ChargeSet.html +10 -4
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
  32. data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
  33. data/doc/TaskJuggler/ColumnTable.html +10 -4
  34. data/doc/TaskJuggler/Daemon.html +71 -52
  35. data/doc/TaskJuggler/DateAttribute.html +10 -4
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
  37. data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
  38. data/doc/TaskJuggler/DurationAttribute.html +10 -4
  39. data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
  40. data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
  41. data/doc/TaskJuggler/FixnumAttribute.html +10 -4
  42. data/doc/TaskJuggler/FlagListAttribute.html +10 -4
  43. data/doc/TaskJuggler/FloatAttribute.html +10 -4
  44. data/doc/TaskJuggler/FormatListAttribute.html +10 -4
  45. data/doc/TaskJuggler/GanttChart.html +10 -4
  46. data/doc/TaskJuggler/GanttContainer.html +14 -8
  47. data/doc/TaskJuggler/GanttHeader.html +10 -4
  48. data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
  49. data/doc/TaskJuggler/GanttLine.html +29 -24
  50. data/doc/TaskJuggler/GanttLoadStack.html +10 -4
  51. data/doc/TaskJuggler/GanttMilestone.html +10 -4
  52. data/doc/TaskJuggler/GanttRouter.html +10 -4
  53. data/doc/TaskJuggler/GanttTaskBar.html +20 -10
  54. data/doc/TaskJuggler/HTMLDocument.html +10 -4
  55. data/doc/TaskJuggler/HTMLGraphics.html +10 -4
  56. data/doc/TaskJuggler/Interval.html +10 -4
  57. data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
  58. data/doc/TaskJuggler/JobInfo.html +10 -4
  59. data/doc/TaskJuggler/Journal.html +227 -160
  60. data/doc/TaskJuggler/JournalEntry.html +10 -4
  61. data/doc/TaskJuggler/JournalEntryList.html +158 -72
  62. data/doc/TaskJuggler/KeywordArray.html +21 -9
  63. data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
  64. data/doc/TaskJuggler/Limits.html +13 -8
  65. data/doc/TaskJuggler/Limits/Limit.html +10 -4
  66. data/doc/TaskJuggler/LimitsAttribute.html +10 -4
  67. data/doc/TaskJuggler/ListAttributeBase.html +10 -4
  68. data/doc/TaskJuggler/Log.html +10 -4
  69. data/doc/TaskJuggler/LogFile.html +10 -4
  70. data/doc/TaskJuggler/LogicalAttribute.html +10 -4
  71. data/doc/TaskJuggler/LogicalExpression.html +11 -5
  72. data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
  73. data/doc/TaskJuggler/LogicalFlag.html +10 -4
  74. data/doc/TaskJuggler/LogicalFunction.html +132 -124
  75. data/doc/TaskJuggler/LogicalOperation.html +10 -4
  76. data/doc/TaskJuggler/Macro.html +16 -10
  77. data/doc/TaskJuggler/MacroTable.html +44 -38
  78. data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
  79. data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
  80. data/doc/TaskJuggler/Message.html +92 -68
  81. data/doc/TaskJuggler/MessageHandler.html +349 -28
  82. data/doc/TaskJuggler/Navigator.html +10 -4
  83. data/doc/TaskJuggler/NavigatorElement.html +10 -4
  84. data/doc/TaskJuggler/NikuProject.html +10 -4
  85. data/doc/TaskJuggler/NikuReport.html +10 -4
  86. data/doc/TaskJuggler/NikuResource.html +10 -4
  87. data/doc/TaskJuggler/NodeListAttribute.html +10 -4
  88. data/doc/TaskJuggler/OnShiftCache.html +10 -4
  89. data/doc/TaskJuggler/ProcessIntercom.html +118 -111
  90. data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
  91. data/doc/TaskJuggler/Project.html +886 -913
  92. data/doc/TaskJuggler/ProjectBroker.html +442 -331
  93. data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
  94. data/doc/TaskJuggler/ProjectFileParser.html +320 -317
  95. data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
  96. data/doc/TaskJuggler/ProjectRecord.html +119 -56
  97. data/doc/TaskJuggler/ProjectServer.html +282 -237
  98. data/doc/TaskJuggler/ProjectServerIface.html +45 -39
  99. data/doc/TaskJuggler/PropertyAttribute.html +10 -4
  100. data/doc/TaskJuggler/PropertyList.html +177 -173
  101. data/doc/TaskJuggler/PropertySet.html +11 -5
  102. data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
  103. data/doc/TaskJuggler/Query.html +280 -256
  104. data/doc/TaskJuggler/RTFHandlers.html +10 -4
  105. data/doc/TaskJuggler/RTFNavigator.html +33 -26
  106. data/doc/TaskJuggler/RTFQuery.html +135 -169
  107. data/doc/TaskJuggler/RTFReport.html +63 -56
  108. data/doc/TaskJuggler/RTFReportLink.html +58 -47
  109. data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
  110. data/doc/TaskJuggler/RealFormat.html +10 -4
  111. data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
  112. data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
  113. data/doc/TaskJuggler/Report.html +333 -290
  114. data/doc/TaskJuggler/ReportBase.html +182 -174
  115. data/doc/TaskJuggler/ReportContext.html +10 -4
  116. data/doc/TaskJuggler/ReportServer.html +144 -126
  117. data/doc/TaskJuggler/ReportServerIface.html +50 -44
  118. data/doc/TaskJuggler/ReportServerRecord.html +38 -32
  119. data/doc/TaskJuggler/ReportServlet.html +144 -137
  120. data/doc/TaskJuggler/ReportTable.html +10 -4
  121. data/doc/TaskJuggler/ReportTableCell.html +169 -164
  122. data/doc/TaskJuggler/ReportTableColumn.html +10 -4
  123. data/doc/TaskJuggler/ReportTableLegend.html +10 -4
  124. data/doc/TaskJuggler/ReportTableLine.html +10 -4
  125. data/doc/TaskJuggler/Resource.html +121 -115
  126. data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
  127. data/doc/TaskJuggler/ResourceListRE.html +10 -4
  128. data/doc/TaskJuggler/ResourceScenario.html +13 -7
  129. data/doc/TaskJuggler/RichText.html +61 -37
  130. data/doc/TaskJuggler/RichTextAttribute.html +10 -4
  131. data/doc/TaskJuggler/RichTextDocument.html +91 -81
  132. data/doc/TaskJuggler/RichTextElement.html +378 -317
  133. data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
  134. data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
  135. data/doc/TaskJuggler/RichTextImage.html +10 -4
  136. data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
  137. data/doc/TaskJuggler/RichTextParser.html +48 -40
  138. data/doc/TaskJuggler/RichTextScanner.html +328 -906
  139. data/doc/TaskJuggler/RichTextSnip.html +59 -57
  140. data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
  141. data/doc/TaskJuggler/Scenario.html +10 -4
  142. data/doc/TaskJuggler/ScenarioData.html +33 -30
  143. data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
  144. data/doc/TaskJuggler/Scoreboard.html +10 -4
  145. data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
  146. data/doc/TaskJuggler/SheetReceiver.html +334 -313
  147. data/doc/TaskJuggler/SheetSender.html +10 -4
  148. data/doc/TaskJuggler/Shift.html +10 -4
  149. data/doc/TaskJuggler/ShiftAssignment.html +10 -4
  150. data/doc/TaskJuggler/ShiftAssignments.html +10 -4
  151. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
  152. data/doc/TaskJuggler/ShiftScenario.html +10 -4
  153. data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
  154. data/doc/TaskJuggler/SortListAttribute.html +10 -4
  155. data/doc/TaskJuggler/SourceFileInfo.html +10 -4
  156. data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
  157. data/doc/TaskJuggler/StatusSheetReport.html +10 -4
  158. data/doc/TaskJuggler/StatusSheetSender.html +10 -4
  159. data/doc/TaskJuggler/StringAttribute.html +10 -4
  160. data/doc/TaskJuggler/SymbolAttribute.html +10 -4
  161. data/doc/TaskJuggler/SyntaxReference.html +260 -230
  162. data/doc/TaskJuggler/TOCEntry.html +99 -42
  163. data/doc/TaskJuggler/TSResourceRecord.html +10 -4
  164. data/doc/TaskJuggler/TSTaskRecord.html +10 -4
  165. data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
  166. data/doc/TaskJuggler/TableOfContents.html +54 -12
  167. data/doc/TaskJuggler/TableReport.html +877 -872
  168. data/doc/TaskJuggler/Task.html +117 -68
  169. data/doc/TaskJuggler/TaskDependency.html +10 -4
  170. data/doc/TaskJuggler/TaskListAttribute.html +10 -4
  171. data/doc/TaskJuggler/TaskListRE.html +10 -4
  172. data/doc/TaskJuggler/TaskScenario.html +1681 -1563
  173. data/doc/TaskJuggler/TextFormatter.html +10 -4
  174. data/doc/TaskJuggler/TextParser.html +567 -534
  175. data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
  176. data/doc/TaskJuggler/TextParser/Rule.html +26 -15
  177. data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
  178. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
  179. data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
  180. data/doc/TaskJuggler/TextReport.html +15 -6
  181. data/doc/TaskJuggler/TextScanner.html +319 -287
  182. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
  183. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
  184. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
  185. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  186. data/doc/TaskJuggler/TimeSheet.html +138 -175
  187. data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
  188. data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
  189. data/doc/TaskJuggler/TimeSheetReport.html +47 -42
  190. data/doc/TaskJuggler/TimeSheetSender.html +10 -4
  191. data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
  192. data/doc/TaskJuggler/TimeSheets.html +22 -16
  193. data/doc/TaskJuggler/Tj3AppBase.html +10 -4
  194. data/doc/TaskJuggler/Tj3Client.html +399 -365
  195. data/doc/TaskJuggler/Tj3Daemon.html +107 -94
  196. data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
  197. data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
  198. data/doc/TaskJuggler/Tj3SsSender.html +10 -4
  199. data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
  200. data/doc/TaskJuggler/Tj3TsSender.html +10 -4
  201. data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
  202. data/doc/TaskJuggler/TjException.html +10 -4
  203. data/doc/TaskJuggler/TjTime.html +145 -140
  204. data/doc/TaskJuggler/TjpExample.html +10 -4
  205. data/doc/TaskJuggler/TjpExportRE.html +122 -118
  206. data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
  207. data/doc/TaskJuggler/URLParameter.html +10 -4
  208. data/doc/TaskJuggler/UserManual.html +162 -155
  209. data/doc/TaskJuggler/VimSyntax.html +1028 -0
  210. data/doc/TaskJuggler/WebServer.html +45 -27
  211. data/doc/TaskJuggler/WorkingHours.html +10 -4
  212. data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
  213. data/doc/TaskJuggler/XMLBlob.html +10 -4
  214. data/doc/TaskJuggler/XMLComment.html +10 -4
  215. data/doc/TaskJuggler/XMLDocument.html +10 -4
  216. data/doc/TaskJuggler/XMLElement.html +10 -4
  217. data/doc/TaskJuggler/XMLNamedText.html +10 -4
  218. data/doc/TaskJuggler/XMLText.html +10 -4
  219. data/doc/index.html +735 -677
  220. data/doc/lib/AccountScenario_rb.html +1 -1
  221. data/doc/lib/Account_rb.html +1 -1
  222. data/doc/lib/Allocation_rb.html +1 -1
  223. data/doc/lib/AppConfig_rb.html +1 -1
  224. data/doc/lib/AttributeBase_rb.html +1 -1
  225. data/doc/lib/AttributeDefinition_rb.html +1 -1
  226. data/doc/lib/Attributes_rb.html +1 -1
  227. data/doc/lib/BatchProcessor_rb.html +1 -1
  228. data/doc/lib/Booking_rb.html +1 -1
  229. data/doc/lib/ChargeSet_rb.html +1 -1
  230. data/doc/lib/Charge_rb.html +1 -1
  231. data/doc/lib/{Message_rb.html → FileList_rb.html} +3 -5
  232. data/doc/lib/HTMLDocument_rb.html +1 -1
  233. data/doc/lib/Interval_rb.html +1 -1
  234. data/doc/lib/Journal_rb.html +1 -1
  235. data/doc/lib/KeywordArray_rb.html +1 -1
  236. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  237. data/doc/lib/Limits_rb.html +1 -1
  238. data/doc/lib/LogFile_rb.html +1 -1
  239. data/doc/lib/Log_rb.html +1 -1
  240. data/doc/lib/LogicalExpression_rb.html +1 -1
  241. data/doc/lib/LogicalFunction_rb.html +1 -1
  242. data/doc/lib/LogicalOperation_rb.html +1 -1
  243. data/doc/lib/MacroTable_rb.html +1 -3
  244. data/doc/lib/MessageHandler_rb.html +1 -1
  245. data/doc/lib/ProjectFileParser_rb.html +1 -1
  246. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  247. data/doc/lib/Project_rb.html +4 -2
  248. data/doc/lib/PropertyList_rb.html +1 -1
  249. data/doc/lib/PropertySet_rb.html +1 -1
  250. data/doc/lib/PropertyTreeNode_rb.html +1 -1
  251. data/doc/lib/Query_rb.html +1 -1
  252. data/doc/lib/RTFHandlers_rb.html +1 -1
  253. data/doc/lib/RTFNavigator_rb.html +1 -1
  254. data/doc/lib/RTFQuery_rb.html +2 -2
  255. data/doc/lib/RTFReportLink_rb.html +4 -2
  256. data/doc/lib/RTFReport_rb.html +1 -1
  257. data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
  258. data/doc/lib/RealFormat_rb.html +1 -1
  259. data/doc/lib/ResourceScenario_rb.html +1 -1
  260. data/doc/lib/Resource_rb.html +1 -1
  261. data/doc/lib/RichTextDocument_rb.html +1 -1
  262. data/doc/lib/RichTextElement_rb.html +1 -1
  263. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  264. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  265. data/doc/lib/RichTextParser_rb.html +1 -1
  266. data/doc/lib/RichTextScanner_rb.html +3 -1
  267. data/doc/lib/RichTextSnip_rb.html +1 -1
  268. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  269. data/doc/lib/RichText_rb.html +3 -1
  270. data/doc/lib/RuntimeConfig_rb.html +1 -1
  271. data/doc/lib/ScenarioData_rb.html +2 -2
  272. data/doc/lib/Scenario_rb.html +1 -1
  273. data/doc/lib/Scoreboard_rb.html +1 -1
  274. data/doc/lib/SheetHandlerBase_rb.html +5 -1
  275. data/doc/lib/SheetReceiver_rb.html +3 -1
  276. data/doc/lib/SheetSender_rb.html +1 -1
  277. data/doc/lib/ShiftAssignments_rb.html +1 -1
  278. data/doc/lib/ShiftScenario_rb.html +1 -1
  279. data/doc/lib/Shift_rb.html +1 -1
  280. data/doc/lib/SimpleQueryExpander_rb.html +67 -0
  281. data/doc/lib/SourceFileInfo_rb.html +1 -1
  282. data/doc/lib/StatusSheetReceiver_rb.html +1 -1
  283. data/doc/lib/StatusSheetSender_rb.html +1 -1
  284. data/doc/lib/SyntaxReference_rb.html +1 -1
  285. data/doc/lib/TOCEntry_rb.html +1 -1
  286. data/doc/lib/TableColumnDefinition_rb.html +1 -1
  287. data/doc/lib/TableOfContents_rb.html +1 -1
  288. data/doc/lib/TaskDependency_rb.html +1 -1
  289. data/doc/lib/TaskJuggler_rb.html +1 -1
  290. data/doc/lib/TaskScenario_rb.html +1 -1
  291. data/doc/lib/Task_rb.html +1 -1
  292. data/doc/lib/TextFormatter_rb.html +1 -1
  293. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  294. data/doc/lib/TextParser/Rule_rb.html +1 -1
  295. data/doc/lib/TextParser/StackElement_rb.html +1 -1
  296. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  297. data/doc/lib/TextParser_rb.html +3 -1
  298. data/doc/lib/TextScanner_rb.html +1 -3
  299. data/doc/lib/TimeSheetReceiver_rb.html +1 -1
  300. data/doc/lib/TimeSheetSender_rb.html +1 -1
  301. data/doc/lib/TimeSheetSummary_rb.html +1 -1
  302. data/doc/lib/TimeSheets_rb.html +1 -1
  303. data/doc/lib/Tj3AppBase_rb.html +1 -1
  304. data/doc/lib/Tj3Config_rb.html +1 -1
  305. data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
  306. data/doc/lib/TjException_rb.html +1 -1
  307. data/doc/lib/TjTime_rb.html +1 -1
  308. data/doc/lib/TjpExample_rb.html +1 -1
  309. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  310. data/doc/lib/URLParameter_rb.html +1 -1
  311. data/doc/lib/UTF8String_rb.html +1 -1
  312. data/doc/lib/UserManual_rb.html +1 -1
  313. data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
  314. data/doc/lib/WorkingHours_rb.html +1 -1
  315. data/doc/lib/XMLDocument_rb.html +1 -1
  316. data/doc/lib/XMLElement_rb.html +1 -1
  317. data/doc/lib/daemon/Daemon_rb.html +1 -1
  318. data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
  319. data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
  320. data/doc/lib/daemon/ProjectServer_rb.html +1 -1
  321. data/doc/lib/daemon/ReportServer_rb.html +1 -3
  322. data/doc/lib/daemon/WebServer_rb.html +1 -1
  323. data/doc/lib/deep_copy_rb.html +1 -1
  324. data/doc/lib/reports/CSVFile_rb.html +1 -1
  325. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  326. data/doc/lib/reports/GanttChart_rb.html +1 -1
  327. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  328. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  329. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  330. data/doc/lib/reports/GanttLine_rb.html +1 -1
  331. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  332. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  333. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  334. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  335. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  336. data/doc/lib/reports/Navigator_rb.html +1 -1
  337. data/doc/lib/reports/NikuReport_rb.html +1 -1
  338. data/doc/lib/reports/ReportBase_rb.html +1 -1
  339. data/doc/lib/reports/ReportContext_rb.html +1 -1
  340. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  341. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  342. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  343. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  344. data/doc/lib/reports/ReportTable_rb.html +1 -1
  345. data/doc/lib/reports/Report_rb.html +1 -1
  346. data/doc/lib/reports/ResourceListRE_rb.html +1 -1
  347. data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
  348. data/doc/lib/reports/TableReport_rb.html +1 -1
  349. data/doc/lib/reports/TaskListRE_rb.html +1 -1
  350. data/doc/lib/reports/TextReport_rb.html +1 -1
  351. data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
  352. data/doc/lib/reports/TjpExportRE_rb.html +1 -1
  353. data/doc/lib/taskjuggler3_rb.html +1 -1
  354. data/doc/lib/tj3client_rb.html +1 -1
  355. data/doc/lib/tj3d_rb.html +1 -1
  356. data/doc/lib/tj3man_rb.html +1 -1
  357. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  358. data/doc/lib/tj3ss_sender_rb.html +1 -1
  359. data/doc/lib/tj3ts_receiver_rb.html +1 -1
  360. data/doc/lib/tj3ts_sender_rb.html +1 -1
  361. data/doc/lib/tj3ts_summary_rb.html +1 -1
  362. data/lib/Allocation.rb +8 -5
  363. data/lib/BatchProcessor.rb +7 -3
  364. data/lib/FileList.rb +58 -0
  365. data/lib/Journal.rb +73 -33
  366. data/lib/KeywordArray.rb +4 -0
  367. data/lib/KeywordDocumentation.rb +45 -11
  368. data/lib/Limits.rb +0 -1
  369. data/lib/LogicalExpression.rb +1 -1
  370. data/lib/LogicalFunction.rb +14 -12
  371. data/lib/MacroTable.rb +3 -4
  372. data/lib/MessageHandler.rb +136 -7
  373. data/lib/Project.rb +72 -86
  374. data/lib/ProjectFileParser.rb +30 -33
  375. data/lib/ProjectFileScanner.rb +7 -16
  376. data/lib/PropertyList.rb +25 -27
  377. data/lib/PropertySet.rb +1 -1
  378. data/lib/PropertyTreeNode.rb +9 -12
  379. data/lib/Query.rb +5 -4
  380. data/lib/RTFNavigator.rb +2 -1
  381. data/lib/RTFQuery.rb +4 -11
  382. data/lib/RTFReport.rb +2 -1
  383. data/lib/RTFReportLink.rb +10 -4
  384. data/lib/RTFWithQuerySupport.rb +45 -0
  385. data/lib/Resource.rb +20 -20
  386. data/lib/ResourceScenario.rb +3 -3
  387. data/lib/RichText.rb +15 -7
  388. data/lib/RichTextDocument.rb +8 -4
  389. data/lib/RichTextElement.rb +35 -12
  390. data/lib/RichTextFunctionHandler.rb +11 -12
  391. data/lib/RichTextParser.rb +5 -3
  392. data/lib/RichTextScanner.rb +144 -565
  393. data/lib/RichTextSnip.rb +3 -7
  394. data/lib/RichTextSyntaxRules.rb +51 -32
  395. data/lib/ScenarioData.rb +16 -25
  396. data/lib/SheetHandlerBase.rb +59 -2
  397. data/lib/SheetReceiver.rb +36 -18
  398. data/lib/SimpleQueryExpander.rb +58 -0
  399. data/lib/SyntaxReference.rb +9 -5
  400. data/lib/TOCEntry.rb +2 -0
  401. data/lib/TableOfContents.rb +4 -0
  402. data/lib/Task.rb +23 -12
  403. data/lib/TaskJuggler.rb +72 -33
  404. data/lib/TaskScenario.rb +131 -53
  405. data/lib/TextParser.rb +43 -30
  406. data/lib/TextParser/Pattern.rb +17 -13
  407. data/lib/TextParser/Rule.rb +5 -0
  408. data/lib/TextScanner.rb +46 -25
  409. data/lib/TimeSheetSummary.rb +9 -7
  410. data/lib/TimeSheets.rb +14 -23
  411. data/lib/Tj3Config.rb +1 -1
  412. data/lib/TjTime.rb +1 -2
  413. data/lib/TjpSyntaxRules.rb +128 -104
  414. data/lib/UTF8String.rb +0 -1
  415. data/lib/UserManual.rb +5 -4
  416. data/lib/VimSyntax.rb +223 -0
  417. data/lib/daemon/Daemon.rb +9 -0
  418. data/lib/daemon/ProcessIntercom.rb +19 -4
  419. data/lib/daemon/ProjectBroker.rb +149 -68
  420. data/lib/daemon/ProjectServer.rb +119 -79
  421. data/lib/daemon/ReportServer.rb +42 -31
  422. data/lib/daemon/WebServer.rb +21 -2
  423. data/lib/deep_copy.rb +1 -1
  424. data/lib/reports/GanttContainer.rb +2 -2
  425. data/lib/reports/GanttLine.rb +2 -3
  426. data/lib/reports/GanttTaskBar.rb +7 -3
  427. data/lib/reports/Report.rb +62 -57
  428. data/lib/reports/ReportBase.rb +6 -4
  429. data/lib/reports/ReportTableCell.rb +13 -14
  430. data/lib/reports/TableReport.rb +2 -1
  431. data/lib/reports/TextReport.rb +3 -0
  432. data/lib/reports/TimeSheetReport.rb +2 -3
  433. data/lib/reports/TjpExportRE.rb +0 -2
  434. data/lib/tj3client.rb +31 -3
  435. data/lib/tj3d.rb +8 -1
  436. data/manual/Day_To_Day_Juggling +2 -95
  437. data/manual/How_To_Contribute +2 -1
  438. data/manual/Rich_Text_Attributes +37 -3
  439. data/manual/Software +203 -0
  440. data/test/MessageChecker.rb +4 -4
  441. data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
  442. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  443. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  444. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  445. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
  446. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  447. data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
  448. data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
  449. data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
  450. data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
  451. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
  452. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
  453. data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
  454. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
  455. data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
  456. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
  457. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
  458. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
  459. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
  460. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
  461. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
  462. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
  463. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
  464. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
  465. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
  466. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
  467. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
  468. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
  469. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
  470. data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
  471. data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
  472. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
  473. data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
  474. data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
  475. data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
  476. data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
  477. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
  478. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
  479. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
  480. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  481. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  482. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  483. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  484. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  485. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  486. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  487. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  488. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  489. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  490. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  491. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
  492. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
  493. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
  494. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
  495. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
  496. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
  497. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
  498. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
  499. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
  500. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
  501. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
  502. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
  503. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
  504. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
  505. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
  506. data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
  507. data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
  508. data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
  509. data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
  510. data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
  511. data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
  512. data/test/TestSuite/StatusSheets/dev2.tji +22 -0
  513. data/test/TestSuite/StatusSheets/resrep.tji +7 -0
  514. data/test/TestSuite/StatusSheets/run +6 -4
  515. data/test/TestSuite/StatusSheets/tj3d.log +312 -0
  516. data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
  517. data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
  518. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  519. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
  520. data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
  521. data/test/TestSuite/TimeSheets/resrep.tji +7 -0
  522. data/test/TestSuite/TimeSheets/run +6 -5
  523. data/test/TestSuite/TimeSheets/statussheets.log +1 -0
  524. data/test/TestSuite/TimeSheets/ts.tji +351 -0
  525. data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
  526. data/test/test_PropertySet.rb +2 -2
  527. data/test/test_RichText.rb +178 -387
  528. data/test/test_SimpleQueryExpander.rb +55 -0
  529. data/test/test_deep_copy.rb +2 -2
  530. metadata +854 -834
  531. data/lib/MacroParser.rb +0 -77
  532. data/lib/Message.rb +0 -56
  533. data/lib/ruby-signal-bug.rb +0 -43
  534. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  535. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  536. data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
  537. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
  538. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
  539. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  540. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  541. data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
  542. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
  543. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  544. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  545. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
@@ -12,6 +12,10 @@
12
12
 
13
13
  class TaskJuggler
14
14
 
15
+ # This class is a specialized version of Array. It stores a list of
16
+ # keywords as String objects. The entry '*' is special. It means all
17
+ # keywords of a particular set are included. '*' must be the first entry if
18
+ # it is present.
15
19
  class KeywordArray < Array
16
20
 
17
21
  alias a_include? include?
@@ -30,7 +30,7 @@ class TaskJuggler
30
30
  # specific or not.
31
31
  class KeywordDocumentation
32
32
 
33
- attr_reader :keyword, :pattern, :references
33
+ attr_reader :keyword, :names, :pattern, :references, :optionalAttributes
34
34
  attr_accessor :contexts, :scenarioSpecific, :inheritedFromProject,
35
35
  :inheritedFromParent, :predecessor, :successor
36
36
 
@@ -41,15 +41,21 @@ class TaskJuggler
41
41
  # _pattern_. _optAttrPatterns_ is an Array with references to
42
42
  # TextParser::Patterns that are optional attributes to this keyword.
43
43
  def initialize(rule, pattern, syntax, args, optAttrPatterns, manual)
44
+ @messageHandler = MessageHandler.new(true)
44
45
  @rule = rule
45
46
  @pattern = pattern
47
+ # The unique identifier. Usually the attribute or property name. To
48
+ # disambiguate a .<scope> can be added.
46
49
  @keyword = pattern.keyword
50
+ # Similar to @keyword, but without the scope. Since there could be
51
+ # several, this is an Array of String objects.
52
+ @names = []
47
53
  @syntax = syntax
48
54
  @args = args
55
+ @manual = manual
49
56
  # Hash that maps patterns of optional attributes to a boolean value. It
50
57
  # is true if the pattern is a scenario specific attribute.
51
58
  @optAttrPatterns = optAttrPatterns
52
- @manual = manual
53
59
  # The above hash is later converted into a list that points to the
54
60
  # keyword documentation of the optional attribute.
55
61
  @optionalAttributes = []
@@ -66,9 +72,39 @@ class TaskJuggler
66
72
  @references = []
67
73
  end
68
74
 
75
+ # Returns true of the KeywordDocumentation is documenting a TJP property
76
+ # (task, resources, etc.). A TJP property can be nested.
77
+ def isProperty?
78
+ # I haven't found a good way to automatically detect all the various
79
+ # report types as properties. The non-nestable ones need to be added
80
+ # manually here.
81
+ return true if %w( export nikureport timesheetreport statussheetreport).
82
+ include?(keyword)
83
+ @optionalAttributes.include?(self)
84
+ end
85
+
86
+ # Returns true of the keyword can be used outside of any other keyword
87
+ # context.
88
+ def globalScope?
89
+ return true if @contexts.empty?
90
+ @contexts.each do |context|
91
+ return true if context.keyword == 'properties'
92
+ end
93
+ false
94
+ end
95
+
69
96
  # Post process the class member to set cross references to other
70
97
  # KeywordDocumentation items.
71
98
  def crossReference(keywords, rules)
99
+ # Get the attribute or property name of the Keyword. This is not unique
100
+ # like @keyword since it's got no scope.
101
+ @pattern.terminalTokens(rules).each do |tok|
102
+ # Ignore patterns that don't have a real name.
103
+ break if tok[0] == '{'
104
+
105
+ @names << tok[0]
106
+ end
107
+
72
108
  # Some arguments are references to other patterns. The current keyword
73
109
  # is added as context to such patterns.
74
110
  @args.each do |arg|
@@ -498,15 +534,12 @@ class TaskJuggler
498
534
  # catches all RichTextScanner processing problems and converts the exception
499
535
  # data into an error message.
500
536
  def newRichText(text)
501
- begin
502
- rText = RichText.new(text)
503
- rti = rText.generateIntermediateFormat
504
- @references += rti.internalReferences
505
- rescue RichTextException => msg
506
- $stderr.puts "Error in RichText of rule #{@keyword}\n" +
507
- "Line #{msg.lineNo}: #{msg.text}\n" +
508
- "#{msg.line}"
537
+ rText = RichText.new(text, [], @messageHandler)
538
+ unless (rti = rText.generateIntermediateFormat)
539
+ @messageHandler.error('rich_text',
540
+ "Error in RichText of rule #{@keyword}")
509
541
  end
542
+ @references += rti.internalReferences
510
543
  rti
511
544
  end
512
545
 
@@ -515,7 +548,8 @@ class TaskJuggler
515
548
  # table cell element. _list_ is the KeywordDocumentation list. _width_ is
516
549
  # the percentage width of the cell.
517
550
  def listHTMLAttributes(list, width)
518
- td = XMLElement.new('td', 'class' => 'descr', 'style' => "width:#{width}%")
551
+ td = XMLElement.new('td', 'class' => 'descr',
552
+ 'style' => "width:#{width}%")
519
553
  first = true
520
554
  list.each do |attr|
521
555
  if first
@@ -236,7 +236,6 @@ class TaskJuggler
236
236
  else
237
237
  raise "Limit period undefined"
238
238
  end
239
- endDate = @project['end']
240
239
 
241
240
  @limits << Limit.new(name, interval, period, value, upper, resource)
242
241
  end
@@ -51,7 +51,7 @@ class TaskJuggler
51
51
  if @sourceFileInfo.nil?
52
52
  "#{@operation.to_s(query)}"
53
53
  else
54
- str = "#{@sourceFileInfo} #{@operation.to_s(query)}"
54
+ "#{@sourceFileInfo} #{@operation.to_s(query)}"
55
55
  end
56
56
  end
57
57
 
@@ -69,7 +69,6 @@ class TaskJuggler
69
69
 
70
70
  # Evaluate the function by calling it with the arguments.
71
71
  def eval(expr)
72
- args = []
73
72
  # Call the function and return the result.
74
73
  send(name, expr, @arguments)
75
74
  end
@@ -92,10 +91,9 @@ class TaskJuggler
92
91
  end
93
92
 
94
93
  def hasalert(expr, args)
95
- property, scopeProperty = properties(expr)
94
+ property = properties(expr)[0]
96
95
  query = expr.query
97
96
  project = property.project
98
- date = project.reportContexts.last.report.get('end')
99
97
  !project['journal'].currentEntries(query.end, property,
100
98
  args[0], query.start).empty?
101
99
  end
@@ -117,7 +115,7 @@ class TaskJuggler
117
115
  end
118
116
 
119
117
  def isdependencyof(expr, args)
120
- property, scopeProperty = properties(expr)
118
+ property = properties(expr)[0]
121
119
  # The result can only be true when called for a Task property.
122
120
  return false unless property.is_a?(Task)
123
121
  project = property.project
@@ -132,7 +130,7 @@ class TaskJuggler
132
130
  end
133
131
 
134
132
  def isdutyof(expr, args)
135
- property, scopeProperty = properties(expr)
133
+ property = properties(expr)[0]
136
134
  # The result can only be true when called for a Task property.
137
135
  return false unless (task = property).is_a?(Task)
138
136
  project = task.project
@@ -145,7 +143,7 @@ class TaskJuggler
145
143
  end
146
144
 
147
145
  def isfeatureof(expr, args)
148
- property, scopeProperty = properties(expr)
146
+ property = properties(expr)[0]
149
147
  # The result can only be true when called for a Task property.
150
148
  return false unless property.is_a?(Task)
151
149
  project = property.project
@@ -158,19 +156,20 @@ class TaskJuggler
158
156
  end
159
157
 
160
158
  def isleaf(expr, args)
161
- property, scopeProperty = properties(expr)
159
+ property = properties(expr)[0]
162
160
  return false unless property
163
161
  property.leaf?
164
162
  end
165
163
 
166
164
  def isongoing(expr, args)
167
- property, scopeProperty = properties(expr)
165
+ property = properties(expr)[0]
168
166
  # The result can only be true when called for a Task property.
169
167
  return false unless (task = property).is_a?(Task)
170
168
  project = task.project
171
169
  # 1st arg must be a scenario index.
172
170
  if (scenarioIdx = project.scenarioIdx(args[0])).nil?
173
- expr.error("Unknown scenario '#{args[0]}' used for function isongoing()")
171
+ expr.error("Unknown scenario '#{args[0]}' used for function " +
172
+ "isongoing()")
174
173
  end
175
174
 
176
175
  query = expr.query
@@ -185,17 +184,20 @@ class TaskJuggler
185
184
  end
186
185
 
187
186
  def isresource(expr, args)
188
- property, scopeProperty = properties(expr)
187
+ property = properties(expr)[0]
188
+ return false unless property
189
189
  property.is_a?(Resource)
190
190
  end
191
191
 
192
192
  def istask(expr, args)
193
- property, scopeProperty = properties(expr)
193
+ property = properties(expr)[0]
194
+ return false unless property
194
195
  property.is_a?(Task)
195
196
  end
196
197
 
197
198
  def treelevel(expr, args)
198
- property, scopeProperty = properties(expr)
199
+ property = properties(expr)[0]
200
+ return 0 unless property
199
201
  property.level + 1
200
202
  end
201
203
 
@@ -12,7 +12,6 @@
12
12
 
13
13
  require 'SourceFileInfo'
14
14
  require 'MessageHandler'
15
- require 'Message'
16
15
  require 'TjException'
17
16
 
18
17
  class TaskJuggler
@@ -62,6 +61,8 @@ class TaskJuggler
62
61
  # unchanged. No error is generated.
63
62
  def resolve(args, sourceFileInfo)
64
63
  name = args[0]
64
+ return nil unless @macros[name]
65
+
65
66
  resolved = @macros[name].value.dup
66
67
  i = 0
67
68
  args.each do |arg|
@@ -73,9 +74,7 @@ class TaskJuggler
73
74
 
74
75
  # This function sends an error message to the message handler.
75
76
  def error(id, text, sourceFileInfo)
76
- message = Message.new(id, 'error', text, nil, nil, sourceFileInfo)
77
- @messageHandler.send(message)
78
- raise TjException.new, 'Macro expasion error'
77
+ @messageHandler.error(id, text, sourceFileInfo)
79
78
  end
80
79
 
81
80
  end
@@ -12,26 +12,155 @@
12
12
 
13
13
  class TaskJuggler
14
14
 
15
+ # The Message object can store several classes of messages that the
16
+ # application can send out.
17
+ class Message
18
+
19
+ attr_reader :type, :id, :message, :sourceFileInfo, :line
20
+
21
+ # Create a new Message object. The _type_ specifies what tpye of message
22
+ # this is. The following types are supported: fatal, error, warning, info
23
+ # and debug. _id_ is a String that must uniquely identify the source of
24
+ # the Message. _message_ is a String with the actual message.
25
+ # _sourceLineInfo_ is a SourceLineInfo object that can reference a
26
+ # location in a specific file. _line_ is a String of that file. _data_ can
27
+ # be any context sensitive data. _sceneario_ specifies the Scenario in
28
+ # which the message originated.
29
+ def initialize(type, id, message, sourceFileInfo, line, data, scenario)
30
+ unless [ :fatal, :error, :warning, :info, :debug ].
31
+ include?(type)
32
+ raise "Unknown message type: #{type}"
33
+ end
34
+ @type = type
35
+
36
+ @id = id
37
+
38
+ if message && !message.is_a?(String)
39
+ raise "String object expected as message but got #{message.class}"
40
+ end
41
+ @message = message
42
+
43
+ if sourceFileInfo && !sourceFileInfo.is_a?(SourceFileInfo)
44
+ raise "SourceFileInfo object expected but got #{sourceFileInfo.class}"
45
+ end
46
+ @sourceFileInfo = sourceFileInfo
47
+
48
+ if line && !line.is_a?(String)
49
+ raise "String object expected as line but got #{line.class}"
50
+ end
51
+ @line = line
52
+
53
+ @data = data
54
+
55
+ if scenario && !scenario.is_a?(Scenario)
56
+ raise "Scenario object expected by got #{scenario.class}"
57
+ end
58
+ @scenario = scenario
59
+ end
60
+
61
+ # Convert the Message into a String.
62
+ def to_s
63
+ str = ""
64
+ # The SourceFileInfo is printed as <fileName>:line:
65
+ if @sourceFileInfo
66
+ str += "#{@sourceFileInfo.fileName}:#{sourceFileInfo.lineNo}: "
67
+ end
68
+ if @scenario
69
+ str += "#{@type.to_s.capitalize} in scenario #{@scenario.id}: "
70
+ else
71
+ str += "#{@type.to_s.capitalize}: "
72
+ end
73
+ str += @message
74
+ str += "\n" + @line if @line
75
+ str
76
+ end
77
+
78
+ end
79
+
80
+ # The MessageHandler can display and store application messages. Depending
81
+ # on the type of the message, a TjExeption can be raised (:error), or the
82
+ # program can be immedidately aborted (:fatal). Other types will just
83
+ # continue the program flow.
15
84
  class MessageHandler
16
85
 
17
86
  attr_reader :messages, :errors
87
+ attr_accessor :scenario
18
88
 
89
+ # Initialize the MessageHandler. _console_ specifies if the messages
90
+ # should be printed to $stderr.
19
91
  def initialize(console = false)
20
92
  @messages = []
21
93
  @console = console
22
-
94
+ # We count the errors.
23
95
  @errors = 0
24
96
  end
25
97
 
26
- def send(message)
27
- @errors += 1 if message.level == 'error' || message.level == 'fatal'
28
- @messages << message
29
- if @console
30
- # The to_s call is necessary to support remote prints via DRb.
31
- $stderr.puts message.to_s
98
+ # Generate a fatal message that will abort the application.
99
+ def fatal(id, message, sourceFileInfo = nil, line = nil, data = nil,
100
+ scenario = nil)
101
+ addMessage(:fatal, id, message, sourceFileInfo, line, data, scenario)
102
+ end
103
+
104
+ # Generate an error message.
105
+ def error(id, message, sourceFileInfo = nil, line = nil, data = nil,
106
+ scenario = nil)
107
+ addMessage(:error, id, message, sourceFileInfo, line, data, scenario)
108
+ end
109
+
110
+ # Generate an critical message.
111
+ def critical(id, message, sourceFileInfo = nil, line = nil, data = nil,
112
+ scenario = nil)
113
+ addMessage(:critical, id, message, sourceFileInfo, line, data, scenario)
114
+ end
115
+
116
+ # Generate a warning.
117
+ def warning(id, message, sourceFileInfo = nil, line = nil, data = nil,
118
+ scenario = nil)
119
+ addMessage(:warning, id, message, sourceFileInfo, line, data, scenario)
120
+ end
121
+
122
+ # Generate an info message.
123
+ def info(id, message, sourceFileInfo = nil, line = nil, data = nil,
124
+ scenario = nil)
125
+ addMessage(:info, id, message, sourceFileInfo, line, data, scenario)
126
+ end
127
+
128
+ # Generate a debug message.
129
+ def debug(id, message, sourceFileInfo = nil, line = nil, data = nil,
130
+ scenario = nil)
131
+ addMessage(:info, id, message, sourceFileInfo, line, data, scenario)
132
+ end
133
+
134
+ # Generate a message by specifying the _type_.
135
+ def addMessage(type, id, message, sourceFileInfo = nil, line = nil,
136
+ data = nil, scenario = nil)
137
+ abortOnError = type == :error
138
+ # Treat criticals like errors but without generating another
139
+ # exception.
140
+ type = :error if type == :critical
141
+
142
+ msg = Message.new(type, id, message, sourceFileInfo, line, data, scenario)
143
+ @messages << msg
144
+ # Print the message to $stderr if requested by the user.
145
+ $stderr.puts msg.to_s if @console
146
+
147
+ case type
148
+ when :error
149
+ # Increase the error counter.
150
+ @errors += 1
151
+ raise TjException.new, '' if abortOnError
152
+ when :fatal
153
+ raise RuntimeError
32
154
  end
33
155
  end
34
156
 
157
+ # Convert all messages into a single String.
158
+ def to_s
159
+ text = ''
160
+ @messages.each { |msg| text += msg.to_s }
161
+ text
162
+ end
163
+
35
164
  end
36
165
 
37
166
  end
@@ -11,7 +11,8 @@
11
11
  #
12
12
 
13
13
  require 'TjException'
14
- require 'Message'
14
+ require 'MessageHandler'
15
+ require 'FileList'
15
16
  require 'TjTime'
16
17
  require 'Booking'
17
18
  require 'PropertySet'
@@ -49,7 +50,7 @@ class TaskJuggler
49
50
  class Project
50
51
 
51
52
  attr_reader :accounts, :shifts, :tasks, :resources, :scenarios,
52
- :timeSheets, :reports, :messageHandler
53
+ :timeSheets, :reports, :messageHandler, :inputFiles
53
54
  attr_accessor :reportContexts, :outputDir, :warnTsDeltas
54
55
 
55
56
  # Create a project with the specified +id+, +name+ and +version+.
@@ -394,6 +395,9 @@ class TaskJuggler
394
395
 
395
396
  Scenario.new(self, 'plan', 'Plan Scenario', nil)
396
397
 
398
+ # A list of files that contained the project data.
399
+ @inputFiles = FileList.new
400
+
397
401
  @timeSheets = TimeSheets.new
398
402
 
399
403
  # The ReportContext provides additional settings to the report that can
@@ -412,12 +416,6 @@ class TaskJuggler
412
416
  self
413
417
  end
414
418
 
415
- # Pass a message (error or warning) to the message handler. _message_ is a
416
- # String that contains the message.
417
- def sendMessage(message)
418
- @messageHandler.send(message)
419
- end
420
-
421
419
  # Query the value of a Project attribute. _name_ is the ID of the attribute.
422
420
  def [](name)
423
421
  if !@attributes.has_key?(name)
@@ -574,36 +572,30 @@ class TaskJuggler
574
572
  end
575
573
 
576
574
  if @tasks.empty?
577
- message = Message.new('no_tasks', 'error', "No tasks defined")
578
- sendMessage(message)
579
- return false
575
+ @messageHandler.error('no_tasks', "No tasks defined")
580
576
  end
581
577
 
582
- begin
583
- @scenarios.each do |sc|
584
- # Skip disabled scenarios
585
- next unless sc.get('enabled')
586
-
587
- scIdx = scenarioIdx(sc)
588
-
589
- # All user provided values are set now. The next step is to
590
- # propagate inherited values. These values must be marked as
591
- # inherited by setting the mode to 1. As we always call
592
- # PropertyTreeNode#inherit this is just a safeguard.
593
- AttributeBase.setMode(1)
594
- prepareScenario(scIdx)
595
-
596
- # Now change to mode 2 so all values that are modified are marked
597
- # as computed.
598
- AttributeBase.setMode(2)
599
- # Schedule the scenario.
600
- scheduleScenario(scIdx)
601
-
602
- # Complete the data sets, and check the result.
603
- finishScenario(scIdx)
604
- end
605
- rescue TjException
606
- return false
578
+ @scenarios.each do |sc|
579
+ # Skip disabled scenarios
580
+ next unless sc.get('enabled')
581
+
582
+ scIdx = scenarioIdx(sc)
583
+
584
+ # All user provided values are set now. The next step is to
585
+ # propagate inherited values. These values must be marked as
586
+ # inherited by setting the mode to 1. As we always call
587
+ # PropertyTreeNode#inherit this is just a safeguard.
588
+ AttributeBase.setMode(1)
589
+ prepareScenario(scIdx)
590
+
591
+ # Now change to mode 2 so all values that are modified are marked
592
+ # as computed.
593
+ AttributeBase.setMode(2)
594
+ # Schedule the scenario.
595
+ scheduleScenario(scIdx)
596
+
597
+ # Complete the data sets, and check the result.
598
+ finishScenario(scIdx)
607
599
  end
608
600
 
609
601
  @timeSheets.warnOnDelta if @warnTsDeltas
@@ -613,47 +605,43 @@ class TaskJuggler
613
605
  # Call this function to generate the reports based on the scheduling result.
614
606
  # This function may only be called after Project#schedule has been called.
615
607
  def generateReports(maxCpuCores)
616
- begin
617
- @reports.index
618
- if maxCpuCores == 1
619
- @reports.each do |report|
620
- next if report.get('formats').empty?
621
- Log.startProgressMeter("Report #{report.name}")
608
+ @reports.index
609
+ if maxCpuCores == 1
610
+ @reports.each do |report|
611
+ next if report.get('formats').empty?
612
+ Log.startProgressMeter("Report #{report.name}")
613
+ @reportContexts.push(ReportContext.new(self, report))
614
+ report.generate
615
+ @reportContexts.pop
616
+ Log.stopProgressMeter
617
+ end
618
+ else
619
+ # Kickoff the generation of all reports by pushing the jobs into the
620
+ # BatchProcessor queue.
621
+ bp = BatchProcessor.new(maxCpuCores)
622
+ @reports.each do |report|
623
+ next if report.get('formats').empty?
624
+ bp.queue(report) {
622
625
  @reportContexts.push(ReportContext.new(self, report))
623
- report.generate
626
+ res = report.generate
624
627
  @reportContexts.pop
625
- Log.stopProgressMeter
626
- end
627
- else
628
- bp = BatchProcessor.new(maxCpuCores)
629
- @reports.each do |report|
630
- next if report.get('formats').empty?
631
- bp.queue(report) {
632
- @reportContexts.push(ReportContext.new(self, report))
633
- res = report.generate
634
- @reportContexts.pop
635
- res
636
- }
628
+ res
629
+ }
630
+ end
631
+ # Now wait for all the jobs to finish.
632
+ bp.wait do |report|
633
+ Log.startProgressMeter("Report #{report.tag.name}")
634
+ $stdout.print(report.stdout)
635
+ $stderr.print(report.stderr)
636
+ if report.retVal.signaled?
637
+ @messageHandler.error('rg_signal', "Signal raised")
637
638
  end
638
- bp.wait do |report|
639
- Log.startProgressMeter("Report #{report.tag.name}")
640
- $stdout.print(report.stdout)
641
- $stderr.print(report.stderr)
642
- if report.retVal.signaled?
643
- raise TjException.new, "Signal raised"
644
- end
645
- unless report.retVal.success?
646
- raise TjException.new, "Process aborted"
647
- end
648
- Log.stopProgressMeter
639
+ unless report.retVal.success?
640
+ @messageHandler.error('rg_abort', "Process aborted")
649
641
  end
642
+ Log.stopProgressMeter
650
643
  end
651
- rescue TjException
652
- $stderr.puts "Report Generation Error: #{$!}"
653
- return false
654
644
  end
655
-
656
- true
657
645
  end
658
646
 
659
647
  def generateReport(reportId, regExpMode, dynamicAttributes = nil)
@@ -667,7 +655,6 @@ class TaskJuggler
667
655
  Log.startProgressMeter("Report #{report.name}")
668
656
  @reportContexts.push(context = ReportContext.new(self, report))
669
657
 
670
- name = nil
671
658
  # If we have dynamic attributes we need to backup the old attributes
672
659
  # first, then parse the dynamicAttributes String replacing the
673
660
  # original values.
@@ -848,25 +835,26 @@ class TaskJuggler
848
835
  # Print the attribute values. It's used for debugging only.
849
836
  def to_s
850
837
  raise "STOP!"
838
+ str = ''
851
839
  @attributes.each do |attribute, value|
852
840
  if value
853
- puts "#{attribute}: " +
854
- "#{value.is_a?(PropertyTreeNode) ? value.fullId : value}"
841
+ str += "#{attribute}: " +
842
+ "#{value.is_a?(PropertyTreeNode) ? value.fullId : value}"
855
843
  end
856
844
  end
845
+ str
857
846
  end
858
847
 
859
848
  # This function sends an error message to the message handler.
860
849
  def error(id, text)
861
- message = Message.new(id, 'error', text)
862
- @messageHandler.send(message)
863
- raise TjException
850
+ @messageHandler.error(id, text)
864
851
  end
865
852
 
866
853
  protected
867
854
 
868
855
  def prepareScenario(scIdx)
869
- Log.startProgressMeter("Preparing scenario #{scenario(scIdx).get('name')}")
856
+ Log.startProgressMeter("Preparing scenario " +
857
+ "#{scenario(scIdx).get('name')}")
870
858
  resources = PropertyList.new(@resources)
871
859
  tasks = PropertyList.new(@tasks)
872
860
 
@@ -1012,19 +1000,17 @@ class TaskJuggler
1012
1000
  # Check for unscheduled tasks and report the first 10 of them as
1013
1001
  # warnings.
1014
1002
  unless unscheduledTasks.empty?
1015
- message = Message.new('unscheduled_tasks', 'warning',
1016
- "#{unscheduledTasks.length} tasks could not be " +
1017
- "scheduled")
1018
- sendMessage(message)
1003
+ @messageHandler.warning(
1004
+ 'unscheduled_tasks',
1005
+ "#{unscheduledTasks.length} tasks could not be scheduled")
1019
1006
  i = 0
1020
1007
  unscheduledTasks.each do |t|
1021
- message = Message.new(
1022
- 'unscheduled_task', 'warning',
1008
+ @messageHandler.warning(
1009
+ 'unscheduled_task',
1023
1010
  "Task #{t.fullId}: " +
1024
1011
  "#{t['start', scIdx] ? t['start', scIdx] : '<?>'} -> " +
1025
- "#{t['end', scIdx] ? t['end', scIdx] : '<?>'}", t,
1012
+ "#{t['end', scIdx] ? t['end', scIdx] : '<?>'}", nil, nil, t,
1026
1013
  scenario(scIdx))
1027
- sendMessage(message)
1028
1014
 
1029
1015
  i += 1
1030
1016
  break if i >= 10