taskjuggler 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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