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,251 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ICalendar.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/Tj3Config'
15
+
16
+ class TaskJuggler
17
+
18
+ # This class implements a very basic RFC5545 compliant iCalendar file
19
+ # generator. It currently only supports a very small subset of the tags that
20
+ # are needed for TaskJuggler.
21
+ class ICalendar
22
+
23
+ # The maximum allowed length of a content line without line end character.
24
+ LINELENGTH = 75
25
+
26
+ # Utility class to store name and email of a person.
27
+ class Person < Struct.new(:name, :email)
28
+ end
29
+
30
+ # Base class for all ICalendar components.
31
+ class Component
32
+
33
+ attr_accessor :description, :relatedTo, :organizer
34
+ attr_reader :uid
35
+
36
+ def initialize(ical, uid, summary, startDate)
37
+ @ical = ical
38
+ @type = self.class.to_s.split('::').last.upcase
39
+ @uid = uid + "-#{@type}"
40
+ @summary = summary
41
+ @startDate = startDate
42
+
43
+ # Optional attributes
44
+ @description = nil
45
+ @relatedTo = nil
46
+ @organizer = nil
47
+ @attendees = []
48
+ end
49
+
50
+ def setOrganizer(name, email)
51
+ @organizer = Person.new(name, email)
52
+ end
53
+
54
+ def addAttendee(name, email)
55
+ @attendees << Person.new(name, email)
56
+ end
57
+
58
+ def to_s
59
+ str = <<"EOT"
60
+ BEGIN:V#{@type}
61
+ DTSTAMP:#{dateTime(TjTime.new.utc)}
62
+ CREATED:#{dateTime(@ical.creationDate)}
63
+ UID:#{@uid}
64
+ LAST-MODIFIED:#{dateTime(@ical.lastModified)}
65
+ SUMMARY:#{quoted(@summary)}
66
+ DTSTART:#{dateTime(@startDate)}
67
+ EOT
68
+ str += "DESCRIPTION:#{quoted(@description)}\n" if @description
69
+ str += "RELATED-TO:#{@relatedTo}\n" if @relatedTo
70
+
71
+ if @organizer
72
+ str += "ORGANIZER;CN=#{@organizer.name}:mailto:#{@organizer.email}\n"
73
+ end
74
+ @attendees.each do |attendee|
75
+ str += "ATTENDEE;CN=#{attendee.name}:mailto:#{attendee.email}\n"
76
+ end
77
+
78
+ str += yield if block_given?
79
+
80
+ str += "END:V#{@type}\n\n"
81
+ end
82
+
83
+ private
84
+
85
+ def dateTime(date)
86
+ @ical.dateTime(date)
87
+ end
88
+
89
+ def quoted(str)
90
+ str.gsub(/([;,"\\])/, '\\\\\1').gsub(/\n/, '\n')
91
+ end
92
+
93
+ end
94
+
95
+ # Stores the data of an VTODO component and can generate one.
96
+ class Todo < Component
97
+
98
+ attr_accessor :priority, :percentComplete
99
+
100
+ # Create the Todo object with some mandatory data. _ical_ is a reference
101
+ # to the parent ICalendar object. _uid_ is a unique pattern used to
102
+ # generate the UID tag. _summary_ is a String for SUMMARY. _startDate_
103
+ # is used to generate DTSTART. _endDate_ is used to either generate
104
+ # the COMPLETED or DUE tag.
105
+ def initialize(ical, uid, summary, startDate, endDate)
106
+ super(ical, uid, summary, startDate)
107
+
108
+ # Mandatory attributes
109
+ @ical.addTodo(self)
110
+ @endDate = endDate
111
+ # Priority value (0 - 9)
112
+ @priority = 0
113
+ @percentComplete = -1
114
+ end
115
+
116
+ # Generate the VTODO record as String.
117
+ def to_s
118
+ super do
119
+ str = ''
120
+ if @percentComplete < 100.0
121
+ str += "DUE:#{dateTime(@endDate)}\n"
122
+ else
123
+ str += "COMPLETED:#{dateTime(@endDate)}\n"
124
+ end
125
+ str += "PERCENT-COMPLETE:#{@percentComplete}\n"
126
+ end
127
+ end
128
+
129
+ end
130
+
131
+ # Stores the data of an VTODO component and can generate one.
132
+ class Event < Component
133
+
134
+ # Create the Event object with some mandatory data. _ical_ is a
135
+ # reference to the parent ICalendar object. _uid_ is a unique pattern
136
+ # used to generate the UID tag. _summary_ is a String for SUMMARY.
137
+ # _startDate_ is used to generate DTSTART. _endDate_ is used to either
138
+ # generate the COMPLETED or DUE tag.
139
+ def initialize(ical, uid, summary, startDate, endDate)
140
+ super(ical, uid, summary, startDate)
141
+ @ical.addEvent(self)
142
+
143
+ # Mandatory attributes
144
+ @endDate = endDate
145
+ # Optional attributes
146
+ @priority = 1
147
+ end
148
+
149
+ # Generate the VEVENT record as String.
150
+ def to_s
151
+ super do
152
+ <<"EOT"
153
+ PRIORITY:#{@priority}
154
+ DTEND:#{dateTime(@endDate)}
155
+ TRANSP:TRANSPARENT
156
+ EOT
157
+ end
158
+ end
159
+
160
+ end
161
+
162
+ class Journal < Component
163
+
164
+ def initialize(ical, uid, summary, startDate)
165
+ super
166
+ @ical.addJournal(self)
167
+ end
168
+
169
+ def to_s
170
+ super
171
+ end
172
+
173
+ end
174
+
175
+ attr_reader :uid
176
+ attr_accessor :creationDate, :lastModified
177
+
178
+ def initialize(uid)
179
+ @uid = "#{AppConfig.packageName}-#{uid}"
180
+ @creationDate = @lastModified = TjTime.new.utc
181
+
182
+ @todos = []
183
+ @events = []
184
+ @journals = []
185
+ end
186
+
187
+ # Add a new VTODO component. For internal use only!
188
+ def addTodo(todo)
189
+ @todos << todo
190
+ end
191
+
192
+ # Add a new VEVENT component. For internal use only!
193
+ def addEvent(event)
194
+ @events << event
195
+ end
196
+
197
+ # Add a new VJOURNAL component. For internal user only!
198
+ def addJournal(journal)
199
+ @journals << journal
200
+ end
201
+
202
+ def to_s
203
+ str = <<"EOT"
204
+ BEGIN:VCALENDAR
205
+ PRODID:-//The #{AppConfig.softwareName} Project/NONSGML #{AppConfig.softwareName} #{AppConfig.version}//EN
206
+ VERSION:2.0
207
+
208
+ EOT
209
+ @todos.each { |todo| str += todo.to_s }
210
+ @events.each { |event| str += event.to_s }
211
+ @journals.each { |journal| str += journal.to_s }
212
+
213
+ str << <<"EOT"
214
+ END:VCALENDAR
215
+ EOT
216
+
217
+ foldLines(str)
218
+ end
219
+
220
+ def dateTime(date)
221
+ date.to_s("%Y%m%dT%H%M%SZ")
222
+ end
223
+
224
+ private
225
+
226
+ # Make sure that no line is longer than LINELENTH octets (excl. the
227
+ # newline character)
228
+ def foldLines(str)
229
+ newStr = ''
230
+ str.each_line do |line|
231
+ bytes = 0
232
+ line.each_utf8_char do |c|
233
+ # Make sure we support Ruby 1.8 and 1.9 String handling.
234
+ cBytes = c.bytesize
235
+ if bytes + cBytes > LINELENGTH && c != "\n"
236
+ newStr += "\n "
237
+ bytes = 0
238
+ else
239
+ bytes += cBytes
240
+ end
241
+ newStr << c
242
+ end
243
+ end
244
+ # Convert line ends to CR+LF
245
+ newStr.gsub(/\n/, "\r\n")
246
+ end
247
+
248
+ end
249
+
250
+ end
251
+
@@ -15,89 +15,66 @@ require 'taskjuggler/TjTime'
15
15
 
16
16
  class TaskJuggler
17
17
 
18
- # The Interval class provides objects that model a time interval. The start
19
- # end end time are represented as seconds after Jan 1, 1970. The start is part
20
- # of the interval, the end is not.
18
+ # This is the based class used to store several kinds of intervals in
19
+ # derived classes.
21
20
  class Interval
22
21
 
23
- attr_accessor :start, :end
22
+ attr_reader :start, :end
24
23
 
25
- # Create a new Interval. _args_ can be three different kind of arguments.
26
- #
27
- # a and b should be TjTime objects.
28
- #
29
- # Interval.new(a, b) | -> Interval(a, b)
30
- # Interval.new(a) | -> Interval(a, a)
31
- # Interval.new(iv) | -> Interval(iv.start, iv.end)
32
- #
33
- def initialize(*args)
34
- if args.length == 1
35
- if args[0].is_a?(TjTime)
36
- # Just one argument, a date
37
- @start = @end = args[0]
38
- elsif args[0].is_a?(Interval)
39
- # Just one argument, an Interval
40
- @start = args[0].start
41
- @end = args[0].end
42
- else
43
- raise "Illegal argument"
44
- end
45
- elsif args.length == 2
46
- # Two arguments, a start and end date
47
- @start = args[0]
48
- @end = args[1]
49
- raise "Interval start must be a date" unless @start.is_a?(TjTime)
50
- raise "Interval end must be a date" unless @end.is_a?(TjTime)
51
- if @end < @start
52
- raise "Invalid interval"
53
- end
54
- else
55
- raise "Illegal arguments"
24
+ # Create a new Interval object. _s_ is the interval start, _e_ the
25
+ # interval end (not included).
26
+ def initialize(s, e)
27
+ @start = s
28
+ @end = e
29
+ # The end must not be before the start.
30
+ if @end < @start
31
+ raise ArgumentError, "Invalid interval (#{s} - #{e})"
56
32
  end
57
33
  end
58
34
 
59
- # Return the duration of the Interval.
60
- def duration
61
- @end - @start
62
- end
63
-
64
- # Return true if _arg_ is contained within the Interval. It can either be a
65
- # single TjTime or another Interval.
35
+ # Return true if _arg_ is contained within the Interval. It can either
36
+ # be a single TjTime or another Interval.
66
37
  def contains?(arg)
67
- if arg.is_a?(TjTime)
68
- return @start <= arg && arg < @end
69
- else
38
+ if arg.is_a?(Interval)
39
+ raise ArgumentError, "Class mismatch" if self.class != arg.class
70
40
  return @start <= arg.start && arg.end <= @end
41
+ else
42
+ raise ArgumentError, "Class mismatch" if @start.class != arg.class
43
+ return @start <= arg && arg < @end
71
44
  end
72
45
  end
73
46
 
74
- # Check whether the Interval _arg_ overlaps with this interval.
47
+ # Check whether the Interval _arg_ overlaps with this Interval.
75
48
  def overlaps?(arg)
76
- if arg.is_a?(TjTime)
77
- return @start <= arg && arg < @end
78
- else
49
+ if arg.is_a?(Interval)
50
+ raise ArgumentError, "Class mismatch" if self.class != arg.class
79
51
  return (@start <= arg.start && arg.start < @end) ||
80
52
  (arg.start <= @start && @start < arg.end)
53
+ else
54
+ raise ArgumentError, "Class mismatch" if @start.class != arg.class
55
+ return @start <= arg && arg < @end
81
56
  end
82
57
  end
83
58
 
84
59
  # Return a new Interval that contains the overlap of self and the Interval
85
60
  # _iv_. In case there is no overlap, nil is returned.
86
61
  def intersection(iv)
62
+ raise ArgumentError, "Class mismatch" if self.class != iv.class
87
63
  newStart = @start > iv.start ? @start : iv.start
88
64
  newEnd = @end < iv.end ? @end : iv.end
89
- newStart < newEnd ? Interval.new(newStart, newEnd) : nil
65
+ newStart < newEnd ? self.class.new(newStart, newEnd) : nil
90
66
  end
91
67
 
92
68
  # Append or prepend the Interval _iv_ to self. If _iv_ does not directly
93
69
  # attach to self, just return self.
94
70
  def combine(iv)
71
+ raise ArgumentError, "Class mismatch" if self.class != iv.class
95
72
  if iv.end == @start
96
73
  # Prepend iv
97
- Array.new Interval(iv.start, @end)
74
+ Array.new self.class.new(iv.start, @end)
98
75
  elsif @end == iv.start
99
76
  # Append iv
100
- Array.new Interval(@start, iv.end)
77
+ Array.new self.class.new(@start, iv.end)
101
78
  else
102
79
  self
103
80
  end
@@ -106,6 +83,7 @@ class TaskJuggler
106
83
  # Compare self with Interval _iv_. This function only works for
107
84
  # non-overlapping Interval objects.
108
85
  def <=>(iv)
86
+ raise ArgumentError, "Class mismatch" if self.class != iv.class
109
87
  if @end < iv.start
110
88
  -1
111
89
  elsif iv.end < @start
@@ -116,15 +94,199 @@ class TaskJuggler
116
94
 
117
95
  # Return true if the Interval _iv_ describes an identical time period.
118
96
  def ==(iv)
97
+ raise ArgumentError, "Class mismatch" if self.class != iv.class
119
98
  @start == iv.start && @end == iv.end
120
99
  end
121
100
 
122
- # Turn the Interval into a human readable form.
101
+ end
102
+
103
+ # The TimeInterval class provides objects that model a time interval. The
104
+ # start end end time are represented as seconds after Jan 1, 1970. The start
105
+ # is part of the interval, the end is not.
106
+ class TimeInterval < Interval
107
+
108
+ attr_accessor :start, :end
109
+
110
+ # Create a new TimeInterval. _args_ can be three different kind of arguments.
111
+ #
112
+ # a and b should be TjTime objects.
113
+ #
114
+ # TimeInterval.new(a, b) | -> Interval(a, b)
115
+ # TimeInterval.new(a) | -> Interval(a, a)
116
+ # TimeInterval.new(iv) | -> Interval(iv.start, iv.end)
117
+ #
118
+ def initialize(*args)
119
+ if args.length == 1
120
+ if args[0].is_a?(TjTime)
121
+ # Just one argument, a date
122
+ super(args[0], args[0])
123
+ elsif args[0].is_a?(TimeInterval)
124
+ # Just one argument, a TimeInterval
125
+ super(args[0].start, args[0].end)
126
+ else
127
+ raise ArgumentError, "Illegal argument 1: #{args[0].class}"
128
+ end
129
+ elsif args.length == 2
130
+ # Two arguments, a start and end date
131
+ unless args[0].is_a?(TjTime)
132
+ raise ArgumentError, "Interval start must be a date, not a " +
133
+ "#{args[0].class}"
134
+ end
135
+ unless args[1].is_a?(TjTime)
136
+ raise ArgumentError, "Interval end must be a date, not a" +
137
+ "#{args[1].class}"
138
+ end
139
+ super(args[0], args[1])
140
+ else
141
+ raise ArgumentError, "Too many arguments: #{args.length}"
142
+ end
143
+ end
144
+
145
+ # Return the duration of the TimeInterval.
146
+ def duration
147
+ @end - @start
148
+ end
149
+
150
+ # Turn the TimeInterval into a human readable form.
123
151
  def to_s
124
152
  @start.to_s + ' - ' + @end.to_s
125
153
  end
126
154
 
127
155
  end
128
156
 
157
+ # This class describes an interval of a scoreboard. The start and end of the
158
+ # interval are stored as indexes but can always be converted back to TjTime
159
+ # objects if needed.
160
+ class ScoreboardInterval < Interval
161
+
162
+ attr_reader :sbStart, :slotDuration
163
+
164
+ # Create a new ScoreboardInterval. _args_ can be three different kind of
165
+ # arguments.
166
+ #
167
+ # sbStart must be a TjTime of the scoreboard start
168
+ # slotDuration must be the duration of the scoreboard slots in seconds
169
+ # a and b should be TjTime or Fixnum objects that describe the start and
170
+ # end time or index of the interval.
171
+ #
172
+ # TimeInterval.new(iv)
173
+ # TimeInterval.new(sbStart, slotDuration, a)
174
+ # TimeInterval.new(sbStart, slotDuration, a, b)
175
+ #
176
+ def initialize(*args)
177
+ case args.length
178
+ when 1
179
+ # If there is only one argument, it must be a ScoreboardInterval.
180
+ if args[0].is_a?(ScoreboardInterval)
181
+ @sbStart = args[0].sbStart
182
+ @slotDuration = args[0].slotDuration
183
+ # Just one argument, a TimeInterval
184
+ super(args[0].start, args[0].end)
185
+ else
186
+ raise ArgumentError, "Illegal argument 1: #{args[0].class}"
187
+ end
188
+ when 3
189
+ @sbStart = args[0]
190
+ @slotDuration = args[1]
191
+ # If the third argument is a date we convert it to a scoreboard index.
192
+ args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
193
+
194
+ if args[2].is_a?(Fixnum) || args[2].is_a?(Bignum)
195
+ super(args[2], args[2])
196
+ else
197
+ raise ArgumentError, "Illegal argument 3: #{args[0].class}"
198
+ end
199
+ when 4
200
+ @sbStart = args[0]
201
+ @slotDuration = args[1]
202
+ # If the third and forth arguments are a date we convert them to a
203
+ # scoreboard index.
204
+ args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
205
+ args[3] = dateToIndex(args[3]) if args[3].is_a?(TjTime)
206
+
207
+ if !(args[2].is_a?(Fixnum) || args[2].is_a?(Bignum))
208
+ raise ArgumentError, "Interval start must be an index or TjTime, " +
209
+ "not a #{args[2].class}"
210
+ end
211
+ if !(args[3].is_a?(Fixnum) || args[3].is_a?(Bignum))
212
+ raise ArgumentError, "Interval end must be an index or TjTime, " +
213
+ "not a #{args[3].class}"
214
+ end
215
+ super(args[2], args[3])
216
+ else
217
+ raise ArgumentError, "Wrong number of arguments: #{args.length}"
218
+ end
219
+
220
+ unless @sbStart.is_a?(TjTime)
221
+ raise ArgumentError, "sbStart must be a TjTime object, not a" +
222
+ "#{@sbStart.class}"
223
+ end
224
+ unless @slotDuration.is_a?(Fixnum)
225
+ raise ArgumentError, "slotDuration must be a Fixnum, not a " +
226
+ "#{@slotDuration.class}"
227
+ end
228
+
229
+ end
230
+
231
+ # Assign the start of the interval. +arg+ can be a Fixnum, Bignum or
232
+ # TjTime object.
233
+ def start=(arg)
234
+ case arg
235
+ when Fixnum
236
+ when Bignum
237
+ @start = arg
238
+ when TjTime
239
+ @start = dateToIndex(arg)
240
+ else
241
+ raise ArgumentError, "Unsupported class #{arg.class}"
242
+ end
243
+ end
244
+
245
+ # Assign the start of the interval. +arg+ can be a Fixnum, Bignum or
246
+ # TjTime object.
247
+ def end=(arg)
248
+ case arg
249
+ when Fixnum
250
+ when Bignum
251
+ @end = arg
252
+ when TjTime
253
+ @end = dateToIndex(arg)
254
+ else
255
+ raise ArgumentError, "Unsupported class #{arg.class}"
256
+ end
257
+ end
258
+
259
+ # Return the interval start as TjTime object.
260
+ def startDate
261
+ indexToDate(@start)
262
+ end
263
+
264
+ # Return the interval end as TjTime object.
265
+ def endDate
266
+ indexToDate(@end)
267
+ end
268
+
269
+ # Return the duration of the ScoreboardInterval.
270
+ def duration
271
+ indexToDate(@end) - indexToDate(@start)
272
+ end
273
+
274
+ # Turn the ScoreboardInterval into a human readable form.
275
+ def to_s
276
+ indexToDate(@start).to_s + ' - ' + indexToDate(@end).to_s
277
+ end
278
+
279
+ private
280
+
281
+ def dateToIndex(date)
282
+ (date - @sbStart).to_i / @slotDuration
283
+ end
284
+
285
+ def indexToDate(index)
286
+ @sbStart + (index * @slotDuration)
287
+ end
288
+
289
+ end
290
+
129
291
  end
130
292
 
@@ -33,11 +33,11 @@ class TaskJuggler
33
33
  si += 1
34
34
  elsif self[si].end < list[li].end
35
35
  # self[si] does overlap with list[li] but list[li] goes further
36
- res << Interval.new(list[li].start, self[si].end)
36
+ res << self[si].class.new(list[li].start, self[si].end)
37
37
  si += 1
38
38
  else
39
39
  # self[si] does overlap with list[li] but self[si] goes further
40
- res << Interval.new(list[li].start, list[li].end)
40
+ res << self[si].class.new(list[li].start, list[li].end)
41
41
  li += 1
42
42
  end
43
43
  elsif list[li].start < self[si].start
@@ -48,11 +48,11 @@ class TaskJuggler
48
48
  li += 1
49
49
  elsif list[li].end < self[si].end
50
50
  # list[li] does overlap with self[si] but self[si] goes further
51
- res << Interval.new(self[si].start, list[li].end)
51
+ res << self[si].class.new(self[si].start, list[li].end)
52
52
  li += 1
53
53
  else
54
54
  # list[li] does overlap with self[si] but list[li] goes further
55
- res << Interval.new(self[si].start, self[si].end)
55
+ res << self[si].class.new(self[si].start, self[si].end)
56
56
  si += 1
57
57
  end
58
58
  else
@@ -86,7 +86,7 @@ class TaskJuggler
86
86
  raise "Intervals may not overlap and must be added in " +
87
87
  "ascending order."
88
88
  elsif last.end == iv.start
89
- self[-1] = Interval.new(last.start, iv.end)
89
+ self[-1] = last.class.new(last.start, iv.end)
90
90
  return self
91
91
  end
92
92
  end