taskjuggler 0.0.2 → 0.0.3

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 (432) hide show
  1. data/Rakefile +1 -0
  2. data/benchmarks/depends.tjp +2 -1
  3. data/benchmarks/htmltaskreport.tjp +2 -1
  4. data/doc/classes/AppConfig.html +124 -120
  5. data/doc/classes/Arguments.html +10 -6
  6. data/doc/classes/Object.html +229 -0
  7. data/doc/classes/String.html +35 -31
  8. data/doc/classes/TaskJuggler/Account.html +18 -18
  9. data/doc/classes/TaskJuggler/AccountAttribute.html +261 -0
  10. data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
  11. data/doc/classes/TaskJuggler/Allocation.html +34 -30
  12. data/doc/classes/TaskJuggler/AllocationAttribute.html +70 -70
  13. data/doc/classes/TaskJuggler/AttributeBase.html +131 -147
  14. data/doc/classes/TaskJuggler/AttributeDefinition.html +38 -21
  15. data/doc/classes/TaskJuggler/BatchProcessor.html +313 -0
  16. data/doc/classes/TaskJuggler/Booking.html +22 -18
  17. data/doc/classes/TaskJuggler/BookingListAttribute.html +42 -42
  18. data/doc/classes/TaskJuggler/BooleanAttribute.html +40 -40
  19. data/doc/classes/TaskJuggler/CSVFile.html +28 -24
  20. data/doc/classes/TaskJuggler/Charge.html +22 -18
  21. data/doc/classes/TaskJuggler/ChargeListAttribute.html +30 -30
  22. data/doc/classes/TaskJuggler/ChargeSet.html +41 -37
  23. data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +46 -46
  24. data/doc/classes/TaskJuggler/ColumnListAttribute.html +231 -0
  25. data/doc/classes/TaskJuggler/ColumnTable.html +23 -21
  26. data/doc/classes/TaskJuggler/DateAttribute.html +20 -20
  27. data/doc/classes/TaskJuggler/DefinitionListAttribute.html +162 -0
  28. data/doc/classes/TaskJuggler/DependencyListAttribute.html +46 -46
  29. data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
  30. data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
  31. data/doc/classes/TaskJuggler/FlagListAttribute.html +42 -42
  32. data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
  33. data/doc/classes/TaskJuggler/FormatListAttribute.html +197 -0
  34. data/doc/classes/TaskJuggler/GanttChart.html +236 -207
  35. data/doc/classes/TaskJuggler/GanttContainer.html +46 -42
  36. data/doc/classes/TaskJuggler/GanttHeader.html +16 -12
  37. data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +16 -12
  38. data/doc/classes/TaskJuggler/GanttLine.html +28 -24
  39. data/doc/classes/TaskJuggler/GanttLoadStack.html +22 -18
  40. data/doc/classes/TaskJuggler/GanttMilestone.html +46 -42
  41. data/doc/classes/TaskJuggler/GanttRouter.html +104 -98
  42. data/doc/classes/TaskJuggler/GanttTaskBar.html +46 -42
  43. data/doc/classes/TaskJuggler/HTMLDocument.html +12 -12
  44. data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
  45. data/doc/classes/TaskJuggler/Interval.html +126 -120
  46. data/doc/classes/TaskJuggler/IntervalListAttribute.html +46 -46
  47. data/doc/classes/TaskJuggler/JobInfo.html +284 -0
  48. data/doc/classes/TaskJuggler/Journal.html +197 -0
  49. data/doc/classes/TaskJuggler/JournalEntry.html +218 -0
  50. data/doc/classes/TaskJuggler/KeywordArray.html +179 -0
  51. data/doc/classes/TaskJuggler/KeywordDocumentation.html +445 -396
  52. data/doc/classes/TaskJuggler/Limits/Limit.html +34 -30
  53. data/doc/classes/TaskJuggler/Limits.html +68 -62
  54. data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
  55. data/doc/classes/TaskJuggler/ListAttributeBase.html +207 -0
  56. data/doc/classes/TaskJuggler/Log.html +72 -68
  57. data/doc/classes/TaskJuggler/LogicalAttribute.html +38 -34
  58. data/doc/classes/TaskJuggler/LogicalExpression.html +16 -12
  59. data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +194 -0
  60. data/doc/classes/TaskJuggler/LogicalFlag.html +32 -32
  61. data/doc/classes/TaskJuggler/LogicalFunction.html +28 -24
  62. data/doc/classes/TaskJuggler/LogicalOperation.html +17 -13
  63. data/doc/classes/TaskJuggler/Macro.html +10 -6
  64. data/doc/classes/TaskJuggler/MacroParser.html +36 -36
  65. data/doc/classes/TaskJuggler/MacroTable.html +40 -36
  66. data/doc/classes/TaskJuggler/Message.html +16 -12
  67. data/doc/classes/TaskJuggler/MessageHandler.html +16 -12
  68. data/doc/classes/TaskJuggler/Navigator.html +249 -0
  69. data/doc/classes/TaskJuggler/OnShiftCache.html +316 -0
  70. data/doc/classes/TaskJuggler/Project.html +1064 -678
  71. data/doc/classes/TaskJuggler/ProjectFileParser.html +90 -85
  72. data/doc/classes/TaskJuggler/PropertyAttribute.html +194 -0
  73. data/doc/classes/TaskJuggler/PropertyList.html +114 -113
  74. data/doc/classes/TaskJuggler/PropertySet.html +355 -312
  75. data/doc/classes/TaskJuggler/PropertyTreeNode.html +527 -474
  76. data/doc/classes/TaskJuggler/Query.html +90 -85
  77. data/doc/classes/TaskJuggler/RTPNavigator.html +292 -0
  78. data/doc/classes/TaskJuggler/RTPReport.html +301 -0
  79. data/doc/classes/TaskJuggler/RealFormat.html +114 -57
  80. data/doc/classes/TaskJuggler/RealFormatAttribute.html +162 -0
  81. data/doc/classes/TaskJuggler/ReferenceAttribute.html +87 -20
  82. data/doc/classes/TaskJuggler/Report.html +82 -291
  83. data/doc/classes/TaskJuggler/ReportBase.html +448 -0
  84. data/doc/classes/TaskJuggler/ReportContext.html +243 -0
  85. data/doc/classes/TaskJuggler/ReportTable.html +158 -129
  86. data/doc/classes/TaskJuggler/ReportTableCell.html +30 -26
  87. data/doc/classes/TaskJuggler/ReportTableColumn.html +29 -25
  88. data/doc/classes/TaskJuggler/ReportTableLegend.html +28 -24
  89. data/doc/classes/TaskJuggler/ReportTableLine.html +34 -30
  90. data/doc/classes/TaskJuggler/Resource.html +12 -12
  91. data/doc/classes/TaskJuggler/ResourceListAttribute.html +46 -46
  92. data/doc/classes/TaskJuggler/ResourceListRE.html +49 -57
  93. data/doc/classes/TaskJuggler/ResourceScenario.html +126 -126
  94. data/doc/classes/TaskJuggler/RichText.html +52 -48
  95. data/doc/classes/TaskJuggler/RichTextAttribute.html +30 -30
  96. data/doc/classes/TaskJuggler/RichTextDocument.html +41 -37
  97. data/doc/classes/TaskJuggler/RichTextElement.html +274 -264
  98. data/doc/classes/TaskJuggler/RichTextException.html +13 -13
  99. data/doc/classes/TaskJuggler/RichTextParser.html +48 -47
  100. data/doc/classes/TaskJuggler/RichTextProtocolExample.html +52 -55
  101. data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +55 -10
  102. data/doc/classes/TaskJuggler/RichTextScanner.html +106 -245
  103. data/doc/classes/TaskJuggler/RichTextSnip.html +28 -24
  104. data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +381 -301
  105. data/doc/classes/TaskJuggler/Scenario.html +6 -6
  106. data/doc/classes/TaskJuggler/ScenarioData.html +40 -36
  107. data/doc/classes/TaskJuggler/ScenarioListAttribute.html +229 -0
  108. data/doc/classes/TaskJuggler/Scoreboard.html +70 -66
  109. data/doc/classes/TaskJuggler/Shift.html +18 -18
  110. data/doc/classes/TaskJuggler/ShiftAssignment.html +58 -54
  111. data/doc/classes/TaskJuggler/ShiftAssignments.html +82 -78
  112. data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
  113. data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
  114. data/doc/classes/TaskJuggler/SortListAttribute.html +196 -0
  115. data/doc/classes/TaskJuggler/SourceFileInfo.html +16 -12
  116. data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
  117. data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
  118. data/doc/classes/TaskJuggler/SyntaxReference.html +46 -42
  119. data/doc/classes/TaskJuggler/TOCEntry.html +16 -12
  120. data/doc/classes/TaskJuggler/TableColumnDefinition.html +48 -33
  121. data/doc/classes/TaskJuggler/TableOfContents.html +22 -18
  122. data/doc/classes/TaskJuggler/TableReport.html +1036 -0
  123. data/doc/classes/TaskJuggler/Task.html +12 -12
  124. data/doc/classes/TaskJuggler/TaskDependency.html +16 -12
  125. data/doc/classes/TaskJuggler/TaskListAttribute.html +46 -46
  126. data/doc/classes/TaskJuggler/TaskListRE.html +49 -58
  127. data/doc/classes/TaskJuggler/TaskScenario.html +1270 -1180
  128. data/doc/classes/TaskJuggler/TextParser/Pattern.html +100 -96
  129. data/doc/classes/TaskJuggler/TextParser/Rule.html +88 -84
  130. data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -12
  131. data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
  132. data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +10 -6
  133. data/doc/classes/TaskJuggler/TextParser.html +203 -140
  134. data/doc/classes/TaskJuggler/TextReport.html +364 -0
  135. data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
  136. data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +50 -42
  137. data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +16 -12
  138. data/doc/classes/TaskJuggler/TextScanner.html +334 -240
  139. data/doc/classes/TaskJuggler/TjException.html +6 -6
  140. data/doc/classes/TaskJuggler/TjTime.html +547 -497
  141. data/doc/classes/TaskJuggler/TjpExample.html +29 -25
  142. data/doc/classes/TaskJuggler/TjpExportRE.html +77 -97
  143. data/doc/classes/TaskJuggler/TjpSyntaxRules.html +3911 -3886
  144. data/doc/classes/TaskJuggler/UserManual.html +54 -54
  145. data/doc/classes/TaskJuggler/WorkingHours.html +53 -49
  146. data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -85
  147. data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
  148. data/doc/classes/TaskJuggler/XMLComment.html +21 -21
  149. data/doc/classes/TaskJuggler/XMLDocument.html +28 -24
  150. data/doc/classes/TaskJuggler/XMLElement.html +70 -58
  151. data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
  152. data/doc/classes/TaskJuggler/XMLText.html +36 -36
  153. data/doc/classes/TaskJuggler.html +266 -183
  154. data/doc/files/COPYING.html +1 -1
  155. data/doc/files/README.html +1 -1
  156. data/doc/files/lib/AccountScenario_rb.html +1 -1
  157. data/doc/files/lib/Account_rb.html +1 -1
  158. data/doc/files/lib/Allocation_rb.html +1 -1
  159. data/doc/files/lib/AppConfig_rb.html +1 -1
  160. data/doc/files/lib/AttributeBase_rb.html +11 -1
  161. data/doc/files/lib/AttributeDefinition_rb.html +1 -1
  162. data/doc/files/lib/Attributes_rb.html +1 -1
  163. data/doc/files/lib/{LogicalFlag_rb.html → BatchProcessor_rb.html} +8 -6
  164. data/doc/files/lib/Booking_rb.html +1 -1
  165. data/doc/files/lib/ChargeSet_rb.html +1 -1
  166. data/doc/files/lib/Charge_rb.html +1 -1
  167. data/doc/files/lib/HTMLDocument_rb.html +1 -1
  168. data/doc/files/lib/Interval_rb.html +1 -1
  169. data/doc/files/lib/Journal_rb.html +106 -0
  170. data/doc/files/lib/KeywordArray_rb.html +106 -0
  171. data/doc/files/lib/KeywordDocumentation_rb.html +1 -1
  172. data/doc/files/lib/Limits_rb.html +1 -1
  173. data/doc/files/lib/Log_rb.html +1 -1
  174. data/doc/files/lib/LogicalExpression_rb.html +1 -3
  175. data/doc/files/lib/LogicalFunction_rb.html +1 -1
  176. data/doc/files/lib/LogicalOperation_rb.html +1 -1
  177. data/doc/files/lib/MacroParser_rb.html +1 -1
  178. data/doc/files/lib/MacroTable_rb.html +1 -1
  179. data/doc/files/lib/MessageHandler_rb.html +1 -1
  180. data/doc/files/lib/Message_rb.html +1 -1
  181. data/doc/files/lib/ProjectFileParser_rb.html +5 -1
  182. data/doc/files/lib/Project_rb.html +5 -1
  183. data/doc/files/lib/PropertyList_rb.html +1 -1
  184. data/doc/files/lib/PropertySet_rb.html +1 -1
  185. data/doc/files/lib/PropertyTreeNode_rb.html +1 -1
  186. data/doc/files/lib/Query_rb.html +1 -1
  187. data/doc/files/lib/RTPNavigator_rb.html +120 -0
  188. data/doc/files/lib/RTPReport_rb.html +118 -0
  189. data/doc/files/lib/RealFormat_rb.html +1 -1
  190. data/doc/files/lib/ResourceScenario_rb.html +1 -1
  191. data/doc/files/lib/Resource_rb.html +1 -1
  192. data/doc/files/lib/RichTextDocument_rb.html +1 -1
  193. data/doc/files/lib/RichTextElement_rb.html +1 -1
  194. data/doc/files/lib/RichTextParser_rb.html +1 -1
  195. data/doc/files/lib/RichTextProtocolExample_rb.html +1 -1
  196. data/doc/files/lib/RichTextProtocolHandler_rb.html +1 -1
  197. data/doc/files/lib/RichTextScanner_rb.html +1 -1
  198. data/doc/files/lib/RichTextSnip_rb.html +1 -1
  199. data/doc/files/lib/RichTextSyntaxRules_rb.html +1 -1
  200. data/doc/files/lib/RichText_rb.html +1 -1
  201. data/doc/files/lib/ScenarioData_rb.html +1 -1
  202. data/doc/files/lib/Scenario_rb.html +1 -1
  203. data/doc/files/lib/Scoreboard_rb.html +1 -1
  204. data/doc/files/lib/ShiftAssignments_rb.html +1 -1
  205. data/doc/files/lib/ShiftScenario_rb.html +1 -1
  206. data/doc/files/lib/Shift_rb.html +1 -1
  207. data/doc/files/lib/SourceFileInfo_rb.html +1 -1
  208. data/doc/files/lib/SyntaxReference_rb.html +1 -1
  209. data/doc/files/lib/TOCEntry_rb.html +1 -1
  210. data/doc/files/lib/TableColumnDefinition_rb.html +1 -1
  211. data/doc/files/lib/TableOfContents_rb.html +1 -1
  212. data/doc/files/lib/TaskDependency_rb.html +1 -1
  213. data/doc/files/lib/TaskJuggler_rb.html +1 -1
  214. data/doc/files/lib/TaskScenario_rb.html +1 -1
  215. data/doc/files/lib/Task_rb.html +1 -1
  216. data/doc/files/lib/TextParser/Pattern_rb.html +1 -1
  217. data/doc/files/lib/TextParser/Rule_rb.html +1 -1
  218. data/doc/files/lib/TextParser/StackElement_rb.html +1 -1
  219. data/doc/files/lib/TextParser/TokenDoc_rb.html +1 -1
  220. data/doc/files/lib/TextParser_rb.html +1 -1
  221. data/doc/files/lib/TextScanner_rb.html +1 -1
  222. data/doc/files/lib/Tj3Config_rb.html +1 -1
  223. data/doc/files/lib/TjException_rb.html +1 -1
  224. data/doc/files/lib/TjTime_rb.html +1 -1
  225. data/doc/files/lib/TjpExample_rb.html +1 -1
  226. data/doc/files/lib/TjpSyntaxRules_rb.html +1 -1
  227. data/doc/files/lib/UTF8String_rb.html +1 -1
  228. data/doc/files/lib/UserManual_rb.html +1 -1
  229. data/doc/files/lib/WorkingHours_rb.html +1 -1
  230. data/doc/files/lib/XMLDocument_rb.html +1 -1
  231. data/doc/files/lib/XMLElement_rb.html +1 -1
  232. data/doc/files/lib/deep_copy_rb.html +106 -0
  233. data/doc/files/lib/ms_test_rb.html +90 -0
  234. data/doc/files/lib/reports/CSVFile_rb.html +1 -1
  235. data/doc/files/lib/reports/ColumnTable_rb.html +1 -1
  236. data/doc/files/lib/reports/GanttChart_rb.html +1 -1
  237. data/doc/files/lib/reports/GanttContainer_rb.html +1 -1
  238. data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  239. data/doc/files/lib/reports/GanttHeader_rb.html +1 -1
  240. data/doc/files/lib/reports/GanttLine_rb.html +1 -1
  241. data/doc/files/lib/reports/GanttLoadStack_rb.html +1 -1
  242. data/doc/files/lib/reports/GanttMilestone_rb.html +1 -1
  243. data/doc/files/lib/reports/GanttRouter_rb.html +1 -1
  244. data/doc/files/lib/reports/GanttTaskBar_rb.html +1 -1
  245. data/doc/files/lib/reports/HTMLGraphics_rb.html +1 -1
  246. data/doc/files/lib/reports/{ReportElement_rb.html → Navigator_rb.html} +6 -8
  247. data/doc/files/lib/reports/ReportBase_rb.html +106 -0
  248. data/doc/files/lib/reports/ReportContext_rb.html +106 -0
  249. data/doc/files/lib/reports/ReportTableCell_rb.html +1 -1
  250. data/doc/files/lib/reports/ReportTableColumn_rb.html +1 -1
  251. data/doc/files/lib/reports/ReportTableLegend_rb.html +1 -1
  252. data/doc/files/lib/reports/ReportTableLine_rb.html +1 -1
  253. data/doc/files/lib/reports/ReportTable_rb.html +1 -1
  254. data/doc/files/lib/reports/Report_rb.html +8 -2
  255. data/doc/files/lib/reports/ResourceListRE_rb.html +2 -2
  256. data/doc/files/lib/reports/{ReportTableElement_rb.html → TableReport_rb.html} +7 -5
  257. data/doc/files/lib/reports/TaskListRE_rb.html +2 -2
  258. data/doc/files/lib/reports/TextReport_rb.html +116 -0
  259. data/doc/files/lib/reports/TjpExportRE_rb.html +2 -2
  260. data/doc/files/lib/taskjuggler3_rb.html +61 -56
  261. data/doc/files/lib/tj3man_rb.html +1 -1
  262. data/doc/fr_class_index.html +41 -3
  263. data/doc/fr_file_index.html +21 -5
  264. data/doc/fr_method_index.html +1069 -959
  265. data/examples/ContactList.html +1467 -0
  266. data/examples/Deliveries.html +485 -0
  267. data/examples/Development.html +2525 -0
  268. data/examples/Overview.html +747 -0
  269. data/examples/Resource Graph.html +616 -0
  270. data/examples/tutorial.tjp +63 -67
  271. data/lib/AttributeBase.rb +27 -31
  272. data/lib/AttributeDefinition.rb +12 -7
  273. data/lib/Attributes.rb +134 -34
  274. data/lib/Interval.rb +2 -0
  275. data/lib/Journal.rb +44 -0
  276. data/lib/{LogicalFlag.rb → KeywordArray.rb} +5 -13
  277. data/lib/KeywordDocumentation.rb +84 -47
  278. data/lib/Limits.rb +7 -5
  279. data/lib/LogicalExpression.rb +1 -1
  280. data/lib/LogicalOperation.rb +33 -0
  281. data/lib/Project.rb +313 -99
  282. data/lib/ProjectFileParser.rb +88 -11
  283. data/lib/PropertyList.rb +2 -1
  284. data/lib/PropertySet.rb +13 -4
  285. data/lib/PropertyTreeNode.rb +34 -15
  286. data/lib/Query.rb +2 -1
  287. data/lib/RTPNavigator.rb +53 -0
  288. data/lib/RTPReport.rb +62 -0
  289. data/lib/RealFormat.rb +28 -10
  290. data/lib/RichTextElement.rb +18 -12
  291. data/lib/RichTextParser.rb +1 -0
  292. data/lib/RichTextProtocolExample.rb +8 -11
  293. data/lib/RichTextProtocolHandler.rb +11 -1
  294. data/lib/RichTextScanner.rb +308 -164
  295. data/lib/RichTextSyntaxRules.rb +24 -0
  296. data/lib/TableColumnDefinition.rb +5 -1
  297. data/lib/TaskJuggler.rb +3 -2
  298. data/lib/TaskScenario.rb +123 -31
  299. data/lib/TextParser.rb +14 -3
  300. data/lib/TextScanner.rb +210 -34
  301. data/lib/Tj3Config.rb +1 -1
  302. data/lib/TjTime.rb +15 -0
  303. data/lib/TjpExample.rb +1 -1
  304. data/lib/TjpSyntaxRules.rb +674 -473
  305. data/lib/WorkingHours.rb +1 -1
  306. data/lib/XMLElement.rb +11 -3
  307. data/lib/deep_copy.rb +72 -0
  308. data/lib/ms_test.rb +27 -0
  309. data/lib/reports/ColumnTable.rb +7 -5
  310. data/lib/reports/GanttChart.rb +60 -34
  311. data/lib/reports/GanttHeader.rb +1 -1
  312. data/lib/reports/GanttRouter.rb +7 -5
  313. data/lib/reports/Navigator.rb +72 -0
  314. data/lib/reports/Report.rb +58 -73
  315. data/lib/reports/ReportBase.rb +241 -0
  316. data/lib/reports/ReportContext.rb +41 -0
  317. data/lib/reports/ReportTable.rb +7 -2
  318. data/lib/reports/ReportTableCell.rb +3 -3
  319. data/lib/reports/ResourceListRE.rb +19 -26
  320. data/lib/reports/{ReportTableElement.rb → TableReport.rb} +297 -97
  321. data/lib/reports/TaskListRE.rb +16 -24
  322. data/lib/reports/TextReport.rb +87 -0
  323. data/lib/reports/TjpExportRE.rb +55 -50
  324. data/lib/taskjuggler3.rb +6 -1
  325. data/manual/Getting_Started +57 -6
  326. data/manual/How_To_Contribute +2 -4
  327. data/manual/Intro +2 -2
  328. data/manual/Reporting_Bugs +9 -2
  329. data/manual/Rich_Text_Attributes +41 -0
  330. data/manual/Tutorial +219 -173
  331. data/tasks/test.rake +3 -0
  332. data/test/TestSuite/CSV-Reports/celltext.tjp +2 -1
  333. data/test/TestSuite/CSV-Reports/resourcereport.tjp +2 -1
  334. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +2 -1
  335. data/test/TestSuite/CSV-Reports/sortByTree.tjp +2 -1
  336. data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +2 -1
  337. data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +2 -1
  338. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +2 -1
  339. data/test/TestSuite/CSV-Reports/taskreport.tjp +2 -1
  340. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +2 -1
  341. data/test/TestSuite/HTML-Reports/depArrows.tjp +72 -0
  342. data/test/TestSuite/HTML-Reports/reference-export.html +187 -0
  343. data/test/TestSuite/HTML-Reports/reference.tjp +21 -0
  344. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -1
  345. data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +3 -3
  346. data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
  347. data/test/TestSuite/Scheduler/Correct/Container-2.tjp +37 -0
  348. data/test/TestSuite/Scheduler/Correct/Container.tjp +40 -0
  349. data/test/TestSuite/Scheduler/Correct/Depends.tjp +9 -14
  350. data/test/TestSuite/Scheduler/Correct/Duration.tjp +2 -1
  351. data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +20 -29
  352. data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -13
  353. data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +6 -5
  354. data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +10 -6
  355. data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +9 -6
  356. data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +9 -6
  357. data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +13 -10
  358. data/test/TestSuite/Scheduler/Correct/Precedes.tjp +9 -14
  359. data/test/TestSuite/Scheduler/Correct/Shift.tjp +9 -8
  360. data/test/TestSuite/Scheduler/Correct/checks.tji +4 -0
  361. data/test/TestSuite/Scheduler/Errors/weak_end_dep.tjp +16 -0
  362. data/test/TestSuite/Scheduler/Errors/weak_start_dep.tjp +16 -0
  363. data/test/TestSuite/Syntax/Correct/Account.tjp +1 -1
  364. data/test/TestSuite/Syntax/Correct/AutoID.tjp +21 -0
  365. data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +2 -1
  366. data/test/TestSuite/Syntax/Correct/Caption.tjp +7 -6
  367. data/test/TestSuite/Syntax/Correct/Celltext.tjp +7 -4
  368. data/test/TestSuite/Syntax/Correct/Comments.tjp +1 -1
  369. data/test/TestSuite/Syntax/Correct/CompletedWork.tji +11 -19
  370. data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +4 -3
  371. data/test/TestSuite/Syntax/Correct/Export.tjp +3 -1
  372. data/test/TestSuite/Syntax/Correct/Flags.tjp +2 -1
  373. data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +2 -1
  374. data/test/TestSuite/Syntax/Correct/Journal.tjp +18 -0
  375. data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +2 -1
  376. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +16 -0
  377. data/test/TestSuite/Syntax/Correct/Period.tjp +2 -1
  378. data/test/TestSuite/Syntax/Correct/RawHTML.tjp +4 -2
  379. data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -2
  380. data/test/TestSuite/Syntax/Correct/ResourcePrefix.tji +2 -0
  381. data/test/TestSuite/Syntax/Correct/ResourcePrefix.tjp +23 -0
  382. data/test/TestSuite/Syntax/Correct/Responsible.tjp +1 -1
  383. data/test/TestSuite/Syntax/Correct/Simple.tjp +1 -1
  384. data/test/TestSuite/Syntax/Correct/String.tjp +1 -1
  385. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +2 -1
  386. data/test/TestSuite/Syntax/Correct/tutorial.tjp +92 -70
  387. data/test/TestSuite/Syntax/Errors/bad_comment.tjp +7 -0
  388. data/test/TestSuite/Syntax/Errors/bad_include.tjp +1 -1
  389. data/test/TestSuite/Syntax/Errors/bad_time_zone.tjp +6 -0
  390. data/test/TestSuite/Syntax/Errors/bad_timing_res.tjp +5 -0
  391. data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +1 -1
  392. data/test/TestSuite/Syntax/Errors/container_attribute.tjp +1 -1
  393. data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +3 -2
  394. data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +1 -1
  395. data/test/TestSuite/Syntax/Errors/eof_in_istring1.tjp +5 -0
  396. data/test/TestSuite/Syntax/Errors/eof_in_istring2.tjp +5 -0
  397. data/test/TestSuite/Syntax/Errors/eof_in_istring3.tjp +6 -0
  398. data/test/TestSuite/Syntax/Errors/eof_in_istring4.tjp +6 -0
  399. data/test/TestSuite/Syntax/Errors/eof_in_istring5.tjp +6 -0
  400. data/test/TestSuite/Syntax/Errors/include_recursion.tji +1 -0
  401. data/test/TestSuite/Syntax/Errors/include_recursion.tjp +7 -0
  402. data/test/TestSuite/Syntax/Errors/junk_after_cut.tjp +6 -0
  403. data/test/TestSuite/Syntax/Errors/navigator_exists.tjp +10 -0
  404. data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +1 -1
  405. data/test/TestSuite/Syntax/Errors/report_end.tjp +1 -1
  406. data/test/TestSuite/Syntax/Errors/report_exists.tjp +10 -0
  407. data/test/TestSuite/Syntax/Errors/report_start.tjp +1 -1
  408. data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +1 -1
  409. data/test/TestSuite/Syntax/Errors/sort_direction.tjp +1 -1
  410. data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +1 -1
  411. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +1 -1
  412. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +1 -1
  413. data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +1 -1
  414. data/test/TestSuite/Syntax/Errors/too_large_timing_res.tjp +7 -0
  415. data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +1 -1
  416. data/test/TestSuite/Syntax/Errors/unknown_task.tjp +1 -1
  417. data/test/all.rb +1 -16
  418. data/test/test_CSV-Reports.rb +8 -5
  419. data/test/test_Query.rb +2 -2
  420. data/test/test_RichText.rb +95 -0
  421. data/test/test_Scheduler.rb +8 -4
  422. data/test/test_Syntax.rb +8 -4
  423. data/test/test_deep_copy.rb +83 -0
  424. metadata +549 -487
  425. data/benchmarks/UTF-8-Strings.rb +0 -58
  426. data/doc/classes/TaskJuggler/ReportElement.html +0 -1070
  427. data/doc/classes/TaskJuggler/ReportTableElement.html +0 -644
  428. data/lib/reports/ReportElement.rb +0 -427
  429. data/test/TestSuite/Syntax/Correct/csvtest +0 -16
  430. data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +0 -10
  431. data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +0 -10
  432. data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +0 -10
data/lib/TaskScenario.rb CHANGED
@@ -64,6 +64,14 @@ class TaskJuggler
64
64
  @property['end', @scenarioIdx] = nil
65
65
  end
66
66
 
67
+ # Milestones may only have start or end date even when the 'scheduled'
68
+ # attribute is set. For further processing, we need to add the missing
69
+ # date.
70
+ if a('milestone') && a('scheduled')
71
+ @property['end', @scenarioIdx] = a('start') if a('start') && !a('end')
72
+ @property['start', @scenarioIdx] = a('end') if !a('start') && a('end')
73
+ end
74
+
67
75
  # Collect the limits of this task and all parent tasks into a single
68
76
  # Array.
69
77
  @limits = []
@@ -265,8 +273,9 @@ class TaskJuggler
265
273
  # - <-- |
266
274
  # - <-- -D
267
275
  # - <-- |D
268
- if durationSpecs == 0 && ((a('forward') && a('end').nil?) ||
269
- (!a('forward') && a('start').nil?))
276
+ if durationSpecs == 0 &&
277
+ ((a('forward') && a('end').nil? && !hasDependencies(true)) ||
278
+ (!a('forward') && a('start').nil? && !hasDependencies(false)))
270
279
  error('task_underspecified',
271
280
  "Task #{@property.fullId} has too few specifations to be " +
272
281
  "scheduled.")
@@ -375,7 +384,6 @@ class TaskJuggler
375
384
  "The start time (#{a('start')}) of task #{@property.fullId} " +
376
385
  "is too late. Must be before #{a('maxstart')}.")
377
386
  end
378
-
379
387
  # Check if the end time is ok
380
388
  error('task_end_undef',
381
389
  "Task #{@property.fullId} has undefined end time") if a('end').nil?
@@ -395,6 +403,13 @@ class TaskJuggler
395
403
  "The end time (#{a('end')}) of task #{@property.fullId} " +
396
404
  "is too late. Must be before #{a('maxend')}.")
397
405
  end
406
+ # Make sure the start is before the end
407
+ if a('start') > a('end')
408
+ error('start_after_end',
409
+ "The start time (#{a('start')}) of task #{@property.fullId} " +
410
+ "is after the end time (#{a('end')}).")
411
+ end
412
+
398
413
 
399
414
  # Check that tasks fits into parent task.
400
415
  unless (parent = @property.parent).nil? ||
@@ -919,22 +934,18 @@ class TaskJuggler
919
934
  a('length') > 0 || a('duration') > 0 || a('effort') > 0 || a('milestone')
920
935
  end
921
936
 
922
- # This function checks if the task has a dependency on another task or
923
- # fixed date for a certain end. If +atEnd+ is true, the task end will be
924
- # checked. Otherwise the start.
925
- def hasDependencies(atEnd)
926
- thisEnd = atEnd ? 'end' : 'start'
927
- !a(thisEnd + 'succs').empty? || !a(thisEnd + 'preds').empty?
928
- end
929
-
937
+ # Find the earliest possible start date for the task. This date must be
938
+ # after the end date of all the task that this task depends on.
939
+ # Dependencies may also require a minimum gap between the tasks.
930
940
  def earliestStart
931
- # puts "Finding earliest start date for #{@property.fullId}"
941
+ # This is the date that we will return.
932
942
  startDate = nil
933
943
  a('depends').each do |dependency|
934
944
  potentialStartDate =
935
945
  dependency.task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
936
946
  return nil if potentialStartDate.nil?
937
947
 
948
+ # Determine the end date of a 'length' gap.
938
949
  dateAfterLengthGap = potentialStartDate
939
950
  gapLength = dependency.gapLength
940
951
  while gapLength > 0 && dateAfterLengthGap < @project['end'] do
@@ -944,6 +955,7 @@ class TaskJuggler
944
955
  dateAfterLengthGap += @project['scheduleGranularity']
945
956
  end
946
957
 
958
+ # Determine the end date of a 'duration' gap.
947
959
  if dateAfterLengthGap > potentialStartDate + dependency.gapDuration
948
960
  potentialStartDate = dateAfterLengthGap
949
961
  else
@@ -960,21 +972,37 @@ class TaskJuggler
960
972
  while (task = task.parent) do
961
973
  if task['start', @scenarioIdx] &&
962
974
  (startDate.nil? || task['start', @scenarioIdx] > startDate)
963
- return task['start', @scenarioIdx]
975
+ startDate = task['start', @scenarioIdx]
976
+ break
964
977
  end
965
978
  end
966
979
 
980
+ # When the computed start date is after the already determined end date
981
+ # of the task, the start dependencies were too weak. This happens when
982
+ # task B depends on A and they are specified this way:
983
+ # task A: | --> D-
984
+ # task B: -D <-- |
985
+ if a('end') && startDate > a('end')
986
+ error('weak_start_dep',
987
+ "Task #{@property.fullId} has a too weak start dependencies " +
988
+ "to be scheduled properly.")
989
+ end
990
+
967
991
  startDate
968
992
  end
969
993
 
994
+ # Find the latest possible end date for the task. This date must be
995
+ # before the start date of all the task that this task precedes.
996
+ # Dependencies may also require a minimum gap between the tasks.
970
997
  def latestEnd
971
- # puts "Finding latest end date for #{@property.fullId}"
998
+ # This is the date that we will return.
972
999
  endDate = nil
973
1000
  a('precedes').each do |dependency|
974
1001
  potentialEndDate =
975
1002
  dependency.task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
976
1003
  return nil if potentialEndDate.nil?
977
1004
 
1005
+ # Determine the end date of a 'length' gap.
978
1006
  dateBeforeLengthGap = potentialEndDate
979
1007
  gapLength = dependency.gapLength
980
1008
  while gapLength > 0 && dateBeforeLengthGap > @project['start'] do
@@ -984,6 +1012,8 @@ class TaskJuggler
984
1012
  end
985
1013
  dateBeforeLengthGap -= @project['scheduleGranularity']
986
1014
  end
1015
+
1016
+ # Determine the end date of a 'duration' gap.
987
1017
  if dateBeforeLengthGap < potentialEndDate - dependency.gapDuration
988
1018
  potentialEndDate = dateBeforeLengthGap
989
1019
  else
@@ -999,10 +1029,22 @@ class TaskJuggler
999
1029
  while (task = task.parent) do
1000
1030
  if task['end', @scenarioIdx] &&
1001
1031
  (endDate.nil? || task['end', @scenarioIdx] < endDate)
1002
- return task['end', @scenarioIdx]
1032
+ endDate = task['end', @scenarioIdx]
1033
+ break
1003
1034
  end
1004
1035
  end
1005
1036
 
1037
+ # When the computed end date is before the already determined start date
1038
+ # of the task, the end dependencies were too weak. This happens when
1039
+ # task A precedes B and they are specified this way:
1040
+ # task A: | --> D-
1041
+ # task B: -D <-- |
1042
+ if a('start') && endDate > a('start')
1043
+ error('weak_end_dep',
1044
+ "Task #{@property.fullId} has a too weak end dependencies " +
1045
+ "to be scheduled properly.")
1046
+ end
1047
+
1006
1048
  endDate
1007
1049
  end
1008
1050
 
@@ -1016,13 +1058,6 @@ class TaskJuggler
1016
1058
  end
1017
1059
  end
1018
1060
 
1019
- def markAsRunaway
1020
- warning('runaway', "Task #{@property.fullId} does not fit into " +
1021
- "project time frame")
1022
-
1023
- @isRunAway = true
1024
- end
1025
-
1026
1061
  def query_complete(query)
1027
1062
  if @property.leaf?
1028
1063
  query.sortableResult = query.numericalResult = a('complete').to_i
@@ -1063,6 +1098,19 @@ class TaskJuggler
1063
1098
  query.result = query.scaleLoad(query.sortableResult)
1064
1099
  end
1065
1100
 
1101
+ # A list of the resources that have been allocated to work on the task in
1102
+ # the report time frame.
1103
+ def query_resources(query)
1104
+ list = ''
1105
+ a('assignedresources').each do |resource|
1106
+ if getAllocatedTime(query.startIdx, query.endIdx, resource) > 0.0
1107
+ list += ', ' unless list.empty?
1108
+ list += resource.id
1109
+ end
1110
+ end
1111
+ query.sortableResult = query.result = list
1112
+ end
1113
+
1066
1114
  # Compute the revenue generated by this Task for a given Account during a
1067
1115
  # given interval. If a Resource is provided as scopeProperty only the
1068
1116
  # revenue directly generated by the resource is taken into account.
@@ -1077,6 +1125,35 @@ class TaskJuggler
1077
1125
  end
1078
1126
  end
1079
1127
 
1128
+ # Compute the total time _resource_ or all resources are allocated during
1129
+ # interval specified by _startIdx_ and _endIdx_.
1130
+ def getAllocatedTime(startIdx, endIdx, resource = nil)
1131
+ return 0.0 if a('milestone')
1132
+
1133
+ allocatedTime = 0.0
1134
+ if @property.container?
1135
+ @property.children.each do |task|
1136
+ allocatedTime += task.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
1137
+ resource)
1138
+ end
1139
+ else
1140
+ if resource
1141
+ allocatedTime += resource.getAllocatedTime(@scenarioIdx,
1142
+ startIdx, endIdx,
1143
+ @property)
1144
+ else
1145
+ a('assignedresources').each do |r|
1146
+ allocatedTime += r.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
1147
+ @property)
1148
+ end
1149
+ end
1150
+ end
1151
+ allocatedTime
1152
+ end
1153
+
1154
+ # Compute the effective work a _resource_ or all resources do during the
1155
+ # interval specified by _startIdx_ and _endIdx_. The effective work is the
1156
+ # actual work multiplied by the efficiency of the resource.
1080
1157
  def getEffectiveWork(startIdx, endIdx, resource = nil)
1081
1158
  return 0.0 if a('milestone')
1082
1159
 
@@ -1335,6 +1412,7 @@ class TaskJuggler
1335
1412
  # booking describes the assignment of a Resource to a certain Task for a
1336
1413
  # specified Interval.
1337
1414
  def bookBookings
1415
+ scheduled = a('scheduled')
1338
1416
  a('booking').each do |booking|
1339
1417
  unless booking.resource.leaf?
1340
1418
  error('booking_resource_not_leaf',
@@ -1363,8 +1441,9 @@ class TaskJuggler
1363
1441
  @lastSlot = date if @lastSlot.nil? || date > @lastSlot
1364
1442
  @tentativeEnd = tEnd if @tentativeEnd.nil? ||
1365
1443
  @tentativeEnd < tEnd
1366
- @property['start', @scenarioIdx] = date if a('start').nil? ||
1367
- date < a('start')
1444
+ if !a('scheduled') && (a('start').nil? || date < a('start'))
1445
+ @property['start', @scenarioIdx] = date
1446
+ end
1368
1447
 
1369
1448
  unless a('assignedresources').include?(booking.resource)
1370
1449
  @property['assignedresources', @scenarioIdx] << booking.resource
@@ -1374,20 +1453,18 @@ class TaskJuggler
1374
1453
  # For tasks with a 'length' we track the covered work time and
1375
1454
  # set the task to 'scheduled' when we have enough length.
1376
1455
  @doneLength += 1
1377
- if @doneLength >= a('length')
1456
+ if !scheduled && @doneLength >= a('length')
1378
1457
  @property['end', @scenarioIdx] = tEnd
1379
1458
  @property['scheduled', @scenarioIdx] = true
1380
1459
  end
1381
1460
  end
1382
1461
  date = tEnd
1383
1462
  end
1384
- if a('duration') > 0
1385
- # For tasks with a 'duration' we track the covered duration and
1386
- # set the task to 'scheduled' when we have enough duration.
1463
+ if a('duration') > 0 && @tentativeEnd
1387
1464
  @doneDuration = ((@tentativeEnd - a('start')) /
1388
1465
  @project['scheduleGranularity']).to_i
1389
- if @doneDuration >= a('duration')
1390
- @property['end', @scenarioIdx] = tEnd
1466
+ if !scheduled && @doneDuration >= a('duration')
1467
+ @property['end', @scenarioIdx] = @tentativeEnd
1391
1468
  @property['scheduled', @scenarioIdx] = true
1392
1469
  end
1393
1470
  end
@@ -1395,6 +1472,21 @@ class TaskJuggler
1395
1472
  end
1396
1473
  end
1397
1474
 
1475
+ # This function checks if the task has a dependency on another task or
1476
+ # fixed date for a certain end. If +atEnd+ is true, the task end will be
1477
+ # checked. Otherwise the start.
1478
+ def hasDependencies(atEnd)
1479
+ thisEnd = atEnd ? 'end' : 'start'
1480
+ !a(thisEnd + 'succs').empty? || !a(thisEnd + 'preds').empty?
1481
+ end
1482
+
1483
+ def markAsRunaway
1484
+ warning('runaway', "Task #{@property.fullId} does not fit into " +
1485
+ "project time frame")
1486
+
1487
+ @isRunAway = true
1488
+ end
1489
+
1398
1490
  # This function determines if a task is really a milestones and marks them
1399
1491
  # accordingly.
1400
1492
  def markMilestone
@@ -1527,7 +1619,7 @@ class TaskJuggler
1527
1619
  # specified completion value.
1528
1620
  def calcCompletion
1529
1621
  # If the user provided a completion degree we are not touching it.
1530
- if property.provided('complete')
1622
+ if @property.provided('complete', @scenarioIdx)
1531
1623
  return
1532
1624
  end
1533
1625
 
data/lib/TextParser.rb CHANGED
@@ -97,7 +97,14 @@ class TaskJuggler
97
97
  def newRule(name)
98
98
  raise "Fatal Error: Rule #{name} already exists" if @rules.has_key?(name)
99
99
 
100
- @rules[name] = @cr = TextParser::Rule.new(name)
100
+ if block_given?
101
+ saveCr = @cr
102
+ @rules[name] = @cr = TextParser::Rule.new(name)
103
+ yield
104
+ @cr = saveCr
105
+ else
106
+ @rules[name] = @cr = TextParser::Rule.new(name)
107
+ end
101
108
  end
102
109
 
103
110
  # Add a new pattern to the most recently added rule. _tokens_ is an array of
@@ -140,7 +147,7 @@ class TaskJuggler
140
147
  # To parse the input this function needs to be called with the name of the
141
148
  # rule to start with. It returns the result of the processing function of
142
149
  # the top-level parser rule that was specified by _ruleName_.
143
- def parse(ruleName, enforceEndOfFile = true)
150
+ def parse(ruleName)
144
151
  @stack = []
145
152
  @@expectedTokens = []
146
153
  updateParserTables
@@ -175,6 +182,10 @@ class TaskJuggler
175
182
  @scanner.error(id, text, property)
176
183
  end
177
184
 
185
+ def warning(id, text, property = nil)
186
+ @scanner.warning(id, text, property)
187
+ end
188
+
178
189
  private
179
190
 
180
191
  # getTransitions recursively determines all possible target tokens
@@ -197,7 +208,7 @@ class TaskJuggler
197
208
  if token[0] == ?!
198
209
  unless @rules.has_key?(tokenId)
199
210
  raise "Fatal Error: Unknown reference to #{tokenId} in pattern " +
200
- "#{pat} + of rule #{rule.name}"
211
+ "#{pat} + of rule #{rule.name}"
201
212
  end
202
213
  refRule = @rules[tokenId]
203
214
  # If the referenced rule describes optional content, we need to look