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/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