taskjuggler 0.1.1 → 0.2.0

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