taskjuggler 0.0.5 → 0.0.6

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 (544) hide show
  1. data/CHANGELOG +2086 -0
  2. data/benchmarks/666tasks.tjp +3183 -0
  3. data/benchmarks/booking.tjp +14 -10
  4. data/doc/AppConfig.html +95 -73
  5. data/doc/Arguments.html +22 -2
  6. data/doc/CHANGELOG.html +2587 -0
  7. data/doc/COPYING.html +21 -1
  8. data/doc/Object.html +161 -122
  9. data/doc/README.html +21 -1
  10. data/doc/RuntimeConfig.html +26 -6
  11. data/doc/String.html +38 -18
  12. data/doc/StringIO.html +579 -0
  13. data/doc/TaskJuggler.html +251 -143
  14. data/doc/TaskJuggler/Account.html +26 -6
  15. data/doc/TaskJuggler/AccountAttribute.html +28 -8
  16. data/doc/TaskJuggler/AccountScenario.html +24 -4
  17. data/doc/TaskJuggler/Allocation.html +30 -10
  18. data/doc/TaskJuggler/AllocationAttribute.html +28 -8
  19. data/doc/TaskJuggler/AttributeBase.html +46 -26
  20. data/doc/TaskJuggler/AttributeDefinition.html +22 -2
  21. data/doc/TaskJuggler/BatchProcessor.html +40 -20
  22. data/doc/TaskJuggler/Booking.html +26 -6
  23. data/doc/TaskJuggler/BookingListAttribute.html +28 -8
  24. data/doc/TaskJuggler/BooleanAttribute.html +28 -8
  25. data/doc/TaskJuggler/CSVFile.html +308 -146
  26. data/doc/TaskJuggler/CellSettingPattern.html +22 -2
  27. data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
  28. data/doc/TaskJuggler/Charge.html +26 -6
  29. data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
  30. data/doc/TaskJuggler/ChargeSet.html +33 -13
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
  32. data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
  33. data/doc/TaskJuggler/ColumnTable.html +24 -4
  34. data/doc/TaskJuggler/Daemon.html +26 -6
  35. data/doc/TaskJuggler/DateAttribute.html +26 -6
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
  37. data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
  38. data/doc/TaskJuggler/DurationAttribute.html +28 -8
  39. data/doc/TaskJuggler/FixnumAttribute.html +24 -4
  40. data/doc/TaskJuggler/FlagListAttribute.html +28 -8
  41. data/doc/TaskJuggler/FloatAttribute.html +26 -6
  42. data/doc/TaskJuggler/FormatListAttribute.html +24 -4
  43. data/doc/TaskJuggler/GanttChart.html +147 -126
  44. data/doc/TaskJuggler/GanttContainer.html +34 -14
  45. data/doc/TaskJuggler/GanttHeader.html +28 -8
  46. data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
  47. data/doc/TaskJuggler/GanttLine.html +38 -18
  48. data/doc/TaskJuggler/GanttLoadStack.html +26 -6
  49. data/doc/TaskJuggler/GanttMilestone.html +34 -14
  50. data/doc/TaskJuggler/GanttRouter.html +50 -30
  51. data/doc/TaskJuggler/GanttTaskBar.html +34 -14
  52. data/doc/TaskJuggler/HTMLDocument.html +26 -6
  53. data/doc/TaskJuggler/HTMLGraphics.html +30 -10
  54. data/doc/TaskJuggler/Interval.html +40 -22
  55. data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
  56. data/doc/TaskJuggler/JobInfo.html +24 -4
  57. data/doc/TaskJuggler/Journal.html +226 -147
  58. data/doc/TaskJuggler/JournalEntry.html +22 -2
  59. data/doc/TaskJuggler/JournalEntryList.html +129 -112
  60. data/doc/TaskJuggler/KeywordArray.html +26 -6
  61. data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
  62. data/doc/TaskJuggler/Limits.html +152 -123
  63. data/doc/TaskJuggler/Limits/Limit.html +149 -70
  64. data/doc/TaskJuggler/LimitsAttribute.html +36 -51
  65. data/doc/TaskJuggler/ListAttributeBase.html +24 -4
  66. data/doc/TaskJuggler/Log.html +50 -32
  67. data/doc/TaskJuggler/LogFile.html +37 -17
  68. data/doc/TaskJuggler/LogicalAttribute.html +53 -33
  69. data/doc/TaskJuggler/LogicalExpression.html +26 -6
  70. data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
  71. data/doc/TaskJuggler/LogicalFlag.html +42 -22
  72. data/doc/TaskJuggler/LogicalFunction.html +204 -140
  73. data/doc/TaskJuggler/LogicalOperation.html +135 -111
  74. data/doc/TaskJuggler/Macro.html +22 -2
  75. data/doc/TaskJuggler/MacroParser.html +32 -12
  76. data/doc/TaskJuggler/MacroTable.html +32 -12
  77. data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
  78. data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
  79. data/doc/TaskJuggler/Message.html +24 -4
  80. data/doc/TaskJuggler/MessageHandler.html +24 -4
  81. data/doc/TaskJuggler/Navigator.html +104 -71
  82. data/doc/TaskJuggler/NavigatorElement.html +32 -12
  83. data/doc/TaskJuggler/NikuProject.html +22 -2
  84. data/doc/TaskJuggler/NikuReport.html +310 -228
  85. data/doc/TaskJuggler/NikuResource.html +22 -2
  86. data/doc/TaskJuggler/NodeListAttribute.html +615 -0
  87. data/doc/TaskJuggler/OnShiftCache.html +32 -12
  88. data/doc/TaskJuggler/ProcessIntercom.html +205 -78
  89. data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
  90. data/doc/TaskJuggler/Project.html +708 -660
  91. data/doc/TaskJuggler/ProjectBroker.html +506 -304
  92. data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
  93. data/doc/TaskJuggler/ProjectFileParser.html +429 -373
  94. data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
  95. data/doc/TaskJuggler/ProjectRecord.html +80 -60
  96. data/doc/TaskJuggler/ProjectServer.html +312 -237
  97. data/doc/TaskJuggler/ProjectServerIface.html +101 -43
  98. data/doc/TaskJuggler/PropertyAttribute.html +32 -12
  99. data/doc/TaskJuggler/PropertyList.html +166 -145
  100. data/doc/TaskJuggler/PropertySet.html +254 -224
  101. data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
  102. data/doc/TaskJuggler/Query.html +169 -148
  103. data/doc/TaskJuggler/RTFHandlers.html +622 -0
  104. data/doc/TaskJuggler/RTFNavigator.html +28 -8
  105. data/doc/TaskJuggler/RTFQuery.html +40 -20
  106. data/doc/TaskJuggler/RTFReport.html +62 -25
  107. data/doc/TaskJuggler/RTFReportLink.html +765 -0
  108. data/doc/TaskJuggler/RealFormat.html +26 -6
  109. data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
  110. data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
  111. data/doc/TaskJuggler/Report.html +402 -251
  112. data/doc/TaskJuggler/ReportBase.html +162 -137
  113. data/doc/TaskJuggler/ReportContext.html +112 -29
  114. data/doc/TaskJuggler/ReportServer.html +89 -64
  115. data/doc/TaskJuggler/ReportServerIface.html +75 -55
  116. data/doc/TaskJuggler/ReportServerRecord.html +54 -31
  117. data/doc/TaskJuggler/ReportServlet.html +980 -0
  118. data/doc/TaskJuggler/ReportTable.html +41 -21
  119. data/doc/TaskJuggler/ReportTableCell.html +214 -170
  120. data/doc/TaskJuggler/ReportTableColumn.html +30 -10
  121. data/doc/TaskJuggler/ReportTableLegend.html +36 -16
  122. data/doc/TaskJuggler/ReportTableLine.html +32 -12
  123. data/doc/TaskJuggler/Resource.html +99 -87
  124. data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
  125. data/doc/TaskJuggler/ResourceListRE.html +47 -26
  126. data/doc/TaskJuggler/ResourceScenario.html +403 -437
  127. data/doc/TaskJuggler/RichText.html +26 -6
  128. data/doc/TaskJuggler/RichTextAttribute.html +50 -30
  129. data/doc/TaskJuggler/RichTextDocument.html +37 -17
  130. data/doc/TaskJuggler/RichTextElement.html +475 -413
  131. data/doc/TaskJuggler/RichTextException.html +22 -2
  132. data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
  133. data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
  134. data/doc/TaskJuggler/RichTextImage.html +22 -2
  135. data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
  136. data/doc/TaskJuggler/RichTextParser.html +56 -34
  137. data/doc/TaskJuggler/RichTextScanner.html +82 -61
  138. data/doc/TaskJuggler/RichTextSnip.html +34 -14
  139. data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
  140. data/doc/TaskJuggler/Scenario.html +22 -2
  141. data/doc/TaskJuggler/ScenarioData.html +30 -46
  142. data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
  143. data/doc/TaskJuggler/Scoreboard.html +42 -22
  144. data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
  145. data/doc/TaskJuggler/SheetReceiver.html +333 -295
  146. data/doc/TaskJuggler/SheetSender.html +253 -230
  147. data/doc/TaskJuggler/Shift.html +26 -6
  148. data/doc/TaskJuggler/ShiftAssignment.html +89 -73
  149. data/doc/TaskJuggler/ShiftAssignments.html +226 -234
  150. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
  151. data/doc/TaskJuggler/ShiftScenario.html +28 -8
  152. data/doc/TaskJuggler/SortListAttribute.html +34 -14
  153. data/doc/TaskJuggler/SourceFileInfo.html +24 -4
  154. data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
  155. data/doc/TaskJuggler/StatusSheetReport.html +168 -153
  156. data/doc/TaskJuggler/StatusSheetSender.html +24 -3
  157. data/doc/TaskJuggler/StringAttribute.html +38 -18
  158. data/doc/TaskJuggler/SymbolAttribute.html +32 -12
  159. data/doc/TaskJuggler/SyntaxReference.html +40 -20
  160. data/doc/TaskJuggler/TOCEntry.html +26 -6
  161. data/doc/TaskJuggler/TSResourceRecord.html +22 -2
  162. data/doc/TaskJuggler/TSTaskRecord.html +22 -2
  163. data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
  164. data/doc/TaskJuggler/TableOfContents.html +26 -6
  165. data/doc/TaskJuggler/TableReport.html +937 -904
  166. data/doc/TaskJuggler/Task.html +55 -36
  167. data/doc/TaskJuggler/TaskDependency.html +24 -4
  168. data/doc/TaskJuggler/TaskListAttribute.html +50 -30
  169. data/doc/TaskJuggler/TaskListRE.html +27 -7
  170. data/doc/TaskJuggler/TaskScenario.html +1273 -1153
  171. data/doc/TaskJuggler/TextFormatter.html +28 -8
  172. data/doc/TaskJuggler/TextParser.html +585 -338
  173. data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
  174. data/doc/TaskJuggler/TextParser/Rule.html +95 -73
  175. data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
  176. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
  177. data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
  178. data/doc/TaskJuggler/TextReport.html +28 -8
  179. data/doc/TaskJuggler/TextScanner.html +400 -1404
  180. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
  181. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
  182. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
  183. data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
  184. data/doc/TaskJuggler/TimeSheet.html +48 -28
  185. data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
  186. data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
  187. data/doc/TaskJuggler/TimeSheetReport.html +154 -133
  188. data/doc/TaskJuggler/TimeSheetSender.html +24 -3
  189. data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
  190. data/doc/TaskJuggler/TimeSheets.html +26 -6
  191. data/doc/TaskJuggler/Tj3AppBase.html +85 -58
  192. data/doc/TaskJuggler/Tj3Client.html +292 -238
  193. data/doc/TaskJuggler/Tj3Daemon.html +159 -74
  194. data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
  195. data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
  196. data/doc/TaskJuggler/Tj3SsSender.html +53 -26
  197. data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
  198. data/doc/TaskJuggler/Tj3TsSender.html +26 -6
  199. data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
  200. data/doc/TaskJuggler/TjException.html +22 -2
  201. data/doc/TaskJuggler/TjTime.html +216 -160
  202. data/doc/TaskJuggler/TjpExample.html +34 -14
  203. data/doc/TaskJuggler/TjpExportRE.html +403 -407
  204. data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
  205. data/doc/TaskJuggler/URLParameter.html +649 -0
  206. data/doc/TaskJuggler/UserManual.html +42 -22
  207. data/doc/TaskJuggler/WebServer.html +702 -0
  208. data/doc/TaskJuggler/WorkingHours.html +38 -18
  209. data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
  210. data/doc/TaskJuggler/XMLBlob.html +24 -4
  211. data/doc/TaskJuggler/XMLComment.html +24 -4
  212. data/doc/TaskJuggler/XMLDocument.html +30 -10
  213. data/doc/TaskJuggler/XMLElement.html +34 -14
  214. data/doc/TaskJuggler/XMLNamedText.html +22 -2
  215. data/doc/TaskJuggler/XMLText.html +24 -4
  216. data/doc/index.html +1841 -1666
  217. data/doc/lib/AccountScenario_rb.html +1 -1
  218. data/doc/lib/Account_rb.html +1 -1
  219. data/doc/lib/Allocation_rb.html +1 -1
  220. data/doc/lib/AppConfig_rb.html +2 -2
  221. data/doc/lib/AttributeBase_rb.html +1 -1
  222. data/doc/lib/AttributeDefinition_rb.html +1 -1
  223. data/doc/lib/Attributes_rb.html +2 -2
  224. data/doc/lib/BatchProcessor_rb.html +1 -1
  225. data/doc/lib/Booking_rb.html +1 -1
  226. data/doc/lib/ChargeSet_rb.html +1 -1
  227. data/doc/lib/Charge_rb.html +1 -1
  228. data/doc/lib/HTMLDocument_rb.html +1 -1
  229. data/doc/lib/Interval_rb.html +1 -1
  230. data/doc/lib/Journal_rb.html +2 -2
  231. data/doc/lib/KeywordArray_rb.html +1 -1
  232. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  233. data/doc/lib/Limits_rb.html +2 -2
  234. data/doc/lib/LogFile_rb.html +2 -2
  235. data/doc/lib/Log_rb.html +1 -1
  236. data/doc/lib/LogicalExpression_rb.html +1 -1
  237. data/doc/lib/LogicalFunction_rb.html +2 -2
  238. data/doc/lib/LogicalOperation_rb.html +2 -2
  239. data/doc/lib/MacroParser_rb.html +1 -1
  240. data/doc/lib/MacroTable_rb.html +1 -1
  241. data/doc/lib/MessageHandler_rb.html +1 -1
  242. data/doc/lib/Message_rb.html +1 -1
  243. data/doc/lib/ProjectFileParser_rb.html +4 -8
  244. data/doc/lib/ProjectFileScanner_rb.html +67 -0
  245. data/doc/lib/Project_rb.html +2 -2
  246. data/doc/lib/PropertyList_rb.html +2 -2
  247. data/doc/lib/PropertySet_rb.html +2 -2
  248. data/doc/lib/PropertyTreeNode_rb.html +2 -2
  249. data/doc/lib/Query_rb.html +2 -2
  250. data/doc/lib/RTFHandlers_rb.html +73 -0
  251. data/doc/lib/RTFNavigator_rb.html +1 -1
  252. data/doc/lib/RTFQuery_rb.html +1 -1
  253. data/doc/lib/RTFReportLink_rb.html +71 -0
  254. data/doc/lib/RTFReport_rb.html +2 -2
  255. data/doc/lib/RealFormat_rb.html +1 -1
  256. data/doc/lib/ResourceScenario_rb.html +2 -2
  257. data/doc/lib/Resource_rb.html +2 -2
  258. data/doc/lib/RichTextDocument_rb.html +1 -1
  259. data/doc/lib/RichTextElement_rb.html +2 -2
  260. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  261. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  262. data/doc/lib/RichTextParser_rb.html +2 -2
  263. data/doc/lib/RichTextScanner_rb.html +2 -2
  264. data/doc/lib/RichTextSnip_rb.html +1 -1
  265. data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
  266. data/doc/lib/RichText_rb.html +1 -1
  267. data/doc/lib/RuntimeConfig_rb.html +1 -1
  268. data/doc/lib/ScenarioData_rb.html +2 -2
  269. data/doc/lib/Scenario_rb.html +1 -1
  270. data/doc/lib/Scoreboard_rb.html +1 -1
  271. data/doc/lib/SheetHandlerBase_rb.html +1 -1
  272. data/doc/lib/SheetReceiver_rb.html +2 -2
  273. data/doc/lib/SheetSender_rb.html +4 -2
  274. data/doc/lib/ShiftAssignments_rb.html +4 -2
  275. data/doc/lib/ShiftScenario_rb.html +1 -1
  276. data/doc/lib/Shift_rb.html +1 -1
  277. data/doc/lib/SourceFileInfo_rb.html +1 -1
  278. data/doc/lib/StatusSheetReceiver_rb.html +2 -2
  279. data/doc/lib/StatusSheetSender_rb.html +2 -2
  280. data/doc/lib/SyntaxReference_rb.html +1 -1
  281. data/doc/lib/TOCEntry_rb.html +1 -1
  282. data/doc/lib/TableColumnDefinition_rb.html +2 -2
  283. data/doc/lib/TableOfContents_rb.html +1 -1
  284. data/doc/lib/TaskDependency_rb.html +1 -1
  285. data/doc/lib/TaskJuggler_rb.html +2 -2
  286. data/doc/lib/TaskScenario_rb.html +2 -2
  287. data/doc/lib/Task_rb.html +2 -2
  288. data/doc/lib/TextFormatter_rb.html +1 -1
  289. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  290. data/doc/lib/TextParser/Rule_rb.html +2 -2
  291. data/doc/lib/TextParser/StackElement_rb.html +2 -2
  292. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  293. data/doc/lib/TextParser_rb.html +2 -2
  294. data/doc/lib/TextScanner_rb.html +6 -2
  295. data/doc/lib/TimeSheetReceiver_rb.html +2 -2
  296. data/doc/lib/TimeSheetSender_rb.html +2 -2
  297. data/doc/lib/TimeSheetSummary_rb.html +2 -2
  298. data/doc/lib/TimeSheets_rb.html +2 -2
  299. data/doc/lib/Tj3AppBase_rb.html +2 -2
  300. data/doc/lib/Tj3Config_rb.html +2 -2
  301. data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
  302. data/doc/lib/TjException_rb.html +1 -1
  303. data/doc/lib/TjTime_rb.html +2 -2
  304. data/doc/lib/TjpExample_rb.html +1 -1
  305. data/doc/lib/TjpSyntaxRules_rb.html +2 -2
  306. data/doc/lib/URLParameter_rb.html +67 -0
  307. data/doc/lib/UTF8String_rb.html +1 -1
  308. data/doc/lib/UserManual_rb.html +1 -1
  309. data/doc/lib/WorkingHours_rb.html +1 -1
  310. data/doc/lib/XMLDocument_rb.html +2 -2
  311. data/doc/lib/XMLElement_rb.html +1 -1
  312. data/doc/lib/daemon/Daemon_rb.html +1 -1
  313. data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
  314. data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
  315. data/doc/lib/daemon/ProjectServer_rb.html +2 -2
  316. data/doc/lib/daemon/ReportServer_rb.html +2 -2
  317. data/doc/lib/daemon/WebServer_rb.html +75 -0
  318. data/doc/lib/deep_copy_rb.html +2 -2
  319. data/doc/lib/reports/CSVFile_rb.html +2 -2
  320. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  321. data/doc/lib/reports/GanttChart_rb.html +2 -2
  322. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  323. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  324. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  325. data/doc/lib/reports/GanttLine_rb.html +1 -1
  326. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  327. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  328. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  329. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  330. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  331. data/doc/lib/reports/Navigator_rb.html +2 -2
  332. data/doc/lib/reports/NikuReport_rb.html +2 -2
  333. data/doc/lib/reports/ReportBase_rb.html +2 -2
  334. data/doc/lib/reports/ReportContext_rb.html +2 -2
  335. data/doc/lib/reports/ReportTableCell_rb.html +2 -2
  336. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  337. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  338. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  339. data/doc/lib/reports/ReportTable_rb.html +2 -2
  340. data/doc/lib/reports/Report_rb.html +2 -2
  341. data/doc/lib/reports/ResourceListRE_rb.html +2 -2
  342. data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
  343. data/doc/lib/reports/TableReport_rb.html +2 -2
  344. data/doc/lib/reports/TaskListRE_rb.html +2 -2
  345. data/doc/lib/reports/TextReport_rb.html +1 -1
  346. data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
  347. data/doc/lib/reports/TjpExportRE_rb.html +2 -2
  348. data/doc/lib/ruby-signal-bug_rb.html +1 -1
  349. data/doc/lib/taskjuggler3_rb.html +2 -2
  350. data/doc/lib/tj3client_rb.html +2 -2
  351. data/doc/lib/tj3d_rb.html +2 -2
  352. data/doc/lib/tj3man_rb.html +1 -1
  353. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  354. data/doc/lib/tj3ss_sender_rb.html +2 -2
  355. data/doc/lib/tj3ts_receiver_rb.html +2 -2
  356. data/doc/lib/tj3ts_sender_rb.html +1 -1
  357. data/doc/lib/tj3ts_summary_rb.html +1 -1
  358. data/doc/rdoc.css +9 -4
  359. data/examples/tutorial.tjp +17 -15
  360. data/gem_spec.rb +3 -0
  361. data/lib/AppConfig.rb +3 -1
  362. data/lib/Attributes.rb +10 -8
  363. data/lib/Journal.rb +55 -20
  364. data/lib/Limits.rb +72 -46
  365. data/lib/LogFile.rb +3 -3
  366. data/lib/LogicalFunction.rb +19 -6
  367. data/lib/LogicalOperation.rb +5 -1
  368. data/lib/Project.rb +37 -9
  369. data/lib/ProjectFileParser.rb +25 -22
  370. data/lib/ProjectFileScanner.rb +365 -0
  371. data/lib/PropertyList.rb +2 -1
  372. data/lib/PropertySet.rb +14 -4
  373. data/lib/PropertyTreeNode.rb +42 -29
  374. data/lib/Query.rb +3 -1
  375. data/lib/RTFHandlers.rb +35 -0
  376. data/lib/RTFReport.rb +23 -6
  377. data/lib/RTFReportLink.rb +72 -0
  378. data/lib/Resource.rb +8 -16
  379. data/lib/ResourceScenario.rb +1 -22
  380. data/lib/RichTextElement.rb +42 -0
  381. data/lib/RichTextParser.rb +6 -4
  382. data/lib/RichTextScanner.rb +5 -5
  383. data/lib/RichTextSyntaxRules.rb +48 -10
  384. data/lib/ScenarioData.rb +5 -3
  385. data/lib/SheetReceiver.rb +24 -6
  386. data/lib/SheetSender.rb +17 -13
  387. data/lib/ShiftAssignments.rb +56 -52
  388. data/lib/StatusSheetReceiver.rb +1 -0
  389. data/lib/StatusSheetSender.rb +1 -0
  390. data/lib/TableColumnDefinition.rb +4 -2
  391. data/lib/Task.rb +8 -9
  392. data/lib/TaskJuggler.rb +21 -11
  393. data/lib/TaskScenario.rb +61 -26
  394. data/lib/TextParser.rb +268 -106
  395. data/lib/TextParser/Rule.rb +4 -2
  396. data/lib/TextParser/StackElement.rb +6 -4
  397. data/lib/TextScanner.rb +283 -700
  398. data/lib/TimeSheetReceiver.rb +1 -0
  399. data/lib/TimeSheetSender.rb +1 -0
  400. data/lib/TimeSheetSummary.rb +51 -26
  401. data/lib/TimeSheets.rb +1 -1
  402. data/lib/Tj3AppBase.rb +8 -1
  403. data/lib/Tj3Config.rb +1 -1
  404. data/lib/TjTime.rb +5 -0
  405. data/lib/TjpSyntaxRules.rb +360 -144
  406. data/lib/URLParameter.rb +30 -0
  407. data/lib/XMLDocument.rb +2 -2
  408. data/lib/daemon/ProcessIntercom.rb +50 -9
  409. data/lib/daemon/ProjectBroker.rb +63 -10
  410. data/lib/daemon/ProjectServer.rb +47 -16
  411. data/lib/daemon/ReportServer.rb +9 -4
  412. data/lib/daemon/WebServer.rb +204 -0
  413. data/lib/deep_copy.rb +4 -1
  414. data/lib/reports/CSVFile.rb +150 -66
  415. data/lib/reports/GanttChart.rb +2 -1
  416. data/lib/reports/Navigator.rb +18 -5
  417. data/lib/reports/NikuReport.rb +32 -2
  418. data/lib/reports/Report.rb +65 -37
  419. data/lib/reports/ReportBase.rb +14 -9
  420. data/lib/reports/ReportContext.rb +19 -4
  421. data/lib/reports/ReportTable.rb +2 -2
  422. data/lib/reports/ReportTableCell.rb +54 -30
  423. data/lib/reports/ResourceListRE.rb +4 -3
  424. data/lib/reports/StatusSheetReport.rb +8 -13
  425. data/lib/reports/TableReport.rb +47 -32
  426. data/lib/reports/TaskListRE.rb +3 -3
  427. data/lib/reports/TimeSheetReport.rb +14 -5
  428. data/lib/reports/TjpExportRE.rb +14 -19
  429. data/lib/taskjuggler3.rb +15 -0
  430. data/lib/tj3client.rb +9 -7
  431. data/lib/tj3d.rb +38 -10
  432. data/lib/tj3ss_sender.rb +7 -0
  433. data/lib/tj3ts_receiver.rb +1 -0
  434. data/manual/Day_To_Day_Juggling +1 -1
  435. data/manual/Rich_Text_Attributes +8 -0
  436. data/manual/TaskJuggler_2x_Migration +7 -0
  437. data/manual/The_TaskJuggler_Syntax +20 -6
  438. data/prj_cfg.rb +3 -2
  439. data/tasks/changelog.rake +36 -0
  440. data/tasks/csts.rake +2 -3
  441. data/tasks/gem.rake +10 -0
  442. data/tasks/missing.rake +0 -17
  443. data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
  444. data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
  445. data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
  446. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
  447. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
  448. data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
  449. data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
  450. data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
  451. data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
  452. data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
  453. data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
  454. data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
  455. data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
  456. data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
  457. data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
  458. data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
  459. data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
  460. data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
  461. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
  462. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
  463. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
  464. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
  465. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
  466. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
  467. data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
  468. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
  469. data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
  470. data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
  471. data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
  472. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
  473. data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
  474. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
  475. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
  476. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
  477. data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
  478. data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
  479. data/test/TestSuite/StatusSheets/run +3 -2
  480. data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
  481. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
  482. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
  483. data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
  484. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
  485. data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
  486. data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
  487. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  488. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  489. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  490. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  491. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  492. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  493. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  494. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  495. data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
  496. data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
  497. data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
  498. data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
  499. data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
  500. data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
  501. data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
  502. data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
  503. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
  504. data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
  505. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  506. data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
  507. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
  508. data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
  509. data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
  510. data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
  511. data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
  512. data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
  513. data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
  514. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  515. data/test/TestSuite/TimeSheets/run +5 -5
  516. data/test/test_CSVFile.rb +75 -0
  517. data/test/test_Limits.rb +63 -5
  518. data/test/test_ProjectFileScanner.rb +163 -0
  519. data/test/test_ReportGenerator.rb +81 -0
  520. data/test/test_RichText.rb +21 -3
  521. data/test/test_Scheduler.rb +1 -1
  522. data/test/test_ShiftAssignments.rb +4 -4
  523. data/test/test_Syntax.rb +1 -1
  524. data/test/test_URLParameter.rb +30 -0
  525. metadata +126 -32
  526. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
  527. data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
  528. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
  529. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
  530. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
  531. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
  532. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
  533. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
  534. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
  535. data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
  536. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
  537. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
  538. data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
  539. data/test/TestSuite/TimeSheets/receiver.log +0 -102
  540. data/test/TestSuite/TimeSheets/sender.log +0 -794
  541. data/test/TestSuite/TimeSheets/summary.log +0 -884
  542. data/test/TestSuite/TimeSheets/timesheets.log +0 -45
  543. data/test/TestSuite/TimeSheets/tj3d.log +0 -292
  544. data/test/test_TextScanner.rb +0 -95
data/lib/Limits.rb CHANGED
@@ -25,14 +25,16 @@ class TaskJuggler
25
25
  class Limit
26
26
 
27
27
  attr_accessor :resource
28
+ attr_reader :name, :interval, :upper
28
29
 
29
30
  # To create a new Limit object, the Interval +interval+ and the
30
- # period duration (+period+ in seconds) must be specified. This creates a
31
- # counter for each period within the overall interval. +value+ is the value
32
- # of the limit. +upper+ specifies whether the limit is an upper or lower
33
- # limit. The limit can also be restricted to certain a Resource specified
34
- # by +resource+.
35
- def initialize(interval, period, value, upper, resource)
31
+ # period duration (+period+ in seconds) must be specified. This creates
32
+ # a counter for each period within the overall interval. +value+ is the
33
+ # value of the limit. +upper+ specifies whether the limit is an upper or
34
+ # lower limit. The limit can also be restricted to certain a Resource
35
+ # specified by +resource+.
36
+ def initialize(name, interval, period, value, upper, resource)
37
+ @name = name
36
38
  @interval = interval
37
39
  @period = period
38
40
  @value = value
@@ -47,7 +49,7 @@ class TaskJuggler
47
49
 
48
50
  # Returns a deep copy of the class instance.
49
51
  def copy
50
- Limit.new(@interval, @period, @value, @upper, @resource)
52
+ Limit.new(@name, @interval, @period, @value, @upper, @resource)
51
53
  end
52
54
 
53
55
  # This function can be used to reset the counter for a specific period
@@ -56,7 +58,8 @@ class TaskJuggler
56
58
  return unless @dirty
57
59
 
58
60
  if date.nil?
59
- @scoreboard = Scoreboard.new(@interval.start, @interval.end, @period, 0)
61
+ @scoreboard = Scoreboard.new(@interval.start, @interval.end,
62
+ @period, 0)
60
63
  else
61
64
  return unless @interval.contains?(date)
62
65
  @scoreboard.set(date, 0)
@@ -64,54 +67,67 @@ class TaskJuggler
64
67
  @dirty = false
65
68
  end
66
69
 
67
- # Increase the counter for a specific period specified by +date+. If
68
- # +resource+ is not nil, the counter is only increased if +resource+
69
- # matches resource.
70
+ # Increase the counter if the _date_ matches the @interval. The
71
+ # relationship between @resource and _resource_ is described below.
72
+ # @r \ _r_ nil y
73
+ # nil inc inc
74
+ # x - if x==y inc else -
70
75
  def inc(date, resource)
71
- return if !@interval.contains?(date) || (!resource.nil? && @resource != resource)
72
-
73
- @dirty = true
74
- @scoreboard.set(date, @scoreboard.get(date) + 1)
76
+ if @interval.contains?(date) &&
77
+ (@resource.nil? || @resource == resource)
78
+ # The condition is met, increment the counter for the interval.
79
+ @dirty = true
80
+ @scoreboard.set(date, @scoreboard.get(date) + 1)
81
+ end
75
82
  end
76
83
 
77
- # Returns true if the counter for the time slot specified by +date+ or all
78
- # counters are within the limit. If +upper+ is true, only upper limits are
79
- # checked. If not, only lower limits are checked. If +resource+ is not
80
- # nil, only limits for this resource are checked.
84
+ # Returns true if the counter for the time slot specified by +date+ or
85
+ # all counters are within the limit. If +upper+ is true, only upper
86
+ # limits are checked. If not, only lower limits are checked. The
87
+ # dependency between _resource_ and @resource is described in the matrix
88
+ # below:
89
+ # @r \ _r_ nil y
90
+ # nil test true
91
+ # x true if x==y test else true
81
92
  def ok?(date, upper, resource)
82
- if date.nil?
83
- # if @upper does not match, we can ignore this limit.
84
- return true if @upper != upper || (!resource.nil? && @resource != resource)
93
+ # if @upper does not match or the provided resource does not match,
94
+ # we can ignore this limit.
95
+ return true if @upper != upper ||
96
+ (!@resource.nil? ^ !resource.nil?) ||
97
+ (@resource && resource && @resource != resource)
85
98
 
86
- # Check all counters.
99
+ if date.nil?
100
+ # No date given. We need to check all counters.
87
101
  @scoreboard.each do |i|
88
102
  return false if @upper ? i >= @value : i < @value
89
103
  end
90
104
  return true
91
105
  else
92
- # If the date is outside the interval or @upper does not match, ignore
93
- # this limit.
94
- return true if !@interval.contains?(date) || @upper != upper
95
- return @upper ? @scoreboard.get(date) < @value : @scoreboard.get(date) >= @value
106
+ # If the date is outside the interval we don't have to check
107
+ # anything. Everything is ok.
108
+ return true if !@interval.contains?(date)
109
+
110
+ return @upper ? @scoreboard.get(date) < @value :
111
+ @scoreboard.get(date) >= @value
96
112
  end
97
113
  end
98
114
 
99
115
  end
100
116
 
101
- attr_reader :limits, :project
117
+ attr_reader :project, :limits
102
118
 
103
119
  # Create a new Limits object. If an argument is passed, it acts as a copy
104
120
  # contructor.
105
121
  def initialize(limits = nil)
106
122
  if limits.nil?
107
123
  # Normal initialization
108
- @limits = {}
124
+ @limits = []
109
125
  @project = nil
110
126
  else
111
127
  # Deep copy content from other instance.
112
- @limits = {}
128
+ @limits = []
113
129
  limits.limits.each do |name, limit|
114
- @limits[name] = limit.copy
130
+ @limits << limit.copy
115
131
  end
116
132
  @project = limits.project
117
133
  end
@@ -128,32 +144,40 @@ class TaskJuggler
128
144
 
129
145
  # Reset all counter for all limits.
130
146
  def reset
131
- @limits.each_value { |limit| limit.reset }
147
+ @limits.each { |limit| limit.reset }
132
148
  end
133
149
 
134
- # Call this function to create or change a limit. The limit must be uniquely
135
- # identified by +name+. +value+ is the new limit value (in time slots).
136
- # +period+ is the Interval where the limit is active. In case the interval
150
+ # Call this function to create or change a limit. The limit is uniquely
151
+ # identified by the combination of +name+, +interval+ and +resource+.
152
+ # +value+ is the new limit value (in time slots). In case the interval
137
153
  # is nil, the complete project time frame is used.
138
154
  def setLimit(name, value, interval = nil, resource = nil)
139
- @limits.delete(name) if @limits[name]
140
- newLimit(name, value, interval.nil? ?
141
- Interval.new(@project['start'], @project['end']) : interval, resource)
155
+ iv = interval || Interval.new(@project['start'], @project['end'])
156
+ # If we have already a limit for the name + interval + resource
157
+ # combination, we delete it first.
158
+ @limits.delete_if do |l|
159
+ l.name == name && l.interval.start == iv.start &&
160
+ l.interval.end == iv.end && l.resource == resource
161
+ end
162
+
163
+ newLimit(name, value, iv, resource)
142
164
  end
143
165
 
144
166
  # This function increases the counters for all limits for a specific
145
167
  # interval identified by _date_.
146
168
  def inc(date, resource = nil)
147
- @limits.each_value do |limit|
169
+ @limits.each do |limit|
148
170
  limit.inc(date, resource)
149
171
  end
150
172
  end
151
173
 
152
- # Check all upper limits and return true if none is exceeded. If a _date_ is
153
- # specified only the counter for that specific period is tested. Otherwise
154
- # all periods are tested.
174
+ # Check all upper limits and return true if none is exceeded. If a _date_
175
+ # is specified only the counters for that specific period are tested.
176
+ # Otherwise all periods are tested. If _resource_ is nil, only
177
+ # non-resource-specific counters are checked, otherwise only the ones that
178
+ # match the _resource_.
155
179
  def ok?(date = nil, upper = true, resource = nil)
156
- @limits.each_value do |limit|
180
+ @limits.each do |limit|
157
181
  return false unless limit.ok?(date, upper, resource)
158
182
  end
159
183
  true
@@ -176,12 +200,14 @@ class TaskJuggler
176
200
  period = 60 * 60 * 24
177
201
  upper = false
178
202
  when 'weeklymax'
179
- interval.start = interval.start.beginOfWeek(@project['weekStartsMonday'])
203
+ interval.start = interval.start.beginOfWeek(
204
+ @project['weekStartsMonday'])
180
205
  interval.end = interval.end.beginOfWeek(@project['weekStartsMonday'])
181
206
  period = 60 * 60 * 24 * 7
182
207
  upper = true
183
208
  when 'weeklymin'
184
- interval.start = interval.start.beginOfWeek(@project['weekStartsMonday'])
209
+ interval.start = interval.start.beginOfWeek(
210
+ @project['weekStartsMonday'])
185
211
  interval.end = interval.end.beginOfWeek(@project['weekStartsMonday'])
186
212
  period = 60 * 60 * 24 * 7
187
213
  upper = false
@@ -212,7 +238,7 @@ class TaskJuggler
212
238
  end
213
239
  endDate = @project['end']
214
240
 
215
- @limits[name] = Limit.new(interval, period, value, upper, resource)
241
+ @limits << Limit.new(name, interval, period, value, upper, resource)
216
242
  end
217
243
 
218
244
  end
data/lib/LogFile.rb CHANGED
@@ -28,17 +28,17 @@ class TaskJuggler
28
28
  end
29
29
 
30
30
  def debug(message)
31
- $stdout.puts message if @outputLevel >= 4
31
+ $stderr.puts message if @outputLevel >= 4
32
32
  log('DEBUG', message) if @logLevel >= 4
33
33
  end
34
34
 
35
35
  def info(message)
36
- $stdout.puts message if @outputLevel >= 3
36
+ $stderr.puts message if @outputLevel >= 3
37
37
  log('INFO', message) if @logLevel >= 3
38
38
  end
39
39
 
40
40
  def warning(message)
41
- $stdout.puts message if @outputLevel >= 2
41
+ $stderr.puts message if @outputLevel >= 2
42
42
  log('WARN', message) if @logLevel >= 2
43
43
  end
44
44
 
@@ -27,6 +27,7 @@ class TaskJuggler
27
27
  'isactive' => 1,
28
28
  'isdependencyof' => 3,
29
29
  'isdutyof' => 2,
30
+ 'isfeatureof' => 2,
30
31
  'isleaf' => 0,
31
32
  'isongoing' => 1,
32
33
  'isresource' => 0,
@@ -94,7 +95,7 @@ class TaskJuggler
94
95
  property, scopeProperty = properties(expr)
95
96
  query = expr.query
96
97
  project = property.project
97
- date = project.reportContext.report.get('end')
98
+ date = project.reportContexts.last.report.get('end')
98
99
  !project['journal'].currentEntries(query.end, property,
99
100
  args[0], query.start).empty?
100
101
  end
@@ -110,9 +111,8 @@ class TaskJuggler
110
111
  expr.error("Unknown scenario '#{args[0]}' used for function isactive()")
111
112
  end
112
113
 
113
- property.getAllocatedTime(scenarioIdx,
114
- project.reportContext.report.get('start'),
115
- project.reportContext.report.get('end'),
114
+ query = expr.query
115
+ property.getAllocatedTime(scenarioIdx, query.start, query.end,
116
116
  scopeProperty) > 0.0
117
117
  end
118
118
 
@@ -144,6 +144,19 @@ class TaskJuggler
144
144
  task['assignedresources', scenarioIdx].include?(resource)
145
145
  end
146
146
 
147
+ def isfeatureof(expr, args)
148
+ property, scopeProperty = properties(expr)
149
+ # The result can only be true when called for a Task property.
150
+ return false unless property.is_a?(Task)
151
+ project = property.project
152
+ # 1st arg must be a task ID.
153
+ return false if (task = project.task(args[0])).nil?
154
+ # 2nd arg must be a scenario index.
155
+ return false if (scenarioIdx = project.scenarioIdx(args[1])).nil?
156
+
157
+ property.isFeatureOf(scenarioIdx, task)
158
+ end
159
+
147
160
  def isleaf(expr, args)
148
161
  property, scopeProperty = properties(expr)
149
162
  return false unless property
@@ -160,8 +173,8 @@ class TaskJuggler
160
173
  expr.error("Unknown scenario '#{args[0]}' used for function isongoing()")
161
174
  end
162
175
 
163
- iv1 = Interval.new(project.reportContext.report.get('start'),
164
- project.reportContext.report.get('end'))
176
+ query = expr.query
177
+ iv1 = Interval.new(query.start, query.end)
165
178
  tStart = task['start', scenarioIdx]
166
179
  tEnd = task['end', scenarioIdx]
167
180
  # This helps to show tasks with scheduling errors.
@@ -65,13 +65,17 @@ class TaskJuggler
65
65
  return evalBinaryOperation(opnd1, operator, opnd2) do |o|
66
66
  coerceNumber(o, expr)
67
67
  end
68
+ elsif opnd1.is_a?(RichTextIntermediate)
69
+ return evalBinaryOperation(opnd1.to_s, operator, opnd2) do |o|
70
+ coerceString(o, expr)
71
+ end
68
72
  elsif opnd1.is_a?(String)
69
73
  return evalBinaryOperation(opnd1, operator, opnd2) do |o|
70
74
  coerceString(o, expr)
71
75
  end
72
76
  else
73
77
  expr.error("First operand of a binary operation must be a date, " +
74
- "a number or a string: #{opnd1}")
78
+ "a number or a string: #{opnd1.class}")
75
79
  end
76
80
  when '&'
77
81
  return coerceBoolean(@operand1.eval(expr), expr) &&
data/lib/Project.rb CHANGED
@@ -50,7 +50,7 @@ class TaskJuggler
50
50
 
51
51
  attr_reader :accounts, :shifts, :tasks, :resources, :scenarios,
52
52
  :timeSheets, :reports, :messageHandler
53
- attr_accessor :reportContext, :outputDir, :warnTsDeltas
53
+ attr_accessor :reportContexts, :outputDir, :warnTsDeltas
54
54
 
55
55
  # Create a project with the specified +id+, +name+ and +version+.
56
56
  # +messageHandler+ is a MessageHandler reference that is used to handle
@@ -335,6 +335,8 @@ class TaskJuggler
335
335
  true, false, false, nil ],
336
336
  [ 'index', 'Index', FixnumAttribute,
337
337
  false, false, false, -1 ],
338
+ [ 'interactive', 'Interactive', BooleanAttribute,
339
+ false, false, false, false ],
338
340
  [ 'left', 'Left', RichTextAttribute,
339
341
  true, false, false, nil ],
340
342
  [ 'loadUnit', 'Load Unit', StringAttribute,
@@ -343,6 +345,8 @@ class TaskJuggler
343
345
  true, true, false, nil ],
344
346
  [ 'numberFormat', 'Number Format', RealFormatAttribute,
345
347
  true, true, false, nil ],
348
+ [ 'openNodes', 'Open Nodes', NodeListAttribute,
349
+ false, false, false, nil ],
346
350
  [ 'prolog', 'Prolog', RichTextAttribute,
347
351
  false, false, false, nil],
348
352
  [ 'resourceAttributes', 'Resource Attributes', FormatListAttribute,
@@ -392,8 +396,12 @@ class TaskJuggler
392
396
 
393
397
  @timeSheets = TimeSheets.new
394
398
 
395
- # This holds a reference to the ReportContext for each Thread.
396
- @reportContext = nil
399
+ # The ReportContext provides additional settings to the report that can
400
+ # complement or replace the report attributes. Reports can include other
401
+ # reports. During report generation, only one context is active, but the
402
+ # context of enclosing reports needs to be preserved. Therefor we use a
403
+ # stack to implement this.
404
+ @reportContexts = []
397
405
  @outputDir = ''
398
406
  @warnTsDeltas = false
399
407
  end
@@ -611,8 +619,9 @@ class TaskJuggler
611
619
  @reports.each do |report|
612
620
  next if report.get('formats').empty?
613
621
  Log.startProgressMeter("Report #{report.name}")
614
- @reportContext = ReportContext.new(self, report)
622
+ @reportContexts.push(ReportContext.new(self, report))
615
623
  report.generate
624
+ @reportContexts.pop
616
625
  Log.stopProgressMeter
617
626
  end
618
627
  else
@@ -620,8 +629,10 @@ class TaskJuggler
620
629
  @reports.each do |report|
621
630
  next if report.get('formats').empty?
622
631
  bp.queue(report) {
623
- @reportContext = ReportContext.new(self, report)
624
- report.generate
632
+ @reportContexts.push(ReportContext.new(self, report))
633
+ res = report.generate
634
+ @reportContexts.pop
635
+ res
625
636
  }
626
637
  end
627
638
  bp.wait do |report|
@@ -645,7 +656,7 @@ class TaskJuggler
645
656
  true
646
657
  end
647
658
 
648
- def generateReport(reportId, regExpMode)
659
+ def generateReport(reportId, regExpMode, dynamicAttributes = nil)
649
660
  reportList = regExpMode ? reportList = matchingReports(reportId) :
650
661
  [ reportId ]
651
662
  reportList.each do |id|
@@ -654,8 +665,25 @@ class TaskJuggler
654
665
  "Request to generate unknown report #{id}")
655
666
  end
656
667
  Log.startProgressMeter("Report #{report.name}")
657
- @reportContext = ReportContext.new(self, report)
668
+ @reportContexts.push(context = ReportContext.new(self, report))
669
+
670
+ name = nil
671
+ # If we have dynamic attributes we need to backup the old attributes
672
+ # first, then parse the dynamicAttributes String replacing the
673
+ # original values.
674
+ if dynamicAttributes
675
+ context.attributeBackup = report.backupAttributes
676
+ parser = ProjectFileParser.new(@messageHandler)
677
+ parser.parseReportAttributes(report, dynamicAttributes)
678
+ report.set('interactive', true)
679
+ end
680
+
658
681
  report.generate
682
+
683
+ if dynamicAttributes
684
+ report.restoreAttributes(context.attributeBackup)
685
+ end
686
+ @reportContexts.pop
659
687
  Log.stopProgressMeter
660
688
  end
661
689
  end
@@ -669,7 +697,7 @@ class TaskJuggler
669
697
  formats = report.get('formats')
670
698
  next if formats.empty?
671
699
 
672
- puts sprintf("%-20s %-15s %s", id, formats.join(', '), report.name)
700
+ puts sprintf("%s\t%s\t%s", id, formats.join(', '), report.name)
673
701
  end
674
702
  end
675
703
 
@@ -11,12 +11,10 @@
11
11
  #
12
12
 
13
13
  require 'TextParser'
14
- require 'TextScanner'
14
+ require 'ProjectFileScanner'
15
15
  require 'TjpSyntaxRules'
16
16
  require 'RichText'
17
- require 'RTFNavigator'
18
- require 'RTFQuery'
19
- require 'RTFReport'
17
+ require 'RTFHandlers'
20
18
 
21
19
  class TaskJuggler
22
20
 
@@ -38,10 +36,10 @@ class TaskJuggler
38
36
  super()
39
37
 
40
38
  @messageHandler = messageHandler
41
- # Define the token types that the TextScanner may return for variable
42
- # elements.
39
+ # Define the token types that the ProjectFileScanner may return for
40
+ # variable elements.
43
41
  @variables = %w( INTEGER FLOAT DATE TIME STRING LITERAL ID ID_WITH_COLON
44
- RELATIVE_ID ABSOLUTE_ID MACRO )
42
+ ABSOLUTE_ID MACRO )
45
43
 
46
44
  initRules
47
45
 
@@ -52,8 +50,8 @@ class TaskJuggler
52
50
  # a set of TJP files.
53
51
  def open(file, master, fileNameIsBuffer = false)
54
52
  begin
55
- @scanner = TextScanner.new(file, @messageHandler)
56
- # We need the TextScanner object for error reporting.
53
+ @scanner = ProjectFileScanner.new(file, @messageHandler)
54
+ # We need the ProjectFileScanner object for error reporting.
57
55
  if master && !fileNameIsBuffer && file != '.' && file[-4, 4] != '.tjp'
58
56
  error('illegal_extension', "Project file name must end with " +
59
57
  '\'.tjp\' extension')
@@ -92,7 +90,7 @@ class TaskJuggler
92
90
 
93
91
  # A set of standard marcros is defined in all files as soon as the project
94
92
  # header has been read. Calling this functions gets the values from @project
95
- # and inserts the Macro objects into the TextScanner.
93
+ # and inserts the Macro objects into the ProjectFileScanner.
96
94
  def setGlobalMacros
97
95
  @scanner.addMacro(Macro.new('projectstart', @project['start'].to_s,
98
96
  @scanner.sourceFileInfo))
@@ -105,6 +103,13 @@ class TaskJuggler
105
103
  @scanner.sourceFileInfo))
106
104
  end
107
105
 
106
+ def parseReportAttributes(report, attributes)
107
+ @property = report
108
+ @project = report.project
109
+ open(attributes, false, true)
110
+ parse('reportAttributes')
111
+ end
112
+
108
113
  private
109
114
 
110
115
  # Utility function that convers English weekday names into their index
@@ -124,7 +129,8 @@ class TaskJuggler
124
129
  if @property.container?
125
130
  error('container_attribute',
126
131
  "The attribute #{attribute} may not be used for this property " +
127
- 'after sub properties have been added.')
132
+ 'after sub properties have been added.', @property,
133
+ @sourceFileInfo[0])
128
134
  end
129
135
  end
130
136
 
@@ -147,13 +153,16 @@ class TaskJuggler
147
153
  # Convenience function to check the integrity of a booking statement.
148
154
  def checkBooking(task, resource)
149
155
  unless task.leaf?
150
- error('booking_no_leaf', "#{task.fullId} is not a leaf task")
156
+ error('booking_no_leaf', "#{task.fullId} is not a leaf task",
157
+ task, @sourceFileInfo[0])
151
158
  end
152
159
  if task['milestone', @scenarioIdx]
153
- error('booking_milestone', "You cannot add bookings to a milestone")
160
+ error('booking_milestone', "You cannot add bookings to a milestone",
161
+ task, @sourceFileInfo[0])
154
162
  end
155
163
  unless resource.leaf?
156
- error('booking_group', "You cannot book a group resource")
164
+ error('booking_group', "You cannot book a group resource",
165
+ task, @sourceFileInfo[0])
157
166
  end
158
167
  end
159
168
 
@@ -210,12 +219,7 @@ class TaskJuggler
210
219
  def newRichText(text, tokenSet = nil)
211
220
  sfi = sourceFileInfo
212
221
  begin
213
- handlers = [
214
- RTFNavigator.new(@project, sfi),
215
- RTFQuery.new(@project, sfi),
216
- RTFReport.new(@project, sfi)
217
- ]
218
- rText = RichText.new(text, handlers)
222
+ rText = RichText.new(text, RTFHandlers.create(@project, sfi))
219
223
  rti = rText.generateIntermediateFormat( [ 0, 0, 0], tokenSet)
220
224
  rti.sectionNumbers = false
221
225
  rescue RichTextException => msg
@@ -283,7 +287,7 @@ class TaskJuggler
283
287
  })
284
288
  descr('A shortcut for all items')
285
289
  # A '-' means the list should be empty.
286
- pattern([ '_ - ' ], lambda {
290
+ pattern([ '_-' ], lambda {
287
291
  KeywordArray.new
288
292
  })
289
293
  descr('No items')
@@ -429,7 +433,6 @@ class TaskJuggler
429
433
  stackEntry = @fileStack.last
430
434
  instance_variable_set('@' + var, stackEntry[var])
431
435
  end
432
- @property = nil
433
436
  end
434
437
 
435
438
  end