taskjuggler 0.1.1 → 0.2.0

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 (563) hide show
  1. data/CHANGELOG +37 -5
  2. data/README.rdoc +4 -2
  3. data/benchmarks/UTF-8-Strings.rb +58 -0
  4. data/benchmarks/css/tjmanual.css +0 -1
  5. data/benchmarks/htmltaskreport-1.html +47702 -0
  6. data/benchmarks/htmltaskreport-2.html +23345 -0
  7. data/benchmarks/htmltaskreport-3.html +23265 -0
  8. data/benchmarks/htmltaskreport-4.html +22135 -0
  9. data/benchmarks/profile.clt +36082 -0
  10. data/benchmarks/tj3.profile +0 -0
  11. data/benchmarks/tj3.profile.grind +6185 -0
  12. data/benchmarks/tj3.profile.symbols +432 -0
  13. data/benchmarks/tj3.profile.txt +448 -0
  14. data/data/tjp.vim +689 -0
  15. data/doc/AppConfig.html +26 -2
  16. data/doc/CHANGELOG.html +60 -8
  17. data/doc/COPYING.html +26 -2
  18. data/doc/Diff/Hunk.html +26 -2
  19. data/doc/Diff.html +26 -2
  20. data/doc/Diffable.html +26 -2
  21. data/doc/DiffableString.html +26 -2
  22. data/doc/Object.html +26 -104
  23. data/doc/README_rdoc.html +39 -7
  24. data/doc/RuntimeConfig.html +26 -2
  25. data/doc/String.html +26 -2
  26. data/doc/TaskJuggler/Account.html +27 -3
  27. data/doc/TaskJuggler/AccountAttribute.html +30 -6
  28. data/doc/TaskJuggler/AccountScenario.html +28 -4
  29. data/doc/TaskJuggler/Allocation.html +33 -9
  30. data/doc/TaskJuggler/AllocationAttribute.html +31 -7
  31. data/doc/TaskJuggler/AttributeBase.html +162 -111
  32. data/doc/TaskJuggler/AttributeDefinition.html +26 -2
  33. data/doc/TaskJuggler/AttributeOverwrite.html +26 -2
  34. data/doc/TaskJuggler/BatchProcessor.html +26 -2
  35. data/doc/TaskJuggler/Booking.html +29 -5
  36. data/doc/TaskJuggler/BookingListAttribute.html +29 -5
  37. data/doc/TaskJuggler/BooleanAttribute.html +30 -6
  38. data/doc/TaskJuggler/CSVFile.html +26 -2
  39. data/doc/TaskJuggler/CellSettingPattern.html +26 -2
  40. data/doc/TaskJuggler/CellSettingPatternList.html +26 -2
  41. data/doc/TaskJuggler/Charge.html +30 -6
  42. data/doc/TaskJuggler/ChargeListAttribute.html +29 -5
  43. data/doc/TaskJuggler/ChargeSet.html +26 -2
  44. data/doc/TaskJuggler/ChargeSetListAttribute.html +30 -6
  45. data/doc/TaskJuggler/CollisionDetector.html +26 -2
  46. data/doc/TaskJuggler/ColumnListAttribute.html +28 -4
  47. data/doc/TaskJuggler/ColumnTable.html +26 -2
  48. data/doc/TaskJuggler/Daemon.html +26 -2
  49. data/doc/TaskJuggler/DataCache.html +26 -2
  50. data/doc/TaskJuggler/DataCacheEntry.html +26 -2
  51. data/doc/TaskJuggler/DateAttribute.html +30 -6
  52. data/doc/TaskJuggler/DefinitionListAttribute.html +28 -4
  53. data/doc/TaskJuggler/DependencyListAttribute.html +30 -6
  54. data/doc/TaskJuggler/DurationAttribute.html +31 -7
  55. data/doc/TaskJuggler/FileList.html +26 -2
  56. data/doc/TaskJuggler/FileRecord.html +26 -2
  57. data/doc/TaskJuggler/FixnumAttribute.html +28 -4
  58. data/doc/TaskJuggler/FlagListAttribute.html +30 -6
  59. data/doc/TaskJuggler/FloatAttribute.html +29 -5
  60. data/doc/TaskJuggler/FormatListAttribute.html +29 -5
  61. data/doc/TaskJuggler/GanttChart.html +26 -2
  62. data/doc/TaskJuggler/GanttContainer.html +26 -2
  63. data/doc/TaskJuggler/GanttHeader.html +26 -2
  64. data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -2
  65. data/doc/TaskJuggler/GanttLine.html +27 -3
  66. data/doc/TaskJuggler/GanttLoadStack.html +26 -2
  67. data/doc/TaskJuggler/GanttMilestone.html +26 -2
  68. data/doc/TaskJuggler/GanttRouter.html +26 -2
  69. data/doc/TaskJuggler/GanttTaskBar.html +26 -2
  70. data/doc/TaskJuggler/HTMLDocument.html +26 -2
  71. data/doc/TaskJuggler/HTMLElements.html +623 -0
  72. data/doc/TaskJuggler/HTMLGraphics.html +26 -2
  73. data/doc/TaskJuggler/ICalReport.html +864 -0
  74. data/doc/TaskJuggler/ICalendar/Component.html +969 -0
  75. data/doc/TaskJuggler/ICalendar/Event.html +742 -0
  76. data/doc/TaskJuggler/ICalendar/Journal.html +722 -0
  77. data/doc/TaskJuggler/ICalendar/Person.html +633 -0
  78. data/doc/TaskJuggler/ICalendar/Todo.html +789 -0
  79. data/doc/TaskJuggler/ICalendar.html +1035 -0
  80. data/doc/TaskJuggler/Interval.html +99 -172
  81. data/doc/TaskJuggler/IntervalList.html +31 -7
  82. data/doc/TaskJuggler/JobInfo.html +26 -2
  83. data/doc/TaskJuggler/Journal.html +26 -2
  84. data/doc/TaskJuggler/JournalEntry.html +26 -2
  85. data/doc/TaskJuggler/JournalEntryList.html +26 -2
  86. data/doc/TaskJuggler/KeywordArray.html +26 -2
  87. data/doc/TaskJuggler/KeywordDocumentation.html +26 -2
  88. data/doc/TaskJuggler/Limits/Limit.html +124 -49
  89. data/doc/TaskJuggler/Limits.html +139 -156
  90. data/doc/TaskJuggler/LimitsAttribute.html +39 -14
  91. data/doc/TaskJuggler/ListAttributeBase.html +35 -11
  92. data/doc/TaskJuggler/Log.html +26 -2
  93. data/doc/TaskJuggler/LogFile.html +26 -2
  94. data/doc/TaskJuggler/LogicalAttribute.html +26 -2
  95. data/doc/TaskJuggler/LogicalExpression.html +26 -2
  96. data/doc/TaskJuggler/LogicalExpressionAttribute.html +35 -11
  97. data/doc/TaskJuggler/LogicalExpressionListAttribute.html +35 -11
  98. data/doc/TaskJuggler/LogicalFlag.html +26 -2
  99. data/doc/TaskJuggler/LogicalFunction.html +28 -4
  100. data/doc/TaskJuggler/LogicalOperation.html +26 -2
  101. data/doc/TaskJuggler/ManagerResponsibilities.html +26 -2
  102. data/doc/TaskJuggler/ManagerStatusRecord.html +26 -2
  103. data/doc/TaskJuggler/Message.html +26 -2
  104. data/doc/TaskJuggler/MessageHandler.html +108 -62
  105. data/doc/TaskJuggler/Navigator.html +26 -2
  106. data/doc/TaskJuggler/NavigatorElement.html +26 -2
  107. data/doc/TaskJuggler/NikuProject.html +26 -2
  108. data/doc/TaskJuggler/NikuReport.html +27 -3
  109. data/doc/TaskJuggler/NikuResource.html +26 -2
  110. data/doc/TaskJuggler/NodeListAttribute.html +31 -7
  111. data/doc/TaskJuggler/PlaceHolderCell.html +26 -2
  112. data/doc/TaskJuggler/ProcessIntercom.html +26 -2
  113. data/doc/TaskJuggler/ProcessIntercomIface.html +26 -2
  114. data/doc/TaskJuggler/Project.html +1236 -973
  115. data/doc/TaskJuggler/ProjectBroker.html +26 -2
  116. data/doc/TaskJuggler/ProjectBrokerIface.html +26 -2
  117. data/doc/TaskJuggler/ProjectFileParser.html +29 -4
  118. data/doc/TaskJuggler/ProjectFileScanner.html +56 -31
  119. data/doc/TaskJuggler/ProjectRecord.html +26 -2
  120. data/doc/TaskJuggler/ProjectServer.html +26 -2
  121. data/doc/TaskJuggler/ProjectServerIface.html +26 -2
  122. data/doc/TaskJuggler/PropertyAttribute.html +35 -11
  123. data/doc/TaskJuggler/PropertyList.html +26 -2
  124. data/doc/TaskJuggler/PropertySet.html +126 -106
  125. data/doc/TaskJuggler/PropertyTreeNode.html +595 -551
  126. data/doc/TaskJuggler/Query.html +127 -100
  127. data/doc/TaskJuggler/RTFHandlers.html +26 -2
  128. data/doc/TaskJuggler/RTFNavigator.html +26 -2
  129. data/doc/TaskJuggler/RTFQuery.html +28 -4
  130. data/doc/TaskJuggler/RTFReport.html +26 -2
  131. data/doc/TaskJuggler/RTFReportLink.html +26 -2
  132. data/doc/TaskJuggler/RTFWithQuerySupport.html +26 -2
  133. data/doc/TaskJuggler/RealFormat.html +26 -2
  134. data/doc/TaskJuggler/RealFormatAttribute.html +31 -7
  135. data/doc/TaskJuggler/ReferenceAttribute.html +58 -34
  136. data/doc/TaskJuggler/Report.html +427 -284
  137. data/doc/TaskJuggler/ReportBase.html +28 -102
  138. data/doc/TaskJuggler/ReportContext.html +26 -2
  139. data/doc/TaskJuggler/ReportScenario.html +633 -0
  140. data/doc/TaskJuggler/ReportServer.html +26 -2
  141. data/doc/TaskJuggler/ReportServerIface.html +26 -2
  142. data/doc/TaskJuggler/ReportServerRecord.html +26 -2
  143. data/doc/TaskJuggler/ReportServlet.html +26 -2
  144. data/doc/TaskJuggler/ReportTable.html +26 -2
  145. data/doc/TaskJuggler/ReportTableCell.html +26 -2
  146. data/doc/TaskJuggler/ReportTableColumn.html +26 -2
  147. data/doc/TaskJuggler/ReportTableLegend.html +26 -2
  148. data/doc/TaskJuggler/ReportTableLine.html +26 -2
  149. data/doc/TaskJuggler/Resource.html +225 -163
  150. data/doc/TaskJuggler/ResourceListAttribute.html +71 -47
  151. data/doc/TaskJuggler/ResourceListRE.html +26 -2
  152. data/doc/TaskJuggler/ResourceScenario.html +645 -603
  153. data/doc/TaskJuggler/RichText.html +26 -2
  154. data/doc/TaskJuggler/RichTextAttribute.html +53 -29
  155. data/doc/TaskJuggler/RichTextDocument.html +26 -2
  156. data/doc/TaskJuggler/RichTextElement.html +26 -2
  157. data/doc/TaskJuggler/RichTextFunctionExample.html +26 -2
  158. data/doc/TaskJuggler/RichTextFunctionHandler.html +26 -2
  159. data/doc/TaskJuggler/RichTextImage.html +26 -2
  160. data/doc/TaskJuggler/RichTextIntermediate.html +29 -5
  161. data/doc/TaskJuggler/RichTextParser.html +26 -2
  162. data/doc/TaskJuggler/RichTextScanner.html +26 -2
  163. data/doc/TaskJuggler/RichTextSnip.html +26 -2
  164. data/doc/TaskJuggler/RichTextSyntaxRules.html +26 -2
  165. data/doc/TaskJuggler/Scenario.html +26 -2
  166. data/doc/TaskJuggler/ScenarioData.html +95 -28
  167. data/doc/TaskJuggler/ScenarioListAttribute.html +39 -15
  168. data/doc/TaskJuggler/Scoreboard.html +137 -73
  169. data/doc/TaskJuggler/ScoreboardInterval.html +1116 -0
  170. data/doc/TaskJuggler/SheetHandlerBase.html +26 -2
  171. data/doc/TaskJuggler/SheetReceiver.html +26 -2
  172. data/doc/TaskJuggler/SheetSender.html +26 -2
  173. data/doc/TaskJuggler/Shift.html +27 -3
  174. data/doc/TaskJuggler/ShiftAssignment.html +27 -3
  175. data/doc/TaskJuggler/ShiftAssignments.html +174 -149
  176. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +41 -16
  177. data/doc/TaskJuggler/ShiftScenario.html +26 -2
  178. data/doc/TaskJuggler/SimpleQueryExpander.html +26 -2
  179. data/doc/TaskJuggler/SortListAttribute.html +35 -11
  180. data/doc/TaskJuggler/StatusSheetReceiver.html +26 -2
  181. data/doc/TaskJuggler/StatusSheetReport.html +26 -2
  182. data/doc/TaskJuggler/StatusSheetSender.html +26 -2
  183. data/doc/TaskJuggler/StdIoWrapper.html +26 -2
  184. data/doc/TaskJuggler/StringAttribute.html +39 -15
  185. data/doc/TaskJuggler/SymbolAttribute.html +35 -11
  186. data/doc/TaskJuggler/SyntaxReference.html +26 -2
  187. data/doc/TaskJuggler/TOCEntry.html +26 -2
  188. data/doc/TaskJuggler/TSResourceRecord.html +26 -2
  189. data/doc/TaskJuggler/TSTaskRecord.html +26 -2
  190. data/doc/TaskJuggler/TableColumnDefinition.html +26 -2
  191. data/doc/TaskJuggler/TableOfContents.html +26 -2
  192. data/doc/TaskJuggler/TableReport.html +239 -214
  193. data/doc/TaskJuggler/TagFile/TagFileEntry.html +841 -0
  194. data/doc/TaskJuggler/TagFile.html +817 -0
  195. data/doc/TaskJuggler/Task.html +27 -3
  196. data/doc/TaskJuggler/TaskDepListAttribute.html +47 -23
  197. data/doc/TaskJuggler/TaskDependency.html +26 -2
  198. data/doc/TaskJuggler/TaskListAttribute.html +47 -23
  199. data/doc/TaskJuggler/TaskListRE.html +26 -2
  200. data/doc/TaskJuggler/TaskScenario.html +2235 -2178
  201. data/doc/TaskJuggler/TernarySearchTree.html +26 -2
  202. data/doc/TaskJuggler/TextFormatter.html +26 -2
  203. data/doc/TaskJuggler/TextParser/Macro.html +26 -2
  204. data/doc/TaskJuggler/TextParser/MacroTable.html +26 -2
  205. data/doc/TaskJuggler/TextParser/Pattern.html +26 -2
  206. data/doc/TaskJuggler/TextParser/Rule.html +26 -2
  207. data/doc/TaskJuggler/TextParser/Scanner/BufferStreamHandle.html +32 -8
  208. data/doc/TaskJuggler/TextParser/Scanner/FileStreamHandle.html +39 -15
  209. data/doc/TaskJuggler/TextParser/Scanner/MacroStackEntry.html +26 -2
  210. data/doc/TaskJuggler/TextParser/Scanner/StreamHandle.html +119 -86
  211. data/doc/TaskJuggler/TextParser/Scanner.html +317 -291
  212. data/doc/TaskJuggler/TextParser/SourceFileInfo.html +26 -2
  213. data/doc/TaskJuggler/TextParser/StackElement.html +26 -2
  214. data/doc/TaskJuggler/TextParser/State.html +26 -2
  215. data/doc/TaskJuggler/TextParser/StateTransition.html +26 -2
  216. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +26 -2
  217. data/doc/TaskJuggler/TextParser/TokenDoc.html +26 -2
  218. data/doc/TaskJuggler/TextParser.html +85 -61
  219. data/doc/TaskJuggler/TextReport.html +26 -2
  220. data/doc/TaskJuggler/TimeInterval.html +841 -0
  221. data/doc/TaskJuggler/{IntervalListAttribute.html → TimeIntervalListAttribute.html} +33 -9
  222. data/doc/TaskJuggler/TimeSheet.html +26 -2
  223. data/doc/TaskJuggler/TimeSheetReceiver.html +26 -2
  224. data/doc/TaskJuggler/TimeSheetRecord.html +27 -3
  225. data/doc/TaskJuggler/TimeSheetReport.html +29 -5
  226. data/doc/TaskJuggler/TimeSheetSender.html +26 -2
  227. data/doc/TaskJuggler/TimeSheetSummary.html +26 -2
  228. data/doc/TaskJuggler/TimeSheets.html +26 -2
  229. data/doc/TaskJuggler/Tj3.html +150 -111
  230. data/doc/TaskJuggler/Tj3AppBase.html +26 -2
  231. data/doc/TaskJuggler/Tj3Client.html +26 -2
  232. data/doc/TaskJuggler/Tj3Daemon.html +26 -2
  233. data/doc/TaskJuggler/Tj3Man.html +26 -2
  234. data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -2
  235. data/doc/TaskJuggler/Tj3SsReceiver.html +26 -2
  236. data/doc/TaskJuggler/Tj3SsSender.html +26 -2
  237. data/doc/TaskJuggler/Tj3TsReceiver.html +26 -2
  238. data/doc/TaskJuggler/Tj3TsSender.html +26 -2
  239. data/doc/TaskJuggler/Tj3TsSummary.html +26 -2
  240. data/doc/TaskJuggler/TjException.html +26 -2
  241. data/doc/TaskJuggler/TjRuntimeError.html +26 -2
  242. data/doc/TaskJuggler/TjTime.html +539 -477
  243. data/doc/TaskJuggler/TjpExample.html +26 -2
  244. data/doc/TaskJuggler/TjpExportRE.html +240 -161
  245. data/doc/TaskJuggler/TjpSyntaxRules.html +4236 -3844
  246. data/doc/TaskJuggler/URLParameter.html +26 -2
  247. data/doc/TaskJuggler/UserManual.html +26 -2
  248. data/doc/TaskJuggler/VimSyntax.html +31 -7
  249. data/doc/TaskJuggler/WebServer.html +26 -2
  250. data/doc/TaskJuggler/WelcomePage.html +26 -2
  251. data/doc/TaskJuggler/WorkingHours.html +227 -152
  252. data/doc/TaskJuggler/WorkingHoursAttribute.html +62 -38
  253. data/doc/TaskJuggler/XMLBlob.html +26 -2
  254. data/doc/TaskJuggler/XMLComment.html +26 -2
  255. data/doc/TaskJuggler/XMLDocument.html +26 -2
  256. data/doc/TaskJuggler/XMLElement.html +26 -2
  257. data/doc/TaskJuggler/XMLNamedText.html +26 -2
  258. data/doc/TaskJuggler/XMLText.html +26 -2
  259. data/doc/TaskJuggler.html +486 -427
  260. data/doc/index.html +801 -659
  261. data/doc/lib/taskjuggler/AccountScenario_rb.html +1 -1
  262. data/doc/lib/taskjuggler/Account_rb.html +1 -1
  263. data/doc/lib/taskjuggler/AlgorithmDiff_rb.html +1 -1
  264. data/doc/lib/taskjuggler/Allocation_rb.html +1 -1
  265. data/doc/lib/taskjuggler/AppConfig_rb.html +1 -1
  266. data/doc/lib/taskjuggler/AttributeBase_rb.html +1 -1
  267. data/doc/lib/taskjuggler/AttributeDefinition_rb.html +1 -1
  268. data/doc/lib/taskjuggler/Attributes_rb.html +1 -1
  269. data/doc/lib/taskjuggler/BatchProcessor_rb.html +1 -1
  270. data/doc/lib/taskjuggler/Booking_rb.html +1 -1
  271. data/doc/lib/taskjuggler/ChargeSet_rb.html +1 -1
  272. data/doc/lib/taskjuggler/Charge_rb.html +1 -1
  273. data/doc/lib/taskjuggler/DataCache_rb.html +1 -1
  274. data/doc/lib/taskjuggler/FileList_rb.html +1 -1
  275. data/doc/lib/taskjuggler/HTMLDocument_rb.html +1 -1
  276. data/doc/lib/{ruby-signal-bug_rb.html → taskjuggler/HTMLElements_rb.html} +9 -9
  277. data/doc/lib/{exchangebug_rb.html → taskjuggler/ICalendar_rb.html} +9 -9
  278. data/doc/lib/taskjuggler/IntervalList_rb.html +1 -1
  279. data/doc/lib/taskjuggler/Interval_rb.html +1 -1
  280. data/doc/lib/taskjuggler/Journal_rb.html +1 -1
  281. data/doc/lib/taskjuggler/KeywordArray_rb.html +1 -1
  282. data/doc/lib/taskjuggler/KeywordDocumentation_rb.html +1 -1
  283. data/doc/lib/taskjuggler/Limits_rb.html +1 -1
  284. data/doc/lib/taskjuggler/LogFile_rb.html +1 -1
  285. data/doc/lib/taskjuggler/Log_rb.html +1 -1
  286. data/doc/lib/taskjuggler/LogicalExpression_rb.html +1 -1
  287. data/doc/lib/taskjuggler/LogicalFunction_rb.html +1 -1
  288. data/doc/lib/taskjuggler/LogicalOperation_rb.html +1 -1
  289. data/doc/lib/taskjuggler/MessageHandler_rb.html +1 -1
  290. data/doc/lib/taskjuggler/ProjectFileParser_rb.html +1 -1
  291. data/doc/lib/taskjuggler/ProjectFileScanner_rb.html +1 -1
  292. data/doc/lib/taskjuggler/Project_rb.html +1 -1
  293. data/doc/lib/taskjuggler/PropertyList_rb.html +1 -1
  294. data/doc/lib/taskjuggler/PropertySet_rb.html +1 -1
  295. data/doc/lib/taskjuggler/PropertyTreeNode_rb.html +1 -1
  296. data/doc/lib/taskjuggler/Query_rb.html +1 -1
  297. data/doc/lib/taskjuggler/RealFormat_rb.html +1 -1
  298. data/doc/lib/taskjuggler/ResourceScenario_rb.html +1 -1
  299. data/doc/lib/taskjuggler/Resource_rb.html +1 -1
  300. data/doc/lib/taskjuggler/RichText/Document_rb.html +1 -1
  301. data/doc/lib/taskjuggler/RichText/Element_rb.html +1 -1
  302. data/doc/lib/taskjuggler/RichText/FunctionExample_rb.html +1 -1
  303. data/doc/lib/taskjuggler/RichText/FunctionHandler_rb.html +1 -1
  304. data/doc/lib/taskjuggler/RichText/Parser_rb.html +1 -1
  305. data/doc/lib/taskjuggler/RichText/RTFHandlers_rb.html +1 -1
  306. data/doc/lib/taskjuggler/RichText/RTFNavigator_rb.html +1 -1
  307. data/doc/lib/taskjuggler/RichText/RTFQuery_rb.html +1 -1
  308. data/doc/lib/taskjuggler/RichText/RTFReportLink_rb.html +1 -1
  309. data/doc/lib/taskjuggler/RichText/RTFReport_rb.html +1 -1
  310. data/doc/lib/taskjuggler/RichText/RTFWithQuerySupport_rb.html +1 -1
  311. data/doc/lib/taskjuggler/RichText/Scanner_rb.html +1 -1
  312. data/doc/lib/taskjuggler/RichText/Snip_rb.html +1 -1
  313. data/doc/lib/taskjuggler/RichText/SyntaxRules_rb.html +1 -1
  314. data/doc/lib/taskjuggler/RichText/TOCEntry_rb.html +1 -1
  315. data/doc/lib/taskjuggler/RichText/TableOfContents_rb.html +1 -1
  316. data/doc/lib/taskjuggler/RichText_rb.html +1 -1
  317. data/doc/lib/taskjuggler/RuntimeConfig_rb.html +1 -1
  318. data/doc/lib/taskjuggler/ScenarioData_rb.html +1 -1
  319. data/doc/lib/taskjuggler/Scenario_rb.html +1 -1
  320. data/doc/lib/taskjuggler/Scoreboard_rb.html +1 -1
  321. data/doc/lib/taskjuggler/SheetHandlerBase_rb.html +1 -1
  322. data/doc/lib/taskjuggler/SheetReceiver_rb.html +1 -1
  323. data/doc/lib/taskjuggler/SheetSender_rb.html +1 -1
  324. data/doc/lib/taskjuggler/ShiftAssignments_rb.html +1 -1
  325. data/doc/lib/taskjuggler/ShiftScenario_rb.html +1 -1
  326. data/doc/lib/taskjuggler/Shift_rb.html +1 -1
  327. data/doc/lib/taskjuggler/SimpleQueryExpander_rb.html +1 -1
  328. data/doc/lib/taskjuggler/StatusSheetReceiver_rb.html +1 -1
  329. data/doc/lib/taskjuggler/StatusSheetSender_rb.html +1 -1
  330. data/doc/lib/taskjuggler/StdIoWrapper_rb.html +1 -1
  331. data/doc/lib/taskjuggler/SyntaxReference_rb.html +1 -1
  332. data/doc/lib/taskjuggler/TableColumnDefinition_rb.html +1 -1
  333. data/doc/lib/taskjuggler/TaskDependency_rb.html +1 -1
  334. data/doc/lib/taskjuggler/TaskJuggler_rb.html +1 -1
  335. data/doc/lib/taskjuggler/TaskScenario_rb.html +1 -1
  336. data/doc/lib/taskjuggler/Task_rb.html +1 -1
  337. data/doc/lib/taskjuggler/TernarySearchTree_rb.html +1 -1
  338. data/doc/lib/taskjuggler/TextFormatter_rb.html +1 -1
  339. data/doc/lib/taskjuggler/TextParser/MacroTable_rb.html +1 -1
  340. data/doc/lib/taskjuggler/TextParser/Pattern_rb.html +1 -1
  341. data/doc/lib/taskjuggler/TextParser/Rule_rb.html +1 -1
  342. data/doc/lib/taskjuggler/TextParser/Scanner_rb.html +1 -1
  343. data/doc/lib/taskjuggler/TextParser/SourceFileInfo_rb.html +1 -1
  344. data/doc/lib/taskjuggler/TextParser/StackElement_rb.html +1 -1
  345. data/doc/lib/taskjuggler/TextParser/State_rb.html +1 -1
  346. data/doc/lib/taskjuggler/TextParser/TokenDoc_rb.html +1 -1
  347. data/doc/lib/taskjuggler/TextParser_rb.html +1 -1
  348. data/doc/lib/taskjuggler/TimeSheetReceiver_rb.html +1 -1
  349. data/doc/lib/taskjuggler/TimeSheetSender_rb.html +1 -1
  350. data/doc/lib/taskjuggler/TimeSheetSummary_rb.html +1 -1
  351. data/doc/lib/taskjuggler/TimeSheets_rb.html +1 -1
  352. data/doc/lib/taskjuggler/Tj3AppBase_rb.html +1 -1
  353. data/doc/lib/taskjuggler/Tj3Config_rb.html +1 -1
  354. data/doc/lib/taskjuggler/Tj3SheetAppBase_rb.html +1 -1
  355. data/doc/lib/taskjuggler/TjException_rb.html +1 -1
  356. data/doc/lib/taskjuggler/TjTime_rb.html +1 -1
  357. data/doc/lib/taskjuggler/TjpExample_rb.html +1 -1
  358. data/doc/lib/taskjuggler/TjpSyntaxRules_rb.html +1 -1
  359. data/doc/lib/taskjuggler/URLParameter_rb.html +1 -1
  360. data/doc/lib/taskjuggler/UTF8String_rb.html +1 -1
  361. data/doc/lib/taskjuggler/UserManual_rb.html +1 -1
  362. data/doc/lib/taskjuggler/VimSyntax_rb.html +1 -1
  363. data/doc/lib/taskjuggler/WorkingHours_rb.html +1 -1
  364. data/doc/lib/taskjuggler/XMLDocument_rb.html +1 -1
  365. data/doc/lib/taskjuggler/XMLElement_rb.html +1 -1
  366. data/doc/lib/taskjuggler/apps/Tj3Client_rb.html +1 -1
  367. data/doc/lib/taskjuggler/apps/Tj3Daemon_rb.html +1 -1
  368. data/doc/lib/taskjuggler/apps/Tj3Man_rb.html +1 -1
  369. data/doc/lib/taskjuggler/apps/Tj3SsReceiver_rb.html +1 -1
  370. data/doc/lib/taskjuggler/apps/Tj3SsSender_rb.html +1 -1
  371. data/doc/lib/taskjuggler/apps/Tj3TsReceiver_rb.html +1 -1
  372. data/doc/lib/taskjuggler/apps/Tj3TsSender_rb.html +1 -1
  373. data/doc/lib/taskjuggler/apps/Tj3TsSummary_rb.html +1 -1
  374. data/doc/lib/taskjuggler/apps/Tj3_rb.html +1 -1
  375. data/doc/lib/taskjuggler/daemon/Daemon_rb.html +1 -1
  376. data/doc/lib/taskjuggler/daemon/ProcessIntercom_rb.html +1 -1
  377. data/doc/lib/taskjuggler/daemon/ProjectBroker_rb.html +1 -1
  378. data/doc/lib/taskjuggler/daemon/ProjectServer_rb.html +1 -1
  379. data/doc/lib/taskjuggler/daemon/ReportServer_rb.html +1 -1
  380. data/doc/lib/taskjuggler/daemon/ReportServlet_rb.html +1 -1
  381. data/doc/lib/taskjuggler/daemon/WebServer_rb.html +1 -1
  382. data/doc/lib/taskjuggler/daemon/WelcomePage_rb.html +1 -1
  383. data/doc/lib/taskjuggler/deep_copy_rb.html +1 -1
  384. data/doc/lib/taskjuggler/reports/CSVFile_rb.html +1 -1
  385. data/doc/lib/taskjuggler/reports/CollisionDetector_rb.html +1 -1
  386. data/doc/lib/taskjuggler/reports/ColumnTable_rb.html +1 -1
  387. data/doc/lib/taskjuggler/reports/GanttChart_rb.html +1 -1
  388. data/doc/lib/taskjuggler/reports/GanttContainer_rb.html +1 -1
  389. data/doc/lib/taskjuggler/reports/GanttHeaderScaleItem_rb.html +1 -1
  390. data/doc/lib/taskjuggler/reports/GanttHeader_rb.html +1 -1
  391. data/doc/lib/taskjuggler/reports/GanttLine_rb.html +1 -1
  392. data/doc/lib/taskjuggler/reports/GanttLoadStack_rb.html +1 -1
  393. data/doc/lib/taskjuggler/reports/GanttMilestone_rb.html +1 -1
  394. data/doc/lib/taskjuggler/reports/GanttRouter_rb.html +1 -1
  395. data/doc/lib/taskjuggler/reports/GanttTaskBar_rb.html +1 -1
  396. data/doc/lib/taskjuggler/reports/HTMLGraphics_rb.html +1 -1
  397. data/doc/lib/taskjuggler/reports/ICalReport_rb.html +71 -0
  398. data/doc/lib/taskjuggler/reports/Navigator_rb.html +1 -1
  399. data/doc/lib/taskjuggler/reports/NikuReport_rb.html +1 -1
  400. data/doc/lib/taskjuggler/reports/ReportBase_rb.html +1 -1
  401. data/doc/lib/taskjuggler/reports/ReportContext_rb.html +1 -1
  402. data/doc/lib/taskjuggler/reports/ReportTableCell_rb.html +1 -1
  403. data/doc/lib/taskjuggler/reports/ReportTableColumn_rb.html +1 -1
  404. data/doc/lib/taskjuggler/reports/ReportTableLegend_rb.html +1 -1
  405. data/doc/lib/taskjuggler/reports/ReportTableLine_rb.html +1 -1
  406. data/doc/lib/taskjuggler/reports/ReportTable_rb.html +1 -1
  407. data/doc/lib/taskjuggler/reports/Report_rb.html +5 -1
  408. data/doc/lib/taskjuggler/reports/ResourceListRE_rb.html +1 -1
  409. data/doc/lib/taskjuggler/reports/StatusSheetReport_rb.html +1 -1
  410. data/doc/lib/taskjuggler/reports/TableReport_rb.html +1 -1
  411. data/doc/lib/taskjuggler/reports/TagFile_rb.html +71 -0
  412. data/doc/lib/taskjuggler/reports/TaskListRE_rb.html +1 -1
  413. data/doc/lib/taskjuggler/reports/TextReport_rb.html +1 -1
  414. data/doc/lib/taskjuggler/reports/TimeSheetReport_rb.html +1 -1
  415. data/doc/lib/taskjuggler/reports/TjpExportRE_rb.html +1 -1
  416. data/doc/lib/tj3_rb.html +1 -1
  417. data/doc/lib/tj3client_rb.html +1 -1
  418. data/doc/lib/tj3d_rb.html +1 -1
  419. data/doc/lib/tj3man_rb.html +1 -1
  420. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  421. data/doc/lib/tj3ss_sender_rb.html +1 -1
  422. data/doc/lib/tj3ts_receiver_rb.html +1 -1
  423. data/doc/lib/tj3ts_sender_rb.html +1 -1
  424. data/doc/lib/tj3ts_summary_rb.html +1 -1
  425. data/lib/taskjuggler/Account.rb +1 -1
  426. data/lib/taskjuggler/AccountScenario.rb +1 -1
  427. data/lib/taskjuggler/Allocation.rb +5 -5
  428. data/lib/taskjuggler/AttributeBase.rb +30 -22
  429. data/lib/taskjuggler/Attributes.rb +80 -78
  430. data/lib/taskjuggler/Booking.rb +2 -2
  431. data/lib/taskjuggler/Charge.rb +3 -3
  432. data/lib/taskjuggler/ICalendar.rb +251 -0
  433. data/lib/taskjuggler/Interval.rb +215 -53
  434. data/lib/taskjuggler/IntervalList.rb +5 -5
  435. data/lib/taskjuggler/Limits.rb +79 -69
  436. data/lib/taskjuggler/LogicalFunction.rb +2 -2
  437. data/lib/taskjuggler/MessageHandler.rb +11 -6
  438. data/lib/taskjuggler/Project.rb +208 -95
  439. data/lib/taskjuggler/ProjectFileParser.rb +2 -2
  440. data/lib/taskjuggler/ProjectFileScanner.rb +7 -6
  441. data/lib/taskjuggler/PropertySet.rb +1 -5
  442. data/lib/taskjuggler/PropertyTreeNode.rb +21 -16
  443. data/lib/taskjuggler/Query.rb +10 -7
  444. data/lib/taskjuggler/Resource.rb +6 -1
  445. data/lib/taskjuggler/ResourceScenario.rb +85 -69
  446. data/lib/taskjuggler/RichText/RTFQuery.rb +2 -2
  447. data/lib/taskjuggler/ScenarioData.rb +11 -1
  448. data/lib/taskjuggler/Scoreboard.rb +8 -1
  449. data/lib/taskjuggler/Shift.rb +1 -1
  450. data/lib/taskjuggler/ShiftAssignments.rb +22 -20
  451. data/lib/taskjuggler/Task.rb +1 -1
  452. data/lib/taskjuggler/TaskJuggler.rb +65 -51
  453. data/lib/taskjuggler/TaskScenario.rb +486 -419
  454. data/lib/taskjuggler/TextParser/Scanner.rb +22 -11
  455. data/lib/taskjuggler/TimeSheets.rb +1 -1
  456. data/lib/taskjuggler/Tj3Config.rb +1 -1
  457. data/lib/taskjuggler/TjTime.rb +7 -3
  458. data/lib/taskjuggler/TjpSyntaxRules.rb +157 -23
  459. data/lib/taskjuggler/VimSyntax.rb +18 -0
  460. data/lib/taskjuggler/WorkingHours.rb +20 -4
  461. data/lib/taskjuggler/apps/Tj3.rb +16 -1
  462. data/lib/taskjuggler/reports/GanttLine.rb +1 -1
  463. data/lib/taskjuggler/reports/ICalReport.rb +136 -0
  464. data/lib/taskjuggler/reports/NikuReport.rb +1 -1
  465. data/lib/taskjuggler/reports/Report.rb +59 -0
  466. data/lib/taskjuggler/reports/ReportBase.rb +2 -67
  467. data/lib/taskjuggler/reports/TableReport.rb +9 -8
  468. data/lib/taskjuggler/reports/TagFile.rb +120 -0
  469. data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
  470. data/lib/taskjuggler/reports/TjpExportRE.rb +33 -9
  471. data/manual/Installation +126 -0
  472. data/spec/ICalendar_spec.rb +45 -0
  473. data/spec/IntervalList_spec.rb +11 -11
  474. data/tasks/changelog.rake +150 -60
  475. data/tasks/gem.rake +1 -0
  476. data/tasks/vim.rake +2 -2
  477. data/test/TestSuite/Export-Reports/refs/Booking.tjp +1 -1
  478. data/test/TestSuite/Export-Reports/refs/CompletedWork.tji.tjp +40 -0
  479. data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +10 -1
  480. data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +1 -1
  481. data/test/TestSuite/HTML-Reports/Alerts.html +160 -412
  482. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  483. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  484. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  485. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
  486. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  487. data/test/TestSuite/HTML-Reports/css/tjmanual.css +0 -20
  488. data/test/TestSuite/HTML-Reports/css/tjreport.css +6 -7
  489. data/test/TestSuite/HTML-Reports/depArrows.html +851 -0
  490. data/test/TestSuite/HTML-Reports/profile.html +37581 -0
  491. data/test/TestSuite/{Scheduler/Correct → HTML-Reports/scripts}/scripts/wz_tooltip.js +20 -20
  492. data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
  493. data/test/TestSuite/Scheduler/Correct/Duration.tjp +3 -3
  494. data/test/TestSuite/Scheduler/Errors/R.html +113 -0
  495. data/test/TestSuite/Scheduler/Errors/allocate_no_assigned.tjp +15 -0
  496. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjmanual.css +0 -1
  497. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjreport.css +0 -0
  498. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/details.png +0 -0
  499. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-green.png +0 -0
  500. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-red.png +0 -0
  501. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-yellow.png +0 -0
  502. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resource.png +0 -0
  503. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resourcegroup.png +0 -0
  504. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/task.png +0 -0
  505. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/taskgroup.png +0 -0
  506. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-down.png +0 -0
  507. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-flat.png +0 -0
  508. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-up.png +0 -0
  509. data/test/TestSuite/Scheduler/Errors/overbooked_duration.tjp +11 -0
  510. data/test/TestSuite/Scheduler/Errors/overbooked_effort.tjp +11 -0
  511. data/test/TestSuite/Scheduler/Errors/overbooked_length.tjp +13 -0
  512. data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/scripts/wz_tooltip.js +0 -0
  513. data/test/TestSuite/StatusSheets/dev2.tji +22 -0
  514. data/test/TestSuite/Syntax/Correct/CompletedWork.tji.tjp +38 -0
  515. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +5 -2
  516. data/test/TestSuite/Syntax/Errors/scenario_after_tracking.tjp +8 -0
  517. data/test/TestSuite/TimeSheets/resrep.tji +7 -0
  518. data/test/TestSuite/TimeSheets/ts.tji +351 -0
  519. data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
  520. data/test/test_Limits.rb +38 -30
  521. data/test/test_Scheduler.rb +2 -2
  522. data/test/test_ShiftAssignments.rb +8 -8
  523. data/test/test_WorkingHours.rb +4 -4
  524. metadata +1015 -1005
  525. data/lib/exchangebug.rb +0 -42
  526. data/lib/ruby-signal-bug.rb +0 -55
  527. data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
  528. data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
  529. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  530. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  531. data/test/TestSuite/ReportGenerator/Correct/Alerts-1.csv +0 -412
  532. data/test/TestSuite/ReportGenerator/Correct/Alerts-1.html +0 -680
  533. data/test/TestSuite/ReportGenerator/Correct/DependencyList.csv +0 -4
  534. data/test/TestSuite/ReportGenerator/Correct/DependencyList.tjp +0 -25
  535. data/test/TestSuite/ReportGenerator/Correct/Journal-1.csv +0 -8
  536. data/test/TestSuite/ReportGenerator/Correct/Journal-2.csv +0 -8
  537. data/test/TestSuite/ReportGenerator/Correct/Journal-3.html +0 -28
  538. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
  539. data/test/TestSuite/ReportGenerator/Correct/opennodes-1.csv +0 -2
  540. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
  541. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  542. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  543. data/test/TestSuite/Scheduler/' +0 -23
  544. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -86
  545. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
  546. data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
  547. data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
  548. data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
  549. data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
  550. data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
  551. data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
  552. data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
  553. data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
  554. data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
  555. data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
  556. data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
  557. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  558. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  559. data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
  560. data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
  561. data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
  562. data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
  563. data/test/TestSuite/TimeSheets/uu.txt +0 -29
@@ -27,7 +27,7 @@ class TaskJuggler
27
27
  # attribute like an URL that contains more details about the task.
28
28
  class PropertyTreeNode
29
29
 
30
- attr_reader :propertySet, :id, :parent, :project, :sequenceNo,
30
+ attr_reader :propertySet, :id, :subId, :parent, :project, :sequenceNo,
31
31
  :children, :adoptees
32
32
  attr_accessor :name, :sourceFileInfo
33
33
  attr_reader :data
@@ -44,6 +44,10 @@ class TaskJuggler
44
44
  @propertySet = propertySet
45
45
  @project = propertySet.project
46
46
  @parent = parent
47
+
48
+ # Scenario specific data
49
+ @data = nil
50
+
47
51
  # Attributes are created on-demand. We need to be careful that a pure
48
52
  # check for existance does not create them unecessarily.
49
53
  @attributes = Hash.new do |hash, attributeId|
@@ -53,12 +57,12 @@ class TaskJuggler
53
57
  "#{self.class.to_s.sub(/TaskJuggler::/, '')} '#{fullId}'"
54
58
  end
55
59
  unless aType.scenarioSpecific
56
- hash[attributeId] = aType.objClass.new(@propertySet, aType)
60
+ hash[attributeId] = aType.objClass.new(@propertySet, aType, self)
57
61
  else
58
62
  raise ArgumentError, "Attribute '#{attributeId}' is scenario specific"
59
63
  end
60
64
  end
61
- @scenarioAttributes = Array.new(@project.scenarioCount) do
65
+ @scenarioAttributes = Array.new(@project.scenarioCount) do |scenarioIdx|
62
66
  Hash.new do |hash, attributeId|
63
67
  unless (aType = attributeDefinition(attributeId))
64
68
  raise ArgumentError,
@@ -66,7 +70,8 @@ class TaskJuggler
66
70
  "#{self.class.to_s.sub(/TaskJuggler::/, '')} '#{fullId}'"
67
71
  end
68
72
  if aType.scenarioSpecific
69
- hash[attributeId] = aType.objClass.new(@propertySet, aType)
73
+ hash[attributeId] = aType.objClass.new(@propertySet, aType,
74
+ @data[scenarioIdx])
70
75
  else
71
76
  raise ArgumentError,
72
77
  "Attribute '#{attributeId}' is not scenario specific"
@@ -93,9 +98,9 @@ class TaskJuggler
93
98
  "(#{@parentId}) don't match"
94
99
  end
95
100
  end
96
- @id = id[(id.rindex('.') + 1).. -1]
101
+ @subId = id[(id.rindex('.') + 1).. -1]
97
102
  else
98
- @id = id
103
+ @subId = id
99
104
  end
100
105
  # The attribute 'id' is either the short ID or the full hierarchical ID.
101
106
  set('id', fullId)
@@ -121,9 +126,6 @@ class TaskJuggler
121
126
  # This is a list of the PropertyTreeNode objects that have adopted this
122
127
  # node.
123
128
  @stepParents = []
124
-
125
- # Scenario specific data
126
- @data = nil
127
129
  end
128
130
 
129
131
  # We only use deep_clone for attributes, never for properties. Since
@@ -279,11 +281,11 @@ class TaskJuggler
279
281
  # namespace, this is just the ID. Otherwise, the full ID is composed of all
280
282
  # IDs from the root node to this node, separating the IDs by a dot.
281
283
  def fullId
282
- res = @id
284
+ res = @subId
283
285
  unless @propertySet.flatNamespace
284
286
  t = self
285
287
  until (t = t.parent).nil?
286
- res = t.id + "." + res
288
+ res = t.subId + "." + res
287
289
  end
288
290
  end
289
291
  res
@@ -386,7 +388,9 @@ class TaskJuggler
386
388
  # _attributeId_. This method works for built-in attributes as well.
387
389
  # In case the attribute does not exist, an exception is raised.
388
390
  def get(attributeId)
389
- @attributes[attributeId].get
391
+ # Make sure the attribute gets created if it doesn't exist already.
392
+ @attributes[attributeId]
393
+ instance_variable_get(('@' + attributeId).intern)
390
394
  end
391
395
 
392
396
  # Return the value of the attribute with ID _attributeId_. This method
@@ -450,7 +454,8 @@ class TaskJuggler
450
454
  # scenario-specific attributes, _scenario_ must indicate the index of the
451
455
  # Scenario.
452
456
  def [](attributeId, scenario)
453
- @scenarioAttributes[scenario][attributeId].get
457
+ @scenarioAttributes[scenario][attributeId]
458
+ @data[scenario].instance_variable_get(('@' + attributeId).intern)
454
459
  end
455
460
 
456
461
  # Returns true if the value of the attribute _attributeId_ (in scenario
@@ -641,15 +646,15 @@ class TaskJuggler
641
646
  end
642
647
 
643
648
  def error(id, text)
644
- @project.messageHandler.error(id, text, sourceFileInfo, nil, self, nil)
649
+ @project.messageHandler.error(id, text, @sourceFileInfo, nil, self, nil)
645
650
  end
646
651
 
647
652
  def warning(id, text)
648
- @project.messageHandler.warning(id, text, sourceFileInfo, nil, self, nil)
653
+ @project.messageHandler.warning(id, text, @sourceFileInfo, nil, self, nil)
649
654
  end
650
655
 
651
656
  def info(id, text)
652
- @project.messageHandler.info(id, text, sourceFileInfo, nil, self, nil)
657
+ @project.messageHandler.info(id, text, @sourceFileInfo, nil, self, nil)
653
658
  end
654
659
 
655
660
 
@@ -273,7 +273,8 @@ class TaskJuggler
273
273
  # duration effort in days. The return value is the converted value with
274
274
  # optional unit as a String.
275
275
  def scaleDuration(value)
276
- scaleValue(value, [ 24 * 60, 24, 1, 1.0 / 7, 1.0 / 30.42, 1.0 / 365 ])
276
+ scaleValue(value, [ 24 * 60, 24, 1, 1.0 / 7, 1.0 / 30.42,
277
+ 1.0 / 91.25, 1.0 / 365 ])
277
278
  end
278
279
 
279
280
  # Convert a load or effort value to the format specified by @loadUnit.
@@ -285,6 +286,7 @@ class TaskJuggler
285
286
  1.0,
286
287
  1.0 / @project.weeklyWorkingDays,
287
288
  1.0 / @project.monthlyWorkingDays,
289
+ 1.0 / (@project.yearlyWorkingDays / 4),
288
290
  1.0 / @project.yearlyWorkingDays ])
289
291
  end
290
292
 
@@ -319,8 +321,9 @@ class TaskJuggler
319
321
  # the original value.
320
322
  delta = []
321
323
  # For each of the units we can define a maximum value that the value
322
- # should not exceed. nil means no limit.
323
- max = [ 60, 48, nil, 8, 24, nil ]
324
+ # should not exceed. nil means no limit. Never use quarters since it's
325
+ # pretty uncommon to use.
326
+ max = [ 60, 48, nil, 8, 24, 0, nil ]
324
327
 
325
328
  i = 0
326
329
  factors.each do |factor|
@@ -359,18 +362,18 @@ class TaskJuggler
359
362
  # other languages as well.
360
363
  units = []
361
364
  if str == "1"
362
- units = %w( minute hour day week month year )
365
+ units = %w( minute hour day week month quarter year )
363
366
  else
364
- units = %w( minutes hours days weeks months years )
367
+ units = %w( minutes hours days weeks months quarters years )
365
368
  end
366
369
  str += ' ' + units[shortest]
367
370
  else
368
- str += %w( min h d w m y )[shortest]
371
+ str += %w( min h d w m q y )[shortest]
369
372
  end
370
373
  else
371
374
  # For fixed units we just need to do the conversion. No unit is
372
375
  # included.
373
- units = [ :minutes, :hours, :days, :weeks, :months, :years ]
376
+ units = [ :minutes, :hours, :days, :weeks, :months, :quarters, :years ]
374
377
  str = @numberFormat.format(value * factors[units.index(@loadUnit)])
375
378
  end
376
379
  str
@@ -24,10 +24,15 @@ class TaskJuggler
24
24
 
25
25
  @data = Array.new(@project.scenarioCount, nil)
26
26
  @project.scenarioCount.times do |i|
27
- @data[i] = ResourceScenario.new(self, i, @scenarioAttributes[i])
27
+ ResourceScenario.new(self, i, @scenarioAttributes[i])
28
28
  end
29
29
  end
30
30
 
31
+ # Just a shortcut to avoid the slower calls via method_missing.
32
+ def book(scenarioIdx, sbIdx, task)
33
+ @data[scenarioIdx].book(sbIdx, task)
34
+ end
35
+
31
36
  # Many Resource functions are scenario specific. These functions are
32
37
  # provided by the class ResourceScenario. In case we can't find a
33
38
  # function called for the Resource class we try to find it in
@@ -46,13 +46,22 @@ class TaskJuggler
46
46
  # Same but for each assigned resource.
47
47
  @lastBookedSlots = {}
48
48
 
49
+ # Attributed are only really created when they are accessed the first
50
+ # time. So make sure some needed attributes really exist so we don't
51
+ # have to check for existance each time we access them.
52
+ %w( alloctdeffort criticalness directreports duties efficiency
53
+ effort limits managers rate reports shifts
54
+ vacations workinghours ).each do |attr|
55
+ @property[attr, @scenarioIdx]
56
+ end
57
+
49
58
  @dCache = DataCache.instance
50
59
  end
51
60
 
52
61
  # This method must be called at the beginning of each scheduling run. It
53
62
  # initializes variables used during the scheduling process.
54
63
  def prepareScheduling
55
- @property['effort', @scenarioIdx] = 0
64
+ @effort = 0
56
65
  initScoreboard if @property.leaf?
57
66
 
58
67
  setDirectReports
@@ -66,14 +75,14 @@ class TaskJuggler
66
75
  def calcCriticalness
67
76
  if @scoreboard.nil?
68
77
  # Resources that are not allocated are not critical at all.
69
- @property['criticalness', @scenarioIdx] = 0.0
78
+ @criticalness = 0.0
70
79
  else
71
80
  freeSlots = 0
72
81
  @scoreboard.each do |slot|
73
82
  freeSlots += 1 if slot.nil?
74
83
  end
75
- @property['criticalness', @scenarioIdx] = freeSlots == 0 ? 1.0 :
76
- a('alloctdeffort') / freeSlots
84
+ @criticalness = freeSlots == 0 ? 1.0 :
85
+ @alloctdeffort / freeSlots
77
86
  end
78
87
  end
79
88
 
@@ -84,7 +93,7 @@ class TaskJuggler
84
93
  # The 'directreports' attribute is the reverse link for the 'managers'
85
94
  # attribute. In contrast to the 'managers' attribute, the
86
95
  # 'directreports' list has no duplicate entries.
87
- a('managers').each do |manager|
96
+ @managers.each do |manager|
88
97
  unless manager['directreports', @scenarioIdx].include?(@property)
89
98
  manager['directreports', @scenarioIdx] << @property
90
99
  end
@@ -92,15 +101,15 @@ class TaskJuggler
92
101
  end
93
102
 
94
103
  def setReports
95
- return unless a('directreports').empty?
104
+ return unless @directreports.empty?
96
105
 
97
- a('managers').each do |r|
106
+ @managers.each do |r|
98
107
  r.setReports_i(@scenarioIdx, [ @property ])
99
108
  end
100
109
  end
101
110
 
102
111
  def preScheduleCheck
103
- a('managers').each do |manager|
112
+ @managers.each do |manager|
104
113
  unless manager.leaf?
105
114
  error('manager_is_group',
106
115
  "Resource #{@property.fullId} has group #{manager.fullId} " +
@@ -124,7 +133,7 @@ class TaskJuggler
124
133
 
125
134
  if (parent = @property.parent)
126
135
  # Add the assigned task to the parent duties list.
127
- a('duties').each do |task|
136
+ @duties.each do |task|
128
137
  unless parent['duties', @scenarioIdx].include?(task)
129
138
  parent['duties', @scenarioIdx] << task
130
139
  end
@@ -137,8 +146,8 @@ class TaskJuggler
137
146
  def available?(sbIdx)
138
147
  return false unless @scoreboard[sbIdx].nil?
139
148
 
140
- limits = a('limits')
141
- return false if limits && !limits.ok?(@scoreboard.idxToDate(sbIdx))
149
+ limits = @limits
150
+ return false if limits && !limits.ok?(sbIdx)
142
151
 
143
152
  true
144
153
  end
@@ -156,8 +165,8 @@ class TaskJuggler
156
165
  return false if !force && !available?(sbIdx)
157
166
 
158
167
  # Make sure the task is in the list of duties.
159
- unless a('duties').include?(task)
160
- @property['duties', @scenarioIdx] << task
168
+ unless @duties.include?(task)
169
+ @duties << task
161
170
  end
162
171
 
163
172
  #puts "Booking resource #{@property.fullId} at " +
@@ -170,7 +179,7 @@ class TaskJuggler
170
179
  t['effort', @scenarioIdx] += 1
171
180
  t = t.parent
172
181
  end
173
- a('limits').inc(@scoreboard.idxToDate(sbIdx)) if a('limits')
182
+ @limits.inc(sbIdx) if @limits
174
183
 
175
184
  # Scoreboard iterations are fairly expensive but they are very frequent
176
185
  # operations in later processing. To limit the interations to the
@@ -242,7 +251,7 @@ class TaskJuggler
242
251
  query.scopeProperty)
243
252
  query.string = query.currencyFormat.format(cost)
244
253
  else
245
- query.string = 'No cost account'
254
+ query.string = 'No \'balance\' defined!'
246
255
  end
247
256
  end
248
257
 
@@ -285,12 +294,12 @@ class TaskJuggler
285
294
  query.scopeProperty)
286
295
  query.string = query.currencyFormat.format(revenue)
287
296
  else
288
- query.string = 'No revenue account'
297
+ query.string = 'No \'balance\' defined!'
289
298
  end
290
299
  end
291
300
 
292
301
  # The work time of the Resource that was blocked by a vacation during the
293
- # specified Interval. The result is in working days (effort).
302
+ # specified TimeInterval. The result is in working days (effort).
294
303
  def query_vacationdays(query)
295
304
  query.sortable = query.numerical = time =
296
305
  getVacationDays(query.startIdx, query.endIdx)
@@ -302,7 +311,7 @@ class TaskJuggler
302
311
  def getEffectiveWork(startIdx, endIdx, task = nil)
303
312
  # There can't be any effective work if the start is after the end or the
304
313
  # todo list doesn't contain the specified task.
305
- return 0.0 if startIdx >= endIdx || (task && !a('duties').include?(task))
314
+ return 0.0 if startIdx >= endIdx || (task && !@duties.include?(task))
306
315
 
307
316
  # The unique key we use to address the result in the cache.
308
317
  key = [ self, :ResourceScenarioEffectiveWork, startIdx, endIdx,
@@ -324,7 +333,7 @@ class TaskJuggler
324
333
 
325
334
  work = @project.convertToDailyLoad(
326
335
  getAllocatedSlots(startIdx, endIdx, task) *
327
- @project['scheduleGranularity']) * a('efficiency')
336
+ @project['scheduleGranularity']) * @efficiency
328
337
  end
329
338
  @dCache.store(work, key)
330
339
  end
@@ -384,7 +393,7 @@ class TaskJuggler
384
393
  else
385
394
  work = @project.convertToDailyLoad(
386
395
  getFreeSlots(startIdx, endIdx) *
387
- @project['scheduleGranularity']) * a('efficiency')
396
+ @project['scheduleGranularity']) * @efficiency
388
397
  end
389
398
  work
390
399
  end
@@ -406,7 +415,7 @@ class TaskJuggler
406
415
 
407
416
  vacationDays = @project.convertToDailyLoad(
408
417
  getVacationSlots(startIdx, endIdx) *
409
- @project['scheduleGranularity']) * a('efficiency')
418
+ @project['scheduleGranularity']) * @efficiency
410
419
  end
411
420
  vacationDays
412
421
  end
@@ -418,7 +427,7 @@ class TaskJuggler
418
427
  amount += child.turnover(@scenarioIdx, startIdx, endIdx, account, task)
419
428
  end
420
429
  else
421
- a('duties').each do |duty|
430
+ @duties.each do |duty|
422
431
  amount += duty.turnover(@scenarioIdx, startIdx, endIdx, account,
423
432
  @property)
424
433
  end
@@ -427,18 +436,18 @@ class TaskJuggler
427
436
  amount
428
437
  end
429
438
 
430
- # Returns the cost for using this resource during the specified Interval
431
- # _period_. If a Task _task_ is provided, only the work on this particular
432
- # task is considered.
439
+ # Returns the cost for using this resource during the specified
440
+ # TimeInterval _period_. If a Task _task_ is provided, only the work on
441
+ # this particular task is considered.
433
442
  def cost(startIdx, endIdx, task = nil)
434
- getAllocatedTime(startIdx, endIdx, task) * a('rate')
443
+ getAllocatedTime(startIdx, endIdx, task) * @rate
435
444
  end
436
445
 
437
446
  # Returns true if the resource or any of its children is allocated during
438
- # the period specified with the Interval _iv_. If task is not nil
447
+ # the period specified with the TimeInterval _iv_. If task is not nil
439
448
  # only allocations to this tasks are respected.
440
449
  def allocated?(iv, task = nil)
441
- return false if task && !a('duties').include?(task)
450
+ return false if task && !@duties.include?(task)
442
451
 
443
452
  startIdx = @project.dateToIdx(iv.start)
444
453
  endIdx = @project.dateToIdx(iv.end)
@@ -450,26 +459,22 @@ class TaskJuggler
450
459
  end
451
460
 
452
461
  # Iterate over the scoreboard and turn its content into a set of Bookings.
453
- # _iv_ can be an Interval to limit the bookings within the provided
454
- # period.
455
- def getBookings(iv = nil)
456
- return {} if @property.container? || @scoreboard.nil? ||
457
- @firstBookedSlot.nil? || @lastBookedSlot.nil?
458
-
459
- bookings = {}
460
- lastTask = nil
461
- bookingStart = nil
462
+ # _iv_ can be a TimeInterval to limit the bookings within the provided
463
+ # period. if _hashByTask_ is true, the result is a Hash of Arrays with
464
+ # bookings hashed by Task. Otherwise it's just a plain Array with
465
+ # Bookings.
466
+ def getBookings(iv = nil, hashByTask = true)
467
+ bookings = hashByTask ? {} : []
468
+ return bookings if @property.container? || @scoreboard.nil? ||
469
+ @firstBookedSlot.nil? || @lastBookedSlot.nil?
462
470
 
463
471
  # To speedup the collection we start with the first booked slot and end
464
472
  # with the last booked slot.
465
473
  startIdx = @firstBookedSlot
466
474
  endIdx = @lastBookedSlot + 1
467
475
 
468
- # In case the index markers are still uninitialized, we have no bookings.
469
- return {} if startIdx.nil? || endIdx.nil?
470
-
471
- # If the user provided an Interval, we only return bookings within this
472
- # Interval.
476
+ # If the user provided a TimeInterval, we only return bookings within
477
+ # this TimeInterval.
473
478
  if iv
474
479
  ivStartIdx = @project.dateToIdx(iv.start)
475
480
  ivEndIdx = @project.dateToIdx(iv.end)
@@ -477,21 +482,35 @@ class TaskJuggler
477
482
  endIdx = ivEndIdx if ivEndIdx < endIdx
478
483
  end
479
484
 
485
+ lastTask = nil
486
+ bookingStart = nil
487
+
480
488
  startIdx.upto(endIdx) do |idx|
481
489
  task = @scoreboard[idx]
482
490
  # Now we watch for task changes.
483
- if task != lastTask || (lastTask == nil && task.is_a?(Task)) ||
484
- (task.is_a?(Task) && idx == endIdx)
485
- unless lastTask.nil?
491
+ if task != lastTask ||
492
+ (task.is_a?(Task) && (lastTask.nil? || idx == endIdx))
493
+ if lastTask
494
+ # We've found the end of a task booking series.
486
495
  # If we don't have a Booking for the task yet, we create one.
487
- if bookings[lastTask].nil?
488
- bookings[lastTask] = Booking.new(@property, lastTask, [])
496
+ if hashByTask
497
+ if bookings[lastTask].nil?
498
+ bookings[lastTask] = Booking.new(@property, lastTask, [])
499
+ end
500
+ # Append the new interval to the Booking.
501
+ bookings[lastTask].intervals <<
502
+ TimeInterval.new(@scoreboard.idxToDate(bookingStart),
503
+ @scoreboard.idxToDate(idx))
504
+ else
505
+ if bookings.empty? || bookings.last.task != lastTask
506
+ bookings << Booking.new(@property, lastTask, [])
507
+ end
508
+ # Append the new interval to the Booking.
509
+ bookings.last.intervals <<
510
+ TimeInterval.new(@scoreboard.idxToDate(bookingStart),
511
+ @scoreboard.idxToDate(idx))
489
512
  end
490
513
 
491
- # Append the new interval to the Booking.
492
- bookings[lastTask].intervals <<
493
- Interval.new(@scoreboard.idxToDate(bookingStart),
494
- @scoreboard.idxToDate(idx))
495
514
  end
496
515
  # Get ready for the next task booking interval
497
516
  if task.is_a?(Task)
@@ -578,19 +597,16 @@ class TaskJuggler
578
597
  @project['scheduleGranularity'], 2)
579
598
 
580
599
  # We'll need this frequently and can savely cache it here.
581
- @shifts = a('shifts')
582
- @workinghours = a('workinghours')
600
+ @shifts = @shifts
601
+ @workinghours = @workinghours
583
602
 
584
603
  # Change all work time slots to nil (available) again.
585
- date = @scoreboard.idxToDate(0)
586
- delta = @project['scheduleGranularity']
587
604
  @project.scoreboardSize.times do |i|
588
- @scoreboard[i] = nil if onShift?(date)
589
- date += delta
605
+ @scoreboard[i] = nil if onShift?(i)
590
606
  end
591
607
 
592
608
  # Mark all resource specific vacation slots as such
593
- a('vacations').each do |vacation|
609
+ @vacations.each do |vacation|
594
610
  startIdx = @scoreboard.dateToIdx(vacation.start)
595
611
  endIdx = @scoreboard.dateToIdx(vacation.end)
596
612
  startIdx.upto(endIdx - 1) do |i|
@@ -613,7 +629,7 @@ class TaskJuggler
613
629
  unless @shifts.nil?
614
630
  # Mark the vacations from all the shifts the resource is assigned to.
615
631
  @project.scoreboardSize.times do |i|
616
- v = @shifts.getSbSlot(@scoreboard.idxToDate(i))
632
+ v = @shifts.getSbSlot(i)
617
633
  # Check if the vacation replacement bit is set. In that case we copy
618
634
  # the whole interval over to the resource scoreboard overriding any
619
635
  # global vacations.
@@ -654,21 +670,21 @@ class TaskJuggler
654
670
  "Management loop detected. #{@property.fullId} has self " +
655
671
  "in list of reports")
656
672
  end
657
- @property['reports', @scenarioIdx] += reports
673
+ @reports += reports
658
674
  # Resources can end up multiple times in the list if they have multiple
659
675
  # reporting chains. We only need them once in the list.
660
- a('reports').uniq!
676
+ @reports.uniq!
661
677
 
662
- a('managers').each do |r|
663
- r.setReports_i(@scenarioIdx, a('reports'))
678
+ @managers.each do |r|
679
+ r.setReports_i(@scenarioIdx, @reports)
664
680
  end
665
681
  end
666
682
 
667
- def onShift?(date)
668
- if @shifts && @shifts.assigned?(date)
669
- return @shifts.onShift?(date)
683
+ def onShift?(sbIdx)
684
+ if @shifts && @shifts.assigned?(sbIdx)
685
+ return @shifts.onShift?(sbIdx)
670
686
  else
671
- @workinghours.onShift?(date)
687
+ @workinghours.onShift?(sbIdx)
672
688
  end
673
689
  end
674
690
 
@@ -682,7 +698,7 @@ class TaskJuggler
682
698
  task)
683
699
  end
684
700
  else
685
- return false unless @scoreboard && a('duties').include?(task)
701
+ return false unless @scoreboard && @duties.include?(task)
686
702
 
687
703
  startIdx, endIdx = fitIndicies(startIdx, endIdx, task)
688
704
  return false if startIdx >= endIdx
@@ -703,7 +719,7 @@ class TaskJuggler
703
719
  end
704
720
  dailyRate
705
721
  else
706
- a('rate')
722
+ @rate
707
723
  end
708
724
  end
709
725
 
@@ -159,8 +159,8 @@ class TaskJuggler
159
159
  def setLoadUnit(query, args)
160
160
  units = {
161
161
  'days' => :days, 'hours' => :hours, 'longauto' => :longauto,
162
- 'minutes' => :minutes, 'months' => :months, 'shortauto' => :shortauto,
163
- 'weeks' => :weeks, 'years' => :years
162
+ 'minutes' => :minutes, 'months' => :months, 'quarters' => :quarters,
163
+ 'shortauto' => :shortauto, 'weeks' => :weeks, 'years' => :years
164
164
  }
165
165
  query.loadUnit = units[args['loadunit']] if args['loadunit']
166
166
  end
@@ -25,10 +25,20 @@ class TaskJuggler
25
25
  @project = property.project
26
26
  @scenarioIdx = idx
27
27
  @attributes = attributes
28
+
29
+ # Register the scenario with the Task.
30
+ @property.data[idx] = self
31
+ end
32
+
33
+ # We only use deep_clone for attributes, never for properties. Since
34
+ # attributes may reference properties these references should remain
35
+ # references.
36
+ def deep_clone
37
+ self
28
38
  end
29
39
 
30
40
  def a(attributeName)
31
- @attributes[attributeName].value
41
+ @attributes[attributeName].get
32
42
  end
33
43
 
34
44
  def error(id, text, sourceFileInfo = nil, property = nil)
@@ -81,6 +81,13 @@ class TaskJuggler
81
81
  end
82
82
  end
83
83
 
84
+ # Iterate over all scoreboard entries by index.
85
+ def each_index
86
+ @sb.each_index do |index|
87
+ yield index
88
+ end
89
+ end
90
+
84
91
  # Assign result of block to each element.
85
92
  def collect!
86
93
  @sb.collect! { |x| yield x }
@@ -154,7 +161,7 @@ class TaskJuggler
154
161
  start = sIdx if start < sIdx
155
162
  idx = eIdx if idx > eIdx
156
163
 
157
- intervals << Interval.new(idxToDate(start), idxToDate(idx))
164
+ intervals << TimeInterval.new(idxToDate(start), idxToDate(idx))
158
165
  end
159
166
  duration = start = 0
160
167
  end
@@ -26,7 +26,7 @@ class TaskJuggler
26
26
 
27
27
  @data = Array.new(@project.scenarioCount, nil)
28
28
  @project.scenarioCount.times do |i|
29
- @data[i] = ShiftScenario.new(self, i, @scenarioAttributes[i])
29
+ ShiftScenario.new(self, i, @scenarioAttributes[i])
30
30
  end
31
31
  end
32
32