taskjuggler 0.0.7 → 0.0.8

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 (415) hide show
  1. data/CHANGELOG +119 -0
  2. data/benchmarks/allocatedSlots.tjp +1602 -0
  3. data/benchmarks/booking.tjp +40 -30
  4. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/css/tjmanual.css +0 -0
  5. data/{test/TestSuite/Scheduler/Correct → benchmarks}/css/tjreport.css +1 -0
  6. data/benchmarks/gantt.tjp +57 -0
  7. data/benchmarks/htmltaskreport.tjp +26 -1
  8. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/details.png +0 -0
  9. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-green.png +0 -0
  10. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-red.png +0 -0
  11. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-yellow.png +0 -0
  12. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resource.png +0 -0
  13. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resourcegroup.png +0 -0
  14. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/task.png +0 -0
  15. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/taskgroup.png +0 -0
  16. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-down.png +0 -0
  17. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-flat.png +0 -0
  18. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-up.png +0 -0
  19. data/benchmarks/profile.clt +36082 -0
  20. data/benchmarks/profile.html +58182 -0
  21. data/benchmarks/runbench.rb +6 -0
  22. data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/scripts/wz_tooltip.js +0 -0
  23. data/doc/AppConfig.html +85 -37
  24. data/doc/Arguments.html +11 -1
  25. data/doc/CHANGELOG.html +131 -2
  26. data/doc/COPYING.html +11 -1
  27. data/doc/Object.html +12 -3
  28. data/doc/README.html +11 -1
  29. data/doc/RuntimeConfig.html +11 -1
  30. data/doc/String.html +11 -1
  31. data/doc/StringIO.html +11 -1
  32. data/doc/TaskJuggler.html +250 -219
  33. data/doc/TaskJuggler/Account.html +11 -1
  34. data/doc/TaskJuggler/AccountAttribute.html +11 -1
  35. data/doc/TaskJuggler/AccountScenario.html +11 -1
  36. data/doc/TaskJuggler/Allocation.html +11 -1
  37. data/doc/TaskJuggler/AllocationAttribute.html +11 -1
  38. data/doc/TaskJuggler/AttributeBase.html +11 -1
  39. data/doc/TaskJuggler/AttributeDefinition.html +11 -1
  40. data/doc/TaskJuggler/BatchProcessor.html +11 -1
  41. data/doc/TaskJuggler/Booking.html +11 -1
  42. data/doc/TaskJuggler/BookingListAttribute.html +11 -1
  43. data/doc/TaskJuggler/BooleanAttribute.html +11 -1
  44. data/doc/TaskJuggler/CSVFile.html +12 -2
  45. data/doc/TaskJuggler/CellSettingPattern.html +11 -1
  46. data/doc/TaskJuggler/CellSettingPatternList.html +11 -1
  47. data/doc/TaskJuggler/Charge.html +11 -1
  48. data/doc/TaskJuggler/ChargeListAttribute.html +11 -1
  49. data/doc/TaskJuggler/ChargeSet.html +11 -1
  50. data/doc/TaskJuggler/ChargeSetListAttribute.html +11 -1
  51. data/doc/TaskJuggler/CollisionDetector.html +1063 -0
  52. data/doc/TaskJuggler/ColumnListAttribute.html +11 -1
  53. data/doc/TaskJuggler/ColumnTable.html +11 -1
  54. data/doc/TaskJuggler/Daemon.html +11 -1
  55. data/doc/TaskJuggler/{OnShiftCache.html → DataCache.html} +127 -139
  56. data/doc/TaskJuggler/DataCacheEntry.html +711 -0
  57. data/doc/TaskJuggler/DateAttribute.html +11 -1
  58. data/doc/TaskJuggler/DefinitionListAttribute.html +11 -1
  59. data/doc/TaskJuggler/DependencyListAttribute.html +11 -1
  60. data/doc/TaskJuggler/DurationAttribute.html +16 -5
  61. data/doc/TaskJuggler/FileList.html +11 -1
  62. data/doc/TaskJuggler/FileRecord.html +11 -1
  63. data/doc/TaskJuggler/FixnumAttribute.html +19 -9
  64. data/doc/TaskJuggler/FlagListAttribute.html +29 -19
  65. data/doc/TaskJuggler/FloatAttribute.html +23 -13
  66. data/doc/TaskJuggler/FormatListAttribute.html +19 -9
  67. data/doc/TaskJuggler/GanttChart.html +94 -133
  68. data/doc/TaskJuggler/GanttContainer.html +11 -1
  69. data/doc/TaskJuggler/GanttHeader.html +11 -1
  70. data/doc/TaskJuggler/GanttHeaderScaleItem.html +11 -1
  71. data/doc/TaskJuggler/GanttLine.html +11 -1
  72. data/doc/TaskJuggler/GanttLoadStack.html +11 -1
  73. data/doc/TaskJuggler/GanttMilestone.html +11 -1
  74. data/doc/TaskJuggler/GanttRouter.html +247 -596
  75. data/doc/TaskJuggler/GanttTaskBar.html +11 -1
  76. data/doc/TaskJuggler/HTMLDocument.html +11 -1
  77. data/doc/TaskJuggler/HTMLGraphics.html +11 -1
  78. data/doc/TaskJuggler/Interval.html +11 -1
  79. data/doc/TaskJuggler/IntervalListAttribute.html +33 -23
  80. data/doc/TaskJuggler/JobInfo.html +11 -1
  81. data/doc/TaskJuggler/Journal.html +11 -1
  82. data/doc/TaskJuggler/JournalEntry.html +11 -1
  83. data/doc/TaskJuggler/JournalEntryList.html +11 -1
  84. data/doc/TaskJuggler/KeywordArray.html +11 -1
  85. data/doc/TaskJuggler/KeywordDocumentation.html +16 -6
  86. data/doc/TaskJuggler/Limits.html +11 -1
  87. data/doc/TaskJuggler/Limits/Limit.html +11 -1
  88. data/doc/TaskJuggler/LimitsAttribute.html +24 -14
  89. data/doc/TaskJuggler/ListAttributeBase.html +11 -1
  90. data/doc/TaskJuggler/Log.html +11 -1
  91. data/doc/TaskJuggler/LogFile.html +11 -1
  92. data/doc/TaskJuggler/LogicalAttribute.html +11 -1
  93. data/doc/TaskJuggler/LogicalExpression.html +11 -1
  94. data/doc/TaskJuggler/LogicalExpressionAttribute.html +19 -9
  95. data/doc/TaskJuggler/LogicalFlag.html +11 -1
  96. data/doc/TaskJuggler/LogicalFunction.html +11 -1
  97. data/doc/TaskJuggler/LogicalOperation.html +11 -1
  98. data/doc/TaskJuggler/Macro.html +11 -1
  99. data/doc/TaskJuggler/MacroTable.html +11 -1
  100. data/doc/TaskJuggler/ManagerResponsibilities.html +11 -1
  101. data/doc/TaskJuggler/ManagerStatusRecord.html +11 -1
  102. data/doc/TaskJuggler/Message.html +11 -1
  103. data/doc/TaskJuggler/MessageHandler.html +11 -1
  104. data/doc/TaskJuggler/Navigator.html +12 -2
  105. data/doc/TaskJuggler/NavigatorElement.html +11 -1
  106. data/doc/TaskJuggler/NikuProject.html +11 -1
  107. data/doc/TaskJuggler/NikuReport.html +11 -1
  108. data/doc/TaskJuggler/NikuResource.html +11 -1
  109. data/doc/TaskJuggler/NodeListAttribute.html +17 -7
  110. data/doc/TaskJuggler/PlaceHolderCell.html +722 -0
  111. data/doc/TaskJuggler/ProcessIntercom.html +11 -1
  112. data/doc/TaskJuggler/ProcessIntercomIface.html +11 -1
  113. data/doc/TaskJuggler/Project.html +587 -500
  114. data/doc/TaskJuggler/ProjectBroker.html +11 -1
  115. data/doc/TaskJuggler/ProjectBrokerIface.html +11 -1
  116. data/doc/TaskJuggler/ProjectFileParser.html +205 -192
  117. data/doc/TaskJuggler/ProjectFileScanner.html +230 -207
  118. data/doc/TaskJuggler/ProjectRecord.html +11 -1
  119. data/doc/TaskJuggler/ProjectServer.html +11 -1
  120. data/doc/TaskJuggler/ProjectServerIface.html +11 -1
  121. data/doc/TaskJuggler/PropertyAttribute.html +19 -9
  122. data/doc/TaskJuggler/PropertyList.html +95 -83
  123. data/doc/TaskJuggler/PropertySet.html +11 -1
  124. data/doc/TaskJuggler/PropertyTreeNode.html +11 -1
  125. data/doc/TaskJuggler/Query.html +234 -232
  126. data/doc/TaskJuggler/RTFHandlers.html +11 -1
  127. data/doc/TaskJuggler/RTFNavigator.html +11 -1
  128. data/doc/TaskJuggler/RTFQuery.html +11 -1
  129. data/doc/TaskJuggler/RTFReport.html +11 -1
  130. data/doc/TaskJuggler/RTFReportLink.html +11 -1
  131. data/doc/TaskJuggler/RTFWithQuerySupport.html +11 -1
  132. data/doc/TaskJuggler/RealFormat.html +12 -2
  133. data/doc/TaskJuggler/RealFormatAttribute.html +15 -5
  134. data/doc/TaskJuggler/ReferenceAttribute.html +38 -28
  135. data/doc/TaskJuggler/Report.html +96 -113
  136. data/doc/TaskJuggler/ReportBase.html +161 -152
  137. data/doc/TaskJuggler/ReportContext.html +11 -1
  138. data/doc/TaskJuggler/ReportServer.html +59 -48
  139. data/doc/TaskJuggler/ReportServerIface.html +51 -41
  140. data/doc/TaskJuggler/ReportServerRecord.html +11 -1
  141. data/doc/TaskJuggler/ReportServlet.html +11 -1
  142. data/doc/TaskJuggler/ReportTable.html +46 -25
  143. data/doc/TaskJuggler/ReportTableCell.html +296 -275
  144. data/doc/TaskJuggler/ReportTableColumn.html +14 -4
  145. data/doc/TaskJuggler/ReportTableLegend.html +11 -1
  146. data/doc/TaskJuggler/ReportTableLine.html +19 -7
  147. data/doc/TaskJuggler/Resource.html +12 -2
  148. data/doc/TaskJuggler/ResourceListAttribute.html +40 -30
  149. data/doc/TaskJuggler/ResourceListRE.html +11 -1
  150. data/doc/TaskJuggler/ResourceScenario.html +708 -565
  151. data/doc/TaskJuggler/RichText.html +54 -36
  152. data/doc/TaskJuggler/RichTextAttribute.html +31 -21
  153. data/doc/TaskJuggler/RichTextDocument.html +11 -1
  154. data/doc/TaskJuggler/RichTextElement.html +11 -1
  155. data/doc/TaskJuggler/RichTextFunctionExample.html +11 -1
  156. data/doc/TaskJuggler/RichTextFunctionHandler.html +11 -1
  157. data/doc/TaskJuggler/RichTextImage.html +11 -1
  158. data/doc/TaskJuggler/RichTextIntermediate.html +81 -71
  159. data/doc/TaskJuggler/RichTextParser.html +88 -33
  160. data/doc/TaskJuggler/RichTextScanner.html +45 -35
  161. data/doc/TaskJuggler/RichTextSnip.html +11 -1
  162. data/doc/TaskJuggler/RichTextSyntaxRules.html +436 -389
  163. data/doc/TaskJuggler/Scenario.html +11 -1
  164. data/doc/TaskJuggler/ScenarioData.html +11 -1
  165. data/doc/TaskJuggler/ScenarioListAttribute.html +23 -13
  166. data/doc/TaskJuggler/Scoreboard.html +92 -73
  167. data/doc/TaskJuggler/SheetHandlerBase.html +11 -1
  168. data/doc/TaskJuggler/SheetReceiver.html +11 -1
  169. data/doc/TaskJuggler/SheetSender.html +11 -1
  170. data/doc/TaskJuggler/Shift.html +11 -1
  171. data/doc/TaskJuggler/ShiftAssignment.html +11 -1
  172. data/doc/TaskJuggler/ShiftAssignments.html +11 -1
  173. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +24 -14
  174. data/doc/TaskJuggler/ShiftScenario.html +11 -1
  175. data/doc/TaskJuggler/SimpleQueryExpander.html +11 -1
  176. data/doc/TaskJuggler/SortListAttribute.html +21 -11
  177. data/doc/TaskJuggler/SourceFileInfo.html +11 -1
  178. data/doc/TaskJuggler/StatusSheetReceiver.html +11 -1
  179. data/doc/TaskJuggler/StatusSheetReport.html +11 -1
  180. data/doc/TaskJuggler/StatusSheetSender.html +112 -11
  181. data/doc/TaskJuggler/StringAttribute.html +23 -13
  182. data/doc/TaskJuggler/SymbolAttribute.html +19 -9
  183. data/doc/TaskJuggler/SyntaxReference.html +80 -71
  184. data/doc/TaskJuggler/TOCEntry.html +11 -1
  185. data/doc/TaskJuggler/TSResourceRecord.html +11 -1
  186. data/doc/TaskJuggler/TSTaskRecord.html +11 -1
  187. data/doc/TaskJuggler/TableColumnDefinition.html +11 -1
  188. data/doc/TaskJuggler/TableOfContents.html +11 -1
  189. data/doc/TaskJuggler/TableReport.html +422 -411
  190. data/doc/TaskJuggler/Task.html +11 -1
  191. data/doc/TaskJuggler/TaskDependency.html +11 -1
  192. data/doc/TaskJuggler/TaskListAttribute.html +33 -23
  193. data/doc/TaskJuggler/TaskListRE.html +11 -1
  194. data/doc/TaskJuggler/TaskScenario.html +2007 -1919
  195. data/doc/TaskJuggler/TextFormatter.html +11 -1
  196. data/doc/TaskJuggler/TextParser.html +421 -612
  197. data/doc/TaskJuggler/TextParser/Pattern.html +410 -211
  198. data/doc/TaskJuggler/TextParser/Rule.html +224 -152
  199. data/doc/TaskJuggler/TextParser/StackElement.html +190 -28
  200. data/doc/TaskJuggler/TextParser/State.html +989 -0
  201. data/doc/TaskJuggler/TextParser/StateTransition.html +782 -0
  202. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +25 -14
  203. data/doc/TaskJuggler/TextParser/TokenDoc.html +11 -1
  204. data/doc/TaskJuggler/TextReport.html +11 -1
  205. data/doc/TaskJuggler/TextScanner.html +285 -273
  206. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +17 -7
  207. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +24 -14
  208. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +11 -1
  209. data/doc/TaskJuggler/TextScanner/StreamHandle.html +64 -52
  210. data/doc/TaskJuggler/TimeSheet.html +11 -1
  211. data/doc/TaskJuggler/TimeSheetReceiver.html +11 -1
  212. data/doc/TaskJuggler/TimeSheetRecord.html +11 -1
  213. data/doc/TaskJuggler/TimeSheetReport.html +11 -1
  214. data/doc/TaskJuggler/TimeSheetSender.html +11 -1
  215. data/doc/TaskJuggler/TimeSheetSummary.html +11 -1
  216. data/doc/TaskJuggler/TimeSheets.html +11 -1
  217. data/doc/TaskJuggler/Tj3AppBase.html +11 -1
  218. data/doc/TaskJuggler/Tj3Client.html +11 -1
  219. data/doc/TaskJuggler/Tj3Daemon.html +11 -1
  220. data/doc/TaskJuggler/Tj3SheetAppBase.html +11 -1
  221. data/doc/TaskJuggler/Tj3SsReceiver.html +11 -1
  222. data/doc/TaskJuggler/Tj3SsSender.html +11 -1
  223. data/doc/TaskJuggler/Tj3TsReceiver.html +11 -1
  224. data/doc/TaskJuggler/Tj3TsSender.html +11 -1
  225. data/doc/TaskJuggler/Tj3TsSummary.html +11 -1
  226. data/doc/TaskJuggler/TjException.html +11 -1
  227. data/doc/TaskJuggler/TjTime.html +474 -324
  228. data/doc/TaskJuggler/TjpExample.html +11 -1
  229. data/doc/TaskJuggler/TjpExportRE.html +11 -1
  230. data/doc/TaskJuggler/TjpSyntaxRules.html +3731 -3662
  231. data/doc/TaskJuggler/URLParameter.html +11 -1
  232. data/doc/TaskJuggler/UserManual.html +11 -1
  233. data/doc/TaskJuggler/VimSyntax.html +11 -1
  234. data/doc/TaskJuggler/WebServer.html +11 -1
  235. data/doc/TaskJuggler/WorkingHours.html +295 -221
  236. data/doc/TaskJuggler/WorkingHoursAttribute.html +11 -1
  237. data/doc/TaskJuggler/XMLBlob.html +11 -1
  238. data/doc/TaskJuggler/XMLComment.html +11 -1
  239. data/doc/TaskJuggler/XMLDocument.html +11 -1
  240. data/doc/TaskJuggler/XMLElement.html +11 -1
  241. data/doc/TaskJuggler/XMLNamedText.html +11 -1
  242. data/doc/TaskJuggler/XMLText.html +11 -1
  243. data/doc/index.html +694 -624
  244. data/doc/lib/AppConfig_rb.html +1 -1
  245. data/doc/lib/Attributes_rb.html +1 -1
  246. data/doc/lib/Booking_rb.html +1 -1
  247. data/doc/lib/DataCache_rb.html +69 -0
  248. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  249. data/doc/lib/ProjectFileParser_rb.html +1 -1
  250. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  251. data/doc/lib/Project_rb.html +1 -1
  252. data/doc/lib/PropertyList_rb.html +1 -1
  253. data/doc/lib/Query_rb.html +1 -1
  254. data/doc/lib/RealFormat_rb.html +1 -1
  255. data/doc/lib/ResourceScenario_rb.html +1 -1
  256. data/doc/lib/Resource_rb.html +1 -1
  257. data/doc/lib/RichTextParser_rb.html +1 -1
  258. data/doc/lib/RichTextScanner_rb.html +1 -1
  259. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  260. data/doc/lib/RichText_rb.html +1 -1
  261. data/doc/lib/Scoreboard_rb.html +1 -1
  262. data/doc/lib/StatusSheetSender_rb.html +1 -1
  263. data/doc/lib/SyntaxReference_rb.html +1 -1
  264. data/doc/lib/TaskJuggler_rb.html +1 -1
  265. data/doc/lib/TaskScenario_rb.html +3 -1
  266. data/doc/lib/TextParser/Pattern_rb.html +3 -1
  267. data/doc/lib/TextParser/Rule_rb.html +3 -1
  268. data/doc/lib/TextParser/StackElement_rb.html +3 -1
  269. data/doc/lib/TextParser/State_rb.html +65 -0
  270. data/doc/lib/TextParser_rb.html +1 -1
  271. data/doc/lib/TextScanner_rb.html +1 -1
  272. data/doc/lib/Tj3Config_rb.html +1 -1
  273. data/doc/lib/TjTime_rb.html +1 -1
  274. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  275. data/doc/lib/WorkingHours_rb.html +3 -1
  276. data/doc/lib/daemon/ReportServer_rb.html +1 -1
  277. data/doc/lib/reports/CSVFile_rb.html +1 -1
  278. data/doc/lib/reports/CollisionDetector_rb.html +67 -0
  279. data/doc/lib/reports/GanttChart_rb.html +1 -1
  280. data/doc/lib/reports/GanttRouter_rb.html +3 -1
  281. data/doc/lib/reports/Navigator_rb.html +1 -1
  282. data/doc/lib/reports/ReportBase_rb.html +1 -1
  283. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  284. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  285. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  286. data/doc/lib/reports/ReportTable_rb.html +1 -1
  287. data/doc/lib/reports/Report_rb.html +1 -1
  288. data/doc/lib/reports/TableReport_rb.html +1 -1
  289. data/doc/lib/taskjuggler3_rb.html +1 -1
  290. data/examples/tutorial.tjp +1 -2
  291. data/lib/AppConfig.rb +10 -4
  292. data/lib/Attributes.rb +4 -4
  293. data/lib/DataCache.rb +124 -0
  294. data/lib/KeywordDocumentation.rb +5 -5
  295. data/lib/Project.rb +54 -10
  296. data/lib/ProjectFileParser.rb +10 -9
  297. data/lib/ProjectFileScanner.rb +38 -25
  298. data/lib/PropertyList.rb +6 -4
  299. data/lib/Query.rb +0 -8
  300. data/lib/RealFormat.rb +1 -1
  301. data/lib/Resource.rb +1 -1
  302. data/lib/ResourceScenario.rb +96 -31
  303. data/lib/RichText.rb +17 -5
  304. data/lib/RichTextParser.rb +22 -9
  305. data/lib/RichTextScanner.rb +34 -34
  306. data/lib/RichTextSyntaxRules.rb +41 -36
  307. data/lib/Scoreboard.rb +16 -7
  308. data/lib/StatusSheetSender.rb +63 -0
  309. data/lib/SyntaxReference.rb +9 -10
  310. data/lib/TaskJuggler.rb +28 -4
  311. data/lib/TaskScenario.rb +66 -19
  312. data/lib/TextParser.rb +219 -384
  313. data/lib/TextParser/Pattern.rb +168 -49
  314. data/lib/TextParser/Rule.rb +33 -17
  315. data/lib/TextParser/StackElement.rb +42 -2
  316. data/lib/TextParser/State.rb +175 -0
  317. data/lib/TextScanner.rb +19 -15
  318. data/lib/Tj3Config.rb +1 -1
  319. data/lib/TjTime.rb +111 -3
  320. data/lib/TjpSyntaxRules.rb +122 -66
  321. data/lib/WorkingHours.rb +91 -186
  322. data/lib/daemon/ReportServer.rb +3 -2
  323. data/lib/reports/CSVFile.rb +1 -1
  324. data/lib/reports/CollisionDetector.rb +177 -0
  325. data/lib/reports/GanttChart.rb +25 -41
  326. data/lib/reports/GanttRouter.rb +104 -233
  327. data/lib/reports/Navigator.rb +1 -1
  328. data/lib/reports/Report.rb +9 -33
  329. data/lib/reports/ReportBase.rb +0 -1
  330. data/lib/reports/ReportTable.rb +19 -8
  331. data/lib/reports/ReportTableCell.rb +61 -25
  332. data/lib/reports/ReportTableColumn.rb +2 -2
  333. data/lib/reports/ReportTableLine.rb +4 -2
  334. data/lib/reports/TableReport.rb +1 -0
  335. data/lib/taskjuggler3.rb +0 -1
  336. data/manual/Installation +7 -3
  337. data/manual/Intro +12 -10
  338. data/manual/The_TaskJuggler_Syntax +4 -4
  339. data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -14
  340. data/test/TestSuite/CSV-Reports/genrefs +1 -1
  341. data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -4
  342. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -22
  343. data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -14
  344. data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -14
  345. data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -14
  346. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -14
  347. data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -14
  348. data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +32 -24
  349. data/test/TestSuite/CSV-Reports/weekly-Reference.csv +13 -0
  350. data/test/TestSuite/CSV-Reports/weekly.tjp +9 -0
  351. data/test/TestSuite/HTML-Reports/css/tjreport.css +7 -2
  352. data/test/TestSuite/HTML-Reports/depArrows.html +839 -830
  353. data/test/TestSuite/HTML-Reports/depArrows.tjp +12 -12
  354. data/test/TestSuite/HTML-Reports/profile.html +37581 -0
  355. data/test/TestSuite/ReportGenerator/Errors/no_report_defined.tjp +7 -0
  356. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +1 -1
  357. data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/missing-reports +2 -0
  358. data/test/TestSuite/StatusSheets/run +2 -0
  359. data/test/TestSuite/Syntax/Correct/Booking.tjp +13 -5
  360. data/test/TestSuite/Syntax/Correct/ResourceRoot.tjp +21 -0
  361. data/test/TestSuite/Syntax/Correct/RollupResource.tjp +21 -0
  362. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +1 -1
  363. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  364. data/test/TestSuite/Syntax/Errors/include_before_project.tjp +2 -0
  365. data/test/TestSuite/Syntax/Errors/no_reduce.tjp +6 -0
  366. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  367. data/test/TestSuite/TimeSheets/run +1 -1
  368. data/test/test_CSV-Reports.rb +2 -4
  369. data/test/test_CollisionDetector.rb +85 -0
  370. data/test/test_Project.rb +2 -2
  371. data/test/test_ProjectFileScanner.rb +73 -31
  372. data/test/test_Query.rb +2 -2
  373. data/test/test_ReportGenerator.rb +1 -1
  374. data/test/test_RichText.rb +4 -4
  375. data/test/test_WorkingHours.rb +150 -11
  376. metadata +75 -67
  377. data/test/TestSuite/ReportGenerator/Errors/css/tjreport.css +0 -407
  378. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +0 -26
  379. data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -3210
  380. data/test/TestSuite/Scheduler/Correct/Container.html +0 -349
  381. data/test/TestSuite/Scheduler/Correct/Limits.html +0 -4964
  382. data/test/TestSuite/Scheduler/Correct/Shift.html +0 -1719
  383. data/test/TestSuite/Scheduler/Correct/Shift2.html +0 -476
  384. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -66
  385. data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
  386. data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
  387. data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
  388. data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
  389. data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
  390. data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
  391. data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
  392. data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
  393. data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
  394. data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
  395. data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
  396. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +0 -1301
  397. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +0 -66
  398. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +0 -407
  399. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  400. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  401. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  402. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  403. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  404. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  405. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  406. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  407. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  408. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  409. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  410. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +0 -1301
  411. data/test/TestSuite/StatusSheets/resrep.tji +0 -7
  412. data/test/TestSuite/StatusSheets/tj3d.log +0 -312
  413. data/test/TestSuite/Syntax/Correct/Managers.html +0 -263
  414. data/test/TestSuite/TimeSheets/acceptable_intervals +0 -1
  415. data/test/TestSuite/TimeSheets/statussheets.log +0 -1
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = Rule.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ class TaskJuggler::TextParser
14
+
15
+ # A StateTransition maps a token type to the next state to be
16
+ # processed. A token descriptor is either a Symbol that maps to a RegExp in
17
+ # the TextScanner or an expected String. The transition may also have a
18
+ # list of State objects that are being activated by the transition.
19
+ class StateTransition
20
+
21
+ attr_reader :tokenType, :state, :stateStack, :loopBack
22
+
23
+ # Create a new StateTransition object. _descriptor_ is a [ token type,
24
+ # token value ] touple. _state_ is the State objects this transition
25
+ # originates at. _stateStack_ is the list of State objects that have been
26
+ # activated by this transition. _loopBack_ is a boolean flag that
27
+ # specifies whether the transition describes a loop back to the start of
28
+ # the Rule or not.
29
+ def initialize(descriptor, state, stateStack, loopBack)
30
+ if !descriptor.respond_to?(:length) || descriptor.length != 2
31
+ raise "Bad parameter descriptor: #{descriptor} " +
32
+ "of type #{descriptor.class}"
33
+ end
34
+ @tokenType = descriptor[0] == :eof ? :eof : descriptor[1]
35
+
36
+ if !state.is_a?(State)
37
+ raise "Bad parameter state: #{state} of type #{state.class}"
38
+ end
39
+ @state = state
40
+
41
+ if !stateStack.is_a?(Array)
42
+ raise "Bad parameter stateStack: #{stateStack} " +
43
+ "of type #{stateStack.class}"
44
+ end
45
+ @stateStack = stateStack.dup
46
+ @loopBack = loopBack
47
+ end
48
+
49
+ # Generate a human readable form of the TransitionState date. It's only
50
+ # used for debugging.
51
+ def to_s
52
+ str = "#{@state.rule.name}, " +
53
+ "#{@state.rule.patterns.index(@state.pattern)}, #{@state.index} "
54
+ unless @stateStack.empty?
55
+ str += "("
56
+ @stateStack.each do |s|
57
+ str += "#{s.rule.name} "
58
+ end
59
+ str += ")"
60
+ end
61
+ str += '(loop)' if @loopBack
62
+ str
63
+ end
64
+
65
+ end
66
+
67
+ # This State objects describes a state of the TextParser FSM. A State
68
+ # captures the position in the syntax description that the parser is
69
+ # currently at. A position is defined by the Rule, the Pattern and the index
70
+ # of the current token of that Pattern. An index of 0 means, we've just read
71
+ # the 1st token of the pattern. States which have no Pattern describe the
72
+ # start of rule. The parser has not yet identified the first token, so it
73
+ # doesn't know the Pattern yet.
74
+ #
75
+ # The actual data of a State is the list of possible StateTransitions to
76
+ # other states and a boolean flag that specifies if Reduce operations are
77
+ # valid for this State or not. The transitions are hashed by the token that
78
+ # would trigger this transition.
79
+ class State
80
+
81
+ attr_reader :rule, :pattern, :index, :transitions
82
+ attr_accessor :noReduce
83
+
84
+ def initialize(rule, pattern = nil, index = 0)
85
+ @rule = rule
86
+ @pattern = pattern
87
+ @index = index
88
+ # Starting states are always reduceable. Other states may or may not be
89
+ # reduceable. For now, we assume they are not.
90
+ @noReduce = !pattern.nil?
91
+
92
+ @transitions = {}
93
+ end
94
+
95
+ # Completed the StateTransition list. We can only call this function after
96
+ # all State objects for the syntax have been created. So we can't make
97
+ # this part of the constructor.
98
+ def addTransitions(states, rules)
99
+ if @pattern
100
+ # This is an normal state node.
101
+ @pattern.addTransitionsToState(states, rules, [], self,
102
+ @rule, @index + 1, false)
103
+ else
104
+ # This is a start node.
105
+ @rule.addTransitionsToState(states, rules, [], self, false)
106
+ end
107
+ end
108
+
109
+ # This method adds the actual StateTransition to this State.
110
+ def addTransition(token, nextState, stateStack, loopBack)
111
+ tr = StateTransition.new(token, nextState, stateStack, loopBack)
112
+ if @transitions.include?(tr.tokenType)
113
+ raise "Ambiguous transition for #{tr.tokenType} in \n#{self}\n" +
114
+ "The following transition both match:\n" +
115
+ " #{tr}\n #{@transitions[tr.tokenType]}"
116
+ end
117
+ @transitions[tr.tokenType] = tr
118
+ end
119
+
120
+ # Find the transition that matches _token_.
121
+ def transition(token)
122
+ if token[0] == :ID
123
+ # The scanner cannot differentiate between IDs and literals that look
124
+ # like IDs. So we look for literals first and then for IDs.
125
+ @transitions[token[1]] || @transitions[:ID]
126
+ elsif token[0] == :LITERAL
127
+ @transitions[token[1]]
128
+ else
129
+ @transitions[token[0]]
130
+ end
131
+ end
132
+
133
+ # Return a comma separated list of token strings that would trigger
134
+ # transitions for this State.
135
+ def expectedTokens
136
+ tokens = []
137
+ @transitions.each_key do |t|
138
+ tokens << "#{t.is_a?(String) ? "'#{t}'" : ":#{t}"}"
139
+ end
140
+ tokens
141
+ end
142
+
143
+ # Convert the State data into a human readable form. Used for debugging
144
+ # only.
145
+ def to_s(short = false)
146
+ if short
147
+ if @pattern
148
+ str = "#{rule.name} " +
149
+ "#{rule.patterns.index(@pattern)} #{@index}"
150
+ else
151
+ str = "#{rule.name} (Starting Node)"
152
+ end
153
+ else
154
+ if @pattern
155
+ str = "=== State: #{rule.name} " +
156
+ "#{rule.patterns.index(@pattern)} #{@index}" +
157
+ " #{@noReduce ? '' : '(R)'}" +
158
+ " #{'=' * 40}\nPattern: #{@pattern}\n"
159
+ else
160
+ str = "=== State: #{rule.name} (Starting Node) #{'=' * 30}\n"
161
+ end
162
+
163
+ @transitions.each do |type, target|
164
+ targetStr = target ? target.to_s : "<EOF>"
165
+ str += " #{type.is_a?(String) ? "'#{type}'" : ":#{type}"}" +
166
+ " => #{targetStr}\n"
167
+ end
168
+ str += "#{'=' * 76}\n"
169
+ end
170
+ str
171
+ end
172
+
173
+ end
174
+
175
+ end
data/lib/TextScanner.rb CHANGED
@@ -57,7 +57,6 @@ class TaskJuggler
57
57
  @fileName = nil
58
58
  @stream = nil
59
59
  @line = nil
60
- @pos = 0
61
60
  @endPos = 1
62
61
  @scanner = nil
63
62
  @wrapped = false
@@ -70,10 +69,11 @@ class TaskJuggler
70
69
  end
71
70
 
72
71
  def injectMacro(macro, args, text)
73
- @nextMacroEnd = @pos + text.length
74
- @line = @line[0, @pos] + text + @line[@pos..-1]
72
+ pos = @scanner.pos
73
+ @nextMacroEnd = pos + text.length
74
+ @line = @line[0, pos] + text + @line[pos..-1]
75
75
  @scanner = StringScanner.new(@line)
76
- @scanner.pos = @pos
76
+ @scanner.pos = pos
77
77
 
78
78
  # Simple detection for recursive macro calls.
79
79
  return false if @macroStack.length > 20
@@ -109,10 +109,12 @@ class TaskJuggler
109
109
  return nil if (token = @scanner.scan(re)).nil?
110
110
  #puts "#{re.to_s[0..20]}: [#{token}]"
111
111
 
112
- @pos = @scanner.pos
113
- while @nextMacroEnd && @nextMacroEnd < @pos
114
- @macroStack.pop
115
- @nextMacroEnd = @macroStack.empty? ? nil : @macroStack.last.endPos
112
+ if @nextMacroEnd
113
+ pos = @scanner.pos
114
+ while @nextMacroEnd && @nextMacroEnd < pos
115
+ @macroStack.pop
116
+ @nextMacroEnd = @macroStack.empty? ? nil : @macroStack.last.endPos
117
+ end
116
118
  end
117
119
 
118
120
  token
@@ -246,7 +248,7 @@ class TaskJuggler
246
248
  end
247
249
 
248
250
  # Switch the parser to another mode. The scanner will then only detect
249
- # with pattens of that _newMode_.
251
+ # patterns of that _newMode_.
250
252
  def mode=(newMode)
251
253
  #puts "**** New mode: #{newMode}"
252
254
  @activePatterns = @patternsByMode[newMode]
@@ -362,21 +364,24 @@ class TaskJuggler
362
364
  # @fileStack.
363
365
  @finishLastFile = false
364
366
  #Log << "Completed file #{@cf.fileName}"
365
- @cf.close
367
+ @cf.close if @cf
366
368
  @fileStack.pop
367
369
 
368
370
  if @fileStack.empty?
369
371
  # We are done with the top-level file now.
370
372
  @cf = @tokenBuffer = nil
371
373
  @finishLastFile = true
372
- return [ '.', '<END>', @startOfToken ]
374
+ return [ :endOfText, '<EOT>', @startOfToken ]
373
375
  else
374
376
  # Continue parsing the file that included the current file.
375
377
  @cf, tokenBuffer = @fileStack.last
376
378
  Log << "Parsing file #{@cf.fileName} ..."
377
379
  # If we have a left over token from previously processing this file,
378
380
  # return it now.
379
- return tokenBuffer if tokenBuffer
381
+ if tokenBuffer
382
+ @finishLastFile = true if tokenBuffer[0] == :eof
383
+ return tokenBuffer
384
+ end
380
385
  end
381
386
  end
382
387
 
@@ -391,7 +396,7 @@ class TaskJuggler
391
396
  # We've found the end of an input file. Return a special token
392
397
  # that describes the end of a file.
393
398
  @finishLastFile = true
394
- return [ '.', '<END>', @startOfToken ]
399
+ return [ :eof, '<END>', @startOfToken ]
395
400
  end
396
401
 
397
402
  raise "#{re} matches empty string" if match.empty?
@@ -401,7 +406,6 @@ class TaskJuggler
401
406
 
402
407
  break if type.nil? # Ignore certain tokens with nil type.
403
408
 
404
- #puts "type: #{type} match: [#{match}]"
405
409
  return [ type, match, @startOfToken ]
406
410
  end
407
411
  end
@@ -467,7 +471,7 @@ class TaskJuggler
467
471
  end
468
472
 
469
473
  def warning(id, text, sfi = nil, data = nil)
470
- message(:warning, id, text, sfi, @cf ? @cf.line : nil, data)
474
+ message(:warning, id, text, sfi, data)
471
475
  end
472
476
 
473
477
  private
data/lib/Tj3Config.rb CHANGED
@@ -13,7 +13,7 @@
13
13
  require 'UTF8String'
14
14
  require 'AppConfig'
15
15
 
16
- AppConfig.version = '0.0.7'
16
+ AppConfig.version = '0.0.8'
17
17
  AppConfig.packageName = 'taskjuggler'
18
18
  AppConfig.softwareName = 'TaskJuggler III'
19
19
  AppConfig.packageInfo = 'A Project Management Software'
data/lib/TjTime.rb CHANGED
@@ -36,8 +36,7 @@ class TaskJuggler
36
36
  if t.is_a?(Time)
37
37
  @time = t
38
38
  elsif t.is_a?(String)
39
- d = DateTime.parse(t)
40
- @time = Time.mktime(d.year, d.mon, d.day, d.hour, d.min, d.sec)
39
+ @time = TjTime.parse(t).time
41
40
  else
42
41
  @time = Time.at(t)
43
42
  end
@@ -60,6 +59,111 @@ class TaskJuggler
60
59
  TjTime.new(Time.local(*args).gmtime)
61
60
  end
62
61
 
62
+ def TjTime.parse(t)
63
+ year, month, day, time, zone = t.split('-', 5)
64
+
65
+ # Check the year
66
+ if year
67
+ year = year.to_i
68
+ if year < 1970 || year > 2035
69
+ raise TjException.new, "Year #{year} out of range (1970 - 2035)"
70
+ end
71
+ else
72
+ raise TjException.new, "Year not specified"
73
+ end
74
+
75
+ # Check the month
76
+ if month
77
+ month = month.to_i
78
+ if month < 1 || month > 12
79
+ raise TjException.new, "Month #{month} out of range (1 - 12)"
80
+ end
81
+ else
82
+ raise TjException.new, "Month not specified"
83
+ end
84
+
85
+ # Check the day
86
+ if day
87
+ day = day.to_i
88
+ maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
89
+ 30, 31, 31, 30, 31, 30, 31 ]
90
+ if month < 1 || month > maxDay[month]
91
+ raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
92
+ end
93
+ else
94
+ raise TjException.new, "Day not specified"
95
+ end
96
+
97
+ # The time is optional. Will be expanded to 00:00:00.
98
+ if time
99
+ hour, minute, second = time.split(':')
100
+
101
+ # Check hour
102
+ if hour
103
+ hour = hour.to_i
104
+ if hour < 0 || hour > 23
105
+ raise TjException.new, "Hour #{hour} out of range (0 - 23)"
106
+ end
107
+ else
108
+ raise TjException.new, "Hour not specified"
109
+ end
110
+
111
+ if minute
112
+ minute = minute.to_i
113
+ if minute < 0 || minute > 59
114
+ raise TjException.new, "Minute #{minute} out of range (0 - 59)"
115
+ end
116
+ else
117
+ raise TjException.new, "Minute not specified"
118
+ end
119
+
120
+ # Check sencond. This value is optional and defaults to 0.
121
+ if second
122
+ second = second.to_i
123
+ if second < 0 || second > 59
124
+ raise TjException.new, "Second #{second} out of range (0 - 59)"
125
+ end
126
+ else
127
+ second = 0
128
+ end
129
+ else
130
+ hour = minute = second = 0
131
+ end
132
+
133
+ # The zone is optional and defaults to the current time zone.
134
+ if zone
135
+ if zone[0] != ?- && zone[0] != ?+
136
+ raise TjException.new, "Time zone adjustment must be prefixed by " +
137
+ "+ or -, not #{zone[0]}"
138
+ end
139
+ if zone.length != 5
140
+ raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
141
+ end
142
+
143
+ date = Time.utc(year, month, day, hour, minute, second)
144
+ sign = zone[0] == ?- ? 1 : -1
145
+ tzHour = zone[1..2].to_i
146
+ if tzHour < 0 || tzHour > 12
147
+ raise TjException.new, "Time zone adjustment hour out of range " +
148
+ "(0 - 12) but is #{tzHour}"
149
+ end
150
+ tzMinute = zone[3..4].to_i
151
+ if tzMinute < 0 || tzMinute > 59
152
+ raise TjException.new, "Time zone adjustment minute out of range " +
153
+ "(0 - 59) but is #{tzMinute}"
154
+ end
155
+ date += sign * (tzHour * 3600 + tzMinute * 60)
156
+ else
157
+ date = Time.mktime(year, month, day, hour, minute, second)
158
+ end
159
+
160
+ #puts "--> #{t}"
161
+ #puts(">>> #{year}-#{month}-#{day}-#{hour}:#{minute}:#{second}" +
162
+ # "#{zone ? "-#{tzHour}:#{tzMinute}" : ""}")
163
+ #puts "=== #{date}"
164
+ TjTime.new(date)
165
+ end
166
+
63
167
  # Check if +zone+ is a valid time zone.
64
168
  def TjTime.checkTimeZone(zone)
65
169
  return true if zone == 'UTC'
@@ -80,7 +184,11 @@ class TaskJuggler
80
184
  region = zone[0..zone.index('/') - 1]
81
185
  res = (newZone != zone && newZone != region && newZone != 'UTC')
82
186
  # Restore TZ if it was set earlier.
83
- ENV['TZ'] = tz if tz
187
+ if tz
188
+ ENV['TZ'] = tz
189
+ else
190
+ ENV.delete('TZ')
191
+ end
84
192
  res
85
193
  end
86
194
 
@@ -155,7 +155,7 @@ EOT
155
155
  repeatable
156
156
 
157
157
  pattern(%w( _alternative !resourceId !moreAlternatives ), lambda {
158
- ([ @val[1] ] + @val[2]).each do |candidate|
158
+ ([ @val[1] ] + (@val[2] ? @val[2] : [])).each do |candidate|
159
159
  @allocate.addCandidate(candidate)
160
160
  end
161
161
  })
@@ -558,7 +558,8 @@ EOT
558
558
 
559
559
  pattern(%w( _celltext !logicalExpression $STRING ), lambda {
560
560
  @column.cellText.addPattern(
561
- CellSettingPattern.new(newRichText(@val[2]), @val[1]))
561
+ CellSettingPattern.new(newRichText(@val[2], @sourceFileInfo[2]),
562
+ @val[1]))
562
563
  })
563
564
  doc('celltext.column', <<'EOT'
564
565
  Specifies an alternative content that is used for the cells of the column.
@@ -660,7 +661,8 @@ EOT
660
661
 
661
662
  pattern(%w( _tooltip !logicalExpression $STRING ), lambda {
662
663
  @column.tooltip.addPattern(
663
- CellSettingPattern.new(newRichText(@val[2]), @val[1]))
664
+ CellSettingPattern.new(newRichText(@val[2], @sourceFileInfo[2]),
665
+ @val[1]))
664
666
  })
665
667
  doc('tooltip.column', <<'EOT'
666
668
  Specifies an alternative content for the tooltip. This will replace the
@@ -742,15 +744,18 @@ EOT
742
744
  return if @val[1].empty?
743
745
 
744
746
  rtTokenSetMore =
745
- %w( LINEBREAK SPACE WORD BOLD ITALIC CODE BOLDITALIC PRE HREF HREFEND
746
- REF REFEND HLINE TITLE2 TITLE3 TITLE4 TITLE2END TITLE3END TITLE4END
747
- BULLET1 BULLET2 BULLET3 BULLET4 NUMBER1 NUMBER2 NUMBER3 NUMBER4 )
747
+ [ :LINEBREAK, :SPACE, :WORD, :BOLD, :ITALIC, :CODE, :BOLDITALIC,
748
+ :PRE, :HREF, :HREFEND, :REF, :REFEND, :HLINE, :TITLE2, :TITLE3,
749
+ :TITLE4, :TITLE2END, :TITLE3END, :TITLE4END,
750
+ :BULLET1, :BULLET2, :BULLET3, :BULLET4, :NUMBER1, :NUMBER2, :NUMBER3,
751
+ :NUMBER4 ]
748
752
  if @val[1] == "Some more details\n"
749
753
  error('ts_default_details',
750
754
  "'Some more details' is not a valid value",
751
755
  @sourceFileInfo[1])
752
756
  end
753
- @journalEntry.details = newRichText(@val[1], rtTokenSetMore)
757
+ @journalEntry.details = newRichText(@val[1], @sourceFileInfo[1],
758
+ rtTokenSetMore)
754
759
  })
755
760
  doc('details', <<'EOT'
756
761
  This is a continuation of the [[summary]] of the journal or status entry. It
@@ -1012,12 +1017,12 @@ EOT
1012
1017
  pattern(%w( !extendPropertyId ), lambda {
1013
1018
  case @val[0]
1014
1019
  when 'task'
1015
- @ruleToExtend = @rules['taskAttributes']
1016
- @ruleToExtendWithScenario = @rules['taskScenarioAttributes']
1020
+ @ruleToExtend = @rules[:taskAttributes]
1021
+ @ruleToExtendWithScenario = @rules[:taskScenarioAttributes]
1017
1022
  @propertySet = @project.tasks
1018
1023
  when 'resource'
1019
- @ruleToExtend = @rules['resourceAttributes']
1020
- @ruleToExtendWithScenario = @rules['resourceScenarioAttributes']
1024
+ @ruleToExtend = @rules[:resourceAttributes]
1025
+ @ruleToExtendWithScenario = @rules[:resourceScenarioAttributes]
1021
1026
  @propertySet = @project.resources
1022
1027
  end
1023
1028
  })
@@ -1218,7 +1223,7 @@ EOT
1218
1223
 
1219
1224
  def rule_headline
1220
1225
  pattern(%w( _headline $STRING ), lambda {
1221
- @property.set('headline', newRichText(@val[1]))
1226
+ @property.set('headline', newRichText(@val[1], @sourceFileInfo[1]))
1222
1227
  })
1223
1228
  doc('headline', <<'EOT'
1224
1229
  Specifies the headline for a report.
@@ -1316,6 +1321,11 @@ EOT
1316
1321
 
1317
1322
  def rule_includeFile
1318
1323
  pattern(%w( !includeFileName ), lambda {
1324
+ unless @project
1325
+ error('include_before_project',
1326
+ "You must declare the project header before you include other " +
1327
+ "files.")
1328
+ end
1319
1329
  @project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
1320
1330
  })
1321
1331
  end
@@ -1690,7 +1700,7 @@ EOT
1690
1700
  def rule_listOfDays
1691
1701
  pattern(%w( !weekDayInterval !moreListOfDays), lambda {
1692
1702
  weekDays = Array.new(7, false)
1693
- ([ @val[0] ] + @val[1]).each do |dayList|
1703
+ ([ @val[0] ] + (@val[1] ? @val[1] : [])).each do |dayList|
1694
1704
  7.times { |i| weekDays[i] = true if dayList[i] }
1695
1705
  end
1696
1706
  weekDays
@@ -1702,7 +1712,7 @@ EOT
1702
1712
  [ ]
1703
1713
  })
1704
1714
  pattern(%w( !timeInterval !moreTimeIntervals ), lambda {
1705
- [ @val[0] ] + @val[1]
1715
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
1706
1716
  })
1707
1717
  end
1708
1718
 
@@ -2059,15 +2069,11 @@ EOT
2059
2069
  end
2060
2070
 
2061
2071
  def rule_operation
2062
- pattern(%w( !operand !operatorAndOperand !operationChain ), lambda {
2072
+ pattern(%w( !operand !operationChain ), lambda {
2063
2073
  operation = LogicalOperation.new(@val[0])
2064
- unless @val[1].nil?
2065
- operation.operator = @val[1][0]
2066
- operation.operand2 = @val[1][1]
2067
- end
2068
- if @val[2]
2074
+ if @val[1]
2069
2075
  # Further operators/operands create an operation tree.
2070
- @val[2].each do |ops|
2076
+ @val[1].each do |ops|
2071
2077
  operation = LogicalOperation.new(operation)
2072
2078
  operation.operator = ops[0]
2073
2079
  operation.operand2 = ops[1]
@@ -2098,7 +2104,6 @@ EOT
2098
2104
  end
2099
2105
 
2100
2106
  def rule_operatorAndOperand
2101
- optional
2102
2107
  pattern(%w( !operator !operand), lambda{
2103
2108
  [ @val[0], @val[1] ]
2104
2109
  })
@@ -2193,7 +2198,7 @@ EOT
2193
2198
 
2194
2199
  def rule_outputFormats
2195
2200
  pattern(%w( !outputFormat !moreOutputFormats ), lambda {
2196
- [ @val[0] ] + @val[1]
2201
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
2197
2202
  })
2198
2203
  end
2199
2204
 
@@ -2341,8 +2346,11 @@ impact on memory usage and scheduling performance. You should set this value
2341
2346
  to the minimum required resolution. Make sure that all values that you specify
2342
2347
  are aligned with the resolution.
2343
2348
 
2344
- The timing resolution should be set prior to any value that represents a time
2345
- value like now or workinghours.
2349
+ Changing the timing resolution will reset the [[workinghours.project|working
2350
+ hours]] to the default times. It's recommended that this is the very first
2351
+ option in the project header section.
2352
+
2353
+ Do not use this option after you've set the time zone!
2346
2354
  EOT
2347
2355
  )
2348
2356
 
@@ -2394,8 +2402,7 @@ EOT
2394
2402
 
2395
2403
  def rule_projectHeader
2396
2404
  pattern(%w( _project !optionalID $STRING !optionalVersion !interval ), lambda {
2397
- @project = Project.new(@val[1], @val[2], @val[3],
2398
- @messageHandler)
2405
+ @project = Project.new(@val[1], @val[2], @val[3], @messageHandler)
2399
2406
  @project['start'] = @val[4].start
2400
2407
  @project['end'] = @val[4].end
2401
2408
  @projectId = @val[1]
@@ -2409,7 +2416,7 @@ EOT
2409
2416
 
2410
2417
  def rule_projectIDs
2411
2418
  pattern(%w( $ID !moreProjectIDs ), lambda {
2412
- [ @val[0] ] + @val[1]
2419
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
2413
2420
  })
2414
2421
  end
2415
2422
 
@@ -2499,8 +2506,7 @@ EOT
2499
2506
  end
2500
2507
 
2501
2508
  def rule_properties
2502
- pattern(%w( !propertiesBody . ))
2503
- lastSyntaxToken(1)
2509
+ pattern(%w( !propertiesBody ))
2504
2510
  end
2505
2511
 
2506
2512
  def rule_propertiesBody
@@ -2628,8 +2634,12 @@ EOT
2628
2634
  example('TimeSheet1', '2')
2629
2635
  end
2630
2636
 
2637
+ def rule_propertiesFile
2638
+ pattern(%w( !propertiesBody . ))
2639
+ end
2640
+
2631
2641
  def rule_propertiesInclude
2632
- pattern(%w( _include !includeProperties !properties ), lambda {
2642
+ pattern(%w( _include !includeProperties !properties . ), lambda {
2633
2643
  })
2634
2644
  doc('include.properties', <<'EOT'
2635
2645
  Includes the specified file name as if its contents would be written
@@ -2696,7 +2706,9 @@ EOT
2696
2706
  def rule_relativeId
2697
2707
  pattern(%w( _! !moreBangs !idOrAbsoluteId ), lambda {
2698
2708
  str = '!'
2699
- @val[1].each { |bang| str += bang }
2709
+ if @val[1]
2710
+ @val[1].each { |bang| str += bang }
2711
+ end
2700
2712
  str += @val[2]
2701
2713
  str
2702
2714
  })
@@ -3019,7 +3031,7 @@ EOT
3019
3031
  })
3020
3032
 
3021
3033
  pattern(%w( _caption $STRING ), lambda {
3022
- @property.set('caption', newRichText(@val[1]))
3034
+ @property.set('caption', newRichText(@val[1], @sourceFileInfo[1]))
3023
3035
  })
3024
3036
  doc('caption', <<'EOT'
3025
3037
  The caption will be embedded in the footer of the table or data segment. The
@@ -3030,7 +3042,7 @@ EOT
3030
3042
  example('Caption', '1')
3031
3043
 
3032
3044
  pattern(%w( _center $STRING ), lambda {
3033
- @property.set('center', newRichText(@val[1]))
3045
+ @property.set('center', newRichText(@val[1], @sourceFileInfo[1]))
3034
3046
  })
3035
3047
  doc('center', <<'EOT'
3036
3048
  This attribute defines the center section of the [[textreport]]. The text will
@@ -3055,7 +3067,7 @@ EOT
3055
3067
  pattern(%w( !reportEnd ))
3056
3068
 
3057
3069
  pattern(%w( _epilog $STRING ), lambda {
3058
- @property.set('epilog', newRichText(@val[1]))
3070
+ @property.set('epilog', newRichText(@val[1], @sourceFileInfo[1]))
3059
3071
  })
3060
3072
  doc('epilog', <<'EOT'
3061
3073
  Define a text section that is printed right after the actual report data. The
@@ -3072,7 +3084,7 @@ EOT
3072
3084
  )
3073
3085
 
3074
3086
  pattern(%w( _footer $STRING ), lambda {
3075
- @property.set('footer', newRichText(@val[1]))
3087
+ @property.set('footer', newRichText(@val[1], @sourceFileInfo[1]))
3076
3088
  })
3077
3089
  doc('footer', <<'EOT'
3078
3090
  Define a text section that is put at the bottom of the report. The
@@ -3084,7 +3096,7 @@ EOT
3084
3096
  pattern(%w( !formats ))
3085
3097
 
3086
3098
  pattern(%w( _header $STRING ), lambda {
3087
- @property.set('header', newRichText(@val[1]))
3099
+ @property.set('header', newRichText(@val[1], @sourceFileInfo[1]))
3088
3100
  })
3089
3101
  doc('header', <<'EOT'
3090
3102
  Define a text section that is put at the top of the report. The
@@ -3099,7 +3111,7 @@ EOT
3099
3111
  pattern(%w( !hidetask ))
3100
3112
 
3101
3113
  pattern(%w( _left $STRING ), lambda {
3102
- @property.set('left', newRichText(@val[1]))
3114
+ @property.set('left', newRichText(@val[1], @sourceFileInfo[1]))
3103
3115
  })
3104
3116
  doc('left', <<'EOT'
3105
3117
  This attribute defines the left margin section of the [[textreport]]. The text
@@ -3119,7 +3131,7 @@ EOT
3119
3131
  pattern(%w( !reportPeriod ))
3120
3132
 
3121
3133
  pattern(%w( _prolog $STRING ), lambda {
3122
- @property.set('prolog', newRichText(@val[1]))
3134
+ @property.set('prolog', newRichText(@val[1], @sourceFileInfo[1]))
3123
3135
  })
3124
3136
  doc('prolog', <<'EOT'
3125
3137
  Define a text section that is printed right before the actual report data. The
@@ -3136,7 +3148,7 @@ EOT
3136
3148
  pattern(%w( !report ))
3137
3149
 
3138
3150
  pattern(%w( _right $STRING ), lambda {
3139
- @property.set('right', newRichText(@val[1]))
3151
+ @property.set('right', newRichText(@val[1], @sourceFileInfo[1]))
3140
3152
  })
3141
3153
  doc('right', <<'EOT'
3142
3154
  This attribute defines the right margin section of the [[textreport]]. The text
@@ -3145,6 +3157,16 @@ span the [[header]] or [[footer]] sections.
3145
3157
  EOT
3146
3158
  )
3147
3159
 
3160
+ pattern(%w( _rollupresource !logicalExpression ), lambda {
3161
+ @property.set('rollupResource', @val[1])
3162
+ })
3163
+ doc('rollupresource', <<'EOT'
3164
+ Do not show sub-resources of resources that match the specified logical
3165
+ expression.
3166
+ EOT
3167
+ )
3168
+ example('RollupResource')
3169
+
3148
3170
  pattern(%w( _rolluptask !logicalExpression ), lambda {
3149
3171
  @property.set('rollupTask', @val[1])
3150
3172
  })
@@ -3178,16 +3200,29 @@ EOT
3178
3200
 
3179
3201
  pattern(%w( !reportStart ))
3180
3202
 
3203
+ pattern(%w( _resourceroot !resourceId), lambda {
3204
+ @property.set('resourceRoot', @val[1])
3205
+ })
3206
+ doc('resourceroot', <<'EOT'
3207
+ Only resources below the specified root-level resources are exported. The
3208
+ exported resources will have the ID of the root-level resource stripped from
3209
+ their ID, so that the sub-resourcess of the root-level resource become
3210
+ top-level resources in the report file.
3211
+ EOT
3212
+ )
3213
+ example('ResourceRoot')
3214
+
3181
3215
  pattern(%w( _taskroot !taskId), lambda {
3182
3216
  @property.set('taskRoot', @val[1])
3183
3217
  })
3184
3218
  doc('taskroot', <<'EOT'
3185
3219
  Only tasks below the specified root-level tasks are exported. The exported
3186
- tasks will have the id of the root-level task stripped from their ID, so that
3187
- the sub-tasks of the root-level task become top-level tasks in the exported
3220
+ tasks will have the ID of the root-level task stripped from their ID, so that
3221
+ the sub-tasks of the root-level task become top-level tasks in the report
3188
3222
  file.
3189
3223
  EOT
3190
3224
  )
3225
+ example('TaskRoot')
3191
3226
 
3192
3227
  pattern(%w( !timeformat ), lambda {
3193
3228
  @property.set('timeFormat', @val[0])
@@ -3365,14 +3400,21 @@ EOT
3365
3400
  )
3366
3401
  end
3367
3402
 
3368
-
3369
-
3370
3403
  def rule_reportType
3371
3404
  singlePattern('_resourcereport')
3372
3405
  doc('resourcereport', <<'EOT'
3373
3406
  The report lists resources and their respective values in a table. The task
3374
- that are the resources are allocated to can be listed as well. See [[report]]
3375
- for further details.
3407
+ that are the resources are allocated to can be listed as well. To reduce the
3408
+ list of included resources, you can use the [[hideresource]],
3409
+ [[rollupresource]] or [[resourceroot]] attributes. The order of the task can
3410
+ be controlled with [[sortresources]]. If the first sorting criteria is tree
3411
+ sorting, the parent resources will always be included to form the tree.
3412
+ Tree sorting is the default. You need to change it if you do not want certain
3413
+ parent resources to be included in the report.
3414
+
3415
+ The tasks that the resources are allocated to can be included as well. Use the
3416
+ [[hidetask]] attribute for this. See [[report]] for a complete list of
3417
+ attributes and the full syntax for this keyword.
3376
3418
  EOT
3377
3419
  )
3378
3420
  singlePattern('_taskreport')
@@ -3381,12 +3423,13 @@ The report lists tasks and their respective values in a table. To reduce the
3381
3423
  list of included tasks, you can use the [[hidetask]], [[rolluptask]] or
3382
3424
  [[taskroot]] attributes. The order of the task can be controlled with
3383
3425
  [[sorttasks]]. If the first sorting criteria is tree sorting, the parent tasks
3384
- will unconditionally be included to form the tree. Tree sorting is the
3385
- default. You need to change it if you do not want certain parent tasks to be
3386
- included in the report.
3426
+ will always be included to form the tree. Tree sorting is the default. You
3427
+ need to change it if you do not want certain parent tasks to be included in
3428
+ the report.
3387
3429
 
3388
- The resources that are allocated to each task can be listed as well. See
3389
- [[report]] for further details.
3430
+ The resources that are allocated to each task can be listed as well. Use the
3431
+ [[hideresource]] attribute for this. See [[report]] for a complete list of
3432
+ attributes and the full syntax for this keyword.
3390
3433
  EOT
3391
3434
  )
3392
3435
  singlePattern('_textreport')
@@ -3504,7 +3547,7 @@ EOT
3504
3547
 
3505
3548
  def rule_resourceLeafList
3506
3549
  pattern(%w( !leafResourceId !moreLeafResources ), lambda {
3507
- [ @val[0] ] + @val[1]
3550
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
3508
3551
  })
3509
3552
  end
3510
3553
 
@@ -3542,7 +3585,7 @@ The booking attribute can be used to report completed work. This can be part
3542
3585
  of the necessary effort or the whole effort. When the scenario is scheduled in
3543
3586
  projection mode, TaskJuggler assumes that only the work reported with bookings
3544
3587
  has been done up to now. It then schedules a plan for the still missing
3545
- effort. Task with bookings must be scheduled in ''''asap'''' mode.
3588
+ effort. All task with bookings must be scheduled in ''''asap'''' mode.
3546
3589
 
3547
3590
  This attribute is also used within export reports to describe the details of a
3548
3591
  scheduled project.
@@ -3550,6 +3593,12 @@ scheduled project.
3550
3593
  The sloppy attribute can be used when you want to skip non-working time or
3551
3594
  other allocations automatically. If it's not given, all bookings must only
3552
3595
  cover working time for the resource.
3596
+
3597
+ The booking attributes is intended to capture the exact amount of completed
3598
+ work. This attribute is not really intended to specify completed effort by
3599
+ hand. Usually, booking statements are generated by [[export]] reports. The
3600
+ [[sloppy.booking|sloppy]] and [[overtime.booking|overtime]] attributes are
3601
+ only kludge for users who want to write them manually.
3553
3602
  EOT
3554
3603
  )
3555
3604
  also(%w( scheduling ))
@@ -4192,8 +4241,10 @@ EOT
4192
4241
  @sourceFileInfo[1])
4193
4242
  end
4194
4243
  rtTokenSetIntro =
4195
- %w( LINEBREAK SPACE WORD BOLD ITALIC CODE BOLDITALIC HREF HREFEND )
4196
- @journalEntry.summary = newRichText(@val[1], rtTokenSetIntro)
4244
+ [ :LINEBREAK, :SPACE, :WORD, :BOLD, :ITALIC, :CODE, :BOLDITALIC,
4245
+ :HREF, :HREFEND ]
4246
+ @journalEntry.summary = newRichText(@val[1], @sourceFileInfo[1],
4247
+ rtTokenSetIntro)
4197
4248
  })
4198
4249
  doc('summary', <<'EOT'
4199
4250
  This is the introductory part of the journal or status entry. It should
@@ -4277,7 +4328,7 @@ EOT
4277
4328
  pattern(%w( !journalEntry ))
4278
4329
 
4279
4330
  pattern(%w( _note $STRING ), lambda {
4280
- @property.set('note', newRichText(@val[1]))
4331
+ @property.set('note', newRichText(@val[1], @sourceFileInfo[1]))
4281
4332
  })
4282
4333
  doc('note.task', <<'EOT'
4283
4334
  Attach a note to the task. This is usually a more detailed specification of
@@ -4426,7 +4477,7 @@ EOT
4426
4477
 
4427
4478
  def rule_taskDepList
4428
4479
  pattern(%w( !taskDep !moreDepTasks ), lambda {
4429
- [ @val[0] ] + @val[1]
4480
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
4430
4481
  })
4431
4482
  end
4432
4483
 
@@ -4439,7 +4490,7 @@ EOT
4439
4490
  id = (@property ? @property.fullId + '.' : '') + @val[1]
4440
4491
  if @project.task(id)
4441
4492
  error('task_exists', "Task #{id} has already been defined.",
4442
- @sourceFileInfo[1])
4493
+ @sourceFileInfo[0])
4443
4494
  end
4444
4495
  end
4445
4496
  @property = Task.new(@project, @val[1], @val[2], @property)
@@ -4498,7 +4549,7 @@ EOT
4498
4549
 
4499
4550
  def rule_taskPredList
4500
4551
  pattern(%w( !taskPred !morePredTasks ), lambda {
4501
- [ @val[0] ] + @val[1]
4552
+ [ @val[0] ] + (@val[1].nil? ? [] : @val[1])
4502
4553
  })
4503
4554
  end
4504
4555
 
@@ -5240,12 +5291,15 @@ possible values.
5240
5291
  The project start and end time are not affected by this setting. You
5241
5292
  have to explicitly state the time zone for those dates or the system defaults
5242
5293
  are assumed. Using the TZ environment variable is the recommended way to
5243
- specify the time zone for your project. If you use this attribute within the
5244
- project, it should be the very first thing you set. It must be set before you
5245
- set the [[timingresolution]] or any attribute with a time or date.
5294
+ specify the time zone for your project.
5246
5295
 
5247
5296
  In case the specified time zone is not hour-aligned with UTC, the
5248
- [[timingresolution]] will automatically be decreased.
5297
+ [[timingresolution]] will automatically be decreased accordingly. Do not
5298
+ change the timingresolution after you've set the time zone!
5299
+
5300
+ Changing the time zone will reset the [[workinghours.project|working hours]]
5301
+ to the default times. It's recommended that you declare your working hours
5302
+ after the time zone.
5249
5303
  EOT
5250
5304
  )
5251
5305
  arg(1, 'zone', <<'EOT'
@@ -5664,15 +5718,17 @@ EOT
5664
5718
  def rule_workinghoursProject
5665
5719
  pattern(%w( !workinghours ))
5666
5720
  doc('workinghours.project', <<'EOT'
5667
- Set the default working hours for all subsequent resource definitions.
5668
- The working hours specification limits the availability of resources to
5669
- certain time slots of week days.
5721
+ Set the default working hours for all subsequent resource definitions. The
5722
+ standard working hours are 9:00am - 12:00am, 1:00pm - 18:00pm, Monday to
5723
+ Friday. The working hours specification limits the availability of resources
5724
+ to certain time slots of week days.
5670
5725
 
5671
5726
  These default working hours can be replaced with other working hours for
5672
5727
  individual resources.
5673
5728
  EOT
5674
5729
  )
5675
5730
  also(%w( dailyworkinghours workinghours.resource workinghours.shift ))
5731
+ example('Project')
5676
5732
  end
5677
5733
 
5678
5734
  def rule_workinghoursResource