taskjuggler 3.0.0 → 3.1.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 (553) hide show
  1. data/CHANGELOG +61 -0
  2. data/README.rdoc +43 -27
  3. data/data/css/tjreport.css +30 -0
  4. data/data/tjp.vim +100 -89
  5. data/examples/ProjectTemplate/template.tjp +338 -0
  6. data/examples/ToDo-List/todolist.tjp +84 -0
  7. data/examples/{tutorial.tjp → Tutorial/tutorial.tjp} +9 -7
  8. data/lib/header.tmpl +1 -1
  9. data/lib/taskjuggler/Account.rb +2 -2
  10. data/lib/taskjuggler/AccountCredit.rb +29 -0
  11. data/lib/taskjuggler/AccountScenario.rb +73 -7
  12. data/lib/taskjuggler/AlertLevelDefinitions.rb +104 -0
  13. data/lib/taskjuggler/AlgorithmDiff.rb +2 -2
  14. data/lib/taskjuggler/Allocation.rb +1 -1
  15. data/lib/taskjuggler/AppConfig.rb +1 -1
  16. data/lib/taskjuggler/AttributeBase.rb +1 -1
  17. data/lib/taskjuggler/AttributeDefinition.rb +1 -1
  18. data/lib/taskjuggler/Attributes.rb +40 -3
  19. data/lib/taskjuggler/BatchProcessor.rb +15 -14
  20. data/lib/taskjuggler/Booking.rb +1 -1
  21. data/lib/taskjuggler/Charge.rb +2 -2
  22. data/lib/taskjuggler/ChargeSet.rb +1 -1
  23. data/lib/taskjuggler/DataCache.rb +24 -12
  24. data/lib/taskjuggler/FileList.rb +1 -1
  25. data/lib/taskjuggler/HTMLDocument.rb +1 -1
  26. data/lib/taskjuggler/HTMLElements.rb +1 -1
  27. data/lib/taskjuggler/ICalendar.rb +1 -1
  28. data/lib/taskjuggler/Interval.rb +1 -1
  29. data/lib/taskjuggler/IntervalList.rb +1 -1
  30. data/lib/taskjuggler/Journal.rb +61 -41
  31. data/lib/taskjuggler/KeywordArray.rb +1 -1
  32. data/lib/taskjuggler/KeywordDocumentation.rb +121 -33
  33. data/lib/taskjuggler/LeaveList.rb +103 -0
  34. data/lib/taskjuggler/Limits.rb +1 -1
  35. data/lib/taskjuggler/Log.rb +6 -3
  36. data/lib/taskjuggler/LogFile.rb +1 -1
  37. data/lib/taskjuggler/LogicalExpression.rb +1 -1
  38. data/lib/taskjuggler/LogicalFunction.rb +16 -2
  39. data/lib/taskjuggler/LogicalOperation.rb +3 -1
  40. data/lib/taskjuggler/MessageHandler.rb +13 -4
  41. data/lib/taskjuggler/PTNProxy.rb +118 -0
  42. data/lib/taskjuggler/Project.rb +58 -67
  43. data/lib/taskjuggler/ProjectFileParser.rb +39 -5
  44. data/lib/taskjuggler/ProjectFileScanner.rb +1 -1
  45. data/lib/taskjuggler/PropertyList.rb +26 -2
  46. data/lib/taskjuggler/PropertySet.rb +8 -1
  47. data/lib/taskjuggler/PropertyTreeNode.rb +36 -32
  48. data/lib/taskjuggler/Query.rb +1 -1
  49. data/lib/taskjuggler/RealFormat.rb +4 -2
  50. data/lib/taskjuggler/Resource.rb +3 -3
  51. data/lib/taskjuggler/ResourceScenario.rb +219 -140
  52. data/lib/taskjuggler/RichText.rb +1 -1
  53. data/lib/taskjuggler/RichText/Document.rb +2 -2
  54. data/lib/taskjuggler/RichText/Element.rb +2 -2
  55. data/lib/taskjuggler/RichText/FunctionExample.rb +2 -2
  56. data/lib/taskjuggler/RichText/FunctionHandler.rb +2 -2
  57. data/lib/taskjuggler/RichText/Parser.rb +2 -2
  58. data/lib/taskjuggler/RichText/RTFHandlers.rb +1 -1
  59. data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
  60. data/lib/taskjuggler/RichText/RTFQuery.rb +1 -1
  61. data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
  62. data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -1
  63. data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
  64. data/lib/taskjuggler/RichText/Scanner.rb +18 -4
  65. data/lib/taskjuggler/RichText/Snip.rb +2 -2
  66. data/lib/taskjuggler/RichText/SyntaxRules.rb +6 -14
  67. data/lib/taskjuggler/RichText/TOCEntry.rb +16 -7
  68. data/lib/taskjuggler/RichText/TableOfContents.rb +3 -2
  69. data/lib/taskjuggler/RuntimeConfig.rb +1 -1
  70. data/lib/taskjuggler/Scenario.rb +1 -1
  71. data/lib/taskjuggler/ScenarioData.rb +1 -1
  72. data/lib/taskjuggler/Scoreboard.rb +1 -1
  73. data/lib/taskjuggler/SheetHandlerBase.rb +1 -1
  74. data/lib/taskjuggler/SheetReceiver.rb +1 -1
  75. data/lib/taskjuggler/SheetSender.rb +3 -3
  76. data/lib/taskjuggler/Shift.rb +2 -2
  77. data/lib/taskjuggler/ShiftAssignments.rb +24 -19
  78. data/lib/taskjuggler/ShiftScenario.rb +4 -4
  79. data/lib/taskjuggler/SimpleQueryExpander.rb +1 -1
  80. data/lib/taskjuggler/StatusSheetReceiver.rb +1 -1
  81. data/lib/taskjuggler/StatusSheetSender.rb +1 -1
  82. data/lib/taskjuggler/StdIoWrapper.rb +1 -1
  83. data/lib/taskjuggler/SyntaxReference.rb +5 -2
  84. data/lib/taskjuggler/TableColumnDefinition.rb +1 -1
  85. data/lib/taskjuggler/Task.rb +4 -8
  86. data/lib/taskjuggler/TaskDependency.rb +1 -1
  87. data/lib/taskjuggler/TaskJuggler.rb +1 -1
  88. data/lib/taskjuggler/TaskScenario.rb +131 -51
  89. data/lib/taskjuggler/TernarySearchTree.rb +6 -4
  90. data/lib/taskjuggler/TextFormatter.rb +9 -2
  91. data/lib/taskjuggler/TextParser.rb +13 -3
  92. data/lib/taskjuggler/TextParser/MacroTable.rb +1 -1
  93. data/lib/taskjuggler/TextParser/Pattern.rb +52 -8
  94. data/lib/taskjuggler/TextParser/Rule.rb +11 -5
  95. data/lib/taskjuggler/TextParser/Scanner.rb +1 -1
  96. data/lib/taskjuggler/TextParser/SourceFileInfo.rb +1 -1
  97. data/lib/taskjuggler/TextParser/StackElement.rb +1 -1
  98. data/lib/taskjuggler/TextParser/State.rb +2 -2
  99. data/lib/taskjuggler/TextParser/TokenDoc.rb +1 -1
  100. data/lib/taskjuggler/TimeSheetReceiver.rb +1 -1
  101. data/lib/taskjuggler/TimeSheetSender.rb +1 -1
  102. data/lib/taskjuggler/TimeSheetSummary.rb +1 -1
  103. data/lib/taskjuggler/TimeSheets.rb +4 -6
  104. data/lib/taskjuggler/Tj3AppBase.rb +18 -1
  105. data/lib/taskjuggler/Tj3Config.rb +4 -4
  106. data/lib/taskjuggler/Tj3SheetAppBase.rb +1 -1
  107. data/lib/taskjuggler/TjException.rb +1 -1
  108. data/lib/taskjuggler/TjTime.rb +1 -1
  109. data/lib/taskjuggler/TjpExample.rb +1 -1
  110. data/lib/taskjuggler/TjpSyntaxRules.rb +920 -392
  111. data/lib/taskjuggler/URLParameter.rb +1 -1
  112. data/lib/taskjuggler/UTF8String.rb +1 -1
  113. data/lib/taskjuggler/UserManual.rb +1 -1
  114. data/lib/taskjuggler/VimSyntax.rb +9 -6
  115. data/lib/taskjuggler/WorkingHours.rb +12 -1
  116. data/lib/taskjuggler/XMLDocument.rb +1 -1
  117. data/lib/taskjuggler/XMLElement.rb +1 -1
  118. data/lib/taskjuggler/apps/Tj3.rb +8 -3
  119. data/lib/taskjuggler/apps/Tj3Client.rb +1 -1
  120. data/lib/taskjuggler/apps/Tj3Daemon.rb +1 -1
  121. data/lib/taskjuggler/apps/Tj3Man.rb +1 -1
  122. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +2 -2
  123. data/lib/taskjuggler/apps/Tj3SsSender.rb +1 -1
  124. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +1 -1
  125. data/lib/taskjuggler/apps/Tj3TsSender.rb +1 -1
  126. data/lib/taskjuggler/apps/Tj3TsSummary.rb +1 -1
  127. data/lib/taskjuggler/daemon/Daemon.rb +1 -1
  128. data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
  129. data/lib/taskjuggler/daemon/ProjectBroker.rb +1 -1
  130. data/lib/taskjuggler/daemon/ProjectServer.rb +1 -1
  131. data/lib/taskjuggler/daemon/ReportServer.rb +2 -2
  132. data/lib/taskjuggler/daemon/ReportServlet.rb +1 -1
  133. data/lib/taskjuggler/daemon/WebServer.rb +1 -1
  134. data/lib/taskjuggler/daemon/WelcomePage.rb +1 -1
  135. data/lib/taskjuggler/deep_copy.rb +1 -1
  136. data/lib/taskjuggler/reports/AccountListRE.rb +115 -0
  137. data/lib/taskjuggler/reports/CSVFile.rb +1 -1
  138. data/lib/taskjuggler/reports/CollisionDetector.rb +1 -1
  139. data/lib/taskjuggler/reports/ColumnTable.rb +1 -1
  140. data/lib/taskjuggler/reports/GanttChart.rb +1 -1
  141. data/lib/taskjuggler/reports/GanttContainer.rb +1 -3
  142. data/lib/taskjuggler/reports/GanttHeader.rb +1 -1
  143. data/lib/taskjuggler/reports/GanttHeaderScaleItem.rb +1 -1
  144. data/lib/taskjuggler/reports/GanttLine.rb +23 -12
  145. data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
  146. data/lib/taskjuggler/reports/GanttMilestone.rb +1 -1
  147. data/lib/taskjuggler/reports/GanttRouter.rb +1 -1
  148. data/lib/taskjuggler/reports/GanttTaskBar.rb +1 -1
  149. data/lib/taskjuggler/reports/HTMLGraphics.rb +1 -1
  150. data/lib/taskjuggler/reports/ICalReport.rb +5 -2
  151. data/lib/taskjuggler/reports/Navigator.rb +1 -1
  152. data/lib/taskjuggler/reports/NikuReport.rb +1 -1
  153. data/lib/taskjuggler/reports/Report.rb +29 -4
  154. data/lib/taskjuggler/reports/ReportBase.rb +15 -1
  155. data/lib/taskjuggler/reports/ReportContext.rb +1 -1
  156. data/lib/taskjuggler/reports/ReportTable.rb +1 -1
  157. data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
  158. data/lib/taskjuggler/reports/ReportTableColumn.rb +1 -1
  159. data/lib/taskjuggler/reports/ReportTableLegend.rb +1 -1
  160. data/lib/taskjuggler/reports/ReportTableLine.rb +1 -1
  161. data/lib/taskjuggler/reports/ResourceListRE.rb +3 -5
  162. data/lib/taskjuggler/reports/StatusSheetReport.rb +2 -2
  163. data/lib/taskjuggler/reports/TableReport.rb +336 -204
  164. data/lib/taskjuggler/reports/TableReportColumn.rb +30 -0
  165. data/lib/taskjuggler/reports/TagFile.rb +2 -2
  166. data/lib/taskjuggler/reports/TaskListRE.rb +3 -6
  167. data/lib/taskjuggler/reports/TextReport.rb +1 -1
  168. data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
  169. data/lib/taskjuggler/reports/TjpExportRE.rb +4 -1
  170. data/lib/tj3.rb +1 -1
  171. data/lib/tj3client.rb +1 -1
  172. data/lib/tj3d.rb +1 -1
  173. data/lib/tj3man.rb +1 -1
  174. data/lib/tj3ss_receiver.rb +1 -1
  175. data/lib/tj3ss_sender.rb +1 -1
  176. data/lib/tj3ts_receiver.rb +1 -1
  177. data/lib/tj3ts_sender.rb +1 -1
  178. data/lib/tj3ts_summary.rb +1 -1
  179. data/lib/updateheader.sh +4 -1
  180. data/manual/Getting_Started +7 -4
  181. data/manual/How_To_Contribute +26 -5
  182. data/manual/Installation +26 -18
  183. data/manual/Intro +55 -33
  184. data/manual/Reporting_Bugs +18 -8
  185. data/manual/Rich_Text_Attributes +16 -3
  186. data/manual/Software +2 -2
  187. data/manual/TaskJuggler_2x_Migration +2 -2
  188. data/manual/The_TaskJuggler_Syntax +10 -0
  189. data/manual/Tutorial +2 -2
  190. data/manual/html/Day_To_Day_Juggling.html +16 -12
  191. data/manual/html/Getting_Started.html +9 -7
  192. data/manual/html/How_To_Contribute.html +18 -10
  193. data/manual/html/Installation.html +18 -15
  194. data/manual/html/Intro.html +44 -28
  195. data/manual/html/Reporting_Bugs.html +9 -7
  196. data/manual/html/Rich_Text_Attributes.html +11 -8
  197. data/manual/html/Software.html +5 -5
  198. data/manual/html/TaskJuggler_2x_Migration.html +4 -4
  199. data/manual/html/TaskJuggler_Internals.html +3 -3
  200. data/manual/html/The_TaskJuggler_Syntax.html +6 -3
  201. data/manual/html/Tutorial.html +12 -12
  202. data/manual/html/account.html +19 -10
  203. data/manual/html/account.task.html +5 -28
  204. data/manual/html/accountprefix.html +5 -5
  205. data/manual/html/{report.html → accountreport.html} +140 -23
  206. data/manual/html/accountroot.html +142 -0
  207. data/manual/html/active.html +5 -5
  208. data/manual/html/adopt.task.html +7 -8
  209. data/manual/html/aggregate.html +145 -0
  210. data/manual/html/alert.html +12 -11
  211. data/manual/html/alertlevels.html +102 -0
  212. data/manual/html/allocate.html +6 -6
  213. data/manual/html/alphabet.html +1 -1
  214. data/manual/html/alternative.html +3 -3
  215. data/manual/html/author.html +3 -3
  216. data/manual/html/balance.html +84 -11
  217. data/manual/html/booking.resource.html +3 -3
  218. data/manual/html/booking.task.html +3 -3
  219. data/manual/html/caption.html +6 -4
  220. data/manual/html/cellcolor.column.html +3 -3
  221. data/manual/html/celltext.column.html +3 -3
  222. data/manual/html/center.html +28 -4
  223. data/manual/html/charge.html +3 -3
  224. data/manual/html/chargeset.html +5 -5
  225. data/manual/html/columnid.html +40 -9
  226. data/manual/html/columns.html +6 -4
  227. data/manual/html/complete.html +15 -9
  228. data/manual/html/copyright.html +5 -5
  229. data/manual/html/{credit.html → credits.html} +15 -12
  230. data/manual/html/css/tjreport.css +30 -0
  231. data/manual/html/currency.html +28 -15
  232. data/manual/html/currencyformat.html +4 -4
  233. data/manual/html/dailymax.html +3 -3
  234. data/manual/html/dailymin.html +3 -3
  235. data/manual/html/dailyworkinghours.html +3 -3
  236. data/manual/html/date.extend.html +3 -3
  237. data/manual/html/date.html +3 -3
  238. data/manual/html/definitions.html +3 -3
  239. data/manual/html/depends.html +3 -3
  240. data/manual/html/details.html +3 -3
  241. data/manual/html/disabled.html +9 -3
  242. data/manual/html/duration.html +3 -3
  243. data/manual/html/efficiency.html +3 -3
  244. data/manual/html/effort.html +3 -3
  245. data/manual/html/email.html +3 -3
  246. data/manual/html/enabled.html +9 -3
  247. data/manual/html/end.column.html +3 -3
  248. data/manual/html/end.html +3 -3
  249. data/manual/html/end.limit.html +3 -3
  250. data/manual/html/end.report.html +4 -4
  251. data/manual/html/end.timesheet.html +3 -3
  252. data/manual/html/endcredit.html +18 -9
  253. data/manual/html/epilog.html +6 -4
  254. data/manual/html/export.html +10 -6
  255. data/manual/html/extend.html +3 -3
  256. data/manual/html/fail.html +3 -3
  257. data/manual/html/fdl.html +3 -3
  258. data/manual/html/flags.account.html +3 -3
  259. data/manual/html/flags.html +3 -3
  260. data/manual/html/flags.journalentry.html +3 -3
  261. data/manual/html/flags.report.html +6 -4
  262. data/manual/html/flags.resource.html +3 -3
  263. data/manual/html/flags.statussheet.html +3 -3
  264. data/manual/html/flags.task.html +3 -3
  265. data/manual/html/flags.timesheet.html +3 -3
  266. data/manual/html/fontcolor.column.html +3 -3
  267. data/manual/html/footer.html +28 -4
  268. data/manual/html/formats.html +4 -4
  269. data/manual/html/functions.html +4 -4
  270. data/manual/html/gapduration.html +3 -3
  271. data/manual/html/gaplength.html +4 -4
  272. data/manual/html/halign.center.html +3 -3
  273. data/manual/html/halign.column.html +3 -3
  274. data/manual/html/halign.left.html +3 -3
  275. data/manual/html/halign.right.html +3 -3
  276. data/manual/html/hasalert.html +3 -3
  277. data/manual/html/header.html +28 -4
  278. data/manual/html/headline.html +6 -6
  279. data/manual/html/hideaccount.html +73 -0
  280. data/manual/html/hidejournalentry.html +6 -6
  281. data/manual/html/hidereport.html +3 -3
  282. data/manual/html/hideresource.html +4 -4
  283. data/manual/html/hidetask.html +4 -4
  284. data/manual/html/icalreport.html +3 -3
  285. data/manual/html/include.macro.html +4 -4
  286. data/manual/html/include.project.html +5 -6
  287. data/manual/html/include.properties.html +5 -97
  288. data/manual/html/index.html +2 -2
  289. data/manual/html/inherit.extend.html +3 -3
  290. data/manual/html/interval1.html +3 -3
  291. data/manual/html/interval2.html +3 -3
  292. data/manual/html/interval3.html +3 -3
  293. data/manual/html/interval4.html +3 -3
  294. data/manual/html/isactive.html +3 -3
  295. data/manual/html/ischildof.html +3 -3
  296. data/manual/html/isdependencyof.html +3 -3
  297. data/manual/html/isdutyof.html +3 -3
  298. data/manual/html/isfeatureof.html +3 -3
  299. data/manual/html/isleaf.html +3 -3
  300. data/manual/html/ismilestone.html +3 -3
  301. data/manual/html/isongoing.html +3 -3
  302. data/manual/html/isresource.html +5 -5
  303. data/manual/html/{alert level.html → isresponsibilityof.html} +19 -14
  304. data/manual/html/istask.html +5 -5
  305. data/manual/html/journalattributes.html +6 -4
  306. data/manual/html/journalentry.html +3 -3
  307. data/manual/html/journalmode.html +8 -6
  308. data/manual/html/leaveallowance.html +139 -0
  309. data/manual/html/leaves.html +140 -0
  310. data/manual/html/left.html +30 -6
  311. data/manual/html/length.html +4 -4
  312. data/manual/html/limits.allocate.html +5 -32
  313. data/manual/html/limits.html +3 -3
  314. data/manual/html/limits.resource.html +3 -3
  315. data/manual/html/limits.task.html +3 -3
  316. data/manual/html/listitem.column.html +3 -3
  317. data/manual/html/listtype.column.html +3 -3
  318. data/manual/html/loadunit.html +6 -4
  319. data/manual/html/logicalexpression.html +3 -3
  320. data/manual/html/logicalflagexpression.html +3 -3
  321. data/manual/html/macro.html +3 -3
  322. data/manual/html/managers.html +3 -3
  323. data/manual/html/mandatory.html +3 -3
  324. data/manual/html/maxend.html +3 -3
  325. data/manual/html/maximum.html +3 -3
  326. data/manual/html/maxstart.html +3 -3
  327. data/manual/html/milestone.html +3 -3
  328. data/manual/html/minend.html +3 -3
  329. data/manual/html/minimum.html +3 -3
  330. data/manual/html/minstart.html +3 -3
  331. data/manual/html/monthlymax.html +3 -3
  332. data/manual/html/monthlymin.html +3 -3
  333. data/manual/html/navbar.html +23 -5
  334. data/manual/html/navigator.html +34 -3
  335. data/manual/html/newtask.html +3 -3
  336. data/manual/html/nikureport.html +3 -3
  337. data/manual/html/note.task.html +3 -3
  338. data/manual/html/now.html +3 -3
  339. data/manual/html/numberformat.html +4 -4
  340. data/manual/html/onend.html +3 -3
  341. data/manual/html/onstart.html +3 -3
  342. data/manual/html/opennodes.html +6 -4
  343. data/manual/html/overtime.booking.html +4 -4
  344. data/manual/html/period.column.html +3 -3
  345. data/manual/html/period.limit.html +3 -3
  346. data/manual/html/period.report.html +4 -4
  347. data/manual/html/period.task.html +3 -3
  348. data/manual/html/persistent.html +3 -3
  349. data/manual/html/precedes.html +3 -3
  350. data/manual/html/priority.html +3 -3
  351. data/manual/html/priority.timesheet.html +3 -3
  352. data/manual/html/project.html +4 -4
  353. data/manual/html/projectid.html +3 -3
  354. data/manual/html/projectid.task.html +3 -3
  355. data/manual/html/projectids.html +3 -3
  356. data/manual/html/projection.html +9 -3
  357. data/manual/html/prolog.html +6 -4
  358. data/manual/html/properties.html +193 -9
  359. data/manual/html/purge.html +5 -5
  360. data/manual/html/rate.html +3 -3
  361. data/manual/html/rate.resource.html +3 -3
  362. data/manual/html/reference.extend.html +3 -3
  363. data/manual/html/remaining.html +3 -3
  364. data/manual/html/replace.html +9 -6
  365. data/manual/html/reportprefix.html +5 -5
  366. data/manual/html/resource.html +22 -4
  367. data/manual/html/resourceattributes.html +6 -6
  368. data/manual/html/resourceprefix.html +3 -3
  369. data/manual/html/resourcereport.html +311 -8
  370. data/manual/html/resourceroot.html +6 -4
  371. data/manual/html/resources.limit.html +4 -4
  372. data/manual/html/responsible.html +3 -3
  373. data/manual/html/richtext.extend.html +3 -3
  374. data/manual/html/right.html +30 -6
  375. data/manual/html/rollupaccount.html +69 -0
  376. data/manual/html/rollupresource.html +6 -6
  377. data/manual/html/rolluptask.html +4 -4
  378. data/manual/html/scale.column.html +3 -3
  379. data/manual/html/scenario.html +3 -3
  380. data/manual/html/scenario.ical.html +3 -3
  381. data/manual/html/scenarios.export.html +3 -3
  382. data/manual/html/scenarios.html +6 -4
  383. data/manual/html/scenariospecific.extend.html +3 -3
  384. data/manual/html/scheduled.html +3 -3
  385. data/manual/html/scheduling.html +3 -3
  386. data/manual/html/select.html +3 -3
  387. data/manual/html/selfcontained.html +6 -4
  388. data/manual/html/shift.allocate.html +77 -0
  389. data/manual/html/shift.html +13 -7
  390. data/manual/html/shift.resource.html +11 -5
  391. data/manual/html/shift.task.html +9 -3
  392. data/manual/html/shift.timesheet.html +4 -4
  393. data/manual/html/shifts.allocate.html +6 -6
  394. data/manual/html/shifts.resource.html +3 -3
  395. data/manual/html/shifts.task.html +3 -3
  396. data/manual/html/shorttimeformat.html +3 -3
  397. data/manual/html/sloppy.booking.html +4 -4
  398. data/manual/html/sloppy.projection.html +12 -6
  399. data/manual/html/sortaccounts.html +73 -0
  400. data/manual/html/sortjournalentries.html +8 -6
  401. data/manual/html/sortresources.html +4 -4
  402. data/manual/html/sorttasks.html +4 -4
  403. data/manual/html/start.column.html +3 -3
  404. data/manual/html/start.html +3 -3
  405. data/manual/html/start.limit.html +3 -3
  406. data/manual/html/start.report.html +4 -4
  407. data/manual/html/startcredit.html +10 -4
  408. data/manual/html/status.statussheet.html +5 -5
  409. data/manual/html/status.timesheet.html +5 -5
  410. data/manual/html/statussheet.html +3 -3
  411. data/manual/html/statussheetreport.html +10 -6
  412. data/manual/html/strict.projection.html +10 -4
  413. data/manual/html/summary.html +3 -3
  414. data/manual/html/supplement.html +5 -5
  415. data/manual/html/supplement.resource.html +22 -4
  416. data/manual/html/supplement.task.html +4 -4
  417. data/manual/html/tagfile.html +3 -3
  418. data/manual/html/task.html +3 -3
  419. data/manual/html/task.statussheet.html +3 -3
  420. data/manual/html/task.timesheet.html +3 -3
  421. data/manual/html/taskattributes.html +3 -3
  422. data/manual/html/taskprefix.html +3 -3
  423. data/manual/html/taskreport.html +347 -8
  424. data/manual/html/taskroot.html +6 -4
  425. data/manual/html/text.extend.html +3 -3
  426. data/manual/html/textreport.html +333 -8
  427. data/manual/html/timeformat.html +4 -4
  428. data/manual/html/timeoff.nikureport.html +3 -3
  429. data/manual/html/timesheet.html +3 -3
  430. data/manual/html/timesheetreport.html +10 -6
  431. data/manual/html/timezone.export.html +3 -3
  432. data/manual/html/timezone.html +3 -3
  433. data/manual/html/timezone.report.html +6 -4
  434. data/manual/html/timezone.shift.html +3 -3
  435. data/manual/html/timingresolution.html +3 -3
  436. data/manual/html/title.column.html +3 -3
  437. data/manual/html/title.html +4 -4
  438. data/manual/html/toc.html +1705 -658
  439. data/manual/html/tooltip.column.html +3 -3
  440. data/manual/html/trackingscenario.html +3 -3
  441. data/manual/html/treelevel.html +3 -3
  442. data/manual/html/vacation.html +3 -3
  443. data/manual/html/vacation.resource.html +4 -4
  444. data/manual/html/vacation.shift.html +4 -4
  445. data/manual/html/warn.html +3 -3
  446. data/manual/html/weeklymax.html +3 -3
  447. data/manual/html/weeklymin.html +3 -3
  448. data/manual/html/weekstartsmonday.html +3 -3
  449. data/manual/html/weekstartssunday.html +3 -3
  450. data/manual/html/width.column.html +3 -3
  451. data/manual/html/work.html +3 -3
  452. data/manual/html/workinghours.project.html +3 -3
  453. data/manual/html/workinghours.resource.html +3 -3
  454. data/manual/html/workinghours.shift.html +3 -3
  455. data/manual/html/yearlyworkingdays.html +4 -4
  456. data/spec/ICalendar_spec.rb +4 -2
  457. data/spec/IntervalList_spec.rb +1 -1
  458. data/spec/ProjectBroker_spec.rb +2 -6
  459. data/spec/StatusSheets_spec.rb +1 -1
  460. data/spec/TernarySearchTree_spec.rb +2 -2
  461. data/spec/TimeSheets_spec.rb +1 -1
  462. data/spec/Tj3Daemon_spec.rb +1 -1
  463. data/spec/Tj3_spec.rb +1 -1
  464. data/spec/support/DaemonControl.rb +1 -1
  465. data/spec/support/spec_helper.rb +19 -0
  466. data/taskjuggler.gemspec +1 -0
  467. data/test/MessageChecker.rb +1 -1
  468. data/test/ReferenceGenerator.rb +1 -1
  469. data/test/TestSuite/CSV-Reports/Leave.tjp +37 -0
  470. data/test/TestSuite/CSV-Reports/celltext.tjp +1 -1
  471. data/test/TestSuite/CSV-Reports/efficiency.tjp +20 -0
  472. data/test/TestSuite/CSV-Reports/headcount.tjp +31 -0
  473. data/test/TestSuite/CSV-Reports/refs/Leave.csv +5 -0
  474. data/test/TestSuite/CSV-Reports/refs/alert.csv +6 -0
  475. data/test/TestSuite/CSV-Reports/refs/celltext.csv +6 -0
  476. data/test/TestSuite/CSV-Reports/refs/efficiency.csv +5 -0
  477. data/test/TestSuite/CSV-Reports/refs/headcount.csv +4 -0
  478. data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +6 -0
  479. data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +6 -0
  480. data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +6 -0
  481. data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +6 -0
  482. data/test/TestSuite/CSV-Reports/refs/taskreport.csv +6 -0
  483. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +14 -0
  484. data/test/TestSuite/CSV-Reports/resourcereport.tjp +1 -1
  485. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +1 -1
  486. data/test/TestSuite/CSV-Reports/sortByTree.tjp +1 -1
  487. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +1 -1
  488. data/test/TestSuite/CSV-Reports/taskreport.tjp +1 -1
  489. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +1 -1
  490. data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +1089 -0
  491. data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +24 -0
  492. data/test/TestSuite/Export-Reports/refs/Complete.tjp +5 -25
  493. data/test/TestSuite/Export-Reports/refs/navigator.tjp +58 -0
  494. data/test/TestSuite/Export-Reports/refs/template.tjp +142 -0
  495. data/test/TestSuite/Export-Reports/refs/textreport.tjp +19 -0
  496. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +26 -7
  497. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +177 -141
  498. data/test/TestSuite/ReportGenerator/Correct/refs/FTE-1.csv +1 -1
  499. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
  500. data/test/TestSuite/Scheduler/Correct/Shift2.tjp +4 -4
  501. data/test/TestSuite/Syntax/Correct/Account.tjp +23 -10
  502. data/test/TestSuite/Syntax/Correct/AccountReport.tjp +74 -0
  503. data/test/TestSuite/Syntax/Correct/AdoptedTasks.tjp +4 -0
  504. data/test/TestSuite/Syntax/Correct/AlertLevels.tjp +25 -0
  505. data/test/TestSuite/Syntax/Correct/Celltext.tjp +3 -3
  506. data/test/TestSuite/Syntax/Correct/Complete.tjp +8 -5
  507. data/test/TestSuite/Syntax/Correct/Leave.tjp +37 -0
  508. data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -4
  509. data/test/TestSuite/Syntax/Correct/Shift.tjp +4 -4
  510. data/test/TestSuite/Syntax/Correct/manual2example.rb +4 -3
  511. data/test/TestSuite/Syntax/Correct/navigator.tjp +31 -0
  512. data/test/TestSuite/Syntax/Correct/template.tjp +338 -0
  513. data/test/TestSuite/Syntax/Correct/textreport.tjp +21 -0
  514. data/test/TestSuite/Syntax/Correct/tutorial.tjp +12 -10
  515. data/test/TestSuite/Syntax/Errors/{adopt_duplicate_child.tjp → adopt_duplicate_child-1.tjp} +0 -0
  516. data/test/TestSuite/Syntax/Errors/{adopt_common_root.tjp → adopt_duplicate_child-2.tjp} +1 -1
  517. data/test/TestSuite/Syntax/Errors/{adopt_duplicate_parent.tjp → adopt_duplicate_child-3.tjp} +1 -1
  518. data/test/TestSuite/Syntax/Errors/adopt_self.tjp +7 -0
  519. data/test/TestSuite/Syntax/Errors/alert_level_redef.tjp +8 -0
  520. data/test/TestSuite/Syntax/Errors/alert_name_redef.tjp +8 -0
  521. data/test/TestSuite/Syntax/Errors/too_few_alert_levels.tjp +5 -0
  522. data/test/TjpGen.rb +1 -1
  523. data/test/all.rb +1 -1
  524. data/test/test_AlgorithmDiff.rb +1 -1
  525. data/test/test_BatchProcessor.rb +23 -10
  526. data/test/test_CSV-Reports.rb +1 -1
  527. data/test/test_CSVFile.rb +1 -1
  528. data/test/test_CollisionDetector.rb +1 -1
  529. data/test/test_Export-Reports.rb +1 -1
  530. data/test/test_Journal.rb +42 -15
  531. data/test/test_Limits.rb +1 -1
  532. data/test/test_LogicalExpression.rb +1 -1
  533. data/test/test_MacroTable.rb +8 -3
  534. data/test/test_Project.rb +1 -1
  535. data/test/test_ProjectFileScanner.rb +1 -1
  536. data/test/test_PropertySet.rb +1 -1
  537. data/test/test_Query.rb +1 -1
  538. data/test/test_RealFormat.rb +1 -1
  539. data/test/test_ReportGenerator.rb +1 -1
  540. data/test/test_RichText.rb +1 -1
  541. data/test/test_Scheduler.rb +1 -1
  542. data/test/test_ShiftAssignments.rb +1 -1
  543. data/test/test_SimpleQueryExpander.rb +1 -1
  544. data/test/test_Syntax.rb +1 -1
  545. data/test/test_TextFormatter.rb +1 -1
  546. data/test/test_TjTime.rb +1 -1
  547. data/test/test_TjpExample.rb +1 -1
  548. data/test/test_URLParameter.rb +1 -1
  549. data/test/test_UTF8String.rb +1 -1
  550. data/test/test_WorkingHours.rb +1 -1
  551. data/test/test_deep_copy.rb +1 -1
  552. metadata +318 -248
  553. data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +0 -8
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Charge.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -15,7 +15,7 @@ require 'taskjuggler/TjTime'
15
15
 
16
16
  class TaskJuggler
17
17
 
18
- # This class describes a one-time or per time charge that can be assiciated
18
+ # This class describes a one-time or per time charge that can be associated
19
19
  # with a Task. The charge can take effect either on starting the task,
20
20
  # finishing it, or per time interval.
21
21
  class Charge
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = ChargeSet.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = DataCache.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -20,11 +20,14 @@ class TaskJuggler
20
20
  # counter. The counter can be read and written externally.
21
21
  class DataCacheEntry
22
22
 
23
+ attr_reader :unhashedKey
23
24
  attr_accessor :hits
24
25
 
25
- # Create a new DataCacheEntry for the _value_. The access counter is set
26
- # to 1 to increase the chance that it is not flushed immedidate.
27
- def initialize(value)
26
+ # Create a new DataCacheEntry for the _value_. We also store the unhashed
27
+ # key to be able to detect hash collisions. The access counter is set to 1
28
+ # to increase the chance that it is not flushed immedidate.
29
+ def initialize(unhashedKey, value)
30
+ @unhashedKey = unhashedKey
28
31
  @value = value
29
32
  @hits = 1
30
33
  end
@@ -60,6 +63,8 @@ class TaskJuggler
60
63
  @hits = 0
61
64
  # Counter for the number of not found values.
62
65
  @misses = 0
66
+ # Counter for hash collisions
67
+ @collisions = 0
63
68
  end
64
69
 
65
70
  # For now, we use this randomly determined size.
@@ -90,17 +95,24 @@ class TaskJuggler
90
95
 
91
96
  # _args_ is a set of arguments that unambigously identify the data entry.
92
97
  # It's converted into a hash to store or recover a previously stored
93
- # entry. If we have a value for the key, return the value. Otherwise call the
94
- # block to compute the value, store it and return it.
98
+ # entry. If we have a value for the key, return the value. Otherwise call
99
+ # the block to compute the value, store it and return it.
95
100
  def cached(*args)
96
101
  key = args.hash
97
102
  if @entries.has_key?(key)
98
103
  e = @entries[key]
99
- @hits += 1
100
- e.value
104
+ if e.unhashedKey != args
105
+ # Two different args produce the same hash key. This should be a
106
+ # very rare event!
107
+ @collisions += 1
108
+ yield
109
+ else
110
+ @hits += 1
111
+ e.value
112
+ end
101
113
  else
102
114
  @misses += 1
103
- store(yield, key)
115
+ store(yield, args, key)
104
116
  end
105
117
  end
106
118
 
@@ -108,7 +120,7 @@ class TaskJuggler
108
120
 
109
121
  def to_s
110
122
  <<"EOT"
111
- Entries: #{@entries.size} Stores: #{@stores}
123
+ Entries: #{@entries.size} Stores: #{@stores} Collisions: #{@collisions}
112
124
  Hits: #{@hits} Misses: #{@misses}
113
125
  Hit Rate: #{@hits * 100.0 / (@hits + @misses)}%
114
126
  EOT
@@ -119,7 +131,7 @@ EOT
119
131
  # Store _value_ into the cache using _key_ to tag it. _key_ must be unique
120
132
  # and must be used to load the value from the cache again. You cannot
121
133
  # store nil values!
122
- def store(value, key)
134
+ def store(value, unhashedKey, key)
123
135
  @stores += 1
124
136
 
125
137
  if @entries.size > @highWaterMark
@@ -133,7 +145,7 @@ EOT
133
145
  end
134
146
  end
135
147
 
136
- @entries[key] = DataCacheEntry.new(value)
148
+ @entries[key] = DataCacheEntry.new(unhashedKey, value)
137
149
 
138
150
  value
139
151
  end
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = FileList.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = HTMLDocument.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = HTMLElements.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = ICalendar.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Interval.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = IntervalList.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Journal.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@ class TaskJuggler
22
22
  class JournalEntry
23
23
 
24
24
  attr_reader :date, :headline, :property, :sourceFileInfo
25
- attr_accessor :author, :summary, :details, :alertLevel, :flags,
25
+ attr_accessor :author, :moderators, :summary, :details, :alertLevel, :flags,
26
26
  :timeSheetRecord
27
27
 
28
28
  # Create a new JournalEntry object.
@@ -40,6 +40,8 @@ class TaskJuggler
40
40
  @sourceFileInfo = sourceFileInfo
41
41
  # A reference to a Resource.
42
42
  @author = nil
43
+ # A list of Resource objects that have moderated this entry.
44
+ @moderators = []
43
45
  # An introductory or summarizing RichText paragraph.
44
46
  @summary = nil
45
47
  # A RichText of arbitrary length.
@@ -63,10 +65,11 @@ class TaskJuggler
63
65
  if query.journalAttributes.include?('alert')
64
66
  levelRecord = query.project['alertLevels'][alertLevel]
65
67
  if query.selfContained
66
- alertName = "<nowiki>[#{levelRecord[1]}]</nowiki> "
68
+ alertName = "<nowiki>[</nowiki><fcol:#{levelRecord.color}><nowiki>" +
69
+ "#{levelRecord.name}</nowiki></fcol><nowiki>]</nowiki>"
67
70
  else
68
- alertName = "[[File:icons/flag-#{levelRecord[0]}.png|" +
69
- "alt=[#{levelRecord[1]}]|text-bottom]] "
71
+ alertName = "[[File:icons/flag-#{levelRecord.id}.png|" +
72
+ "alt=[#{levelRecord.name}]|text-bottom]] "
70
73
  end
71
74
  else
72
75
  alertName = ''
@@ -243,6 +246,11 @@ class TaskJuggler
243
246
  end
244
247
  end
245
248
 
249
+ # Like Array::delete
250
+ def delete(e)
251
+ @entries.delete(e)
252
+ end
253
+
246
254
  # Like Array::delete_if
247
255
  def delete_if
248
256
  @entries.delete_if { |e| yield(e) }
@@ -349,12 +357,30 @@ class TaskJuggler
349
357
 
350
358
  return if entry.property.nil?
351
359
 
352
- unless @propertyToEntries.include?(entry.property)
353
- @propertyToEntries[entry.property] = JournalEntryList.new
360
+ # When we store the property into the @propertyToEntries hash, we need
361
+ # to make sure that we store the PropertyTreeNode object and not a
362
+ # PTNProxy object.
363
+ unless @propertyToEntries.include?(entry.property.ptn)
364
+ @propertyToEntries[entry.property.ptn] = JournalEntryList.new
365
+ end
366
+ @propertyToEntries[entry.property.ptn] << entry
367
+ end
368
+
369
+ def getEntries(property)
370
+ @propertyToEntries[property.ptn]
371
+ end
372
+
373
+ # Delete all entries of the Journal for which the block yields true.
374
+ def delete_if
375
+ @entries.delete_if do |e|
376
+ res = yield(e)
377
+ @propertyToEntries[e.property.ptn].delete(e) if res
378
+ res
354
379
  end
355
- @propertyToEntries[entry.property] << entry
356
380
  end
357
381
 
382
+
383
+
358
384
  def to_rti(query)
359
385
  entries = JournalEntryList.new
360
386
 
@@ -408,8 +434,8 @@ class TaskJuggler
408
434
  # each task (incl. sub tasks) are included.
409
435
  if query.property
410
436
  if query.property.is_a?(Task)
411
- entries += currentEntriesR(query.end, query.property, 0, query.start,
412
- query.hideJournalEntry)
437
+ entries += currentEntriesR(query.end, query.property, 0,
438
+ query.start, query.hideJournalEntry)
413
439
  end
414
440
  else
415
441
  query.project.tasks.each do |task|
@@ -482,10 +508,10 @@ class TaskJuggler
482
508
  logExp = nil, task = nil, alertLevel = nil)
483
509
  list = JournalEntryList.new
484
510
  @entries.each do |entry|
485
- if entry.author == resource &&
511
+ if entry.author == resource.ptn &&
486
512
  (startDate.nil? || entry.date > startDate) &&
487
513
  (endDate.nil? || entry.date <= endDate) &&
488
- (task.nil? || entry.property == task) &&
514
+ (task.nil? || entry.property == task.ptn) &&
489
515
  (alertLevel.nil? || entry.alertLevel >= alertLevel) &&
490
516
  !entry.headline.empty? && !hidden(entry, logExp)
491
517
  list << entry
@@ -503,7 +529,7 @@ class TaskJuggler
503
529
  resource = nil, alertLevel = nil)
504
530
  list = JournalEntryList.new
505
531
  @entries.each do |entry|
506
- if entry.property == task &&
532
+ if entry.property == task.ptn &&
507
533
  (startDate.nil? || entry.date >= startDate) &&
508
534
  (endDate.nil? || entry.date < endDate) &&
509
535
  (resource.nil? || entry.author == resource) &&
@@ -539,8 +565,8 @@ class TaskJuggler
539
565
  @entries.each do |entry|
540
566
  if (startDate.nil? || startDate <= entry.date) &&
541
567
  (endDate.nil? || endDate >= entry.date) &&
542
- (property.nil? || property == entry.property ||
543
- entry.property.isChildOf?(property)) &&
568
+ (property.nil? || property.ptn == entry.property ||
569
+ entry.property.isChildOf?(property.ptn)) &&
544
570
  (alertLevel.nil? || alertLevel == entry.alertLevel) &&
545
571
  !hidden(entry, logExp)
546
572
  list << entry
@@ -589,8 +615,8 @@ class TaskJuggler
589
615
  # with at least the required alert level _minLevel_ are returned. Messages
590
616
  # with alert level _minLevel_ must be newer than _minDate_.
591
617
  def currentEntries(date, property, minLevel, minDate, logExp)
592
- pEntries = @propertyToEntries[property] ?
593
- @propertyToEntries[property].last(date) : JournalEntryList.new
618
+ pEntries = getEntries(property) ? getEntries(property).last(date) :
619
+ JournalEntryList.new
594
620
  # Remove entries below the minium alert level or before the timeout
595
621
  # date.
596
622
  pEntries.delete_if do |e|
@@ -602,8 +628,8 @@ class TaskJuggler
602
628
  # Check parents for a more important or more up-to-date message.
603
629
  p = property.parent
604
630
  while p do
605
- ppEntries = @propertyToEntries[p] ?
606
- @propertyToEntries[p].last(date) : JournalEntryList.new
631
+ ppEntries = getEntries(p) ?
632
+ getEntries(p).last(date) : JournalEntryList.new
607
633
 
608
634
  # A parent has a more up-to-date message.
609
635
  if !ppEntries.empty? && ppEntries.first.date >= pEntries.first.date
@@ -630,8 +656,8 @@ class TaskJuggler
630
656
  def currentEntriesR(date, property, minLevel = 0, minDate = nil,
631
657
  logExp = nil)
632
658
  # See if this property has any current JournalEntry objects.
633
- pEntries = @propertyToEntries[property] ?
634
- @propertyToEntries[property].last(date) : JournalEntryList.new
659
+ pEntries = getEntries(property) ? getEntries(property).last(date) :
660
+ JournalEntryList.new
635
661
  # Remove entries below the minium alert level or before the timeout
636
662
  # date.
637
663
  pEntries.delete_if do |e|
@@ -645,9 +671,13 @@ class TaskJuggler
645
671
  maxPAlertLevel = e.alertLevel if e.alertLevel > maxPAlertLevel
646
672
  end
647
673
 
648
- entries = JournalEntryList.new
674
+ cEntries = JournalEntryList.new
649
675
  latestDate = nil
650
676
  maxAlertLevel = 0
677
+ # If we have an entry from this property, we only care about child
678
+ # entries that are from a later date.
679
+ minDate = pEntries.first.date + 1 unless pEntries.empty?
680
+
651
681
  # Now gather all current entries of the child properties and find the
652
682
  # date that is closest to and right before the given _date_.
653
683
  property.kids.each do |p|
@@ -656,30 +686,20 @@ class TaskJuggler
656
686
  latestDate = e.date if latestDate.nil? || e.date > latestDate
657
687
  # Find the highest alert level.
658
688
  maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
659
- entries << e
689
+ cEntries << e
660
690
  end
661
691
  end
662
- # If no child property has a more current JournalEntry or one with a
663
- # higher alert level than this property and this property has
664
- # JournalEntry objects, than those are taken.
692
+
665
693
  if !pEntries.empty? && (maxPAlertLevel > maxAlertLevel ||
666
694
  latestDate.nil? ||
667
695
  pEntries.first.date >= latestDate)
668
-
669
- # Remove all entries that are filtered by logExp.
670
- if logExp
671
- pEntries.delete_if { |e| hidden(e, logExp) }
672
- end
673
-
674
- return pEntries
675
- end
676
-
677
- # Remove all child entries that are older than the current parent
678
- # entries (if we have parent entries).
679
- unless pEntries.empty?
680
- entries.delete_if do |e|
681
- e.date <= pEntries.first.date
682
- end
696
+ # If no child property has a more current JournalEntry or one with a
697
+ # higher alert level than this property and this property has
698
+ # JournalEntry objects, than those are taken.
699
+ entries = pEntries
700
+ else
701
+ # Otherwise we take the entries from the kids.
702
+ entries = cEntries
683
703
  end
684
704
 
685
705
  # Remove all entries that are filtered by logExp.
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = KeywordArray.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = KeywordDocumentation.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -11,6 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
+ require 'term/ansicolor'
14
15
  require 'taskjuggler/HTMLDocument'
15
16
  require 'taskjuggler/RichText'
16
17
  require 'taskjuggler/TjpExample'
@@ -32,6 +33,7 @@ class TaskJuggler
32
33
  class KeywordDocumentation
33
34
 
34
35
  include HTMLElements
36
+ include Term::ANSIColor
35
37
 
36
38
  attr_reader :keyword, :names, :pattern, :references, :optionalAttributes
37
39
  attr_accessor :contexts, :scenarioSpecific, :inheritedFromProject,
@@ -40,7 +42,7 @@ class TaskJuggler
40
42
  # Construct a new KeywordDocumentation object. _rule_ is the
41
43
  # TextParser::Rule and _pattern_ is the corresponding TextParser::Pattern.
42
44
  # _syntax_ is an expanded syntax representation of the _pattern_. _args_
43
- # is a Array of ParserTokenDoc that describe the arguments of the
45
+ # is an Array of TextParser::TokenDoc that describe the arguments of the
44
46
  # _pattern_. _optAttrPatterns_ is an Array with references to
45
47
  # TextParser::Patterns that are optional attributes to this keyword.
46
48
  def initialize(rule, pattern, syntax, args, optAttrPatterns, manual)
@@ -79,10 +81,11 @@ class TaskJuggler
79
81
  # (task, resources, etc.). A TJP property can be nested.
80
82
  def isProperty?
81
83
  # I haven't found a good way to automatically detect all the various
82
- # report types as properties. The non-nestable ones need to be added
83
- # manually here.
84
- return true if %w( export nikureport timesheetreport statussheetreport).
85
- include?(keyword)
84
+ # report types as properties. They don't directly include themselves as
85
+ # attributes.
86
+ return true if %w( accountreport export nikureport resourcereport
87
+ taskreport textreport timesheetreport
88
+ statussheetreport).include?(keyword)
86
89
  @optionalAttributes.include?(self)
87
90
  end
88
91
 
@@ -122,10 +125,14 @@ class TaskJuggler
122
125
  @optAttrPatterns.each do |pattern, scenarioSpecific|
123
126
  next unless checkReference(pattern)
124
127
 
128
+ # Check if all the attributes are documented. We ignore undocumented
129
+ # keywords that are deprecated or removed.
125
130
  if (kwd = keywords[pattern.keyword]).nil?
126
- token = pattern.terminalToken(rules)
127
- $stderr.puts "Keyword #{keyword} has undocumented optional " +
128
- "attribute #{token[0]}"
131
+ unless [ :deprecated, :removed ].include?(pattern.supportLevel)
132
+ token = pattern.terminalTokens(rules)
133
+ $stderr.puts "Keyword #{keyword} has undocumented optional " +
134
+ "attribute #{token[0]}"
135
+ end
129
136
  else
130
137
  @optionalAttributes << kwd
131
138
  kwd.contexts << self unless kwd.contexts.include?(self)
@@ -145,7 +152,9 @@ class TaskJuggler
145
152
  def computeInheritance(keywords, rules)
146
153
  property = nil
147
154
  @contexts.each do |kwd|
148
- if %w( task resource account report shift scenario).include?(kwd.keyword)
155
+ if %w( task resource account shift scenario
156
+ accountreport resourcereport taskreport textreport ).
157
+ include?(kwd.keyword)
149
158
  property = kwd.keyword
150
159
  break
151
160
  end
@@ -159,12 +168,12 @@ class TaskJuggler
159
168
  project.resources
160
169
  when 'account'
161
170
  project.accounts
162
- when 'report'
163
- project.reports
164
171
  when 'shift'
165
172
  project.shifts
166
173
  when 'scenario'
167
174
  project.scenarios
175
+ else
176
+ project.reports
168
177
  end
169
178
  keyword = @keyword
170
179
  keyword = keyword.split('.')[0] if keyword.include?('.')
@@ -192,19 +201,39 @@ class TaskJuggler
192
201
  textW = 79
193
202
 
194
203
  # Top line with multiple elements
195
- str = "Keyword: #{@keyword} " +
196
- "Scenario Specific: #{@scenarioSpecific ? 'Yes' : 'No'} " +
197
- "Inherited: #{@inheritedFromParent ? 'Yes' : 'No'}\n\n"
204
+ str = "#{blue('Keyword:')} #{bold(@keyword)}\n\n"
205
+
206
+ if @pattern.supportLevel != :supported
207
+ msg = supportLevelMessage
208
+
209
+ if [ :deprecated, :removed ].include?(@pattern.supportLevel) &&
210
+ @seeAlso.length > 0
211
+ msg += "\n\nPlease use "
212
+ alsoStr = ''
213
+ @seeAlso.each do |also|
214
+ unless alsoStr.empty?
215
+ alsoStr += ', '
216
+ end
217
+ alsoStr += also.keyword
218
+ end
219
+ msg += "#{alsoStr} instead!"
220
+ end
198
221
 
199
- str += "Purpose: #{format(tagW, newRichText(@pattern.doc).to_s,
200
- textW)}\n\n"
222
+ str += red("Warning: #{format(tagW, msg, textW)}\n")
223
+ end
201
224
 
225
+ # Don't show further details if the keyword has been removed.
226
+ return str if @pattern.supportLevel == :removed
227
+
228
+ str += blue('Purpose:') +
229
+ " #{format(tagW, newRichText(@pattern.doc).to_s,
230
+ textW)}\n"
202
231
  if @syntax != '[{ <attributes> }]'
203
- str += "Syntax: #{format(tagW, @syntax, textW)}\n\n"
232
+ str += blue('Syntax:') + " #{format(tagW, @syntax, textW)}\n"
204
233
 
205
- str += "Arguments: "
234
+ str += blue('Arguments:') + " "
206
235
  if @args.empty?
207
- str += format(tagW, "none\n\n", textW)
236
+ str += format(tagW, "none\n", textW)
208
237
  else
209
238
  argStr = ''
210
239
  @args.each do |arg|
@@ -228,7 +257,7 @@ class TaskJuggler
228
257
  str += "\n"
229
258
  end
230
259
 
231
- str += 'Context: '
260
+ str += blue('Context:') + ' '
232
261
  if @contexts.empty?
233
262
  str += format(tagW, 'Global scope', textW)
234
263
  else
@@ -242,7 +271,7 @@ class TaskJuggler
242
271
  str += format(tagW, cxtStr, textW)
243
272
  end
244
273
 
245
- str += "\n\nAttributes: "
274
+ str += "\n#{blue('Attributes:')} "
246
275
  if @optionalAttributes.empty?
247
276
  str += "none\n\n"
248
277
  else
@@ -260,34 +289,37 @@ class TaskJuggler
260
289
  attr.inheritedFromParent
261
290
  first = true
262
291
  showLegend = true
263
- attrStr += '['
292
+ tag = '['
264
293
  if attr.scenarioSpecific
265
- attrStr += 'sc'
294
+ tag += 'sc'
266
295
  first = false
267
296
  end
268
297
  if attr.inheritedFromProject
269
- attrStr += ':' unless first
270
- attrStr += 'ig'
298
+ tag += ':' unless first
299
+ tag += 'ig'
271
300
  first = false
272
301
  end
273
302
  if attr.inheritedFromParent
274
- attrStr += ':' unless first
275
- attrStr += 'ip'
303
+ tag += ':' unless first
304
+ tag += 'ip'
276
305
  end
277
- attrStr += ']'
306
+ tag += ']'
307
+ attrStr += cyan(tag)
278
308
  end
279
309
  end
280
310
  if showLegend
281
- attrStr += "\n\n[sc] : Attribute is scenario specific" +
282
- "\n[ig] : Attribute is inherited from global attribute" +
283
- "\n[ip] : Attribute is inherited from parent property"
311
+ attrStr += "\n\n#{cyan('[sc]')} : Attribute is scenario specific" +
312
+ "\r#{cyan('[ig]')} : " +
313
+ "Value can be inherited from global setting" +
314
+ "\r#{cyan('[ip]')} : " +
315
+ "Value can be inherited from parent property"
284
316
  end
285
317
  str += format(tagW, attrStr, textW)
286
318
  str += "\n"
287
319
  end
288
320
 
289
321
  unless @seeAlso.empty?
290
- str += "See also: "
322
+ str += blue('See also:') + " "
291
323
  alsoStr = ''
292
324
  @seeAlso.each do |also|
293
325
  unless alsoStr.empty?
@@ -322,6 +354,7 @@ class TaskJuggler
322
354
  DIV.new('style' => 'margin-left:5%; margin-right:5%') do
323
355
  [
324
356
  generateHTMLKeywordBox,
357
+ generateHTMLSupportLevel,
325
358
  generateHTMLDescriptionBox,
326
359
  generateHTMLOptionalAttributesBox,
327
360
  generateHTMLExampleBox
@@ -406,6 +439,22 @@ class TaskJuggler
406
439
  TextFormatter.new(width, indent).format(str)[indent..-1]
407
440
  end
408
441
 
442
+ def generateHTMLSupportLevel
443
+ if @pattern.supportLevel != :supported
444
+ [
445
+ P.new do
446
+ newRichText("<fcol:red>#{supportLevelMessage}</fcol>").to_html
447
+ end,
448
+ [ :deprecated, :removed ].include?(@pattern.supportLevel) ?
449
+ P.new do
450
+ useInsteadMessage
451
+ end : nil
452
+ ]
453
+ else
454
+ nil
455
+ end
456
+ end
457
+
409
458
  def generateHTMLKeywordBox
410
459
  # Box with keyword name.
411
460
  P.new do
@@ -423,6 +472,8 @@ class TaskJuggler
423
472
  end
424
473
 
425
474
  def generateHTMLDescriptionBox
475
+ return nil if @pattern.supportLevel == :removed
476
+
426
477
  # Box with purpose, syntax, arguments and context.
427
478
  P.new do
428
479
  TABLE.new({ 'align' => 'center', 'class' => 'table' }) do
@@ -521,6 +572,8 @@ class TaskJuggler
521
572
  end
522
573
 
523
574
  def generateHTMLTableLine(col1, col2, col3 = nil, col1rows = nil)
575
+ return nil if @pattern.supportLevel == :removed
576
+
524
577
  TR.new('align' => 'left') do
525
578
  columns = []
526
579
  attrs = { 'class' => 'tag' }
@@ -535,6 +588,8 @@ class TaskJuggler
535
588
  end
536
589
 
537
590
  def generateHTMLOptionalAttributesBox
591
+ return nil if @pattern.supportLevel == :removed
592
+
538
593
  # Box with attributes.
539
594
  unless @optionalAttributes.empty?
540
595
  @optionalAttributes.sort! do |a, b|
@@ -618,6 +673,8 @@ class TaskJuggler
618
673
  end
619
674
 
620
675
  def generateHTMLExampleBox
676
+ return nil if @pattern.supportLevel == :removed
677
+
621
678
  if @pattern.exampleFile
622
679
  exampleDir = AppConfig.dataDirs('test')[0] + "TestSuite/Syntax/Correct/"
623
680
  example = TjpExample.new
@@ -634,6 +691,37 @@ class TaskJuggler
634
691
  end
635
692
  end
636
693
 
694
+ def supportLevelMessage
695
+ case @pattern.supportLevel
696
+ when :experimental
697
+ "This keyword is currently in an experimental state. " +
698
+ "The implementation is probably still incomplete and " +
699
+ "use of this keyword may lead to wrong results. Do not " +
700
+ "use this keyword unless you were specifically directed " +
701
+ "by the developers to try it."
702
+ when :beta
703
+ "This keyword has not yet been fully tested yet. You are " +
704
+ "welcome to try it, but it may lead to wrong results. " +
705
+ "The syntax may still change with future versions. " +
706
+ "The developers appreciate any feedback on this keyword."
707
+ when :deprecated
708
+ "This keyword should no longer be used. It will be removed " +
709
+ "in future versions of this software."
710
+ when :removed
711
+ "This keyword is no longer supported."
712
+ end
713
+ end
714
+
715
+ def useInsteadMessage
716
+ return nil if @seeAlso.empty?
717
+
718
+ descr = [ 'Use ' ]
719
+ @seeAlso.each do |a|
720
+ descr << ', ' unless descr.length <= 1
721
+ descr << A.new('href' => "#{a.keyword}.html") { a.title }
722
+ end
723
+ descr << " instead."
724
+ end
637
725
  end
638
726
 
639
727
  end