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
@@ -28,6 +28,8 @@ be used to track turnover. When the cost of a task is split over multiple
28
28
  accounts they all must have the same top-level group account. Top-level
29
29
  accounts can be used for profit/loss calculations. The sub-account structure
30
30
  of a top-level account should be organized accordingly.
31
+
32
+ Accounts have a global name space. All IDs must be unique within the accounts of the project.
31
33
  EOT
32
34
  )
33
35
  example('Account', '1')
@@ -49,11 +51,11 @@ EOT
49
51
  end
50
52
 
51
53
  def rule_accountHeader
52
- pattern(%w( _account $ID $STRING ), lambda {
54
+ pattern(%w( _account !optionalID $STRING ), lambda {
53
55
  if @property.nil? && !@accountprefix.empty?
54
- @property = @project.task(@accountprefix)
56
+ @property = @project.accout(@accountprefix)
55
57
  end
56
- if @project.account(@val[1])
58
+ if @val[1] && @project.account(@val[1])
57
59
  error('account_exists', "Account #{@val[1]} has already been defined.")
58
60
  end
59
61
  @property = Account.new(@project, @val[1], @val[2], @property)
@@ -61,11 +63,6 @@ EOT
61
63
  @property.inheritAttributes
62
64
  @scenarioIdx = 0
63
65
  })
64
- arg(1, 'id', <<'EOT'
65
- The ID of the account. Accounts have a global name space. The ID must be
66
- unique within the whole project.
67
- EOT
68
- )
69
66
  arg(2, 'name', 'A name or short description of the account')
70
67
  end
71
68
 
@@ -450,7 +447,8 @@ EOT
450
447
 
451
448
  def rule_columnId
452
449
  pattern(%w( !reportableAttributes ), lambda {
453
- title = @reportElement.defaultColumnTitle(@val[0])
450
+ title = TableReport.defaultColumnTitle(@val[0]) ||
451
+ @project.attributeName(@val[0])
454
452
  @column = TableColumnDefinition.new(@val[0], title)
455
453
  })
456
454
  doc('columnid', <<'EOT'
@@ -492,6 +490,15 @@ EOT
492
490
  doc('hidecelltext', <<'EOT'
493
491
  This logical expression is evaluated during report generation for each report
494
492
  cell. If it evaluates to true, the cell will have no content.
493
+ EOT
494
+ )
495
+
496
+ pattern(%w( _hidecellurl !logicalExpression ), lambda {
497
+ @column.hideCellURL = @val[1]
498
+ })
499
+ doc('hidecellurl', <<'EOT'
500
+ This logical expression is evaluated during report generation for each report
501
+ cell. If it evaluates to true, the cell will have no URL attached.
495
502
  EOT
496
503
  )
497
504
 
@@ -524,71 +531,10 @@ EOT
524
531
  )
525
532
  end
526
533
 
527
- def rule_csvFileName
528
- pattern(%w( $STRING ), lambda {
529
- # '.' means 'use $stdout'
530
- if @val[0] == '.'
531
- name = '.'
532
- else
533
- unless @val[0][-4,4] == '.csv'
534
- error('no_csv_suffix',
535
- "Report name must have .csv suffix: #{@val[0]}")
536
- end
537
- # Strip '.csv' suffix from file name
538
- name = @val[0][0..-5]
539
- end
540
- if @project.reports[name]
541
- error('report_redefinition',
542
- "A report with the name #{name} has already been defined.")
543
- end
544
- name
545
- })
546
- arg(1, 'file name', <<'EOT'
547
- The name of the report file to generate. It should end with a .html extension.
548
- EOT
549
- )
550
- end
551
-
552
- def rule_csvResourceReport
553
- pattern(%w( !csvResourceReportHeader !reportBody ))
554
- doc('csvresourcereport', <<'EOT'
555
- The report lists all resources and their respective values as colon-separated-value (CSV) file. Due to
556
- the very simple nature of the CSV format, only a small subset of features will
557
- be supported for CSV output. Including tasks or listing multiple scenarios
558
- will result in very difficult to read reports.
559
- EOT
560
- )
561
- end
562
-
563
- def rule_csvResourceReportHeader
564
- pattern(%w( _csvresourcereport !csvFileName ), lambda {
565
- @report = Report.new(@project, @val[1], :csv, sourceFileInfo)
566
- @reportElement = ResourceListRE.new(@report)
567
- })
568
- end
569
-
570
- def rule_csvTaskReport
571
- pattern(%w( !csvTaskReportHeader !reportBody ))
572
- doc('csvtaskreport', <<'EOT'
573
- The report lists all tasks and their respective values as
574
- colon-separated-value (CSV) file. Due to the very simple nature of the CSV
575
- format, only a small subset of features will be supported for CSV output.
576
- Including resources or listing multiple scenarios will result in very
577
- difficult to read reports.
578
- EOT
579
- )
580
- end
581
-
582
- def rule_csvTaskReportHeader
583
- pattern(%w( _csvtaskreport !csvFileName ), lambda {
584
- @report = Report.new(@project, @val[1], :csv, sourceFileInfo)
585
- @reportElement = TaskListRE.new(@report)
586
- })
587
- end
588
-
589
534
  def rule_date
590
535
  pattern(%w( $DATE ), lambda {
591
- resolution = @project.nil? ? 60 * 60 : @project['scheduleGranularity']
536
+ resolution = @project.nil? ? Project.maxScheduleGranularity :
537
+ @project['scheduleGranularity']
592
538
  if @val[0] % resolution != 0
593
539
  error('misaligned_date',
594
540
  "The date must be aligned to the timing resolution (" +
@@ -655,49 +601,11 @@ EOT
655
601
  example('Export')
656
602
  end
657
603
 
658
- def rule_exportableResourceAttribute
659
- singlePattern('_all')
660
- singlePattern('_none')
661
- singlePattern('_vacation')
662
- singlePattern('_workinghours')
663
- end
664
-
665
- def rule_exportableResourceAttributes
666
- listRule('moreExportableResourceAttributes', '!exportableResourceAttribute')
667
- end
668
-
669
- def rule_exportableTaskAttribute
670
- singlePattern('_all')
671
- singlePattern('_booking')
672
- singlePattern('_complete')
673
- singlePattern('_depends')
674
- singlePattern('_flags')
675
- singlePattern('_maxend')
676
- singlePattern('_maxstart')
677
- singlePattern('_minend')
678
- singlePattern('_minstart')
679
- singlePattern('_none')
680
- singlePattern('_note')
681
- singlePattern('_priority')
682
- singlePattern('_responsible')
683
- end
684
-
685
- def rule_exportableTaskAttributes
686
- listRule('moreExportableTaskAttributes', '!exportableTaskAttribute')
687
- end
688
-
689
604
  def rule_exportHeader
690
605
  pattern(%w( _export $STRING ), lambda {
691
- if @val[1] == '.'
692
- mainFile = true
693
- name = '.'
694
- else
695
- extension = @val[1][-4, 4]
696
- if extension == '.tjp'
697
- mainFile = true
698
- elsif extension == '.tji'
699
- mainFile = false
700
- else
606
+ if @val[1] != '.'
607
+ suffix = @val[1][-4, 4]
608
+ if suffix != '.tjp' && suffix != '.tji'
701
609
  error('export_bad_extn',
702
610
  'Export report files must have a .tjp or .tji extension.')
703
611
  end
@@ -705,12 +613,11 @@ EOT
705
613
  name = @val[1][0..-5]
706
614
  end
707
615
 
708
- if @project.reports[name]
616
+ if @project.reports[@val[1]]
709
617
  error('report_redefinition',
710
618
  "A report with the name #{name} has already been defined.")
711
619
  end
712
- @report = Report.new(@project, name, :export, sourceFileInfo)
713
- @reportElement = TjpExportRE.new(@report, mainFile)
620
+ newReport(@val[1], :export, sourceFileInfo)
714
621
  })
715
622
  arg(1, 'file name', <<'EOT'
716
623
  The name of the report file to generate. It must end with a .tjp or .tji
@@ -723,29 +630,54 @@ EOT
723
630
  optional
724
631
  repeatable
725
632
 
633
+ pattern(%w( _definitions !exportDefinitions ), lambda {
634
+ @property.set('definitions', @val[1])
635
+ })
636
+ doc('definitions', <<"EOT"
637
+ This attributes controls what definitions will be contained in the report. By default, '.tjp' reports have all definitions included and '.tji' reports have no definitions included.
638
+ EOT
639
+ )
640
+ allOrNothingListRule('exportDefinitions',
641
+ { 'flags' => 'Include flag definitions',
642
+ 'projecids' => 'Include project IDs',
643
+ 'tasks' => 'Include task definitions',
644
+ 'resources' => 'Include resource definitions' })
726
645
  pattern(%w( !hideresource ))
727
646
  pattern(%w( !hidetask ))
728
647
  pattern(%w( !reportEnd ))
729
648
  pattern(%w( !reportPeriod ))
730
649
  pattern(%w( !reportStart ))
650
+
731
651
  pattern(%w( _resourceattributes !exportableResourceAttributes ), lambda {
732
- @reportElement.resourceAttrs = @val[1].include?('none') ? [] : @val[1]
652
+ @property.set('resourceAttributes', @val[1])
733
653
  })
734
654
  doc('resourceattributes', <<"EOT"
735
- Define a list of resource attributes that should be included in the report. To
736
- include all supported attributes just use ''''all''''. When ''''none'''' is
737
- used, no optional resource attributes will be exported.
655
+ Define a list of resource attributes that should be included in the report.
738
656
  EOT
739
- )
657
+ )
658
+ allOrNothingListRule('exportableResourceAttributes',
659
+ { 'vacation' => 'Include vacations',
660
+ 'workinghours' => 'Include working hours' })
661
+
740
662
  pattern(%w( _taskattributes !exportableTaskAttributes ), lambda {
741
- @reportElement.taskAttrs = @val[1].include?('none') ? [] : @val[1]
663
+ @property.set('taskAttributes', @val[1])
742
664
  })
743
665
  doc('taskattributes', <<"EOT"
744
- Define a list of task attributes that should be included in the report. To
745
- include all supported attributes just use ''''all''''. When ''''none'''' is
746
- used, no optional task attributes will be exported.
666
+ Define a list of task attributes that should be included in the report.
747
667
  EOT
748
- )
668
+ )
669
+ allOrNothingListRule('exportableTaskAttributes',
670
+ { 'booking' => 'Include bookings',
671
+ 'complete' => 'Include completion values',
672
+ 'depends' => 'Include dependencies',
673
+ 'flags' => 'Include flags',
674
+ 'maxend' => 'Include maximum end dates',
675
+ 'maxstart' => 'Include maximum start dates',
676
+ 'minend' => 'Include minimum end dates',
677
+ 'minstart' => 'Include minimum start dates',
678
+ 'note' => 'Include notes',
679
+ 'priority' => 'Include priorities',
680
+ 'responsible' => 'Include responsible resource' })
749
681
  end
750
682
 
751
683
  def rule_exportBody
@@ -885,7 +817,7 @@ EOT
885
817
  def rule_flag
886
818
  pattern(%w( $ID ), lambda {
887
819
  unless @project['flags'].include?(@val[0])
888
- error('undecl_flag', "Undeclared flag #{@val[0]}")
820
+ error('undecl_flag', "Undeclared flag '#{@val[0]}'")
889
821
  end
890
822
  @val[0]
891
823
  })
@@ -943,7 +875,7 @@ EOT
943
875
 
944
876
  def rule_hideresource
945
877
  pattern(%w( _hideresource !logicalExpression ), lambda {
946
- @reportElement.hideResource = @val[1]
878
+ @property.set('hideResource', @val[1])
947
879
  })
948
880
  doc('hideresource', <<'EOT'
949
881
  Do not include resources that match the specified logical expression. If the
@@ -955,7 +887,7 @@ EOT
955
887
 
956
888
  def rule_hidetask
957
889
  pattern(%w( _hidetask !logicalExpression ), lambda {
958
- @reportElement.hideTask = @val[1]
890
+ @property.set('hideTask', @val[1])
959
891
  })
960
892
  doc('hidetask', <<'EOT'
961
893
  Do not include tasks that match the specified logical expression. If the
@@ -965,58 +897,6 @@ EOT
965
897
  )
966
898
  end
967
899
 
968
- def rule_htmlFileName
969
- pattern(%w( $STRING ), lambda {
970
- unless @val[0][-5,5] == '.html'
971
- error('no_html_suffix',
972
- "Report name must have .html suffix: #{@val[0]}")
973
- end
974
- # Strip '.html' suffix from file name
975
- name = @val[0][0..-6]
976
- if @project.reports[name]
977
- error('report_redefinition',
978
- "A report with the name #{name} has already been defined.")
979
- end
980
- name
981
- })
982
- arg(1, 'file name', <<'EOT'
983
- The name of the report file to generate. It should end with a .html extension.
984
- EOT
985
- )
986
- end
987
-
988
- def rule_htmlResourceReport
989
- pattern(%w( !htmlResourceReportHeader !reportBody ))
990
- doc('htmlresourcereport', <<'EOT'
991
- The report lists all resources and their respective values as a HTML page. The
992
- task that are the resources are allocated to can be listed as well.
993
- EOT
994
- )
995
- end
996
-
997
- def rule_htmlResourceReportHeader
998
- pattern(%w( _htmlresourcereport !htmlFileName ), lambda {
999
- @report = Report.new(@project, @val[1], :html, sourceFileInfo)
1000
- @reportElement = ResourceListRE.new(@report)
1001
- })
1002
- end
1003
-
1004
- def rule_htmlTaskReport
1005
- pattern(%w( !htmlTaskReportHeader !reportBody ))
1006
- doc('htmltaskreport', <<'EOT'
1007
- The report lists all tasks and their respective values as a HTML page. The
1008
- resources that are allocated to each task can be listed as well.
1009
- EOT
1010
- )
1011
- end
1012
-
1013
- def rule_htmlTaskReportHeader
1014
- pattern(%w( _htmltaskreport !htmlFileName ), lambda {
1015
- @report = Report.new(@project, @val[1], :html, sourceFileInfo)
1016
- @reportElement = TaskListRE.new(@report)
1017
- })
1018
- end
1019
-
1020
900
  def rule_includeAttributes
1021
901
  optionsRule('includeAttributesBody')
1022
902
  end
@@ -1034,8 +914,20 @@ sub-account of the account specified by ID. The parent account must already be
1034
914
  defined.
1035
915
  EOT
1036
916
  )
917
+ arg(1, 'account ID', 'The absolute ID of an already defined account')
918
+
919
+ pattern(%w( _reportprefix !taskId ), lambda {
920
+ @reportprefix = @val[1].fullId
921
+ })
922
+ doc('reportprefix', <<'EOT'
923
+ This attribute can be used to insert the reports of the included file as
924
+ sub-report of the report specified by ID. The parent report must already
925
+ be defined.
926
+ EOT
927
+ )
928
+ arg(1, 'report ID', 'The absolute ID of an already defined report.')
1037
929
 
1038
- pattern(%w( _resourceprefix !taskId ), lambda {
930
+ pattern(%w( _resourceprefix !resourceId ), lambda {
1039
931
  @resourceprefix = @val[1].fullId
1040
932
  })
1041
933
  doc('resourceprefix', <<'EOT'
@@ -1044,6 +936,7 @@ sub-resource of the resource specified by ID. The parent resource must already
1044
936
  be defined.
1045
937
  EOT
1046
938
  )
939
+ arg(1, 'resource ID', 'The ID of an already defined resource')
1047
940
 
1048
941
  pattern(%w( _taskprefix !taskId ), lambda {
1049
942
  @taskprefix = @val[1].fullId
@@ -1053,6 +946,7 @@ This attribute can be used to insert the tasks of the included file as
1053
946
  sub-task of the task specified by ID. The parent task must already be defined.
1054
947
  EOT
1055
948
  )
949
+ arg(1, 'task ID', 'The absolute ID of an already defined task.')
1056
950
  end
1057
951
 
1058
952
  def rule_includeFile
@@ -1178,11 +1072,67 @@ EOT
1178
1072
  singlePattern('!intervals')
1179
1073
  end
1180
1074
 
1075
+ def rule_journalEntry
1076
+ pattern(%w( !journalEntryHeader !journalEntryBody ), lambda {
1077
+ @val[0]
1078
+ })
1079
+ doc('journalentry', <<'EOT'
1080
+ This attribute adds an entry to the journal of the project. A journal can be used to record events, decisions or news that happened at a particular moment during the project. Depending on the context, a journal entry may or may not be associated with a specific property.
1081
+
1082
+ A journal entry consists of three parts. The headline is mandatory and should be only 5 to 10 words long. The introduction is optional and should be only one or two sentences long. All other details should be put into the third part.
1083
+
1084
+ Depending on the context, journal entries are listed with headlines only, as headlines plus introduction or in full.
1085
+ EOT
1086
+ )
1087
+ end
1088
+
1089
+ def rule_journalEntryAttributes
1090
+ optional
1091
+ repeatable
1092
+
1093
+ pattern(%w( _intro $STRING ), lambda {
1094
+ @journalEntry.intro = newRichText(@val[1])
1095
+ })
1096
+ doc('intro', <<'EOT'
1097
+ This is the introductory part of the journal entry. It should summarize the
1098
+ full entry but should contain more details than the headline.
1099
+ EOT
1100
+ )
1101
+ arg(1, 'text', <<'EOT'
1102
+ The text will be interpreted as [[Rich_Text_Attributes Rich Text]].
1103
+ EOT
1104
+ )
1105
+
1106
+ pattern(%w( _more $STRING ), lambda {
1107
+ @journalEntry.more = newRichText(@val[1])
1108
+ })
1109
+ doc('more', <<'EOT'
1110
+ This is a continuation of the [[intro introduction]] of the journal entry. It
1111
+ is usually several paragraphs long.
1112
+ EOT
1113
+ )
1114
+ arg(1, 'text', <<'EOT'
1115
+ The text will be interpreted as [[Rich_Text_Attributes Rich Text]].
1116
+ EOT
1117
+ )
1118
+ end
1119
+
1120
+ def rule_journalEntryBody
1121
+ optionsRule('journalEntryAttributes')
1122
+ end
1123
+
1124
+ def rule_journalEntryHeader
1125
+ pattern(%w( _journalentry !valDate $STRING ), lambda {
1126
+ @journalEntry = JournalEntry.new(@project['journal'], @val[1], @val[2],
1127
+ @property)
1128
+ })
1129
+ end
1181
1130
  def rule_leafResourceId
1182
1131
  pattern(%w( !resourceId ), lambda {
1183
1132
  resource = @val[0]
1184
1133
  unless resource.leaf?
1185
- error('leaf_resource_id_expected', "#{resource.id} is not a leaf resource.")
1134
+ error('leaf_resource_id_expected',
1135
+ "#{resource.id} is not a leaf resource.")
1186
1136
  end
1187
1137
  resource
1188
1138
  })
@@ -1415,6 +1365,9 @@ EOT
1415
1365
 
1416
1366
  def rule_macro
1417
1367
  pattern(%w( _macro $ID $MACRO ), lambda {
1368
+ if @scanner.macroDefined?(@val[1])
1369
+ warning('marco_redefinition', "Redefining macro #{@val[1]}")
1370
+ end
1418
1371
  @scanner.addMacro(Macro.new(@val[1], @val[2], @scanner.sourceFileInfo))
1419
1372
  })
1420
1373
  doc('macro', <<'EOT'
@@ -1481,6 +1434,10 @@ EOT
1481
1434
  commaListRule('!weekDayInterval')
1482
1435
  end
1483
1436
 
1437
+ def rule_moreOutputFormats
1438
+ commaListRule('!outputFormat')
1439
+ end
1440
+
1484
1441
  def rule_moreProjectIDs
1485
1442
  commaListRule('$ID')
1486
1443
  end
@@ -1501,6 +1458,45 @@ EOT
1501
1458
  commaListRule('!timeInterval')
1502
1459
  end
1503
1460
 
1461
+ def rule_navigator
1462
+ pattern(%w( !navigatorHeader !navigatorBody ), lambda {
1463
+ @project['navigators'][@navigator.id] = @navigator
1464
+ })
1465
+ doc('navigator', <<'EOT'
1466
+ Defines a navigator object with the specified ID. This object can be used in
1467
+ reports to include a navigation bar with references to other reports.
1468
+ EOT
1469
+ )
1470
+ end
1471
+
1472
+ def rule_navigatorAttributes
1473
+ optional
1474
+ repeatable
1475
+ pattern(%w( _hidereport !logicalExpression ), lambda {
1476
+ @navigator.hideReport = @val[1]
1477
+ })
1478
+ doc('hidereport', <<'EOT'
1479
+ This attribute can be used to exclude the reports that match the specified
1480
+ expression from the navigation bar.
1481
+ EOT
1482
+ )
1483
+ end
1484
+
1485
+ def rule_navigatorBody
1486
+ optional
1487
+ pattern(%w( _{ !navigatorAttributes _} ))
1488
+ end
1489
+
1490
+ def rule_navigatorHeader
1491
+ pattern(%w( _navigator $ID ), lambda {
1492
+ if @project['navigators'][@val[1]]
1493
+ error('navigator_exists',
1494
+ "The navigator #{@val[1]} has already been defined.")
1495
+ end
1496
+ @navigator = Navigator.new(@val[1], @project)
1497
+ })
1498
+ end
1499
+
1504
1500
  def rule_number
1505
1501
  singlePattern('$INTEGER')
1506
1502
  singlePattern('$FLOAT')
@@ -1534,7 +1530,7 @@ EOT
1534
1530
  pattern(%w( $ID !argumentList ), lambda {
1535
1531
  if @val[1].nil?
1536
1532
  unless @project['flags'].include?(@val[0])
1537
- error('operand_unkn_flag', "Undeclared flag #{@val[0]}")
1533
+ error('operand_unkn_flag', "Undeclared flag '#{@val[0]}'")
1538
1534
  end
1539
1535
  LogicalFlag.new(@val[0])
1540
1536
  else
@@ -1606,6 +1602,20 @@ EOT
1606
1602
  descr('The \'smaller-or-equal\' operator')
1607
1603
  end
1608
1604
 
1605
+ def rule_optionalID
1606
+ optional
1607
+ pattern(%w( $ID ), lambda {
1608
+ @val[0]
1609
+ })
1610
+ arg(0, 'id', <<"EOT"
1611
+ An optional ID. If you ever want to reference this property, you must specify
1612
+ your own unique ID. If no ID is specified one will be automatically generated.
1613
+ These IDs may become visible in reports, but may change at any time. You may
1614
+ never rely on automatically generated IDs.
1615
+ EOT
1616
+ )
1617
+ end
1618
+
1609
1619
  def rule_optionalPercent
1610
1620
  optional
1611
1621
  pattern(%w( !number _% ), lambda {
@@ -1613,6 +1623,43 @@ EOT
1613
1623
  })
1614
1624
  end
1615
1625
 
1626
+ def rule_optionalVersion
1627
+ optional
1628
+ pattern(%w( $STRING ), lambda {
1629
+ @val[0]
1630
+ })
1631
+ arg(0, 'version', <<"EOT"
1632
+ An optional version ID. This can be something simple as "4.2" or an ID tag of
1633
+ a revision control system. If not specified, it defaults to "1.0".
1634
+ EOT
1635
+ )
1636
+ end
1637
+
1638
+ def rule_outputFormat
1639
+ pattern(%w( _csv ), lambda {
1640
+ :csv
1641
+ })
1642
+ descr(<<'EOT'
1643
+ The report lists the resources and their respective values as
1644
+ colon-separated-value (CSV) format. Due to the very simple nature of the CSV
1645
+ format, only a small subset of features will be supported for CSV output.
1646
+ Including tasks or listing multiple scenarios will result in very difficult to
1647
+ read reports.
1648
+ EOT
1649
+ )
1650
+
1651
+ pattern(%w( _html ), lambda {
1652
+ :html
1653
+ })
1654
+ descr('Generate a web page (HTML file)')
1655
+ end
1656
+
1657
+ def rule_outputFormats
1658
+ pattern(%w( !outputFormat !moreOutputFormats ), lambda {
1659
+ [ @val[0] ] + @val[1]
1660
+ })
1661
+ end
1662
+
1616
1663
  def rule_project
1617
1664
  pattern(%w( !projectProlog !projectDeclaration !properties ), lambda {
1618
1665
  @val[1]
@@ -1629,7 +1676,7 @@ EOT
1629
1676
 
1630
1677
  pattern(%w( _currencyformat $STRING $STRING $STRING $STRING $INTEGER ),
1631
1678
  lambda {
1632
- @project['currencyformat'] = RealFormat.new(@val.slice(1, 5))
1679
+ @project['currencyFormat'] = RealFormat.new(@val.slice(1, 5))
1633
1680
  })
1634
1681
  doc('currencyformat',
1635
1682
  'These values specify the default format used for all currency ' +
@@ -1679,6 +1726,8 @@ EOT
1679
1726
 
1680
1727
  pattern(%w( !projectBodyInclude ))
1681
1728
 
1729
+ pattern(%w( !journalEntry ))
1730
+
1682
1731
  pattern(%w( _now !date ), lambda {
1683
1732
  @project['now'] = @val[1]
1684
1733
  @scanner.addMacro(Macro.new('now', @val[1].to_s,
@@ -1695,7 +1744,7 @@ EOT
1695
1744
 
1696
1745
  pattern(%w( _numberformat $STRING $STRING $STRING $STRING $INTEGER ),
1697
1746
  lambda {
1698
- @project['numberformat'] = RealFormat.new(@val.slice(1, 5))
1747
+ @project['numberFormat'] = RealFormat.new(@val.slice(1, 5))
1699
1748
  })
1700
1749
  doc('numberformat',
1701
1750
  'These values specify the default format used for all numerical ' +
@@ -1708,7 +1757,7 @@ EOT
1708
1757
 
1709
1758
  pattern(%w( !scenario ))
1710
1759
  pattern(%w( _shorttimeformat $STRING ), lambda {
1711
- @project['shorttimeformat'] = @val[1]
1760
+ @project['shortTimeFormat'] = @val[1]
1712
1761
  })
1713
1762
  doc('shorttimeformat',
1714
1763
  'Specifies time format for time short specifications. This is normal' +
@@ -1716,7 +1765,7 @@ EOT
1716
1765
  arg(1, 'format', 'strftime like format string')
1717
1766
 
1718
1767
  pattern(%w( !timeformat ), lambda {
1719
- @project['timeformat'] = @val[0]
1768
+ @project['timeFormat'] = @val[0]
1720
1769
  })
1721
1770
 
1722
1771
  pattern(%w( !timezone ), lambda {
@@ -1729,6 +1778,11 @@ EOT
1729
1778
  error('bad_timing_res',
1730
1779
  "Timing resolution must be one of #{goodValues.join(', ')} min.")
1731
1780
  end
1781
+ if @val[1] > (Project.maxScheduleGranularity / 60)
1782
+ error('too_large_timing_res',
1783
+ 'The maximum allowed timing resolution for the timezone is ' +
1784
+ "#{Project.maxScheduleGranularity / 60} minutes.")
1785
+ end
1732
1786
  @project['scheduleGranularity'] = @val[1] * 60
1733
1787
  })
1734
1788
  doc('timingresolution', <<'EOT'
@@ -1746,14 +1800,14 @@ EOT
1746
1800
  )
1747
1801
 
1748
1802
  pattern(%w( _weekstartsmonday ), lambda {
1749
- @project['weekstartsmonday'] = true
1803
+ @project['weekStartsMonday'] = true
1750
1804
  })
1751
1805
  doc('weekstartsmonday',
1752
1806
  'Specify that you want to base all week calculation on weeks ' +
1753
1807
  'starting on Monday. This is common in many European countries.')
1754
1808
 
1755
1809
  pattern(%w( _weekstartssunday ), lambda {
1756
- @project['weekstartsmonday'] = false
1810
+ @project['weekStartsMonday'] = false
1757
1811
  })
1758
1812
  doc('weekstartssunday',
1759
1813
  'Specify that you want to base all week calculation on weeks ' +
@@ -1792,18 +1846,17 @@ EOT
1792
1846
  end
1793
1847
 
1794
1848
  def rule_projectHeader
1795
- pattern(%w( _project $ID $STRING $STRING !interval ), lambda {
1849
+ pattern(%w( _project !optionalID $STRING !optionalVersion !interval ), lambda {
1796
1850
  @project = Project.new(@val[1], @val[2], @val[3],
1797
1851
  @messageHandler)
1798
1852
  @project['start'] = @val[4].start
1799
1853
  @project['end'] = @val[4].end
1800
1854
  setGlobalMacros
1801
1855
  @property = nil
1856
+ @reportCounter = 0
1802
1857
  @project
1803
1858
  })
1804
- arg(1, 'id', 'The ID of the project')
1805
1859
  arg(2, 'name', 'The name of the project')
1806
- arg(3, 'version', 'The version of the project plan')
1807
1860
  end
1808
1861
 
1809
1862
  def rule_projectIDs
@@ -1849,7 +1902,7 @@ EOT
1849
1902
  # documentation.
1850
1903
  pattern(%w( !projectPropertiesBody ))
1851
1904
  doc('properties', <<'EOT'
1852
- The project properties. Every project must consists of at least one task.
1905
+ The project properties. Every project must consists of at least one task. The other properties are optional. To save the scheduled data at least one output generating property should be used.
1853
1906
  EOT
1854
1907
  )
1855
1908
  end
@@ -1915,6 +1968,8 @@ EOT
1915
1968
  @project['revenueAccount'] = @val[0][1]
1916
1969
  })
1917
1970
 
1971
+ pattern(%w( !export ))
1972
+
1918
1973
  pattern(%w( _flags !declareFlagList ), lambda {
1919
1974
  unless @project['flags'].include?(@val[1])
1920
1975
  @project['flags'] += @val[1]
@@ -1939,6 +1994,8 @@ EOT
1939
1994
 
1940
1995
  pattern(%w( !macro ))
1941
1996
 
1997
+ pattern(%w( !navigator ))
1998
+
1942
1999
  pattern(%w( _projectid $ID ), lambda {
1943
2000
  @project['projectids'] << @val[1]
1944
2001
  @project['projectids'].uniq!
@@ -1969,7 +2026,7 @@ Set the default rate for all subsequently defined resources. The rate describes
1969
2026
  EOT
1970
2027
  )
1971
2028
 
1972
- pattern(%w( !reportDefinitions ))
2029
+ pattern(%w( !report ))
1973
2030
  pattern(%w( !resource ))
1974
2031
  pattern(%w( !shift ))
1975
2032
 
@@ -2065,195 +2122,62 @@ EOT
2065
2122
  optionsRule('referenceAttributes')
2066
2123
  end
2067
2124
 
2068
- def rule_reportAttributes
2069
- optional
2070
- repeatable
2071
-
2072
- pattern(%w( !balance ), lambda {
2073
- @reportElement.costAccount = @val[0][0]
2074
- @reportElement.revenueAccount = @val[0][1]
2125
+ def rule_report
2126
+ pattern(%w( !reportHeader !reportBody ), lambda {
2127
+ @property = @property.parent
2075
2128
  })
2129
+ doc('report', <<'EOT'
2130
+ Reports are used to store and vizualize the results of a scheduled project.
2131
+ The content, the output format and the appearance of a report can be adjusted
2132
+ with report attributes. Reports can be nested to create structured document
2133
+ trees. As with other properties, the resource attributes can be inherited from
2134
+ the enclosing report or the project.
2076
2135
 
2077
- pattern(%w( _caption $STRING ), lambda {
2078
- @reportElement.caption = newRichText(@val[1])
2079
- })
2080
- doc('caption', <<'EOT'
2081
- The caption will be embedded in the footer of the table or data segment. The
2082
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2136
+ Reports have a local name space. All IDs must be unique within the reports
2137
+ that belong to the same enclosing report.
2083
2138
  EOT
2084
2139
  )
2085
- example('Caption', '1')
2140
+ end
2086
2141
 
2087
- pattern(%w( _columns !columnDef !moreColumnDef ), lambda {
2088
- columns = [ @val[1] ]
2089
- columns += @val[2] if @val[2]
2090
- @reportElement.columns = columns
2091
- })
2092
- doc('columns', <<'EOT'
2093
- Specifies which columns shall be included in a report.
2094
2142
 
2095
- All columns support macro expansion. Contrary to the normal macro expansion,
2096
- these macros are expanded during the report generation. So the value of the
2097
- macro is being changed after each table cell or table line. Consequently only
2098
- build in macros can be used. To protect the macro calls against expansion
2099
- during the initial file processing, the report macros must be prefixed with an
2100
- additional ''''$''''.
2143
+ def rule_reportableAttributes
2144
+ singlePattern('_chart')
2145
+ descr(<<'EOT'
2146
+ A Gantt chart. This column type requires all lines to have the same fixed
2147
+ height. This does not work well with rich text columns in some browsers. Some
2148
+ show a scrollbar for the compressed table cells, others don't. It is
2149
+ recommended, that you don't use rich text columns in conjuction with the chart
2150
+ column.
2101
2151
  EOT
2102
- )
2152
+ )
2103
2153
 
2104
- pattern(%w( _epilog $STRING ), lambda {
2105
- @reportElement.epilog = newRichText(@val[1])
2154
+ singlePattern('_complete')
2155
+ descr('The completion degree of a task')
2156
+
2157
+ pattern([ '_completed' ], lambda {
2158
+ 'complete'
2106
2159
  })
2107
- doc('epilog', <<'EOT'
2108
- Define a text section that is printed right after the actual report data. The
2109
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2110
- EOT
2111
- )
2160
+ descr('Deprecated alias for complete')
2112
2161
 
2113
- pattern(%w( !reportEnd ))
2162
+ singlePattern('_criticalness')
2163
+ descr('A measure for how much effort the resource is allocated for, or' +
2164
+ 'how strained the allocated resources of a task are')
2114
2165
 
2115
- pattern(%w( _headline $STRING ), lambda {
2116
- @reportElement.headline = @val[1]
2117
- })
2118
- doc('headline', <<'EOT'
2119
- Specifies the headline for a report.
2166
+ singlePattern('_cost')
2167
+ descr(<<'EOT'
2168
+ The cost of the task or resource. The use of this column requires that a cost
2169
+ account has been set for the report using the [[balance]] attribute.
2120
2170
  EOT
2121
- )
2171
+ )
2122
2172
 
2123
- pattern(%w( !hideresource ))
2173
+ singlePattern('_daily')
2174
+ descr('A group of columns with one column for each day')
2124
2175
 
2125
- pattern(%w( !hidetask ))
2176
+ singlePattern('_depends')
2177
+ descr('A comma separated list of tasks that have to precede this task.')
2126
2178
 
2127
- pattern(%w( _loadunit !loadunit ), lambda {
2128
- @reportElement.loadUnit = :"#{@val[1]}"
2129
- })
2130
- doc('loadunit', <<'EOT'
2131
- Determines what unit should be used to display all load values in this report.
2132
- EOT
2133
- )
2134
-
2135
- pattern(%w( _prolog $STRING ), lambda {
2136
- @reportElement.prolog = newRichText(@val[1])
2137
- })
2138
- doc('prolog', <<'EOT'
2139
- Define a text section that is printed right before the actual report data. The
2140
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2141
- EOT
2142
- )
2143
-
2144
- pattern(%w( _rawhead $STRING ), lambda {
2145
- @reportElement.rawHead = @val[1]
2146
- })
2147
- doc('rawhead', <<'EOT'
2148
- Specifies a section of raw HTML code that will be inserted at the top of the
2149
- report.
2150
- EOT
2151
- )
2152
-
2153
- pattern(%w( _rawtail $STRING ), lambda {
2154
- @reportElement.rawTail = @val[1]
2155
- })
2156
- doc('rawtail', <<'EOT'
2157
- Specifies a section of raw HTML code that will be inserted at the bottom of
2158
- the report.
2159
- EOT
2160
- )
2161
-
2162
- pattern(%w( !reportPeriod ))
2163
-
2164
- pattern(%w( _rolluptask !logicalExpression ), lambda {
2165
- @reportElement.rollupTask = @val[1]
2166
- })
2167
- doc('rolluptask', <<'EOT'
2168
- Do not show sub-tasks of tasks that match the specified logical expression.
2169
- EOT
2170
- )
2171
-
2172
- pattern(%w( _scenarios !scenarioIdList ), lambda {
2173
- # Don't include disabled scenarios in the report
2174
- @val[1].delete_if { |sc| !@project.scenario(sc).get('enabled') }
2175
- @reportElement.scenarios = @val[1]
2176
- })
2177
- doc('scenrios', <<'EOT'
2178
- List of scenarios that should be included in the report.
2179
- EOT
2180
- )
2181
-
2182
- pattern(%w( _sortresources !sortCriteria ), lambda {
2183
- @reportElement.sortResources = @val[1]
2184
- })
2185
- doc('sortresources', <<'EOT'
2186
- Determines how the resources are sorted in the report. Multiple criteria can be
2187
- specified as a comma separated list. If one criteria is not sufficient to sort
2188
- a group of resources, the next criteria will be used to sort the resources in
2189
- this group.
2190
- EOT
2191
- )
2192
-
2193
- pattern(%w( _sorttasks !sortCriteria ), lambda {
2194
- @reportElement.sortTasks = @val[1]
2195
- })
2196
- doc('sorttasks', <<'EOT'
2197
- Determines how the tasks are sorted in the report. Multiple criteria can be
2198
- specified as comma separated list. If one criteria is not sufficient to sort a
2199
- group of tasks, the next criteria will be used to sort the tasks within
2200
- this group.
2201
- EOT
2202
- )
2203
-
2204
- pattern(%w( !reportStart ))
2205
-
2206
- pattern(%w( _taskroot !taskId), lambda {
2207
- @reportElement.taskRoot = @val[1]
2208
- })
2209
- doc('taskroot', <<'EOT'
2210
- Only tasks below the specified root-level tasks are exported. The exported
2211
- tasks will have the id of the root-level task stripped from their ID, so that
2212
- the sub-tasks of the root-level task become top-level tasks in the exported
2213
- file.
2214
- EOT
2215
- )
2216
-
2217
- pattern(%w( !timeformat ), lambda {
2218
- @reportElement.timeFormat = @val[0]
2219
- })
2220
- end
2221
-
2222
- def rule_reportableAttributes
2223
- singlePattern('_chart')
2224
- descr(<<'EOT'
2225
- A Gantt chart. This column type requires all lines to have the same fixed
2226
- height. This does not work well with rich text columns in some browsers. Some
2227
- show a scrollbar for the compressed table cells, others don't. It is
2228
- recommended, that you don't use rich text columns in conjuction with the chart
2229
- column.
2230
- EOT
2231
- )
2232
-
2233
- singlePattern('_complete')
2234
- descr('The completion degree of a task')
2235
-
2236
- pattern([ '_completed' ], lambda {
2237
- 'complete'
2238
- })
2239
- descr('Deprecated alias for complete')
2240
-
2241
- singlePattern('_criticalness')
2242
- descr('A measure for how much effort the resource is allocated for, or' +
2243
- 'how strained the allocated resources of a task are')
2244
-
2245
- singlePattern('_cost')
2246
- descr(<<'EOT'
2247
- The cost of the task or resource. The use of this column requires that a cost
2248
- account has been set for the report using the [[balance]] attribute.
2249
- EOT
2250
- )
2251
-
2252
- singlePattern('_daily')
2253
- descr('A group of columns with one column for each day')
2254
-
2255
- singlePattern('_duration')
2256
- descr('The duration of a task')
2179
+ singlePattern('_duration')
2180
+ descr('The duration of a task')
2257
2181
 
2258
2182
  singlePattern('_duties')
2259
2183
  descr('List of tasks that the resource is allocated to')
@@ -2312,7 +2236,7 @@ EOT
2312
2236
  descr('A group of columns with one column for each month')
2313
2237
 
2314
2238
  singlePattern('_no')
2315
- descr('The object line number in the report')
2239
+ descr('The object line number in the report (Cannot be used for sorting!)')
2316
2240
 
2317
2241
  singlePattern('_name')
2318
2242
  descr('The name or description of the item')
@@ -2324,6 +2248,9 @@ EOT
2324
2248
  descr('The criticalness of the task with respect to all the paths that ' +
2325
2249
  'it is a part of.')
2326
2250
 
2251
+ singlePattern('_precedes')
2252
+ descr('A comma separated list of tasks that have to follow this task.')
2253
+
2327
2254
  singlePattern('_priority')
2328
2255
  descr('The priority of a task')
2329
2256
 
@@ -2333,6 +2260,10 @@ EOT
2333
2260
  singlePattern('_rate')
2334
2261
  descr('The daily cost of a resource.')
2335
2262
 
2263
+ singlePattern('_resources')
2264
+ descr('A list of resources that are assigned to the task in the report ' +
2265
+ 'time frame.')
2266
+
2336
2267
  singlePattern('_responsible')
2337
2268
  descr('The responsible people for this task')
2338
2269
 
@@ -2343,6 +2274,9 @@ revenue account has been set for the report using the [[balance]] attribute.
2343
2274
  EOT
2344
2275
  )
2345
2276
 
2277
+ singlePattern('_scenario')
2278
+ descr('The name of the scenario')
2279
+
2346
2280
  singlePattern('_seqno')
2347
2281
  descr('The index of the item based on the declaration order')
2348
2282
 
@@ -2360,33 +2294,228 @@ EOT
2360
2294
 
2361
2295
  end
2362
2296
 
2363
- def rule_reportDefinitions
2364
- pattern(%w( !csvResourceReport ))
2365
- pattern(%w( !csvTaskReport ))
2366
- pattern(%w( !export ))
2367
- pattern(%w( !htmlResourceReport ))
2368
- pattern(%w( !htmlTaskReport ))
2369
- pattern(%w( !resourceReport ))
2370
- pattern(%w( !taskReport ))
2371
- end
2297
+ def rule_reportAttributes
2298
+ optional
2299
+ repeatable
2372
2300
 
2373
- def rule_reportDefinitionsBody
2374
- # This rule is not defining actual syntax. It's only used for the
2375
- # documentation.
2376
- optionsRule('reportDefinitions')
2377
- end
2301
+ pattern(%w( !balance ), lambda {
2302
+ @property.set('costAccount', @val[0][0])
2303
+ @property.set('revenueAccount', @val[0][1])
2304
+ })
2378
2305
 
2379
- def rule_reportBody
2380
- optionsRule('reportAttributes')
2306
+ pattern(%w( _caption $STRING ), lambda {
2307
+ @property.set('caption', newRichText(@val[1]))
2308
+ })
2309
+ doc('caption', <<'EOT'
2310
+ The caption will be embedded in the footer of the table or data segment. The
2311
+ text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2312
+ EOT
2313
+ )
2314
+ arg(1, 'text', 'The caption text.')
2315
+ example('Caption', '1')
2316
+
2317
+ pattern(%w( _center $STRING ), lambda {
2318
+ @property.set('center', newRichText(@val[1]))
2319
+ })
2320
+ doc('center', <<'EOT'
2321
+ This attribute defines the center section of the [[textreport]]. The text will
2322
+ be interpreted as [[Rich_Text_Attributes Rich Text]].
2323
+ EOT
2324
+ )
2325
+ arg(1, 'text', 'The text')
2326
+
2327
+ pattern(%w( _columns !columnDef !moreColumnDef ), lambda {
2328
+ columns = [ @val[1] ]
2329
+ columns += @val[2] if @val[2]
2330
+ @property.set('columns', columns)
2331
+ })
2332
+ doc('columns', <<'EOT'
2333
+ Specifies which columns shall be included in a report.
2334
+
2335
+ All columns support macro expansion. Contrary to the normal macro expansion,
2336
+ these macros are expanded during the report generation. So the value of the
2337
+ macro is being changed after each table cell or table line. Consequently only
2338
+ build in macros can be used. To protect the macro calls against expansion
2339
+ during the initial file processing, the report macros must be prefixed with an
2340
+ additional ''''$''''.
2341
+ EOT
2342
+ )
2343
+
2344
+ pattern(%w( !reportEnd ))
2345
+
2346
+ pattern(%w( _epilog $STRING ), lambda {
2347
+ @property.set('epilog', newRichText(@val[1]))
2348
+ })
2349
+ doc('epilog', <<'EOT'
2350
+ Define a text section that is printed right after the actual report data. The
2351
+ text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2352
+ EOT
2353
+ )
2354
+ also(%w( footer header prolog ))
2355
+
2356
+ pattern(%w( _footer $STRING ), lambda {
2357
+ @property.set('footer', newRichText(@val[1]))
2358
+ })
2359
+ doc('footer', <<'EOT'
2360
+ Define a text section that is put at the bottom of the report. The
2361
+ text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2362
+ EOT
2363
+ )
2364
+ also(%w( epilog header prolog ))
2365
+
2366
+ pattern(%w( _formats !outputFormats ), lambda {
2367
+ @property.set('formats', @val[1])
2368
+ })
2369
+ doc('formats', <<'EOT'
2370
+ EOT
2371
+ )
2372
+
2373
+ pattern(%w( _header $STRING ), lambda {
2374
+ @property.set('header', newRichText(@val[1]))
2375
+ })
2376
+ doc('header', <<'EOT'
2377
+ Define a text section that is put at the top of the report. The
2378
+ text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2379
+ EOT
2380
+ )
2381
+ also(%w( epilog footer prolog ))
2382
+
2383
+ pattern(%w( _headline $STRING ), lambda {
2384
+ @property.set('headline', @val[1])
2385
+ })
2386
+ doc('headline', <<'EOT'
2387
+ Specifies the headline for a report.
2388
+ EOT
2389
+ )
2390
+
2391
+ pattern(%w( !hideresource ))
2392
+
2393
+ pattern(%w( !hidetask ))
2394
+
2395
+ pattern(%w( _left $STRING ), lambda {
2396
+ @property.set('left', newRichText(@val[1]))
2397
+ })
2398
+ doc('left', <<'EOT'
2399
+ This attribute defines the left margin section of the [[textreport]]. The text
2400
+ will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
2401
+ span the [[header]] or [[footer]] sections.
2402
+ EOT
2403
+ )
2404
+
2405
+ pattern(%w( _loadunit !loadunit ), lambda {
2406
+ @property.set('loadUnit', "#{@val[1]}")
2407
+ })
2408
+ doc('loadunit', <<'EOT'
2409
+ Determines what unit should be used to display all load values in this report.
2410
+ EOT
2411
+ )
2412
+
2413
+ pattern(%w( _prolog $STRING ), lambda {
2414
+ @property.set('prolog', newRichText(@val[1]))
2415
+ })
2416
+ doc('prolog', <<'EOT'
2417
+ Define a text section that is printed right before the actual report data. The
2418
+ text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2419
+ EOT
2420
+ )
2421
+ also(%w( epilog footer header ))
2422
+
2423
+ pattern(%w( _rawhead $STRING ), lambda {
2424
+ @property.set('rawHead', @val[1])
2425
+ })
2426
+ doc('rawhead', <<'EOT'
2427
+ Specifies a section of raw HTML code that will be inserted at the top of the
2428
+ report.
2429
+ EOT
2430
+ )
2431
+
2432
+ pattern(%w( _rawtail $STRING ), lambda {
2433
+ @property.set('rawTail', @val[1])
2434
+ })
2435
+ doc('rawtail', <<'EOT'
2436
+ Specifies a section of raw HTML code that will be inserted at the bottom of
2437
+ the report.
2438
+ EOT
2439
+ )
2440
+
2441
+ pattern(%w( !report ))
2442
+ pattern(%w( !reportPeriod ))
2443
+
2444
+ pattern(%w( _right $STRING ), lambda {
2445
+ @property.set('right', newRichText(@val[1]))
2446
+ })
2447
+ doc('right', <<'EOT'
2448
+ This attribute defines the right margin section of the [[textreport]]. The text
2449
+ will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
2450
+ span the [[header]] or [[footer]] sections.
2451
+ EOT
2452
+ )
2453
+
2454
+ pattern(%w( _rolluptask !logicalExpression ), lambda {
2455
+ @property.set('rollupTask', @val[1])
2456
+ })
2457
+ doc('rolluptask', <<'EOT'
2458
+ Do not show sub-tasks of tasks that match the specified logical expression.
2459
+ EOT
2460
+ )
2461
+
2462
+ pattern(%w( _scenarios !scenarioIdList ), lambda {
2463
+ # Don't include disabled scenarios in the report
2464
+ @val[1].delete_if { |sc| !@project.scenario(sc).get('enabled') }
2465
+ @property.set('scenarios', @val[1])
2466
+ })
2467
+ doc('scenarios', <<'EOT'
2468
+ List of scenarios that should be included in the report.
2469
+ EOT
2470
+ )
2471
+
2472
+ pattern(%w( _sortresources !sortCriteria ), lambda {
2473
+ @property.set('sortResources', @val[1])
2474
+ })
2475
+ doc('sortresources', <<'EOT'
2476
+ Determines how the resources are sorted in the report. Multiple criteria can be
2477
+ specified as a comma separated list. If one criteria is not sufficient to sort
2478
+ a group of resources, the next criteria will be used to sort the resources in
2479
+ this group.
2480
+ EOT
2481
+ )
2482
+
2483
+ pattern(%w( _sorttasks !sortCriteria ), lambda {
2484
+ @property.set('sortTasks', @val[1])
2485
+ })
2486
+ doc('sorttasks', <<'EOT'
2487
+ Determines how the tasks are sorted in the report. Multiple criteria can be
2488
+ specified as comma separated list. If one criteria is not sufficient to sort a
2489
+ group of tasks, the next criteria will be used to sort the tasks within
2490
+ this group.
2491
+ EOT
2492
+ )
2493
+
2494
+ pattern(%w( !reportStart ))
2495
+
2496
+ pattern(%w( _taskroot !taskId), lambda {
2497
+ @property.set('taskRoot', @val[1])
2498
+ })
2499
+ doc('taskroot', <<'EOT'
2500
+ Only tasks below the specified root-level tasks are exported. The exported
2501
+ tasks will have the id of the root-level task stripped from their ID, so that
2502
+ the sub-tasks of the root-level task become top-level tasks in the exported
2503
+ file.
2504
+ EOT
2505
+ )
2506
+
2507
+ pattern(%w( !timeformat ), lambda {
2508
+ @property.set('timeFormat', @val[0])
2509
+ })
2381
2510
  end
2382
2511
 
2383
2512
  def rule_reportEnd
2384
2513
  pattern(%w( _end !date ), lambda {
2385
- if @val[1] < @reportElement.start
2514
+ if @val[1] < @property.get('start')
2386
2515
  error('report_end',
2387
- "End date must be before start date #{@reportElement.start}")
2516
+ "End date must be before start date #{@property.get('start')}")
2388
2517
  end
2389
- @reportElement.end = @val[1]
2518
+ @property.set('end', @val[1])
2390
2519
  })
2391
2520
  doc('end.report', <<'EOT'
2392
2521
  Specifies the end date of the report. In task reports only tasks that start
@@ -2398,8 +2527,8 @@ EOT
2398
2527
 
2399
2528
  def rule_reportPeriod
2400
2529
  pattern(%w( _period !interval ), lambda {
2401
- @reportElement.start = @val[1].start
2402
- @reportElement.end = @val[1].end
2530
+ @property.set('start', @val[1].start)
2531
+ @property.set('end', @val[1].end)
2403
2532
  })
2404
2533
  doc('period.report', <<'EOT'
2405
2534
  This property is a shortcut for setting the start and end property at the
@@ -2410,11 +2539,11 @@ EOT
2410
2539
 
2411
2540
  def rule_reportStart
2412
2541
  pattern(%w( _start !date ), lambda {
2413
- if @val[1] > @reportElement.end
2542
+ if @val[1] > @property.get('end')
2414
2543
  error('report_start',
2415
- "Start date must be before end date #{@reportElement.end}")
2544
+ "Start date must be before end date #{@property.get('end')}")
2416
2545
  end
2417
- @reportElement.start = @val[1]
2546
+ @property.set('start', @val[1])
2418
2547
  })
2419
2548
  doc('start.report', <<'EOT'
2420
2549
  Specifies the start date of the report. In task reports only tasks that end
@@ -2422,25 +2551,106 @@ after this end date are listed.
2422
2551
  EOT
2423
2552
  )
2424
2553
  end
2425
- def rule_reports
2426
- # This rule is not defining actual syntax. It's only used for the
2427
- # documentation.
2428
- pattern(%w( !reportDefinitionsBody ))
2429
- doc('reports', <<'EOT'
2430
- The report definitions. In order to see the results of your scheduled project
2431
- you need to define at least one report.
2554
+
2555
+ def rule_reportBody
2556
+ optionsRule('reportAttributes')
2557
+ end
2558
+
2559
+ def rule_reportHeader
2560
+ pattern(%w( !reportType !optionalID $STRING ), lambda {
2561
+ if @property.nil? && !@reportprefix.empty?
2562
+ @property = @project.report(@reportprefix)
2563
+ end
2564
+ if @val[1]
2565
+ id = (@property ? @property.fullId + '.' : '') + @val[1]
2566
+ if @project.report(id)
2567
+ error('report_exists', "report #{id} has already been defined.")
2568
+ end
2569
+ end
2570
+ @property = Report.new(@project, @val[1], @val[2], @property)
2571
+ @property.sourceFileInfo = @scanner.sourceFileInfo
2572
+ @property.inheritAttributes
2573
+ case @val[0]
2574
+ when 'taskreport'
2575
+ @property.typeSpec = :taskreport
2576
+ # Set the default columns for this report.
2577
+ %w( wbs name start end effort chart ).each do |col|
2578
+ @property.get('columns') <<
2579
+ TableColumnDefinition.new(col, columnTitle(col))
2580
+ end
2581
+ # Show all tasks, sorted by tree, start-up, seqno-up.
2582
+ @property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
2583
+ @property.set('sortTasks',
2584
+ [ [ 'tree', true, -1 ],
2585
+ [ 'start', true, 0 ],
2586
+ [ 'seqno', true, -1 ] ])
2587
+ # Show no resources, but set sorting to id-up.
2588
+ @property.set('hideResource',
2589
+ LogicalExpression.new(LogicalOperation.new(1)))
2590
+ @property.set('sortResources', [ [ 'id', true, -1 ] ])
2591
+ when 'resourcereport'
2592
+ @property.typeSpec = :resourcereport
2593
+ # Set the default columns for this report.
2594
+ %w( no name ).each do |col|
2595
+ @property.get('columns') <<
2596
+ TableColumnDefinition.new(col, columnTitle(col))
2597
+ end
2598
+ # Show all resources, sorted by tree and id-up.
2599
+ @property.set('hideResource',
2600
+ LogicalExpression.new(LogicalOperation.new(0)))
2601
+ @property.set('sortResources', [ [ 'tree', true, -1 ],
2602
+ [ 'id', true, -1 ] ])
2603
+ # Hide all resources, but set sorting to tree, start-up, seqno-up.
2604
+ @property.set('hideTask', LogicalExpression.new(LogicalOperation.new(1)))
2605
+ @property.set('sortTasks',
2606
+ [ [ 'tree', true, -1 ],
2607
+ [ 'start', true, 0 ],
2608
+ [ 'seqno', true, -1 ] ])
2609
+ when 'textreport'
2610
+ @property.typeSpec = :textreport
2611
+ else
2612
+ raise "Unsupported report type #{@val[0]}"
2613
+ end
2614
+ })
2615
+ arg(2, 'name', <<'EOT'
2616
+ The name of the report. This will be the base name for generated output files.
2617
+ The suffix will depend on the specified [[formats]].It will also be used in
2618
+ navigation bars.
2432
2619
  EOT
2433
2620
  )
2434
2621
  end
2435
2622
 
2623
+ def rule_reportType
2624
+ singlePattern('_resourcereport')
2625
+ doc('resourcereport', <<'EOT'
2626
+ The report lists resources and their respective values in a table. The task
2627
+ that are the resources are allocated to can be listed as well.
2628
+ EOT
2629
+ )
2630
+ singlePattern('_taskreport')
2631
+ doc('taskreport', <<'EOT'
2632
+ The report lists tasks and their respective values in a table. The
2633
+ resources that are allocated to each task can be listed as well.
2634
+ EOT
2635
+ )
2636
+ singlePattern('_textreport')
2637
+ doc('textreport', <<'EOT'
2638
+ This report consists of 5 RichText sections, a header, a center section with a left and right margin and a footer. The sections may contain the output of other defined reports.
2639
+ EOT
2640
+ )
2641
+ end
2436
2642
 
2437
2643
  def rule_resource
2438
2644
  pattern(%w( !resourceHeader !resourceBody ), lambda {
2439
2645
  @property = @property.parent
2440
2646
  })
2441
2647
  doc('resource', <<'EOT'
2442
- Tasks that have an effort specification need to have resources assigned to do
2443
- the work. Use this property to define resources and groups of resources.
2648
+ Tasks that have an effort specification need to have at least one resource
2649
+ assigned to do the work. Use this property to define resources or groups of
2650
+ resources.
2651
+
2652
+ Resources have a global name space. All IDs must be unique within the resources
2653
+ of the project.
2444
2654
  EOT
2445
2655
  )
2446
2656
  end
@@ -2448,6 +2658,7 @@ EOT
2448
2658
  def rule_resourceAttributes
2449
2659
  repeatable
2450
2660
  optional
2661
+ pattern(%w( !journalEntry ))
2451
2662
  pattern(%w( !purge ))
2452
2663
  pattern(%w( !resource ))
2453
2664
  pattern(%w( !resourceScenarioAttributes ))
@@ -2507,11 +2718,11 @@ EOT
2507
2718
  end
2508
2719
 
2509
2720
  def rule_resourceHeader
2510
- pattern(%w( _resource $ID $STRING ), lambda {
2721
+ pattern(%w( _resource !optionalID $STRING ), lambda {
2511
2722
  if @property.nil? && !@resourceprefix.empty?
2512
- @property = @project.task(@resourceprefix)
2723
+ @property = @project.resource(@resourceprefix)
2513
2724
  end
2514
- if @project.resource(@val[1])
2725
+ if @val[1] && @project.resource(@val[1])
2515
2726
  error('resource_exists', "Resource #{@val[1]} has already been defined.")
2516
2727
  end
2517
2728
  @property = Resource.new(@project, @val[1], @val[2], @property)
@@ -2519,11 +2730,11 @@ EOT
2519
2730
  @property.inheritAttributes
2520
2731
  @scenarioIdx = 0
2521
2732
  })
2522
- arg(1, 'id', <<'EOT'
2523
- The ID of the resource. Resources have a global name space. The ID must be
2524
- unique within the whole project.
2525
- EOT
2526
- )
2733
+ # arg(1, 'id', <<'EOT'
2734
+ #The ID of the resource. Resources have a global name space. The ID must be
2735
+ #unique within the whole project.
2736
+ #EOT
2737
+ # )
2527
2738
  arg(2, 'name', 'The name of the resource')
2528
2739
  end
2529
2740
 
@@ -2539,26 +2750,6 @@ EOT
2539
2750
  })
2540
2751
  end
2541
2752
 
2542
- def rule_resourceReport
2543
- pattern(%w( !resourceReportHeader !reportBody ))
2544
- doc('resourcereport', <<'EOT'
2545
- The report lists all resources and their respective values in the GUI. The
2546
- task that are the resources are allocated to can be listed as well. In the commandline version this report is ignored.
2547
- EOT
2548
- )
2549
- end
2550
-
2551
- def rule_resourceReportHeader
2552
- pattern(%w( _resourcereport $STRING ), lambda {
2553
- @report = Report.new(@project, @val[1], :gui, sourceFileInfo)
2554
- @reportElement = ResourceListRE.new(@report)
2555
- })
2556
- arg(1, 'file name', <<'EOT'
2557
- The name of the report.
2558
- EOT
2559
- )
2560
- end
2561
-
2562
2753
  def rule_resourceScenarioAttributes
2563
2754
  pattern(%w( _efficiency !number ), lambda {
2564
2755
  @property['efficiency', @scenarioIdx] = @val[1]
@@ -2779,7 +2970,12 @@ EOT
2779
2970
  @property = @property.parent
2780
2971
  })
2781
2972
  doc('shift', <<'EOT'
2782
- A shift combines several workhours related settings in a reusable entity. Besides the weekly working hours it can also hold information such as vacations and a timezone.
2973
+ A shift combines several workhours related settings in a reusable entity.
2974
+ Besides the weekly working hours it can also hold information such as
2975
+ vacations and a time zone.
2976
+
2977
+ Shifts have a global name space. All IDs must be unique within the shifts of
2978
+ the project.
2783
2979
  EOT
2784
2980
  )
2785
2981
  end
@@ -2830,8 +3026,8 @@ EOT
2830
3026
  end
2831
3027
 
2832
3028
  def rule_shiftHeader
2833
- pattern(%w( _shift $ID $STRING ), lambda {
2834
- if @project.shift(@val[1])
3029
+ pattern(%w( _shift !optionalID $STRING ), lambda {
3030
+ if @val[1] && @project.shift(@val[1])
2835
3031
  error('shift_exists', "Shift #{@val[1]} has already been defined.")
2836
3032
  end
2837
3033
  @property = Shift.new(@project, @val[1], @val[2], @property)
@@ -2839,7 +3035,6 @@ EOT
2839
3035
  @property.inheritAttributes
2840
3036
  @scenarioIdx = 0
2841
3037
  })
2842
- arg(1, 'id', 'The ID of the shift')
2843
3038
  arg(2, 'name', 'The name of the shift')
2844
3039
  end
2845
3040
 
@@ -2862,17 +3057,20 @@ Use this attribute if the vacation definition for the shift should replace the v
2862
3057
  EOT
2863
3058
  )
2864
3059
 
2865
- pattern(%w( _timezone $STRING ), lambda {
3060
+ pattern(%w( _timezone !validTimeZone ), lambda {
2866
3061
  @property['timezone', @scenarioIdx] = @val[1]
2867
3062
  })
2868
3063
  doc('timezone.shift', <<'EOT'
2869
- Sets the timezone of the shift. The working hours of the shift are assumed to be within the specified time zone. The timezone does not effect the vaction interval. The latter is assumed to be within the project time zone.
3064
+ Sets the time zone of the shift. The working hours of the shift are assumed to
3065
+ be within the specified time zone. The time zone does not effect the vaction
3066
+ interval. The latter is assumed to be within the project time zone.
2870
3067
  EOT
2871
3068
  )
2872
3069
  arg(1, 'zone', <<'EOT'
2873
3070
  Time zone to use. E. g. 'Europe/Berlin' or 'America/Denver'. Don't use the 3
2874
- letter acronyms. Linux systems have a command line utility called tzselect to
2875
- lookup possible values.
3071
+ letter acronyms. See
3072
+ [http://en.wikipedia.org/wiki/List_of_zoneinfo_time_zones Wikipedia] for
3073
+ possible values.
2876
3074
  EOT
2877
3075
  )
2878
3076
 
@@ -2999,6 +3197,9 @@ various steps and phases of the project. Depending on the attributes of that
2999
3197
  task, a task can be a container task, a milestone or a regular leaf task. The
3000
3198
  latter may have resources assigned. By specifying dependencies the user can
3001
3199
  force a certain sequence of tasks.
3200
+
3201
+ Tasks have a local name space. All IDs must be unique within the tasks
3202
+ that belong to the same enclosing task.
3002
3203
  EOT
3003
3204
  )
3004
3205
  end
@@ -3006,6 +3207,9 @@ EOT
3006
3207
  def rule_taskAttributes
3007
3208
  repeatable
3008
3209
  optional
3210
+
3211
+ pattern(%w( !journalEntry ))
3212
+
3009
3213
  pattern(%w( _note $STRING ), lambda {
3010
3214
  @property.set('note', newRichText(@val[1]))
3011
3215
  })
@@ -3161,20 +3365,21 @@ EOT
3161
3365
  end
3162
3366
 
3163
3367
  def rule_taskHeader
3164
- pattern(%w( _task $ID $STRING ), lambda {
3368
+ pattern(%w( _task !optionalID $STRING ), lambda {
3165
3369
  if @property.nil? && !@taskprefix.empty?
3166
3370
  @property = @project.task(@taskprefix)
3167
3371
  end
3168
- id = (@property ? @property.fullId + '.' : '') + @val[1]
3169
- if @project.task(id)
3170
- error('task_exists', "Task #{id} has already been defined.")
3372
+ if @val[1]
3373
+ id = (@property ? @property.fullId + '.' : '') + @val[1]
3374
+ if @project.task(id)
3375
+ error('task_exists', "Task #{id} has already been defined.")
3376
+ end
3171
3377
  end
3172
3378
  @property = Task.new(@project, @val[1], @val[2], @property)
3173
3379
  @property.sourceFileInfo = @scanner.sourceFileInfo
3174
3380
  @property.inheritAttributes
3175
3381
  @scenarioIdx = 0
3176
3382
  })
3177
- arg(1, 'id', 'The ID of the task')
3178
3383
  arg(2, 'name', 'The name of the task')
3179
3384
  end
3180
3385
 
@@ -3226,27 +3431,6 @@ EOT
3226
3431
  })
3227
3432
  end
3228
3433
 
3229
- def rule_taskReport
3230
- pattern(%w( !taskReportHeader !reportBody ))
3231
- doc('taskreport', <<'EOT'
3232
- The report lists all tasks and their respective values in the GUI. The
3233
- resources that are allocated to each task can be listed as well. In the
3234
- commandline version it is simply ignored.
3235
- EOT
3236
- )
3237
- end
3238
-
3239
- def rule_taskReportHeader
3240
- pattern(%w( _taskreport $STRING ), lambda {
3241
- @report = Report.new(@project, @val[1], :gui, sourceFileInfo)
3242
- @reportElement = TaskListRE.new(@report)
3243
- })
3244
- arg(1, 'file name', <<'EOT'
3245
- The name of the report.
3246
- EOT
3247
- )
3248
- end
3249
-
3250
3434
  def rule_taskScenarioAttributes
3251
3435
 
3252
3436
  pattern(%w( _account $ID ), lambda {
@@ -3301,7 +3485,7 @@ duration of the task. The accounts to be charged are determined by the
3301
3485
  [[chargeset]] setting of the task.
3302
3486
  EOT
3303
3487
  )
3304
- arg(0, 'amount', 'The amount to charge')
3488
+ arg(1, 'amount', 'The amount to charge')
3305
3489
 
3306
3490
  pattern(%w( !chargeset ))
3307
3491
 
@@ -3815,24 +3999,32 @@ EOT
3815
3999
  end
3816
4000
 
3817
4001
  def rule_timezone
3818
- pattern(%w( _timezone $STRING ), lambda{
3819
- # TODO
4002
+ pattern(%w( _timezone !validTimeZone ), lambda{
4003
+ ENV['TZ'] = @project['timezone'] = @val[1]
3820
4004
  })
3821
4005
  doc('timezone', <<'EOT'
3822
- Sets the default timezone of the project. All times that have no time
3823
- zones specified will be assumed to be in this timezone. The value must be a
4006
+ Sets the default time zone of the project. All times that have no time
4007
+ zones specified will be assumed to be in this time zone. The value must be a
3824
4008
  string just like those used for the TZ environment variable. Most
3825
4009
  Linux systems have a command line utility called tzselect to lookup
3826
4010
  possible values.
3827
4011
 
3828
4012
  The project start and end time are not affected by this setting. You
3829
- have to explicitly state the timezone for those dates or the system
3830
- defaults are assumed.
4013
+ have to explicitly state the time zone for those dates or the system defaults
4014
+ are assumed. Using the TZ environment variable is the recommended way to
4015
+ specify the time zone for your project. If you use this attribute within the
4016
+ project, it should be the very first thing you set. It must be set before you
4017
+ set the [[timingresolution]] or any attribute with a time or date.
4018
+
4019
+ In case the specified time zone is not hour-aligned with UTC, the
4020
+ [[timingresolution]] will automatically be decreased.
3831
4021
  EOT
3832
4022
  )
3833
4023
  arg(1, 'zone', <<'EOT'
3834
4024
  Time zone to use. E. g. 'Europe/Berlin' or 'America/Denver'. Don't use the 3
3835
- letter acronyms.
4025
+ letter acronyms. See
4026
+ [http://en.wikipedia.org/wiki/List_of_zoneinfo_time_zones Wikipedia] for
4027
+ possible values.
3836
4028
  EOT
3837
4029
  )
3838
4030
  end
@@ -3853,6 +4045,15 @@ EOT
3853
4045
  })
3854
4046
  end
3855
4047
 
4048
+ def rule_validTimeZone
4049
+ pattern(%w( $STRING ), lambda {
4050
+ unless TjTime.checkTimeZone(@val[0])
4051
+ error('bad_time_zone', "#{@val[0]} is not a known time zone")
4052
+ end
4053
+ @val[0]
4054
+ })
4055
+ end
4056
+
3856
4057
  def rule_valIntervalOrDate
3857
4058
  pattern(%w( !date !intervalOptionalEnd ), lambda {
3858
4059
  if @val[1]