taskjuggler 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -175,7 +175,9 @@ class TaskJuggler
175
175
  warning('ts_res_end_delta',
176
176
  "#{resource.name} requests " +
177
177
  "#{@expectedEnd < @task['end', scenarioIdx] ?
178
- 'earlier' : 'later'} end for task #{@task.fullId}")
178
+ 'earlier' : 'later'} end (#{@expectedEnd}) for task " +
179
+ "#{@task.fullId}. Planned end is " +
180
+ "#{@task['end', scenarioIdx]}.")
179
181
  end
180
182
  end
181
183
  end
@@ -214,8 +216,7 @@ class TaskJuggler
214
216
  scenarioIdx = @timeSheet.scenarioIdx
215
217
  startIdx = project.dateToIdx(project['now'], true)
216
218
  endIdx = project.dateToIdx(@task['end', scenarioIdx])
217
- remainingWork = @task.getEffectiveWork(scenarioIdx, startIdx, endIdx,
218
- resource)
219
+ @task.getEffectiveWork(scenarioIdx, startIdx, endIdx, resource)
219
220
  end
220
221
 
221
222
  # The reported expected end of the task.
@@ -231,11 +232,11 @@ class TaskJuggler
231
232
  private
232
233
 
233
234
  def error(id, text)
234
- @timeSheet.message('error', id, text, @sourceFileInfo)
235
+ @timeSheet.error(id, text, @sourceFileInfo)
235
236
  end
236
237
 
237
238
  def warning(id, text)
238
- @timeSheet.message('warning', id, text, @sourceFileInfo)
239
+ @timeSheet.warning(id, text, @sourceFileInfo)
239
240
  end
240
241
 
241
242
  end
@@ -332,18 +333,6 @@ class TaskJuggler
332
333
  @resource.getFreeSlots(@scenarioIdx, startIdx, endIdx)
333
334
  end
334
335
 
335
- # Report an error or warning to the TjMessageHandler. In case of an error
336
- # an exception is raised.
337
- def message(type, id, text, sourceFileInfo)
338
- unless text.empty?
339
- message = Message.new(id, type, text, @resource, nil, sourceFileInfo)
340
- resource.project.messageHandler.send(message)
341
- end
342
-
343
- # An empty strings signals an already reported error
344
- raise TjException.new, '' if type == 'error'
345
- end
346
-
347
336
  # Converts allocation percentage into time slots.
348
337
  def percentToSlots(value)
349
338
  @percentageUsed = true
@@ -366,16 +355,18 @@ class TaskJuggler
366
355
  @resource.project['scheduleGranularity']).to_i
367
356
  end
368
357
 
369
- private
370
-
371
- def error(id, text)
372
- message('error', id, text, @sourceFileInfo)
358
+ def error(id, text, sourceFileInfo = nil)
359
+ @resource.project.messageHandler.error(
360
+ id, text, sourceFileInfo || @sourceFileInfo, nil, @resource)
373
361
  end
374
362
 
375
- def warning(id, text)
376
- message('warning', id, text, @sourceFileInfo)
363
+ def warning(id, text, sourceFileInfo = nil)
364
+ @resource.project.messageHandler.warning(id, text, sourceFileInfo, nil,
365
+ @resource)
377
366
  end
378
367
 
368
+ private
369
+
379
370
  def workWithUnit(slots)
380
371
  if @percentageUsed
381
372
  "#{(slotsToPercent(slots) * 100.0).to_i}%"
@@ -13,7 +13,7 @@
13
13
  require 'UTF8String'
14
14
  require 'AppConfig'
15
15
 
16
- AppConfig.version = '0.0.6'
16
+ AppConfig.version = '0.0.7'
17
17
  AppConfig.packageName = 'taskjuggler'
18
18
  AppConfig.softwareName = 'TaskJuggler III'
19
19
  AppConfig.packageInfo = 'A Project Management Software'
@@ -260,8 +260,7 @@ class TaskJuggler
260
260
  # Return a new time that is 1 month later than time but at the same time of
261
261
  # day.
262
262
  def sameTimeNextMonth
263
- sec, min, hour, day, month, year, wday, yday, isdst, tz =
264
- @time.localtime.to_a
263
+ sec, min, hour, day, month, year = @time.localtime.to_a
265
264
  monMax = month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
266
265
  month += 1
267
266
  if month > 12
@@ -57,7 +57,7 @@ EOT
57
57
  end
58
58
  if @val[1] && @project.account(@val[1])
59
59
  error('account_exists', "Account #{@val[1]} has already been defined.",
60
- @property, @sourceFileInfo[1])
60
+ @sourceFileInfo[1], @property)
61
61
  end
62
62
  @property = Account.new(@project, @val[1], @val[2], @property)
63
63
  @property.sourceFileInfo = @sourceFileInfo[0]
@@ -74,8 +74,7 @@ EOT
74
74
  # In case we have a nested supplement, we need to prepend the parent ID.
75
75
  id = @property.fullId + '.' + id if @property && @property.is_a?(Account)
76
76
  if (account = @project.account(id)).nil?
77
- error('unknown_account', "Unknown account #{id}", nil,
78
- @sourceFileInfo[0])
77
+ error('unknown_account', "Unknown account #{id}", @sourceFileInfo[0])
79
78
  end
80
79
  account
81
80
  })
@@ -109,7 +108,7 @@ EOT
109
108
  level = @project.alertLevelIndex(@val[0])
110
109
  unless level
111
110
  error('bad_alert', "Unknown alert level #{@val[1]}. Must be " +
112
- 'green, yellow or red', nil, @sourceFileInfo[0])
111
+ 'green, yellow or red', @sourceFileInfo[0])
113
112
  end
114
113
  level
115
114
  })
@@ -214,6 +213,18 @@ Makes a resource allocation mandatory. This means, that for each time slot
214
213
  only then resources are allocated when all mandatory resources are available.
215
214
  So either all mandatory resources can be allocated for the time slot, or no
216
215
  resource will be allocated.
216
+ EOT
217
+ )
218
+ pattern(%w( _shift !allocationShiftAssignment ))
219
+ doc('shifts.allocate', <<'EOT'
220
+ Limits the allocations of resources during the specified interval to the
221
+ specified shift. Multiple shifts can be defined, but shift intervals may not
222
+ overlap. Allocation shifts are an additional restriction to the
223
+ [[shifts.task|task shifts]] and [[shifts.resource|resource shifts]] or
224
+ [[workinghours.resource|resource working hours]]. Allocations will only be
225
+ made for time slots that are specified as duty time in all relevant shifts.
226
+ The restriction to the shift is only active during the specified time
227
+ interval. Outside of this interval, no restrictions apply.
217
228
  EOT
218
229
  )
219
230
  end
@@ -257,9 +268,9 @@ EOT
257
268
  def rule_allocationShiftAssignment
258
269
  pattern(%w( !shiftId !intervalsOptional ), lambda {
259
270
  # Make sure we have a ShiftAssignment for the allocation.
260
- if @allocate.shift.nil?
261
- @allocate.shift = ShiftAssignments.new
262
- @allocate.shift.project = @project
271
+ if @allocate.shifts.nil?
272
+ @allocate.shifts = ShiftAssignments.new
273
+ @allocate.shifts.project = @project
263
274
  end
264
275
 
265
276
  if @val[1].nil?
@@ -268,11 +279,11 @@ EOT
268
279
  intervals = @val[1]
269
280
  end
270
281
  intervals.each do |interval|
271
- if !@allocate.shift.
282
+ if !@allocate.shifts.
272
283
  addAssignment(ShiftAssignment.new(@val[0].scenario(@scenarioIdx),
273
284
  interval))
274
285
  error('shift_assignment_overlap',
275
- 'Shifts may not overlap each other.', nil, @sourceFileInfo[0])
286
+ 'Shifts may not overlap each other.', @sourceFileInfo[0])
276
287
  end
277
288
  end
278
289
  })
@@ -316,16 +327,16 @@ EOT
316
327
  if @val[1].parent
317
328
  error('cost_acct_no_top',
318
329
  "The cost account #{@val[1].fullId} is not a top-level account.",
319
- nil, @sourceFileInfo[1])
330
+ @sourceFileInfo[1])
320
331
  end
321
332
  if @val[2].parent
322
333
  error('rev_acct_no_top',
323
334
  "The revenue account #{@val[2].fullId} is not a top-level " +
324
- "account.", nil, @sourceFileInfo[2])
335
+ "account.", @sourceFileInfo[2])
325
336
  end
326
337
  if @val[1] == @val[2]
327
338
  error('cost_rev_same',
328
- 'The cost and revenue accounts may not be the same.', nil,
339
+ 'The cost and revenue accounts may not be the same.',
329
340
  @sourceFileInfo[1])
330
341
  end
331
342
  [ @val[1], @val[2] ]
@@ -351,8 +362,8 @@ EOT
351
362
  pattern(%w( _overtime $INTEGER ), lambda {
352
363
  if @val[1] < 0 || @val[1] > 2
353
364
  error('overtime_range',
354
- "Overtime value #{@val[1]} out of range (0 - 2).", @property,
355
- @sourceFileInfo[1])
365
+ "Overtime value #{@val[1]} out of range (0 - 2).",
366
+ @sourceFileInfo[1], @property)
356
367
  end
357
368
  @booking.overtime = @val[1]
358
369
  })
@@ -373,8 +384,8 @@ EOT
373
384
  pattern(%w( _sloppy $INTEGER ), lambda {
374
385
  if @val[1] < 0 || @val[1] > 2
375
386
  error('sloppy_range',
376
- "Sloppyness value #{@val[1]} out of range (0 - 2).", @property,
377
- @sourceFileInfo[1])
387
+ "Sloppyness value #{@val[1]} out of range (0 - 2).",
388
+ @sourceFileInfo[1], @property)
378
389
  end
379
390
  @booking.sloppy = @val[1]
380
391
  })
@@ -428,7 +439,7 @@ EOT
428
439
  end
429
440
  chargeSet.complete
430
441
  rescue TjException
431
- error('chargeset', $!.message, @property, @sourceFileInfo[0])
442
+ error('chargeset', $!.message, @sourceFileInfo[0], @property)
432
443
  end
433
444
  masterAccounts = []
434
445
  @property['chargeset', @scenarioIdx].each do |set|
@@ -437,7 +448,7 @@ EOT
437
448
  if masterAccounts.include?(chargeSet.master)
438
449
  error('chargeset_master',
439
450
  "All charge sets for this task must have different top-level " +
440
- "accounts.", @property, @sourceFileInfo[0])
451
+ "accounts.", @sourceFileInfo[0], @property)
441
452
  end
442
453
  @property['chargeset', @scenarioIdx] =
443
454
  @property['chargeset', @scenarioIdx] + [ chargeSet ]
@@ -506,7 +517,7 @@ EOT
506
517
  unless /#[0-9A-Fa-f]{3}/ =~ col || /#[0-9A-Fa-f]{3}/ =~ col
507
518
  error('bad_color',
508
519
  "Color values must be specified as '#RGB' or '#RRGGBB' values",
509
- nil, @sourceFileInfo[0])
520
+ @sourceFileInfo[0])
510
521
  end
511
522
  col
512
523
  })
@@ -685,7 +696,7 @@ EOT
685
696
  if @val[0] % resolution != 0
686
697
  error('misaligned_date',
687
698
  "The date must be aligned to the timing resolution (" +
688
- "#{resolution / 60} min) of the project.", nil,
699
+ "#{resolution / 60} min) of the project.",
689
700
  @sourceFileInfo[0])
690
701
  end
691
702
  @val[0]
@@ -736,7 +747,7 @@ EOT
736
747
  BULLET1 BULLET2 BULLET3 BULLET4 NUMBER1 NUMBER2 NUMBER3 NUMBER4 )
737
748
  if @val[1] == "Some more details\n"
738
749
  error('ts_default_details',
739
- "'Some more details' is not a valid value", nil,
750
+ "'Some more details' is not a valid value",
740
751
  @sourceFileInfo[1])
741
752
  end
742
753
  @journalEntry.details = newRichText(@val[1], rtTokenSetMore)
@@ -966,7 +977,7 @@ EOT
966
977
  unless (?A..?Z) === @val[0][0]
967
978
  error('extend_id_cap',
968
979
  "User defined attributes IDs must start with a capital letter",
969
- nil, @sourceFileInfo[0])
980
+ @sourceFileInfo[0])
970
981
  end
971
982
  @val[0]
972
983
  })
@@ -1033,7 +1044,7 @@ EOT
1033
1044
  def rule_flag
1034
1045
  pattern(%w( $ID ), lambda {
1035
1046
  unless @project['flags'].include?(@val[0])
1036
- error('undecl_flag', "Undeclared flag '#{@val[0]}'", nil,
1047
+ error('undecl_flag', "Undeclared flag '#{@val[0]}'",
1037
1048
  @sourceFileInfo[0])
1038
1049
  end
1039
1050
  @val[0]
@@ -1305,7 +1316,7 @@ EOT
1305
1316
 
1306
1317
  def rule_includeFile
1307
1318
  pattern(%w( !includeFileName ), lambda {
1308
- @scanner.include(@val[0], @sourceFileInfo[0])
1319
+ @project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
1309
1320
  })
1310
1321
  end
1311
1322
 
@@ -1314,8 +1325,9 @@ EOT
1314
1325
  unless @val[0][-4, 4] == '.tji'
1315
1326
  error('bad_include_suffix', "Included files must have a '.tji'" +
1316
1327
  "extension: '#{@val[0]}'",
1317
- nil, @sourceFileInfo[0])
1328
+ @sourceFileInfo[0])
1318
1329
  end
1330
+ pushFileStack
1319
1331
  @val[0]
1320
1332
  })
1321
1333
  arg(0, 'filename', <<'EOT'
@@ -1328,8 +1340,8 @@ EOT
1328
1340
 
1329
1341
  def rule_includeProperties
1330
1342
  pattern(%w( !includeFileName !includeAttributes ), lambda {
1331
- pushFileStack
1332
- @scanner.include(@val[0], @sourceFileInfo[0])
1343
+ popFileStack
1344
+ @project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
1333
1345
  })
1334
1346
  end
1335
1347
 
@@ -1341,7 +1353,7 @@ EOT
1341
1353
  if mode == 0
1342
1354
  unless @val[0] < endSpec
1343
1355
  error('start_before_end', "The end date (#{endSpec}) must be " +
1344
- "after the start date (#{@val[0]}).", nil, @sourceFileInfo[0])
1356
+ "after the start date (#{@val[0]}).", @sourceFileInfo[0])
1345
1357
  end
1346
1358
  Interval.new(@val[0], endSpec)
1347
1359
  else
@@ -1372,7 +1384,7 @@ EOT
1372
1384
  if mode == 0
1373
1385
  unless @val[0] < endSpec
1374
1386
  error('start_before_end', "The end date (#{endSpec}) must be after " +
1375
- "the start date (#{@val[0]}).", nil, @sourceFileInfo[0])
1387
+ "the start date (#{@val[0]}).", @sourceFileInfo[0])
1376
1388
  end
1377
1389
  Interval.new(@val[0], endSpec)
1378
1390
  else
@@ -1402,7 +1414,7 @@ EOT
1402
1414
  60 * 60 * 24 * 365 # years
1403
1415
  ]
1404
1416
  if @val[0] == 0.0
1405
- error('zero_duration', "The interval duration may not be 0.", nil,
1417
+ error('zero_duration', "The interval duration may not be 0.",
1406
1418
  @sourceFileInfo[1])
1407
1419
  end
1408
1420
  duration = @val[0] * convFactors[@val[1]]
@@ -1472,7 +1484,7 @@ EOT
1472
1484
  level = @project.alertLevelIndex(@val[1])
1473
1485
  unless level
1474
1486
  error('bad_alert', "Unknown alert level #{@val[1]}. Must be " +
1475
- 'green, yellow or red', nil, @sourceFileInfo[0])
1487
+ 'green, yellow or red', @sourceFileInfo[0])
1476
1488
  end
1477
1489
  @journalEntry.alertLevel = level
1478
1490
  })
@@ -1515,7 +1527,7 @@ EOT
1515
1527
  resource = @val[0]
1516
1528
  unless resource.leaf?
1517
1529
  error('leaf_resource_id_expected',
1518
- "#{resource.id} is not a leaf resource.", nil, @sourceFileInfo[0])
1530
+ "#{resource.id} is not a leaf resource.", @sourceFileInfo[0])
1519
1531
  end
1520
1532
  resource
1521
1533
  })
@@ -1894,7 +1906,7 @@ EOT
1894
1906
  pattern(%w( _navigator $ID ), lambda {
1895
1907
  if @project['navigators'][@val[1]]
1896
1908
  error('navigator_exists',
1897
- "The navigator #{@val[1]} has already been defined.", nil,
1909
+ "The navigator #{@val[1]} has already been defined.",
1898
1910
  @sourceFileInfo[0])
1899
1911
  end
1900
1912
  @navigator = Navigator.new(@val[1], @project)
@@ -1954,12 +1966,12 @@ EOT
1954
1966
  when :taskreport
1955
1967
  if (p1 = @project.task(@val[0])).nil?
1956
1968
  error('unknown_main_node',
1957
- "Unknown task ID #{@val[0]}", nil, @sourceFileInfo[0])
1969
+ "Unknown task ID #{@val[0]}", @sourceFileInfo[0])
1958
1970
  end
1959
1971
  if @val[1]
1960
1972
  if (p2 = @project.resource(@val[1])).nil?
1961
1973
  error('unknown_sub_node',
1962
- "Unknown resource ID #{@val[0]}", nil, @sourceFileInfo[0])
1974
+ "Unknown resource ID #{@val[0]}", @sourceFileInfo[0])
1963
1975
  end
1964
1976
  return [ p2, p1 ]
1965
1977
  end
@@ -1967,12 +1979,12 @@ EOT
1967
1979
  when :resourcereport
1968
1980
  if (p1 = @project.task(@val[0])).nil?
1969
1981
  error('unknown_main_node',
1970
- "Unknown task ID #{@val[0]}", nil, @sourceFileInfo[0])
1982
+ "Unknown task ID #{@val[0]}", @sourceFileInfo[0])
1971
1983
  end
1972
1984
  if @val[1]
1973
1985
  if (p2 = @project.resource(@val[1])).nil?
1974
1986
  error('unknown_sub_node',
1975
- "Unknown resource ID #{@val[0]}", nil, @sourceFileInfo[0])
1987
+ "Unknown resource ID #{@val[0]}", @sourceFileInfo[0])
1976
1988
  end
1977
1989
  return [ p2, p1 ]
1978
1990
  end
@@ -2009,12 +2021,12 @@ EOT
2009
2021
  pattern(%w( $ABSOLUTE_ID ), lambda {
2010
2022
  if @val[0].count('.') > 1
2011
2023
  error('operand_attribute',
2012
- 'Attributes must be specified as <scenarioID>.<attribute>', nil,
2024
+ 'Attributes must be specified as <scenarioID>.<attribute>',
2013
2025
  @sourceFileInfo[0])
2014
2026
  end
2015
2027
  scenario, attribute = @val[0].split('.')
2016
2028
  if (scenarioIdx = @project.scenarioIdx(scenario)).nil?
2017
- error('operand_unkn_scen', "Unknown scenario ID #{scenario}", nil,
2029
+ error('operand_unkn_scen', "Unknown scenario ID #{scenario}",
2018
2030
  @sourceFileInfo[0])
2019
2031
  end
2020
2032
  LogicalAttribute.new(attribute, scenarioIdx)
@@ -2026,7 +2038,7 @@ EOT
2026
2038
  if @val[1].nil?
2027
2039
  unless @project['flags'].include?(@val[0])
2028
2040
  error('operand_unkn_flag', "Undeclared flag '#{@val[0]}'",
2029
- nil, @sourceFileInfo[0])
2041
+ @sourceFileInfo[0])
2030
2042
  end
2031
2043
  LogicalFlag.new(@val[0])
2032
2044
  else
@@ -2310,12 +2322,12 @@ EOT
2310
2322
  unless goodValues.include?(@val[1])
2311
2323
  error('bad_timing_res',
2312
2324
  "Timing resolution must be one of #{goodValues.join(', ')} min.",
2313
- nil, @sourceFileInfo[1])
2325
+ @sourceFileInfo[1])
2314
2326
  end
2315
2327
  if @val[1] > (Project.maxScheduleGranularity / 60)
2316
2328
  error('too_large_timing_res',
2317
2329
  'The maximum allowed timing resolution for the timezone is ' +
2318
- "#{Project.maxScheduleGranularity / 60} minutes.", nil,
2330
+ "#{Project.maxScheduleGranularity / 60} minutes.",
2319
2331
  @sourceFileInfo[1])
2320
2332
  end
2321
2333
  @project['scheduleGranularity'] = @val[1] * 60
@@ -2450,7 +2462,9 @@ EOT
2450
2462
  end
2451
2463
 
2452
2464
  def rule_projectBodyInclude
2453
- pattern(%w( _include !includeFile !projectBodyAttributes . ))
2465
+ pattern(%w( _include !includeFile !projectBodyAttributes . ), lambda {
2466
+ popFileStack
2467
+ })
2454
2468
  lastSyntaxToken(1)
2455
2469
  doc('include.project', <<'EOT'
2456
2470
  Includes the specified file name as if its contents would be written
@@ -2469,6 +2483,7 @@ EOT
2469
2483
 
2470
2484
  def rule_prologInclude
2471
2485
  pattern(%w( _include !includeFile !projectProlog . ), lambda {
2486
+ popFileStack
2472
2487
  })
2473
2488
  lastSyntaxToken(1)
2474
2489
  doc('include.macro', <<'EOT'
@@ -2615,7 +2630,6 @@ EOT
2615
2630
 
2616
2631
  def rule_propertiesInclude
2617
2632
  pattern(%w( _include !includeProperties !properties ), lambda {
2618
- popFileStack
2619
2633
  })
2620
2634
  doc('include.properties', <<'EOT'
2621
2635
  Includes the specified file name as if its contents would be written
@@ -2637,7 +2651,7 @@ EOT
2637
2651
  pattern(%w( _purge $ID ), lambda {
2638
2652
  if (attributeDefinition = @property.attributeDefinition(@val[1])).nil?
2639
2653
  error('purge_unknown_id',
2640
- "#{@val[1]} is not a known attribute for this property", nil,
2654
+ "#{@val[1]} is not a known attribute for this property",
2641
2655
  @sourceFileInfo[1])
2642
2656
  end
2643
2657
  if attributeDefinition.scenarioSpecific
@@ -2648,7 +2662,7 @@ EOT
2648
2662
  unless attr.is_a?(Array)
2649
2663
  error('purge_no_list',
2650
2664
  "#{@val[1]} is not a list attribute. Only those can be purged.",
2651
- nil, @sourceFileInfo[1])
2665
+ @sourceFileInfo[1])
2652
2666
  end
2653
2667
  if attributeDefinition.scenarioSpecific
2654
2668
  @property[@val[1], @scenarioIdx] = attributeDefinition.default.dup
@@ -2863,6 +2877,13 @@ EOT
2863
2877
  singlePattern('_journal')
2864
2878
  descr(<<'EOT'
2865
2879
  The journal entries for the task or resource for the reported interval.
2880
+ EOT
2881
+ )
2882
+
2883
+ singlePattern('_journal_sub')
2884
+ descr(<<'EOT'
2885
+ The journal entries for the task or resource and all its subtasks or resources
2886
+ for the reported interval.
2866
2887
  EOT
2867
2888
  )
2868
2889
 
@@ -2970,7 +2991,12 @@ EOT
2970
2991
  )
2971
2992
 
2972
2993
  singlePattern('_targets')
2973
- descr('A list of tasks that depend in the current task.')
2994
+ descr(<<'EOT'
2995
+ A list of milestones that depend on the current task. For container tasks it
2996
+ will also include the targets of the child tasks. Usually the task name, the
2997
+ task ID and the start date will be listed.
2998
+ EOT
2999
+ )
2974
3000
 
2975
3001
  singlePattern('_wbs')
2976
3002
  descr('The hierarchical or work breakdown structure index')
@@ -3105,7 +3131,7 @@ EOT
3105
3131
  pattern(%w( _opennodes !nodeIdList ), lambda {
3106
3132
  @property.set('openNodes', @val[1])
3107
3133
  })
3108
- doc('opennods', 'For internal use only!')
3134
+ doc('opennodes', 'For internal use only!')
3109
3135
 
3110
3136
  pattern(%w( !report ))
3111
3137
 
@@ -3175,7 +3201,7 @@ EOT
3175
3201
  if @val[1] < @property.get('start')
3176
3202
  error('report_end',
3177
3203
  "End date must be before start date #{@property.get('start')}",
3178
- nil, @sourceFileInfo[1])
3204
+ @sourceFileInfo[1])
3179
3205
  end
3180
3206
  @property.set('end', @val[1])
3181
3207
  })
@@ -3196,7 +3222,7 @@ EOT
3196
3222
  end
3197
3223
  # In case we have a nested supplement, we need to prepend the parent ID.
3198
3224
  if (report = @project.report(id)).nil?
3199
- error('report_id_expected', "#{id} is not a defined report.", nil,
3225
+ error('report_id_expected', "#{id} is not a defined report.",
3200
3226
  @sourceFileInfo[0])
3201
3227
  end
3202
3228
  report
@@ -3226,7 +3252,7 @@ EOT
3226
3252
  if @val[1] > @property.get('end')
3227
3253
  error('report_start',
3228
3254
  "Start date must be before end date #{@property.get('end')}",
3229
- nil, @sourceFileInfo[1])
3255
+ @sourceFileInfo[1])
3230
3256
  end
3231
3257
  @property.set('start', @val[1])
3232
3258
  })
@@ -3250,7 +3276,7 @@ EOT
3250
3276
  id = (@property ? @property.fullId + '.' : '') + @val[1]
3251
3277
  if @project.report(id)
3252
3278
  error('report_exists', "report #{id} has already been defined.",
3253
- @property, @sourceFileInfo[1])
3279
+ @sourceFileInfo[1], @property)
3254
3280
  end
3255
3281
  end
3256
3282
  @property = Report.new(@project, @val[1], @val[2], @property)
@@ -3446,7 +3472,7 @@ EOT
3446
3472
  id = (@resourceprefix.empty? ? '' : @resourceprefix + '.') + @val[0]
3447
3473
  if (resource = @project.resource(id)).nil?
3448
3474
  error('resource_id_expected', "#{id} is not a defined resource.",
3449
- nil, @sourceFileInfo[0])
3475
+ @sourceFileInfo[0])
3450
3476
  end
3451
3477
  resource
3452
3478
  })
@@ -3460,8 +3486,8 @@ EOT
3460
3486
  end
3461
3487
  if @val[1] && @project.resource(@val[1])
3462
3488
  error('resource_exists',
3463
- "Resource #{@val[1]} has already been defined.", @property,
3464
- @sourceFileInfo[1])
3489
+ "Resource #{@val[1]} has already been defined.",
3490
+ @sourceFileInfo[1], @property)
3465
3491
  end
3466
3492
  @property = Resource.new(@project, @val[1], @val[2], @property)
3467
3493
  @property.sourceFileInfo = @sourceFileInfo[0]
@@ -3691,7 +3717,7 @@ EOT
3691
3717
  @project.scenarios.clearProperties if @property.nil?
3692
3718
  if @project.scenario(@val[1])
3693
3719
  error('scenario_exists',
3694
- "Scenario #{@val[1]} has already been defined.", nil,
3720
+ "Scenario #{@val[1]} has already been defined.",
3695
3721
  @sourceFileInfo[1])
3696
3722
  end
3697
3723
  @property = Scenario.new(@project, @val[1], @val[2], @property)
@@ -3704,7 +3730,7 @@ EOT
3704
3730
  def rule_scenarioId
3705
3731
  pattern(%w( $ID ), lambda {
3706
3732
  if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
3707
- error('unknown_scenario_id', "Unknown scenario: #{@val[0]}", nil,
3733
+ error('unknown_scenario_id', "Unknown scenario: #{@val[0]}",
3708
3734
  @sourceFileInfo[0])
3709
3735
  end
3710
3736
  @scenarioIdx
@@ -3715,7 +3741,7 @@ EOT
3715
3741
  def rule_scenarioIdCol
3716
3742
  pattern(%w( $ID_WITH_COLON ), lambda {
3717
3743
  if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
3718
- error('unknown_scenario_id', "Unknown scenario: @val[0]", nil,
3744
+ error('unknown_scenario_id', "Unknown scenario: @val[0]",
3719
3745
  @sourceFileInfo[0])
3720
3746
  end
3721
3747
  })
@@ -3728,7 +3754,7 @@ EOT
3728
3754
  def rule_scenarioIdx
3729
3755
  pattern(%w( $ID ), lambda {
3730
3756
  if (scenarioIdx = @project.scenarioIdx(@val[0])).nil?
3731
- error('unknown_scenario_idx', "Unknown scenario #{@val[0]}", nil,
3757
+ error('unknown_scenario_idx', "Unknown scenario #{@val[0]}",
3732
3758
  @sourceFileInfo[0])
3733
3759
  end
3734
3760
  scenarioIdx
@@ -3774,8 +3800,8 @@ EOT
3774
3800
  addAssignment(ShiftAssignment.new(@val[0].scenario(@scenarioIdx),
3775
3801
  interval))
3776
3802
  error('shift_assignment_overlap',
3777
- 'Shifts may not overlap each other.', @property,
3778
- @sourceFileInfo[0])
3803
+ 'Shifts may not overlap each other.',
3804
+ @sourceFileInfo[0], @property)
3779
3805
  end
3780
3806
  end
3781
3807
  # Set same value again to set the 'provided' state for the attribute.
@@ -3806,7 +3832,7 @@ EOT
3806
3832
  pattern(%w( _shift !optionalID $STRING ), lambda {
3807
3833
  if @val[1] && @project.shift(@val[1])
3808
3834
  error('shift_exists', "Shift #{@val[1]} has already been defined.",
3809
- nil, @sourceFileInfo[1])
3835
+ @sourceFileInfo[1])
3810
3836
  end
3811
3837
  @property = Shift.new(@project, @val[1], @val[2], @property)
3812
3838
  @property.sourceFileInfo = @sourceFileInfo[0]
@@ -3819,7 +3845,7 @@ EOT
3819
3845
  def rule_shiftId
3820
3846
  pattern(%w( $ID ), lambda {
3821
3847
  if (shift = @project.shift(@val[0])).nil?
3822
- error('shift_id_expected', "#{@val[0]} is not a defined shift.", nil,
3848
+ error('shift_id_expected', "#{@val[0]} is not a defined shift.",
3823
3849
  @sourceFileInfo[0])
3824
3850
  end
3825
3851
  shift
@@ -3898,24 +3924,24 @@ EOT
3898
3924
  # <scenario>.<attribute>.<up|down>
3899
3925
  if (scenario = @project.scenarioIdx(args[0])).nil?
3900
3926
  error('sort_unknown_scen',
3901
- "Unknown scenario #{args[0]} in sorting criterium", nil,
3927
+ "Unknown scenario #{args[0]} in sorting criterium",
3902
3928
  @sourceFileInfo[0])
3903
3929
  end
3904
3930
  attribute = args[1]
3905
3931
  if args[2] != 'up' && args[2] != 'down'
3906
3932
  error('sort_direction', "Sorting direction must be 'up' or 'down'",
3907
- nil, @sourceFileInfo[0])
3933
+ @sourceFileInfo[0])
3908
3934
  end
3909
3935
  direction = args[2] == 'up'
3910
3936
  else
3911
3937
  error('sorting_crit_exptd1',
3912
3938
  "Sorting criterium expected (e.g. tree, start.up or " +
3913
- "plan.end.down).", nil, @sourceFileInfo[0])
3939
+ "plan.end.down).", @sourceFileInfo[0])
3914
3940
  end
3915
3941
  if attribute == 'wbs'
3916
3942
  error('sorting_wbs',
3917
3943
  "Sorting by wbs is not supported. Please use 'tree' " +
3918
- '(without appended .up or .down) instead.', nil,
3944
+ '(without appended .up or .down) instead.',
3919
3945
  @sourceFileInfo[0])
3920
3946
  end
3921
3947
  [ attribute, direction, scenario ]
@@ -3961,7 +3987,7 @@ EOT
3961
3987
  if @val[0] != 'tree'
3962
3988
  error('sorting_crit_exptd2',
3963
3989
  "Sorting criterium expected (e.g. tree, start.up or " +
3964
- "plan.end.down).", nil, @sourceFileInfo[0])
3990
+ "plan.end.down).", @sourceFileInfo[0])
3965
3991
  end
3966
3992
  [ 'tree', true, -1 ]
3967
3993
  })
@@ -3974,7 +4000,7 @@ EOT
3974
4000
  if @project.reports[fileName]
3975
4001
  error('report_redefinition',
3976
4002
  "A report with the name '#{fileName}' has already been " +
3977
- "defined.", nil, @sourceFileInfo[2])
4003
+ "defined.", @sourceFileInfo[2])
3978
4004
  end
3979
4005
  else
3980
4006
  fileName = "statusSheet#{@project.reports.length + 1}"
@@ -4158,11 +4184,11 @@ EOT
4158
4184
  error('ts_summary_too_long',
4159
4185
  "The summary text must be 480 characters long or shorter. " +
4160
4186
  "This text has #{@val[1].length} characters.",
4161
- nil, @sourceFileInfo[1])
4187
+ @sourceFileInfo[1])
4162
4188
  end
4163
4189
  if @val[1] == "A summary text\n"
4164
4190
  error('ts_default_summary',
4165
- "'A summary text' is not a valid summary", nil,
4191
+ "'A summary text' is not a valid summary",
4166
4192
  @sourceFileInfo[1])
4167
4193
  end
4168
4194
  rtTokenSetIntro =
@@ -4382,7 +4408,7 @@ EOT
4382
4408
  end
4383
4409
  error('too_many_bangs',
4384
4410
  "Too many '!' for relative task in this context.",
4385
- @property, @sourceFileInfo[0]) if id[0] == ?!
4411
+ @sourceFileInfo[0], @property) if id[0] == ?!
4386
4412
  if task
4387
4413
  task.fullId + '.' + id
4388
4414
  else
@@ -4412,7 +4438,7 @@ EOT
4412
4438
  if @val[1]
4413
4439
  id = (@property ? @property.fullId + '.' : '') + @val[1]
4414
4440
  if @project.task(id)
4415
- error('task_exists', "Task #{id} has already been defined.", nil,
4441
+ error('task_exists', "Task #{id} has already been defined.",
4416
4442
  @sourceFileInfo[1])
4417
4443
  end
4418
4444
  end
@@ -4435,7 +4461,7 @@ EOT
4435
4461
  id = @taskprefix + '.' + id unless @taskprefix.empty?
4436
4462
  end
4437
4463
  if (task = @project.task(id)).nil?
4438
- error('unknown_task', "Unknown task #{id}", nil, @sourceFileInfo[0])
4464
+ error('unknown_task', "Unknown task #{id}", @sourceFileInfo[0])
4439
4465
  end
4440
4466
  task
4441
4467
  })
@@ -4500,8 +4526,8 @@ EOT
4500
4526
 
4501
4527
  if @property['chargeset', @scenarioIdx].empty?
4502
4528
  error('task_without_chargeset',
4503
- 'The task does not have a chargeset defined.', @property,
4504
- @sourceFileInfo[0])
4529
+ 'The task does not have a chargeset defined.',
4530
+ @sourceFileInfo[0], @property)
4505
4531
  end
4506
4532
  case @val[2]
4507
4533
  when 'onstart'
@@ -4538,7 +4564,7 @@ EOT
4538
4564
  pattern(%w( _complete !number), lambda {
4539
4565
  if @val[1] < 0.0 || @val[1] > 100.0
4540
4566
  error('task_complete', "Complete value must be between 0 and 100",
4541
- @property, @sourceFileInfo[1])
4567
+ @sourceFileInfo[1], @property)
4542
4568
  end
4543
4569
  @property['complete', @scenarioIdx] = @val[1]
4544
4570
  })
@@ -4588,8 +4614,8 @@ EOT
4588
4614
  pattern(%w( _effort !workingDuration ), lambda {
4589
4615
  checkContainer('effort')
4590
4616
  if @val[1] <= 0.0
4591
- error('effort_zero', "Effort value must be larger than 0", @property,
4592
- @sourceFileInfo[1])
4617
+ error('effort_zero', "Effort value must be larger than 0",
4618
+ @sourceFileInfo[1], @property)
4593
4619
  end
4594
4620
  @property['effort', @scenarioIdx] = @val[1]
4595
4621
  })
@@ -4766,7 +4792,7 @@ EOT
4766
4792
  pattern(%w( _priority $INTEGER ), lambda {
4767
4793
  if @val[1] < 0 || @val[1] > 1000
4768
4794
  error('task_priority', "Priority must have a value between 0 and 1000",
4769
- @property, @sourceFileInfo[1])
4795
+ @sourceFileInfo[1], @property)
4770
4796
  end
4771
4797
  @property['priority', @scenarioIdx] = @val[1]
4772
4798
  })
@@ -4791,7 +4817,7 @@ EOT
4791
4817
 
4792
4818
  pattern(%w( _projectid $ID ), lambda {
4793
4819
  unless @project['projectids'].include?(@val[1])
4794
- error('unknown_projectid', "Unknown project ID #{@val[1]}", nil,
4820
+ error('unknown_projectid', "Unknown project ID #{@val[1]}",
4795
4821
  @sourceFileInfo[1])
4796
4822
  end
4797
4823
  @property['projectid', @scenarioIdx] = @val[1]
@@ -4822,8 +4848,8 @@ EOT
4822
4848
  @property['end', @scenarioIdx].nil?))
4823
4849
  error('not_scheduled',
4824
4850
  "Task #{@property.fullId} is marked as scheduled but does not " +
4825
- 'have a fixed start and end date.', @property,
4826
- @sourceFileInfo[0])
4851
+ 'have a fixed start and end date.',
4852
+ @sourceFileInfo[0], @property)
4827
4853
  end
4828
4854
  @property['scheduled', @scenarioIdx] = true
4829
4855
  })
@@ -4876,8 +4902,8 @@ EOT
4876
4902
  checkContainer('shift')
4877
4903
  })
4878
4904
  doc('shift.task', <<'EOT'
4879
- This keyword has been deprecated. Please use [shifts.task shifts
4880
- (task)] instead.
4905
+ This keyword has been deprecated. Please use [[shifts.task|shifts
4906
+ (task)]] instead.
4881
4907
  EOT
4882
4908
  )
4883
4909
 
@@ -4887,10 +4913,11 @@ EOT
4887
4913
  doc('shifts.task', <<'EOT'
4888
4914
  Limits the working time for this task during the during the specified interval
4889
4915
  to the working hours of the given shift. Multiple shifts can be defined, but
4890
- shift intervals may not overlap. This is an additional working time limit to
4891
- the working hours of the allocated resources. It does not replace the resource
4892
- working hour restrictions. For a resource to be assigned to a time slot, both
4893
- the task shifts as well as the resource working hours must declare the time slot as duty slot.
4916
+ shift intervals may not overlap. This is an additional working time
4917
+ restriction ontop of the working hours of the allocated resources. It does not
4918
+ replace the resource working hour restrictions. For a resource to be assigned
4919
+ to a time slot, both the respective task shift as well as the resource working
4920
+ hours must declare the time slot as duty slot.
4894
4921
  EOT
4895
4922
  )
4896
4923
 
@@ -5061,7 +5088,7 @@ EOT
5061
5088
  pattern([ '$TIME', '_-', '$TIME' ], lambda {
5062
5089
  if @val[0] >= @val[2]
5063
5090
  error('time_interval',
5064
- "End time of interval must be larger than start time", nil,
5091
+ "End time of interval must be larger than start time",
5065
5092
  @sourceFileInfo[0])
5066
5093
  end
5067
5094
  [ @val[0], @val[2] ]
@@ -5174,7 +5201,7 @@ EOT
5174
5201
  @property = nil
5175
5202
  unless @sheetAuthor.leaf?
5176
5203
  error('ts_group_author',
5177
- 'A resource group cannot file a time sheet', nil,
5204
+ 'A resource group cannot file a time sheet',
5178
5205
  @sourceFileInfo[1])
5179
5206
  end
5180
5207
  # Currently time sheets are hardcoded for scenario 0.
@@ -5290,11 +5317,11 @@ EOT
5290
5317
  if @val[2].length > 120
5291
5318
  error('ts_headline_too_long',
5292
5319
  "The headline must be 120 or less characters long. This one " +
5293
- "has #{@val[2].length} characters.", nil, @sourceFileInfo[2])
5320
+ "has #{@val[2].length} characters.", @sourceFileInfo[2])
5294
5321
  end
5295
5322
  if @val[2] == 'Your headline here!'
5296
5323
  error('ts_no_headline',
5297
- "'Your headline here!' is not a valid headline", nil,
5324
+ "'Your headline here!' is not a valid headline",
5298
5325
  @sourceFileInfo[2])
5299
5326
  end
5300
5327
  @journalEntry = JournalEntry.new(@project['journal'],
@@ -5331,7 +5358,7 @@ EOT
5331
5358
  if @val[1] < @timeSheet.interval.start
5332
5359
  error('ts_end_too_early',
5333
5360
  "The expected task end date must be after the start date of " +
5334
- "this time sheet report.", nil, @sourceFileInfo[1])
5361
+ "this time sheet report.", @sourceFileInfo[1])
5335
5362
  end
5336
5363
  @timeSheetRecord.expectedEnd = @val[1]
5337
5364
  })
@@ -5346,7 +5373,7 @@ EOT
5346
5373
  priority = @val[1]
5347
5374
  if priority < 1 || priority > 1000
5348
5375
  error('ts_bad_priority',
5349
- "Priority value #{priority} must be between 1 and 1000.", nil,
5376
+ "Priority value #{priority} must be between 1 and 1000.",
5350
5377
  @sourceFileInfo[1])
5351
5378
  end
5352
5379
  @timeSheetRecord.priority = priority
@@ -5411,11 +5438,8 @@ EOT
5411
5438
  unless @property.leaf?
5412
5439
  error('ts_task_not_leaf',
5413
5440
  'You cannot specify a task that has sub tasks here.',
5414
- @property, @sourceFileInfo[1])
5441
+ @sourceFileInfo[1], @property)
5415
5442
  end
5416
- scenarioIdx = @timeSheet.scenarioIdx
5417
- taskStart = @property['start', scenarioIdx] || @project['start']
5418
- taskEnd = @property['end', scenarioIdx] || @project['end']
5419
5443
 
5420
5444
  @timeSheetRecord = TimeSheetRecord.new(@timeSheet, @property)
5421
5445
  @timeSheetRecord.sourceFileInfo = @sourceFileInfo[0]
@@ -5433,7 +5457,7 @@ EOT
5433
5457
  pattern(%w( !date ), lambda {
5434
5458
  if @val[0] < @project['start'] || @val[0] > @project['end']
5435
5459
  error('date_in_range', "Date must be within the project time frame " +
5436
- "#{@project['start']} - #{@project['end']}", nil,
5460
+ "#{@project['start']} - #{@project['end']}",
5437
5461
  @sourceFileInfo[0])
5438
5462
  end
5439
5463
  @val[0]
@@ -5443,7 +5467,7 @@ EOT
5443
5467
  def rule_validTimeZone
5444
5468
  pattern(%w( $STRING ), lambda {
5445
5469
  unless TjTime.checkTimeZone(@val[0])
5446
- error('bad_time_zone', "#{@val[0]} is not a known time zone", nil,
5470
+ error('bad_time_zone', "#{@val[0]} is not a known time zone",
5447
5471
  @sourceFileInfo[0])
5448
5472
  end
5449
5473
  @val[0]
@@ -5458,7 +5482,7 @@ EOT
5458
5482
  if mode == 0
5459
5483
  unless @val[0] < endSpec
5460
5484
  error('start_before_end', "The end date (#{endSpec}) must be " +
5461
- "after the start date (#{@val[0]}).", nil,
5485
+ "after the start date (#{@val[0]}).",
5462
5486
  @sourceFileInfo[1])
5463
5487
  end
5464
5488
  iv = Interval.new(@val[0], endSpec)
@@ -5495,7 +5519,7 @@ EOT
5495
5519
  if mode == 0
5496
5520
  unless @val[0] < endSpec
5497
5521
  error('start_before_end', "The end date (#{endSpec}) must be after " +
5498
- "the start date (#{@val[0]}).", nil, @sourceFileInfo[1])
5522
+ "the start date (#{@val[0]}).", @sourceFileInfo[1])
5499
5523
  end
5500
5524
  iv = Interval.new(@val[0], endSpec)
5501
5525
  else
@@ -5610,7 +5634,7 @@ EOT
5610
5634
  # 1.0.
5611
5635
  if @val[0] < 0.0 || @val[0] > 100.0
5612
5636
  error('illegal_percentage',
5613
- "Percentage values must be between 0 and 100%.", nil,
5637
+ "Percentage values must be between 0 and 100%.",
5614
5638
  @sourceFileInfo[1])
5615
5639
  end
5616
5640
  @val[0] / 100.0