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
@@ -69,16 +69,25 @@ class TaskJuggler::TextParser
69
69
 
70
70
  # Inject the String _text_ into the input stream at the current cursor
71
71
  # position.
72
- def injectText(text)
72
+ def injectText(text, callLength)
73
+ # Current scanner position in _bytes_ form start
73
74
  pos = @scanner.pos
74
- @nextMacroEnd = pos + text.length
75
- @line = @line[0, pos] + text + @line[pos..-1]
75
+ # Remove the macro call from the end of the already parsed input.
76
+ preCall = @scanner.pre_match[0..-(callLength + 1)]
77
+ # Store the end position of the inserted macro in bytes.
78
+ @nextMacroEnd = preCall.bytesize + text.bytesize
79
+ # Compose the new @line from the cleaned input, the injected text and
80
+ # the remainer of the old @line.
81
+ @line = preCall + text + @scanner.post_match
82
+ # Start the StringScanner again at the first character of the injected
83
+ # text.
76
84
  @scanner = StringScanner.new(@line)
77
- @scanner.pos = pos
85
+ @scanner.pos = preCall.bytesize
78
86
  end
79
87
 
80
- def injectMacro(macro, args, text)
81
- injectText(text)
88
+ def injectMacro(macro, args, text, callLength)
89
+ # We add 3 chars more for the ${}.
90
+ injectText(text, callLength)
82
91
 
83
92
  # Simple detection for recursive macro calls.
84
93
  return false if @macroStack.length > 20
@@ -151,7 +160,7 @@ class TaskJuggler::TextParser
151
160
  def line
152
161
  return '' unless @line
153
162
 
154
- @line[0..(@scanner.pos - 1)]
163
+ (@scanner.pre_match || '') + (@scanner.matched || '')
155
164
  end
156
165
 
157
166
  end
@@ -474,8 +483,9 @@ class TaskJuggler::TextParser
474
483
  # Expand a macro and inject it into the input stream. _prefix_ is any
475
484
  # string that was found right before the macro call. We have to inject it
476
485
  # before the expanded macro. _args_ is an Array of Strings. The first is
477
- # the macro name, the rest are the parameters.
478
- def expandMacro(prefix, args)
486
+ # the macro name, the rest are the parameters. _callLength_ is the number
487
+ # of characters for the complete macro call "${...}".
488
+ def expandMacro(prefix, args, callLength)
479
489
  # Get the expanded macro from the @macroTable.
480
490
  macro, text = @macroTable.resolve(args, sourceFileInfo)
481
491
  unless macro && text
@@ -485,7 +495,7 @@ class TaskJuggler::TextParser
485
495
  # If the expanded macro is empty, we can ignore it.
486
496
  return if text == ''
487
497
 
488
- unless @cf.injectMacro(macro, args, prefix + text)
498
+ unless @cf.injectMacro(macro, args, prefix + text, callLength)
489
499
  error('macro_stack_overflow', "Too many nested macro calls.")
490
500
  end
491
501
  end
@@ -514,7 +524,8 @@ class TaskJuggler::TextParser
514
524
  args = entry.args[1..-1]
515
525
  args.collect! { |a| '"' + a + '"' }
516
526
  @messageHandler.info('macro_stack',
517
- " ${#{macro.name} #{args.join(' ')}}",
527
+ " ${#{macro.name}#{args.empty? ? '' : ' '}" +
528
+ "#{args.join(' ')}}",
518
529
  macro.sourceFileInfo)
519
530
  end
520
531
  end
@@ -102,7 +102,7 @@ class TaskJuggler
102
102
  if @status.headline.empty?
103
103
  error('ts_no_headline',
104
104
  "You must provide a headline for the status of " +
105
- "task #{@task.fullId}")
105
+ "task #{taskId}")
106
106
  end
107
107
  if @status.summary &&
108
108
  @status.summary.richText.inputText == "A summary text\n"
@@ -14,7 +14,7 @@
14
14
  require 'taskjuggler/UTF8String'
15
15
  require 'taskjuggler/AppConfig'
16
16
 
17
- AppConfig.version = '0.1.1'
17
+ AppConfig.version = '0.2.0'
18
18
  AppConfig.packageName = 'taskjuggler'
19
19
  AppConfig.softwareName = 'TaskJuggler III'
20
20
  AppConfig.packageInfo = 'A Project Management Software'
@@ -26,9 +26,8 @@ class TaskJuggler
26
26
  # The number of days per month. Leap years are taken care of separately.
27
27
  MON_MAX = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
28
28
 
29
- # The current time zone name.
30
- @@tz = 'UTC'
31
- ENV['TZ'] = @@tz
29
+ # Initialize @@tz with the current time zone if it is set.
30
+ @@tz = ENV['TZ']
32
31
 
33
32
  # call-seq:
34
33
  # TjTime() -> TjTime (now)
@@ -114,6 +113,11 @@ class TaskJuggler
114
113
  TjTime.new((localtime.to_i / clock) * clock)
115
114
  end
116
115
 
116
+ # Return the time object in UTC.
117
+ def utc
118
+ TjTime.new(@time.dup.gmtime)
119
+ end
120
+
117
121
  # Returns the total number of seconds of the day. The time is assumed to be
118
122
  # in the time zone specified by _tz_.
119
123
  def secondsOfDay(tz = nil)
@@ -289,7 +289,7 @@ EOT
289
289
  end
290
290
 
291
291
  if @val[1].nil?
292
- intervals = [ Interval.new(@project['start'], @project['end']) ]
292
+ intervals = [ TimeInterval.new(@project['start'], @project['end']) ]
293
293
  else
294
294
  intervals = @val[1]
295
295
  end
@@ -883,7 +883,7 @@ EOT
883
883
 
884
884
  def rule_exportHeader
885
885
  pattern(%w( _export !optionalID $STRING ), lambda {
886
- report = newReport(@val[1], @val[2], :export, sourceFileInfo)
886
+ report = newReport(@val[1], @val[2], :export, @sourceFileInfo[0])
887
887
 
888
888
  # By default, we export all scenarios.
889
889
  scenarios = Array.new(@project.scenarios.items) { |i| i }
@@ -939,7 +939,8 @@ Define a list of resource attributes that should be included in the report.
939
939
  EOT
940
940
  )
941
941
  allOrNothingListRule('exportableResourceAttributes',
942
- { 'vacation' => 'Include vacations',
942
+ { 'booking' => 'Include bookings',
943
+ 'vacation' => 'Include vacations',
943
944
  'workinghours' => 'Include working hours' })
944
945
 
945
946
  pattern(%w( !rollupresource ))
@@ -1269,7 +1270,7 @@ EOT
1269
1270
 
1270
1271
  # We allow multiple instances of flag definitions.
1271
1272
  begin
1272
- @property['flags', @scenarioIdx] << flag
1273
+ @property['flags', @scenarioIdx] += [ flag ]
1273
1274
  rescue AttributeOverwrite
1274
1275
  end
1275
1276
  end
@@ -1495,6 +1496,71 @@ EOT
1495
1496
  )
1496
1497
  also(%w( sorttasks ))
1497
1498
  end
1499
+ def rule_iCalReport
1500
+ pattern(%w( !iCalReportHeader !iCalReportBody ), lambda {
1501
+ @property = nil
1502
+ })
1503
+ doc('icalreport', <<'EOT'
1504
+ Generates an RFC5545 compliant iCalendar file. This file can be used to export
1505
+ task information to calendar applications or other tools that read iCalendar
1506
+ files.
1507
+ EOT
1508
+ )
1509
+ end
1510
+ def rule_iCalReportBody
1511
+ optionsRule('iCalReportAttributes')
1512
+ end
1513
+
1514
+ def rule_iCalReportAttributes
1515
+ optional
1516
+ repeatable
1517
+
1518
+ pattern(%w( !hideresource ))
1519
+ pattern(%w( !hidejournalentry ))
1520
+ pattern(%w( !hidetask ))
1521
+ pattern(%w( !reportEnd ))
1522
+ pattern(%w( !reportPeriod ))
1523
+ pattern(%w( !reportStart ))
1524
+ pattern(%w( !rollupresource ))
1525
+ pattern(%w( !rolluptask ))
1526
+
1527
+ pattern(%w( _scenario !scenarioId ), lambda {
1528
+ # Don't include disabled scenarios in the report
1529
+ @val[1].delete_if { |sc| !@project.scenario(sc).get('active') }
1530
+ @property.set('scenarios', @val[1])
1531
+ })
1532
+ doc('scenario.ical', <<'EOT'
1533
+ Id of the scenario that should be included in the report. By default, the
1534
+ top-level scenario will be included. This attribute can be used select another
1535
+ scenario.
1536
+ EOT
1537
+ )
1538
+ end
1539
+
1540
+ def rule_iCalReportHeader
1541
+ pattern(%w( _icalreport !optionalID $STRING ), lambda {
1542
+ report = newReport(@val[1], @val[2], :iCal, @sourceFileInfo[0])
1543
+
1544
+ @property.set('formats', [ :iCal ])
1545
+ # By default, we export only the first scenario.
1546
+ report.set('scenarios', [ 0 ])
1547
+ # Show all tasks, sorted by seqno-up.
1548
+ report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
1549
+ report.set('sortTasks', [ [ 'seqno', true, -1 ] ])
1550
+ # Show all resources, sorted by seqno-up.
1551
+ report.set('hideResource',
1552
+ LogicalExpression.new(LogicalOperation.new(0)))
1553
+ report.set('sortResources', [ [ 'seqno', true, -1 ] ])
1554
+ # Show all journal entries.
1555
+ report.set('hideJournalEntry',
1556
+ LogicalExpression.new(LogicalOperation.new(0)))
1557
+ })
1558
+ arg(1, 'file name', <<'EOT'
1559
+ The name of the report file to generate without an extension. Use . to use
1560
+ the standard output channel.
1561
+ EOT
1562
+ )
1563
+ end
1498
1564
 
1499
1565
  def rule_idOrAbsoluteId
1500
1566
  singlePattern('$ID')
@@ -1602,12 +1668,12 @@ EOT
1602
1668
  error('start_before_end', "The end date (#{endSpec}) must be " +
1603
1669
  "after the start date (#{@val[0]}).", @sourceFileInfo[0])
1604
1670
  end
1605
- Interval.new(@val[0], endSpec)
1671
+ TimeInterval.new(@val[0], endSpec)
1606
1672
  else
1607
- Interval.new(@val[0], @val[0] + endSpec)
1673
+ TimeInterval.new(@val[0], @val[0] + endSpec)
1608
1674
  end
1609
1675
  else
1610
- Interval.new(@val[0], @val[0].sameTimeNextDay)
1676
+ TimeInterval.new(@val[0], @val[0].sameTimeNextDay)
1611
1677
  end
1612
1678
  })
1613
1679
  doc('interval3', <<'EOT'
@@ -1633,9 +1699,9 @@ EOT
1633
1699
  error('start_before_end', "The end date (#{endSpec}) must be after " +
1634
1700
  "the start date (#{@val[0]}).", @sourceFileInfo[0])
1635
1701
  end
1636
- Interval.new(@val[0], endSpec)
1702
+ TimeInterval.new(@val[0], endSpec)
1637
1703
  else
1638
- Interval.new(@val[0], @val[0] + endSpec)
1704
+ TimeInterval.new(@val[0], @val[0] + endSpec)
1639
1705
  end
1640
1706
  })
1641
1707
  doc('interval2', <<'EOT'
@@ -1811,7 +1877,9 @@ EOT
1811
1877
  )
1812
1878
 
1813
1879
  pattern(%w( _period !valInterval ), lambda {
1814
- @limitInterval = @val[1]
1880
+ @limitInterval = ScoreboardInterval.new(@project['start'],
1881
+ @project['scheduleGranularity'],
1882
+ @val[1].start, @val[1].end)
1815
1883
  })
1816
1884
  doc('period.limit', <<'EOT'
1817
1885
  This property is a shortcut for setting the start and end dates of the limit
@@ -1843,7 +1911,9 @@ EOT
1843
1911
 
1844
1912
  def rule_limitValue
1845
1913
  pattern([ '!workingDuration' ], lambda {
1846
- @limitInterval = Interval.new(@project['start'], @project['end'])
1914
+ @limitInterval = ScoreboardInterval.new(@project['start'],
1915
+ @project['scheduleGranularity'],
1916
+ @project['start'], @project['end'])
1847
1917
  @limitResources = []
1848
1918
  @val[0]
1849
1919
  })
@@ -1987,7 +2057,8 @@ EOT
1987
2057
  pattern([ '_longauto'] , lambda { :longauto })
1988
2058
  descr(<<'EOT'
1989
2059
  Automatically select the unit that produces the shortest and most readable
1990
- value. The unit name will not be abbreviated.
2060
+ value. The unit name will not be abbreviated. It will not use quarters since
2061
+ it is not common.
1991
2062
  EOT
1992
2063
  )
1993
2064
 
@@ -1995,12 +2066,16 @@ EOT
1995
2066
  descr('Display all load and duration values as minutes.')
1996
2067
 
1997
2068
  pattern([ '_months' ], lambda { :months })
1998
- descr('Display all load and duration values as monts.')
2069
+ descr('Display all load and duration values as months.')
2070
+
2071
+ pattern([ '_quarters' ], lambda { :quarters })
2072
+ descr('Display all load and duration values as quarters.')
1999
2073
 
2000
2074
  pattern([ '_shortauto' ], lambda { :shortauto })
2001
2075
  descr(<<'EOT'
2002
2076
  Automatically select the unit that produces the shortest and most readable
2003
- value. The unit name will be abbreviated.
2077
+ value. The unit name will be abbreviated. It will not use quarters since it is
2078
+ not common.
2004
2079
  EOT
2005
2080
  )
2006
2081
 
@@ -2223,7 +2298,7 @@ EOF
2223
2298
 
2224
2299
  def rule_nikuReportHeader
2225
2300
  pattern(%w( _nikureport !optionalID $STRING ), lambda {
2226
- newReport(@val[1], @val[2], :niku, sourceFileInfo)
2301
+ newReport(@val[1], @val[2], :niku, @sourceFileInfo[0])
2227
2302
  @property.set('numberFormat', RealFormat.new(['-', '', '', '.', 2]))
2228
2303
  })
2229
2304
  arg(1, 'file name', <<'EOT'
@@ -2646,6 +2721,8 @@ the project. All sub-scenarios of this scenario inherit the bookings of the
2646
2721
  tracking scenario and may not have any bookings of their own. The tracking
2647
2722
  scenario must also be specified to use time and status sheet reports.
2648
2723
 
2724
+ The tracking scenario must be defined after all scenario have been defined.
2725
+
2649
2726
  The tracking scenario and all scenarios derived from it will be scheduled in
2650
2727
  projection mode. This means that the scheduler will only add bookings after
2651
2728
  the current date or the date specified by [[now]]. It is assumed that all
@@ -2852,6 +2929,7 @@ Declare one or more flag for later use. Flags can be used to mark tasks, resourc
2852
2929
  EOT
2853
2930
  )
2854
2931
 
2932
+ pattern(%w( !iCalReport ))
2855
2933
  pattern(%w( !propertiesInclude ))
2856
2934
 
2857
2935
  pattern(%w( !limits ), lambda {
@@ -2902,6 +2980,7 @@ EOT
2902
2980
 
2903
2981
  pattern(%w( !report ))
2904
2982
  pattern(%w( !resource ))
2983
+ pattern(%w( !tagfile ))
2905
2984
  pattern(%w( !shift ))
2906
2985
  pattern(%w( !statusSheet ))
2907
2986
  pattern(%w( !statusSheetReport ))
@@ -4172,6 +4251,12 @@ EOT
4172
4251
  pattern(%w( _scenario $ID $STRING ), lambda {
4173
4252
  # If this is the top-level scenario, we must delete the default scenario
4174
4253
  # first.
4254
+ @project.scenarios.each do |scenario|
4255
+ if scenario.get('projection')
4256
+ error('scenario_after_tracking',
4257
+ 'Scenarios must be defined before a tracking scenario is set.')
4258
+ end
4259
+ end
4175
4260
  @project.scenarios.clearProperties if @property.nil?
4176
4261
  if @project.scenario(@val[1])
4177
4262
  error('scenario_exists',
@@ -4247,7 +4332,7 @@ EOT
4247
4332
  sa.project = @project
4248
4333
 
4249
4334
  if @val[1].nil?
4250
- intervals = [ Interval.new(@project['start'], @project['end']) ]
4335
+ intervals = [ TimeInterval.new(@project['start'], @project['end']) ]
4251
4336
  else
4252
4337
  intervals = @val[1]
4253
4338
  end
@@ -4465,7 +4550,7 @@ EOT
4465
4550
  else
4466
4551
  fileName = "statusSheet#{@project.reports.length + 1}"
4467
4552
  end
4468
- report = newReport(@val[1], fileName, :statusSheet, sourceFileInfo)
4553
+ report = newReport(@val[1], fileName, :statusSheet, @sourceFileInfo[0])
4469
4554
  report.set('scenarios', [ 0 ])
4470
4555
  # Show all tasks, sorted by id-up.
4471
4556
  report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
@@ -4734,6 +4819,54 @@ EOT
4734
4819
  arg(1, 'task ID', 'The ID of an already defined task.')
4735
4820
  end
4736
4821
 
4822
+ def rule_tagfile
4823
+ pattern(%w( !tagfileHeader !tagfileBody ), lambda {
4824
+ @property = nil
4825
+ })
4826
+ doc('tagfile', <<'EOT'
4827
+ The tagfile report generates a file that maps properties to source file
4828
+ locations. This can be used by editors to quickly jump to a certain task or
4829
+ resource definition. Currently only the ctags format is supported that is used
4830
+ by editors like [http://www.vim.org|vim].
4831
+ EOT
4832
+ )
4833
+ end
4834
+
4835
+ def rule_tagfileHeader
4836
+ pattern(%w( _tagfile !optionalID $STRING ), lambda {
4837
+ report = newReport(@val[1], @val[2], :tagfile, @sourceFileInfo[0])
4838
+
4839
+ @property.set('formats', [ :ctags ])
4840
+ # Include all tasks.
4841
+ report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
4842
+ report.set('sortTasks', [ [ 'seqno', true, -1 ] ])
4843
+ # Include all resources.
4844
+ report.set('hideResource',
4845
+ LogicalExpression.new(LogicalOperation.new(0)))
4846
+ report.set('sortResources', [ [ 'seqno', true, -1 ] ])
4847
+ })
4848
+ arg(1, 'file name', <<'EOT'
4849
+ The name of the tagfile to generate. You can leave it empty and it will
4850
+ default to the commonly used name ''''tags''''.
4851
+ EOT
4852
+ )
4853
+ end
4854
+
4855
+ def rule_tagfileAttributes
4856
+ optional
4857
+ repeatable
4858
+
4859
+ pattern(%w( !hideresource ))
4860
+ pattern(%w( !hidetask ))
4861
+ pattern(%w( !rollupresource ))
4862
+ pattern(%w( !rolluptask ))
4863
+ end
4864
+
4865
+ def rule_tagfileBody
4866
+ optionsRule('tagfileAttributes')
4867
+ end
4868
+
4869
+
4737
4870
  def rule_task
4738
4871
  pattern(%w( !taskHeader !taskBody ), lambda {
4739
4872
  @property = @property.parent
@@ -5841,7 +5974,8 @@ EOT
5841
5974
  end
5842
5975
  def rule_tsReportHeader
5843
5976
  pattern(%w( _timesheetreport !optionalID $STRING ), lambda {
5844
- report = newReport(@val[1], @val[2], :timeSheet, sourceFileInfo)
5977
+ report = newReport(@val[1], @val[2], :timeSheet, @sourceFileInfo[0])
5978
+
5845
5979
  report.set('scenarios', [ 0 ])
5846
5980
  # Show all tasks, sorted by seqno-up.
5847
5981
  report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
@@ -6075,12 +6209,12 @@ EOT
6075
6209
  "after the start date (#{@val[0]}).",
6076
6210
  @sourceFileInfo[1])
6077
6211
  end
6078
- iv = Interval.new(@val[0], endSpec)
6212
+ iv = TimeInterval.new(@val[0], endSpec)
6079
6213
  else
6080
- iv = Interval.new(@val[0], @val[0] + endSpec)
6214
+ iv = TimeInterval.new(@val[0], @val[0] + endSpec)
6081
6215
  end
6082
6216
  else
6083
- iv = Interval.new(@val[0], @val[0].sameTimeNextDay)
6217
+ iv = TimeInterval.new(@val[0], @val[0].sameTimeNextDay)
6084
6218
  end
6085
6219
  checkInterval(iv)
6086
6220
  iv
@@ -6111,9 +6245,9 @@ EOT
6111
6245
  error('start_before_end', "The end date (#{endSpec}) must be after " +
6112
6246
  "the start date (#{@val[0]}).", @sourceFileInfo[1])
6113
6247
  end
6114
- iv = Interval.new(@val[0], endSpec)
6248
+ iv = TimeInterval.new(@val[0], endSpec)
6115
6249
  else
6116
- iv = Interval.new(@val[0], @val[0] + endSpec)
6250
+ iv = TimeInterval.new(@val[0], @val[0] + endSpec)
6117
6251
  end
6118
6252
  checkInterval(iv)
6119
6253
  iv
@@ -210,6 +210,24 @@ hi def link tjpnumber Number
210
210
 
211
211
  let b:current_syntax = "tjp"
212
212
 
213
+ " Support running tj3 from within vim. Just type ':make your_project.tjp' to
214
+ " activate it.
215
+ set makeprg=tj3
216
+
217
+ " Support browsing the man page by typing Shift-k while having the cursor over
218
+ " any syntax keyword
219
+ set keywordprg=tj3man
220
+
221
+ " Remap Ctrl-] to show full ID of property defined in the current
222
+ " line. This requires a current ctags file (generated by 'tagfile'
223
+ " report') to be present in the directory where vim was started.
224
+ map <C-]> :call ShowFullID()<CR>
225
+ function! ShowFullID()
226
+ let linenumber = line(".")
227
+ let filename = bufname("%")
228
+ execute "!grep '".filename."\t".linenumber.";' tags|cut -f 1"
229
+ endfunction
230
+
213
231
  augroup TaskJugglerSource
214
232
  " Remove all trailing white spaces from line ends when saving files
215
233
  " Note: This overwrites the s mark.
@@ -48,6 +48,9 @@ class TaskJuggler
48
48
  @startDate = wh.startDate
49
49
  @endDate = wh.endDate
50
50
  @slotDuration = wh.slotDuration
51
+ # Make sure the copied scoreboard has been created, so we can share it
52
+ # copy-on-write.
53
+ wh.onShift?(0)
51
54
  @scoreboard = wh.scoreboard
52
55
  else
53
56
  slotDuration = arg1
@@ -68,6 +71,14 @@ class TaskJuggler
68
71
  end
69
72
  end
70
73
 
74
+ # Since we want to share the scoreboard among instances with identical
75
+ # working hours, we need to prevent the scoreboard from being deep cloned.
76
+ # Calling the constructor with self in a re-defined deep_clone method will
77
+ # do just that.
78
+ def deep_clone
79
+ WorkingHours.new(self)
80
+ end
81
+
71
82
  # Return true of the given WorkingHours object +wh+ is identical to this
72
83
  # object.
73
84
  def ==(wh)
@@ -126,11 +137,16 @@ class TaskJuggler
126
137
  @days[dayOfWeek]
127
138
  end
128
139
 
129
- # Return true if _date_ is within the defined working hours.
130
- def onShift?(date)
140
+ # Return true if _arg_ is within the defined working hours. _arg_ can be a
141
+ # TjTime object or a global scoreboard index.
142
+ def onShift?(arg)
131
143
  initScoreboard unless @scoreboard
132
144
 
133
- @scoreboard.get(date)
145
+ if arg.is_a?(TjTime)
146
+ @scoreboard.get(arg)
147
+ else
148
+ @scoreboard[arg]
149
+ end
134
150
  end
135
151
 
136
152
  # Return true only if all slots in the _interval_ are offhour slots.
@@ -209,7 +225,7 @@ class TaskJuggler
209
225
  end
210
226
 
211
227
  # Restore old time zone setting.
212
- if @timezone
228
+ if @timezone && oldTimezone
213
229
  TjTime.setTimeZone(oldTimezone)
214
230
  end
215
231
  end
@@ -39,8 +39,12 @@ class TaskJuggler
39
39
  @freeze = false
40
40
  # The cut-off date for the freeze
41
41
  @freezeDate = TjTime.new.align(3600)
42
+ # Should bookings be grouped by Task or by Resource (default).
43
+ @freezeByTask = false
42
44
  # Don't generate any reports.
43
45
  @noReports = false
46
+ # Treat warnings like errors or not.
47
+ @abortOnWarning = false
44
48
  # The directory where generated reports should be put in.
45
49
  @outputDir = ''
46
50
  # The file names of the time sheet files to check.
@@ -86,6 +90,11 @@ EOT
86
90
  error("Invalid freeze date: #{msg}")
87
91
  end
88
92
  end
93
+ @opts.on('--freezebytask',
94
+ format('Group the bookings in the booking file generated ' +
95
+ 'during a freeze by task instead of by resource.')) do
96
+ @freezeByTask = true
97
+ end
89
98
  @opts.on('--check-time-sheet <tji-file>', String,
90
99
  format("Check the given time sheet")) do |arg|
91
100
  @timeSheets << arg
@@ -108,6 +117,10 @@ EOT
108
117
  'reports.')) do
109
118
  @noReports = true
110
119
  end
120
+ @opts.on('--abort-on-warnings',
121
+ format('Abort program on warnings like we do on errors.')) do
122
+ @abortOnWarning = true
123
+ end
111
124
  @opts.on('-o', '--output-dir <directory>', String,
112
125
  format('Directory the reports should go into')) do |arg|
113
126
  @outputDir = arg + '/'
@@ -128,6 +141,7 @@ EOT
128
141
  tj = TaskJuggler.new(true)
129
142
  tj.maxCpuCores = @maxCpuCores
130
143
  tj.warnTsDeltas = @warnTsDeltas
144
+ tj.messageHandler.abortOnWarning = @abortOnWarning
131
145
  keepParser = !@timeSheets.empty? || !@statusSheets.empty?
132
146
  return 1 unless tj.parse(files, keepParser)
133
147
 
@@ -147,7 +161,8 @@ EOT
147
161
  end
148
162
 
149
163
  # Check for freeze mode and generate the booking file if requested.
150
- tj.freeze(@freezeDate) if @freeze
164
+ return 1 if @freeze && tj.freeze(@freezeDate, @freezeByTask) &&
165
+ tj.errors > 0
151
166
 
152
167
  return 0 if @noReports
153
168
 
@@ -317,7 +317,7 @@ class TaskJuggler
317
317
  # resource int the chart. Depending on the resolution, the only periods with
318
318
  # a duration above the threshold are shown.
319
319
  def generateTimeOffZones
320
- iv = Interval.new(@chart.start, @chart.end)
320
+ iv = TimeInterval.new(@chart.start, @chart.end)
321
321
  # Don't show any zones if the threshold for this scale is 0 or smaller.
322
322
  return if (minTimeOff = @chart.scale['minTimeOff']) <= 0
323
323