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
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ICalReport.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
7
+ # by Chris Schlaeger <chris@linux.com>
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of version 2 of the GNU General Public License as
11
+ # published by the Free Software Foundation.
12
+ #
13
+
14
+ require 'taskjuggler/reports/ReportBase'
15
+ require 'taskjuggler/ICalendar'
16
+
17
+ class TaskJuggler
18
+
19
+ # This Report derivative generates iCalendar files.
20
+ class ICalReport < ReportBase
21
+
22
+ # Create a new ICalReport with _report_ as description.
23
+ def initialize(report)
24
+ super
25
+ end
26
+
27
+ # Generate an intermediate version of the report data.
28
+ def generateIntermediateFormat
29
+ super
30
+ # Prepare the task list.
31
+ @taskList = PropertyList.new(@project.tasks)
32
+ @taskList.setSorting(a('sortTasks'))
33
+ @taskList = filterTaskList(@taskList, nil, a('hideTask'), a('rollupTask'),
34
+ a('openNodes'))
35
+ @taskList.sort!
36
+
37
+ # Prepare the resource list. This is not yet used.
38
+ @resourceList = PropertyList.new(@project.resources)
39
+ @resourceList.setSorting(a('sortResources'))
40
+ @resourceList = filterResourceList(@resourceList, nil, a('hideResource'),
41
+ a('rollupResource'), a('openNodes'))
42
+ @resourceList.sort!
43
+
44
+ @query = @report.project.reportContexts.last.query.dup
45
+
46
+ @ical = ICalendar.new("#{AppConfig.packageName}-#{@project['projectid']}")
47
+ # Use the project start date of the current date (whichever is earlier)
48
+ # for the calendar creation date.
49
+ @ical.creationDate = [ @report.project['start'], TjTime.new ].min
50
+ # Use the project 'now' date a last modification date.
51
+ @ical.lastModified = @report.project['now']
52
+
53
+ # We only care about the first requested scenario.
54
+ scenarioIdx = a('scenarios').first
55
+ uidMap = {}
56
+ @taskList.each do |task|
57
+ todo = ICalendar::Todo.new(
58
+ @ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
59
+ task.name, task['start', scenarioIdx], task['end', scenarioIdx])
60
+ # Save the ical UID of this TODO.
61
+ uidMap[task] = todo.uid
62
+ @query.property = task
63
+ @query.attributeId = 'complete'
64
+ @query.scenarioIdx = scenarioIdx
65
+ @query.process
66
+ todo.percentComplete = @query.to_num.to_i
67
+ # We must convert the TJ priority range (1 - 1000) to iCalendar range
68
+ # (0 - 9).
69
+ todo.priority = (task['priority', scenarioIdx] - 1) / 100
70
+ # If there is a parent task and it's known already, we set the
71
+ # relation in the TODO component.
72
+ if task.parent && uidMap[task.parent]
73
+ todo.relatedTo = uidMap[task.parent]
74
+ end
75
+ # If we have a task note, use this for the DESCRIPTION property.
76
+ if (note = task.get('note'))
77
+ note = note.to_s
78
+ todo.description = note
79
+ end
80
+ # Check if we have a responsible resource with an email address. Since
81
+ # ICalendar only knows one organizer we ignore all but the first.
82
+ organizer = nil
83
+ unless (responsible = task['responsible', scenarioIdx]).empty? &&
84
+ @resourceList.include?(organizer = responsible[0]) &&
85
+ organizer.get('email')
86
+ todo.setOrganizer(responsible[0].name, responsible[0].get('email'))
87
+ end
88
+ # Set the assigned resources as attendees.
89
+ attendees = []
90
+ task['assignedresources', scenarioIdx].each do |resource|
91
+ next unless @resourceList.include?(resource) &&
92
+ resource.get('email')
93
+ attendees << resource
94
+ todo.addAttendee(resource.name, resource.get('email'))
95
+ end
96
+
97
+ # Generate an additional VEVENT entry for all leaf tasks that aren't
98
+ # milestones.
99
+ if task.leaf? && !task['milestone', scenarioIdx]
100
+ event = ICalendar::Event.new(
101
+ @ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
102
+ task.name, task['start', scenarioIdx], task['end', scenarioIdx])
103
+ event.description = note if note
104
+ event.setOrganizer(organizer.name, organizer.email) if organizer
105
+ attendees.each do |attendee|
106
+ event.addAttendee(attendee.name, attendee.get('email'))
107
+ end
108
+ end
109
+
110
+ # Generate VJOURNAL entries for all the journal entries of this task.
111
+ @report.project['journal'].
112
+ entriesByTask(task, a('start'), a('end'),
113
+ a('hideJournalEntry')).each do |entry|
114
+ journal = ICalendar::Journal.new(
115
+ @ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
116
+ entry.headline, entry.date)
117
+ journal.relatedTo = uidMap[task]
118
+ journal.description = entry.summary.to_s + entry.details.to_s
119
+ # Set the author of the journal entry as organizer.
120
+ if (author = entry.author) && @resourceList.include?(author) &&
121
+ author.get('email')
122
+ journal.setOrganizer(author.name, author.get('email'))
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ # Convert the intermediate format into a DOS formated String.
129
+ def to_iCal
130
+ @ical.to_s
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
@@ -305,7 +305,7 @@ EOT
305
305
  query = Query.new(queryAttrs)
306
306
 
307
307
  # Calculate the number of working days in the report interval.
308
- workingDays = @project.workingDays(Interval.new(a('start'), a('end')))
308
+ workingDays = @project.workingDays(TimeInterval.new(a('start'), a('end')))
309
309
 
310
310
  resourceList.each do |resource|
311
311
  # We only care about leaf resources that have the custom attribute
@@ -17,10 +17,12 @@ require 'taskjuggler/PropertyTreeNode'
17
17
  require 'taskjuggler/reports/TextReport'
18
18
  require 'taskjuggler/reports/TaskListRE'
19
19
  require 'taskjuggler/reports/ResourceListRE'
20
+ require 'taskjuggler/reports/TagFile'
20
21
  require 'taskjuggler/reports/TjpExportRE'
21
22
  require 'taskjuggler/reports/StatusSheetReport'
22
23
  require 'taskjuggler/reports/TimeSheetReport'
23
24
  require 'taskjuggler/reports/NikuReport'
25
+ require 'taskjuggler/reports/ICalReport'
24
26
  require 'taskjuggler/reports/CSVFile'
25
27
  require 'taskjuggler/reports/Navigator'
26
28
  require 'taskjuggler/reports/ReportContext'
@@ -28,6 +30,10 @@ require 'taskjuggler/HTMLDocument'
28
30
 
29
31
  class TaskJuggler
30
32
 
33
+ # Just a dummy class to make the 'flags' attribute work.
34
+ class ReportScenario < ScenarioData
35
+ end
36
+
31
37
  # The Report class holds the fundamental description and functionality to
32
38
  # turn the scheduled project into a user readable form. A report may contain
33
39
  # other reports.
@@ -43,6 +49,13 @@ class TaskJuggler
43
49
  # The type specifier must be set for every report. It tells whether this
44
50
  # is a task, resource, text or other report.
45
51
  @typeSpec = nil
52
+ # Reports don't really have any scenario specific attributes. But the
53
+ # flag handling code assumes they are. To use flags, we need them as
54
+ # well.
55
+ @data = Array.new(@project.scenarioCount, nil)
56
+ @project.scenarioCount.times do |i|
57
+ ReportScenario.new(self, i, @scenarioAttributes[i])
58
+ end
46
59
  end
47
60
 
48
61
  # The generate function is where the action happens in this class. The
@@ -65,11 +78,15 @@ class TaskJuggler
65
78
  end
66
79
 
67
80
  case format
81
+ when :iCal
82
+ generateICal
68
83
  when :html
69
84
  generateHTML
70
85
  copyAuxiliaryFiles
71
86
  when :csv
72
87
  generateCSV
88
+ when :ctags
89
+ generateCTags
73
90
  when :niku
74
91
  generateNiku
75
92
  when :tjp
@@ -90,10 +107,14 @@ class TaskJuggler
90
107
  case @typeSpec
91
108
  when :export
92
109
  @content = TjpExportRE.new(self)
110
+ when :iCal
111
+ @content = ICalReport.new(self)
93
112
  when :niku
94
113
  @content = NikuReport.new(self)
95
114
  when :resourcereport
96
115
  @content = ResourceListRE.new(self)
116
+ when :tagfile
117
+ @content = TagFile.new(self)
97
118
  when :textreport
98
119
  @content = TextReport.new(self)
99
120
  when :taskreport
@@ -293,6 +314,44 @@ EOT
293
314
  end
294
315
  end
295
316
 
317
+ # Generate Niku report
318
+ def generateICal
319
+ unless @content.respond_to?('to_iCal')
320
+ warning('ical_not_supported',
321
+ "iCalendar format is not supported for report #{@id} of " +
322
+ "type #{@typeSpec}.")
323
+ return nil
324
+ end
325
+
326
+ begin
327
+ f = @name == '.' ? $stdout :
328
+ File.new(((@name[0] == '/' ? '' : @project.outputDir) +
329
+ @name + '.ical').untaint, 'w')
330
+ f.puts "#{@content.to_iCal}"
331
+ rescue IOError
332
+ error('write_ical', "Cannot write to file #{@name}.\n#{$!}")
333
+ end
334
+ end
335
+
336
+ # Generate ctags file
337
+ def generateCTags
338
+ unless @content.respond_to?('to_ctags')
339
+ warning('ctags_not_supported',
340
+ "ctags format is not supported for report #{@id} of " +
341
+ "type #{@typeSpec}.")
342
+ return nil
343
+ end
344
+
345
+ begin
346
+ f = @name == '.' ? $stdout :
347
+ File.new(((@name[0] == '/' ? '' : @project.outputDir) +
348
+ @name).untaint, 'w')
349
+ f.puts "#{@content.to_ctags}"
350
+ rescue IOError
351
+ error('write_ctags', "Cannot write to file #{@name}.\n#{$!}")
352
+ end
353
+ end
354
+
296
355
  def copyAuxiliaryFiles
297
356
  # Don't copy files if output is stdout.
298
357
  return if @name == '.' || a('interactive')
@@ -64,7 +64,7 @@ class TaskJuggler
64
64
  list.delete_if do |task|
65
65
  delete = true
66
66
  a('scenarios').each do |scenarioIdx|
67
- iv = Interval.new(a('start'), a('end'))
67
+ iv = TimeInterval.new(a('start'), a('end'))
68
68
  if task.hasResourceAllocated?(scenarioIdx, iv, resource)
69
69
  delete = false
70
70
  break;
@@ -92,7 +92,7 @@ class TaskJuggler
92
92
  if task
93
93
  # If we have a task we need to check that the resources are assigned
94
94
  # to the task in any of the reported scenarios.
95
- iv = Interval.new(a('start'), a('end'))
95
+ iv = TimeInterval.new(a('start'), a('end'))
96
96
  list.delete_if do |resource|
97
97
  delete = true
98
98
  a('scenarios').each do |scenarioIdx|
@@ -194,71 +194,6 @@ class TaskJuggler
194
194
  list
195
195
  end
196
196
 
197
- # This function converts number to strings that may include a unit. The
198
- # unit is determined by @loadUnit. In the automatic modes, the shortest
199
- # possible result is shown and the unit is always appended. _value_ is the
200
- # value to convert. _factors_ determines the conversion factors for the
201
- # different units.
202
- # TODO: Delete when all users have been migrated to use Query!
203
- def scaleValue(value, factors)
204
- loadUnit = a('loadUnit')
205
- numberFormat = a('numberFormat')
206
-
207
- if loadUnit == :shortauto || loadUnit == :longauto
208
- # We try all possible units and store the resulting strings here.
209
- options = []
210
- # For each of the units we can define a maximum value that the value
211
- # should not exceed. A maximum of 0 means no limit.
212
- max = [ 60, 48, 0, 8, 24, 0 ]
213
-
214
- i = 0
215
- shortest = nil
216
- factors.each do |factor|
217
- scaledValue = value * factor
218
- str = numberFormat.format(scaledValue)
219
- # We ignore results that are 0 or exceed the maximum. To ensure that
220
- # we have at least one result the unscaled value is always taken.
221
- if (factor != 1.0 && scaledValue == 0) ||
222
- (max[i] != 0 && scaledValue > max[i])
223
- options << nil
224
- else
225
- options << str
226
- end
227
- i += 1
228
- end
229
-
230
- # Default to days in case they are all the same.
231
- shortest = 2
232
- # Find the shortest option.
233
- 6.times do |j|
234
- shortest = j if options[j] &&
235
- options[j].length < options[shortest].length
236
- end
237
-
238
- str = options[shortest]
239
- if loadUnit == :longauto
240
- # For the long units we handle singular and plural properly. For
241
- # English we just need to append an 's', but this code will work for
242
- # other languages as well.
243
- units = []
244
- if str == "1"
245
- units = %w( minute hour day week month year )
246
- else
247
- units = %w( minutes hours days weeks months years )
248
- end
249
- str += ' ' + units[shortest]
250
- else
251
- str += %w( min h d w m y )[shortest]
252
- end
253
- else
254
- # For fixed units we just need to do the conversion. No unit is
255
- # included.
256
- units = [ :minutes, :hours, :days, :weeks, :months, :years ]
257
- str = numberFormat.format(value * factors[units.index(loadUnit)])
258
- end
259
- str
260
- end
261
-
262
197
  end
263
198
 
264
199
  end
@@ -488,7 +488,7 @@ class TaskJuggler
488
488
  t.send(name1Func) == currentInterval)
489
489
  # call TjTime::sameTimeNext... function to get the end of the column.
490
490
  nextT = t.send(sameTimeNextFunc)
491
- iv = Interval.new(t, nextT)
491
+ iv = TimeInterval.new(t, nextT)
492
492
  # Create the new column object.
493
493
  column = ReportTableColumn.new(table, nil, '')
494
494
  # Store the date of the column in the original form.
@@ -505,7 +505,7 @@ class TaskJuggler
505
505
  # TODO: The width should be taken from some data structure.
506
506
  column.cell2.width = 20
507
507
  # Off-duty cells will have a different color than working time cells.
508
- unless @project.isWorkingTime(iv)
508
+ unless @project.hasWorkingTime(iv)
509
509
  column.cell2.category = 'tabhead_offduty'
510
510
  end
511
511
  cellsInInterval += 1
@@ -736,8 +736,8 @@ class TaskJuggler
736
736
  # scheduling problem, we use the full project interval.
737
737
  taskStart = task['start', origQuery.scenarioIdx]
738
738
  taskEnd = task['end', origQuery.scenarioIdx]
739
- taskIv = Interval.new(taskStart.nil? ? @project['start'] : taskStart,
740
- taskEnd.nil? ? @project['end'] : taskEnd)
739
+ taskIv = TimeInterval.new(taskStart.nil? ? @project['start'] : taskStart,
740
+ taskEnd.nil? ? @project['end'] : taskEnd)
741
741
 
742
742
  firstCell = nil
743
743
  while t < @end
@@ -747,7 +747,7 @@ class TaskJuggler
747
747
  query = origQuery.dup
748
748
  # call TjTime::sameTimeNext... function
749
749
  nextT = t.send(sameTimeNextFunc)
750
- cellIv = Interval.new(t, nextT)
750
+ cellIv = TimeInterval.new(t, nextT)
751
751
  case columnDef.content
752
752
  when 'empty'
753
753
  # Create a new cell
@@ -814,8 +814,9 @@ class TaskJuggler
814
814
  # scheduling problem, we use the full project interval.
815
815
  taskStart = task['start', origQuery.scenarioIdx]
816
816
  taskEnd = task['end', origQuery.scenarioIdx]
817
- taskIv = Interval.new(taskStart.nil? ? @project['start'] : taskStart,
818
- taskEnd.nil? ? @project['end'] : taskEnd)
817
+ taskIv = TimeInterval.new(taskStart.nil? ? @project['start'] :
818
+ taskStart,
819
+ taskEnd.nil? ? @project['end'] : taskEnd)
819
820
  else
820
821
  task = nil
821
822
  end
@@ -832,7 +833,7 @@ class TaskJuggler
832
833
 
833
834
  # call TjTime::sameTimeNext... function
834
835
  nextT = t.send(sameTimeNextFunc)
835
- cellIv = Interval.new(t, nextT)
836
+ cellIv = TimeInterval.new(t, nextT)
836
837
  # Get work load for all tasks.
837
838
  query.scopeProperty = nil
838
839
  query.attributeId = 'effort'
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ProjectFileParser.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
7
+ # by Chris Schlaeger <chris@linux.com>
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of version 2 of the GNU General Public License as
11
+ # published by the Free Software Foundation.
12
+ #
13
+
14
+ require 'taskjuggler/reports/ReportBase.rb'
15
+ require 'taskjuggler/Tj3Config'
16
+
17
+ class TaskJuggler
18
+
19
+ # This class specializes ReportBase to generate tag files used by editors
20
+ # such as vim.
21
+ class TagFile < ReportBase
22
+
23
+ # The TagFileEntry class is used to store the intermediate representation
24
+ # of the TagFile.
25
+ class TagFileEntry
26
+
27
+ attr_reader :tag, :file, :line, :kind
28
+
29
+ # Create a new TagFileEntry object. _tag_ is the property ID. _file_ is
30
+ # the source file name, _line_ the line number in this file. _kind_
31
+ # specifies the property type. The following types should be used:
32
+ # r : Resource
33
+ # t : Task
34
+ # p : Report
35
+ def initialize(tag, file, line, kind)
36
+ @tag = tag
37
+ @file = file
38
+ @line = line
39
+ @kind = kind
40
+ end
41
+
42
+ # Used to sort the tag file entries by tag.
43
+ def <=>(e)
44
+ @tag <=> e.tag
45
+ end
46
+
47
+ # Convert the entry into a ctags compatible line.
48
+ def to_ctags
49
+ "#{@tag}\t#{@file}\t#{@line};\"\t#{@kind}\n"
50
+ end
51
+
52
+ end
53
+
54
+ def initialize(report)
55
+ super
56
+ end
57
+
58
+ def generateIntermediateFormat
59
+ super
60
+
61
+ @tags = []
62
+
63
+ # Add the resources.
64
+ @resourceList = PropertyList.new(@project.resources)
65
+ @resourceList.setSorting(a('sortResources'))
66
+ @resourceList = filterResourceList(@resourceList, nil, a('hideResource'),
67
+ a('rollupResource'), a('openNodes'))
68
+ @resourceList.each do |resource|
69
+ next unless resource.sourceFileInfo
70
+ @tags << TagFileEntry.new(resource.fullId,
71
+ resource.sourceFileInfo.fileName,
72
+ resource.sourceFileInfo.lineNo, 'r')
73
+ end
74
+
75
+ # Add the tasks.
76
+ @taskList = PropertyList.new(@project.tasks)
77
+ @taskList.setSorting(a('sortTasks'))
78
+ @taskList = filterTaskList(@taskList, nil, a('hideTask'), a('rollupTask'),
79
+ a('openNodes'))
80
+ @taskList.each do |task|
81
+ next unless task.sourceFileInfo
82
+ @tags << TagFileEntry.new(task.fullId,
83
+ task.sourceFileInfo.fileName,
84
+ task.sourceFileInfo.lineNo, 't')
85
+ end
86
+
87
+ # Add the reports.
88
+ @project.reports.each do |report|
89
+ next unless report.sourceFileInfo
90
+ @tags << TagFileEntry.new(report.fullId,
91
+ report.sourceFileInfo.fileName,
92
+ report.sourceFileInfo.lineNo, 'p')
93
+ end
94
+ end
95
+
96
+ # Returns a String that contains the content of the ctags file.
97
+ # See http://vimdoc.sourceforge.net/htmldoc/tagsrch.html for the spec.
98
+ def to_ctags
99
+ # The ctags header. Not used if this is really needed.
100
+ s = <<"EOT"
101
+ !_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
102
+ !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
103
+ !_TAG_PROGRAM_AUTHOR #{AppConfig.authors.join(';')} //
104
+ !_TAG_PROGRAM_NAME #{AppConfig.softwareName} //
105
+ !_TAG_PROGRAM_URL #{AppConfig.contact} /official site/
106
+ !_TAG_PROGRAM_VERSION #{AppConfig.version} //
107
+ EOT
108
+
109
+ # Turn the list of Tags into ctags lines.
110
+ @tags.sort.each do |tag|
111
+ s << tag.to_ctags
112
+ end
113
+
114
+ s
115
+ end
116
+
117
+ end
118
+
119
+ end
120
+
@@ -241,9 +241,9 @@ EOT
241
241
 
242
242
  assignedTaskList.each do |task|
243
243
  # Time sheet task records only make sense for leaf tasks.
244
- reportIv = Interval.new(from, to)
245
- taskIv = Interval.new(task['start', scenarioIdx],
246
- task['end', scenarioIdx])
244
+ reportIv = TimeInterval.new(from, to)
245
+ taskIv = TimeInterval.new(task['start', scenarioIdx],
246
+ task['end', scenarioIdx])
247
247
  next if !task.leaf? || !reportIv.overlaps?(taskIv)
248
248
 
249
249
  queryAttrs['property'] = task
@@ -26,7 +26,7 @@ class TaskJuggler
26
26
  @supportedTaskAttrs = %w( booking complete depends flags maxend
27
27
  maxstart minend minstart note priority
28
28
  projectid responsible )
29
- @supportedResourceAttrs = %w( flags vacation workinghours )
29
+ @supportedResourceAttrs = %w( booking flags vacation workinghours )
30
30
  end
31
31
 
32
32
  def generateIntermediateFormat
@@ -193,7 +193,7 @@ class TaskJuggler
193
193
  def generateTask(task, indent)
194
194
  Log.activity if task.sequenceNo % 100 == 0
195
195
 
196
- @file << ' ' * indent + "task #{task.id} " +
196
+ @file << ' ' * indent + "task #{task.subId} " +
197
197
  "#{quotedString(task.name)} {\n"
198
198
 
199
199
  if a('taskAttributes').include?('depends')
@@ -274,7 +274,6 @@ class TaskJuggler
274
274
  def generateResourceAttributes
275
275
  @resourceList.each do |resource|
276
276
  Log.activity if resource.sequenceNo % 100 == 0
277
-
278
277
  @file << "supplement resource #{resource.fullId} {\n"
279
278
  @project.resources.eachAttributeDefinition do |attrDef|
280
279
  id = attrDef.id
@@ -285,6 +284,7 @@ class TaskJuggler
285
284
  if attrDef.scenarioSpecific
286
285
  a('scenarios').each do |scenarioIdx|
287
286
  next if inheritable?(resource, id, scenarioIdx)
287
+
288
288
  generateAttribute(resource, id, 2, scenarioIdx)
289
289
  end
290
290
  else
@@ -292,6 +292,15 @@ class TaskJuggler
292
292
  end
293
293
  end
294
294
 
295
+ # Since 'booking' is a task attribute, we need a special handling if
296
+ # we want to list them in the resource context.
297
+ if a('resourceAttributes').include?('booking') &&
298
+ a('resourceAttributes')[0] != '*'
299
+ a('scenarios').each do |scenarioIdx|
300
+ generateBookingsByResource(resource, 2, scenarioIdx)
301
+ end
302
+ end
303
+
295
304
  @file << "}\n"
296
305
  end
297
306
  end
@@ -326,7 +335,7 @@ class TaskJuggler
326
335
  when 'depends'
327
336
  next # already taken care of
328
337
  when 'booking'
329
- generateBooking(task, 2, scenarioIdx)
338
+ generateBookingsByTask(task, 2, scenarioIdx)
330
339
  else
331
340
  generateAttribute(task, id, 2, scenarioIdx)
332
341
  end
@@ -363,13 +372,14 @@ class TaskJuggler
363
372
  # report.
364
373
  def getBookings
365
374
  @bookings = {}
366
- if a('taskAttributes').include?('booking')
375
+ if a('taskAttributes').include?('booking') ||
376
+ a('resourceAttributes').include?('booking')
367
377
  a('scenarios').each do |scenarioIdx|
368
378
  @bookings[scenarioIdx] = {}
369
379
  @resourceList.each do |resource|
370
380
  # Get the bookings for this resource hashed by task.
371
- bookings = resource.getBookings(scenarioIdx,
372
- Interval.new(a('start'), a('end')))
381
+ bookings = resource.getBookings(
382
+ scenarioIdx, TimeInterval.new(a('start'), a('end')))
373
383
  next if bookings.nil?
374
384
 
375
385
  # Now convert/add them to a tripple-stage hash by scenarioIdx, task
@@ -387,7 +397,7 @@ class TaskJuggler
387
397
  end
388
398
  end
389
399
 
390
- def generateBooking(task, indent, scenarioIdx)
400
+ def generateBookingsByTask(task, indent, scenarioIdx)
391
401
  return unless @bookings[scenarioIdx].include?(task)
392
402
 
393
403
  # Convert Hash into an [ Resource, Booking ] Array sorted by Resource
@@ -397,10 +407,24 @@ class TaskJuggler
397
407
  end
398
408
 
399
409
  resourceBookings.each do |resourceId, booking|
400
- generateAttributeText('booking ' + booking.to_tjp, indent, scenarioIdx)
410
+ generateAttributeText('booking ' + booking.to_tjp(false), indent,
411
+ scenarioIdx)
401
412
  end
402
413
  end
403
414
 
415
+ def generateBookingsByResource(resource, indent, scenarioIdx)
416
+ # Get the bookings for this resource hashed by task.
417
+ bookings = resource.getBookings(scenarioIdx,
418
+ TimeInterval.new(a('start'), a('end')),
419
+ false)
420
+ bookings.each do |booking|
421
+ next unless @taskList.include?(booking.task)
422
+ generateAttributeText('booking ' + booking.to_tjp(true), indent,
423
+ scenarioIdx)
424
+ end
425
+ end
426
+
427
+
404
428
  # This utility function is used to indent multi-line attributes. All
405
429
  # attributes should be filtered through this function. Attributes that
406
430
  # contain line breaks will be indented properly. In addition to the