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/TextScanner.rb CHANGED
@@ -71,13 +71,21 @@ class TaskJuggler
71
71
  def getc19
72
72
  Log.activity if @bytes & 0x3FFF == 0
73
73
  @bytes += 1
74
- @file.getc
74
+ begin
75
+ @file.getc
76
+ rescue
77
+ nil
78
+ end
75
79
  end
76
80
 
77
81
  def getc18
78
82
  Log.activity if @bytes & 0x3FFF == 0
79
83
  @bytes += 1
80
- c = @file.getc
84
+ begin
85
+ c = @file.getc
86
+ rescue
87
+ return nil
88
+ end
81
89
  return nil if c.nil?
82
90
  '' << c
83
91
  end
@@ -165,7 +173,7 @@ class TaskJuggler
165
173
  end
166
174
  end
167
175
  @masterPath = @cf.dirname + '/'
168
- @tokenBuffer = @pos = nil
176
+ @tokenBuffer = @pos = @lastPos = nil
169
177
  end
170
178
 
171
179
  # Finish processing and reset all data structures.
@@ -173,27 +181,39 @@ class TaskJuggler
173
181
  Log.startProgressMeter("Reading file #{@masterFile}")
174
182
  Log.stopProgressMeter
175
183
  @fileStack = []
176
- @cf = @tokenBuffer = @pos = nil
184
+ @cf = @tokenBuffer = nil
177
185
  end
178
186
 
179
187
  # Continue processing with a new file specified by _fileName_. When this
180
188
  # file is finished, we will continue in the old file after the location
181
189
  # where we started with the new file.
182
190
  def include(fileName)
183
- begin
184
- if @fileStack.empty?
185
- path = @masterPath
186
- else
187
- path = @fileStack.last[0].dirname + '/'
188
- @fileStack.last[1, 2] = [ @tokenBuffer, @pos ]
189
- end
190
- if fileName[0] != '/'
191
- # If the included file is not an absolute name, we interpret the file
192
- # name relative to the including file.
193
- fileName = path + fileName
194
- end
191
+ if @fileStack.empty?
192
+ path = @masterPath
193
+ else
194
+ path = @fileStack.last[0].dirname + '/'
195
+ @fileStack.last[1, 2] = [ @tokenBuffer, @pos ]
196
+ end
197
+ if fileName[0] != '/'
198
+ # If the included file is not an absolute name, we interpret the file
199
+ # name relative to the including file.
200
+ fileName = path + fileName
201
+ end
202
+
203
+ @tokenBuffer = nil
195
204
 
196
- @tokenBuffer = @pos = nil
205
+ # Check the current file stack to find recusions.
206
+ if @pos && fileName == @pos.fileName
207
+ error('include_recursion', "Recursive inclusion of #{fileName} detected")
208
+ else
209
+ @fileStack.each do |entry|
210
+ if fileName == entry[0].fileName
211
+ error('include_recursion', "Recursive inclusion of #{fileName} " +
212
+ "detected")
213
+ end
214
+ end
215
+ end
216
+ begin
197
217
  @fileStack << [ (@cf = FileStreamHandle.new(fileName)), nil, nil ]
198
218
  rescue StandardError
199
219
  error('bad_include', "Cannot open include file #{fileName}")
@@ -229,11 +249,13 @@ class TaskJuggler
229
249
  # If we have a pushed-back token, return that first.
230
250
  unless @tokenBuffer.nil?
231
251
  res = @tokenBuffer
232
- @tokenBuffer = @pos = nil
252
+ @tokenBuffer = nil
253
+ @pos = @tokenBufferPos
233
254
  return res
234
255
  end
235
256
 
236
257
  # Start processing characters from the input.
258
+ startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
237
259
  token = [ '.', '<END>' ]
238
260
  while c = nextChar
239
261
  case c
@@ -242,10 +264,13 @@ class TaskJuggler
242
264
  token = tok
243
265
  break
244
266
  end
267
+ startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
245
268
  when '#'
246
269
  skipComment
270
+ startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
247
271
  when '/'
248
272
  skipCPlusPlusComments
273
+ startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
249
274
  when '0'..'9'
250
275
  token = readNumber(c)
251
276
  break
@@ -255,12 +280,18 @@ class TaskJuggler
255
280
  when '"'
256
281
  token = readString(c)
257
282
  break
283
+ when '-'
284
+ token = handleDash
285
+ break
258
286
  when '!'
259
287
  token = readRelativeId(c)
260
288
  break
261
289
  when 'a'..'z', 'A'..'Z', '_'
262
290
  token = readId(c)
263
291
  break
292
+ when '<', '>', '='
293
+ token = readOperator(c)
294
+ break
264
295
  when '['
265
296
  token = readMacro
266
297
  break
@@ -274,8 +305,7 @@ class TaskJuggler
274
305
  break
275
306
  end
276
307
  end
277
- @lastPos = @pos
278
- @pos = SourceFileInfo.new(fileName, lineNo, columnNo)
308
+ @pos = startOfToken
279
309
  return token
280
310
  end
281
311
 
@@ -287,6 +317,7 @@ class TaskJuggler
287
317
  raise "Fatal Error: Cannot return more than 1 token in a row"
288
318
  end
289
319
  @tokenBuffer = token
320
+ @tokenBufferPos = @pos
290
321
  @pos = @lastPos
291
322
  end
292
323
 
@@ -315,20 +346,31 @@ class TaskJuggler
315
346
 
316
347
  # Call this function to report any errors related to the parsed input.
317
348
  def error(id, text, property = nil)
318
- message = Message.new(id, 'error', text + "\n" + line.to_s,
319
- property, nil, sourceFileInfo)
320
- @messageHandler.send(message)
321
-
322
- until @macroStack.empty?
323
- macro, args = @macroStack.pop
324
- args.collect! { |a| '"' + a + '"' }
325
- message = Message.new('macro_stack', 'info',
326
- " #{macro.name} #{args.join(' ')}", nil, nil,
327
- macro.sourceFileInfo)
349
+ message('error', id, text, property)
350
+ end
351
+
352
+ def warning(id, text, property = nil)
353
+ message('warning', id, text, property)
354
+ end
355
+
356
+ def message(type, id, text, property)
357
+ unless text.empty?
358
+ message = Message.new(id, type, text + "\n" + line.to_s,
359
+ property, nil, sourceFileInfo)
328
360
  @messageHandler.send(message)
361
+
362
+ until @macroStack.empty?
363
+ macro, args = @macroStack.pop
364
+ args.collect! { |a| '"' + a + '"' }
365
+ message = Message.new('macro_stack', 'info',
366
+ " #{macro.name} #{args.join(' ')}", nil, nil,
367
+ macro.sourceFileInfo)
368
+ @messageHandler.send(message)
369
+ end
329
370
  end
330
371
 
331
- raise TjException.new, 'Syntax error during parse'
372
+ # An empty strings signals an already reported error
373
+ raise TjException.new, '' if type == 'error'
332
374
  end
333
375
 
334
376
  private
@@ -337,6 +379,14 @@ class TaskJuggler
337
379
  # features a FIFO buffer that can hold any amount of returned characters.
338
380
  # When it has reached the end of the master file it returns nil.
339
381
  def nextChar
382
+ # We've started to find the next token. @pos no longer marks the
383
+ # position of the current token. Since we also store the EOF position in
384
+ # @pos, don't reset it if we have processed all files completely.
385
+ if @pos && @cf
386
+ @lastPos = @pos
387
+ @pos = nil
388
+ end
389
+
340
390
  if (c = nextCharI) == '$' && !@ignoreMacros
341
391
  # Double $ are reduced to a single $.
342
392
  return c if (c = nextCharI) == '$'
@@ -351,7 +401,7 @@ class TaskJuggler
351
401
  returnChar(c)
352
402
  macroParser = MacroParser.new(self, @messageHandler)
353
403
  begin
354
- macroParser.parse('macroCall', false)
404
+ macroParser.parse('macroCall')
355
405
  rescue TjException
356
406
  end
357
407
  @ignoreMacros = false
@@ -379,13 +429,17 @@ class TaskJuggler
379
429
  # If EOF has been reached, try the parent file until even the master
380
430
  # file has been processed completely.
381
431
  if (c = @cf.getc).nil?
432
+ # Safe current position so an EOF related error can be properly
433
+ # reported.
434
+ @pos = sourceFileInfo
435
+
382
436
  @cf.close
383
437
  @fileStack.pop
384
438
  if @fileStack.empty?
385
439
  # We are done with the top-level file now.
386
- @cf = @tokenBuffer = @pos = nil
440
+ @cf = @tokenBuffer = nil
387
441
  else
388
- @cf, @tokenBuffer, @pos = @fileStack.last
442
+ @cf, @tokenBuffer, @lastPos = @fileStack.last
389
443
  Log << "Parsing file #{@cf.fileName} ..."
390
444
  # We have been called by nextToken() already, so we can't just
391
445
  # restore @tokenBuffer and be done. We need to feed the token text
@@ -442,6 +496,26 @@ class TaskJuggler
442
496
  end
443
497
  end
444
498
 
499
+ def handleDash
500
+ if (c1 = nextChar) == '8'
501
+ if (c2 = nextChar) == '<'
502
+ if (c3 = nextChar) == '-'
503
+ return readIndentedString
504
+ else
505
+ returnChar(c3)
506
+ returnChar(c2)
507
+ returnChar(c1)
508
+ end
509
+ else
510
+ returnChar(c2)
511
+ returnChar(c1)
512
+ end
513
+ else
514
+ returnChar(c1)
515
+ end
516
+ return [ 'LITERAL', ' - ']
517
+ end
518
+
445
519
  def readBlanks(c)
446
520
  loop do
447
521
  if c == ' '
@@ -611,6 +685,90 @@ class TaskJuggler
611
685
  [ 'STRING', token ]
612
686
  end
613
687
 
688
+ def readIndentedString
689
+ state = 0
690
+ indent = ''
691
+ token = ''
692
+ while true
693
+ case state
694
+ when 0 # Determining indent
695
+ if nextChar != "\n"
696
+ error('junk_after_cut',
697
+ 'The cut mark -8<- must be immediately followed by a ' +
698
+ 'line break.')
699
+ end
700
+ while (c = nextChar) == ' ' || c == "\t"
701
+ indent << c
702
+ end
703
+ returnChar(c)
704
+ state = 1
705
+ when 1 # reading '-' or first content line character
706
+ if (c = nextChar) == '-'
707
+ state = 3
708
+ elsif c.nil?
709
+ error('eof_in_istring1', 'Unexpected end of file in string')
710
+ elsif c == "\n"
711
+ token << c
712
+ state = 6
713
+ else
714
+ token << c
715
+ state = 2
716
+ end
717
+ when 2 # reading content line
718
+ while (c = nextChar) != "\n"
719
+ error('eof_in_istring2',
720
+ 'Unexpected end of file in string') if c.nil?
721
+ token << c
722
+ end
723
+ token << c
724
+ state = 6
725
+ when 3 # reading '>' of '->8-'
726
+ if (c = nextChar) == '>'
727
+ state = 4
728
+ else
729
+ error('eof_in_istring3',
730
+ 'Unexpected end of file in string') if c.nil?
731
+ token << '-'
732
+ token << c
733
+ state = 2
734
+ end
735
+ when 4 # reading '8' of '->8-'
736
+ if (c = nextChar) == '8'
737
+ state = 5
738
+ else
739
+ error('eof_in_istring4',
740
+ 'Unexpected end of file in string') if c.nil?
741
+ token << c
742
+ state = 2
743
+ end
744
+ when 5 # reading '-' of '->8-'
745
+ if (c = nextChar) == '-'
746
+ return [ 'STRING', token ]
747
+ else
748
+ error('eof_in_istring5',
749
+ 'Unexpected end of file in string') if c.nil?
750
+ token << c
751
+ state = 2
752
+ end
753
+ when 6 # reading indentation
754
+ state = 1
755
+ indent.each_utf8_char do |ci|
756
+ if ci != (c = nextChar)
757
+ if c == '-'
758
+ state = 3
759
+ break
760
+ else
761
+ error('bad_indent',
762
+ 'All string lines must have the exact same indentation.')
763
+ end
764
+ end
765
+ end
766
+ else
767
+ raise "State machine error"
768
+ end
769
+ end
770
+ end
771
+
614
772
  def readId(c)
615
773
  token = ""
616
774
  token << c
@@ -646,6 +804,24 @@ class TaskJuggler
646
804
  return [ 'MACRO', token ]
647
805
  end
648
806
 
807
+ # Read operators of logical expressions.
808
+ def readOperator(c)
809
+ case c
810
+ when '='
811
+ return [ 'LITERAL', '=' ]
812
+ when '>'
813
+ return [ 'LITERAL', '>=' ] if (c = nextChar) == '='
814
+ returnChar(c)
815
+ return [ 'LITERAL', '>' ]
816
+ when '<'
817
+ return [ 'LITERAL', '<=' ] if (c = nextChar) == '='
818
+ returnChar(c)
819
+ return [ 'LITERAL', '<' ]
820
+ else
821
+ raise "Unsupported operator #{c}"
822
+ end
823
+ end
824
+
649
825
  # Read only decimal digits and return the result als Fixnum.
650
826
  def readDigits
651
827
  token = ""
data/lib/Tj3Config.rb CHANGED
@@ -13,7 +13,7 @@
13
13
  require 'UTF8String'
14
14
  require 'AppConfig'
15
15
 
16
- AppConfig.version = '0.0.2'
16
+ AppConfig.version = '0.0.3'
17
17
  AppConfig.packageName = 'TaskJuggler III'
18
18
  AppConfig.packageInfo = 'A Project Mangement Software'
19
19
  AppConfig.copyright = [ (2006..2009).to_a ]
data/lib/TjTime.rb CHANGED
@@ -60,6 +60,21 @@ class TaskJuggler
60
60
  TjTime.new(Time.local(*args).gmtime)
61
61
  end
62
62
 
63
+ # Check if +zone+ is a valid time zone.
64
+ def TjTime.checkTimeZone(zone)
65
+ return true if zone == 'UTC'
66
+
67
+ tz = ENV['TZ']
68
+ ENV['TZ'] = zone
69
+ newZone = Time.new.zone
70
+ # If the time zone is valid, the OS can convert a zone like
71
+ # 'America/Denver' into 'MST'. Unknown time zones are either not
72
+ # converted or cause a fallback to UTC.
73
+ res = (newZone != zone && newZone != 'UTC')
74
+ ENV['TZ'] = tz if tz
75
+ res
76
+ end
77
+
63
78
  # Align the date to a time grid. The grid distance is determined by _clock_.
64
79
  def align(clock)
65
80
  TjTime.new((@time.to_i / clock) * clock)
data/lib/TjpExample.rb CHANGED
@@ -89,7 +89,7 @@ class TaskJuggler
89
89
  end
90
90
  snippetState[tag] = false
91
91
  else
92
- raise "Bad indicator: #{line}"
92
+ raise "Bad indicator #{indicator}. Must be '+' or '-': #{line}"
93
93
  end
94
94
  else
95
95
  # Process the regular lines and add them to all currently active