taskjuggler 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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