taskjuggler 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. data/CHANGELOG +44 -0
  2. data/bin/tj3webd +4 -0
  3. data/data/css/tjreport.css +14 -5
  4. data/data/tjp.vim +22 -7
  5. data/examples/Fedora-20/reports.tji +2 -4
  6. data/examples/Scrum/Product Burndown.csv +26 -0
  7. data/examples/Scrum/Sprint 1 Burndown.csv +26 -0
  8. data/examples/Scrum/Sprint 2 Burndown.csv +26 -0
  9. data/examples/Scrum/Sprint 3 Burndown.csv +26 -0
  10. data/examples/Scrum/scrum.tjp +141 -0
  11. data/examples/Tutorial/tutorial.tjp +13 -7
  12. data/lib/taskjuggler/Attributes.rb +2 -3
  13. data/lib/taskjuggler/HTMLDocument.rb +25 -18
  14. data/lib/taskjuggler/Journal.rb +85 -65
  15. data/lib/taskjuggler/KeywordDocumentation.rb +25 -13
  16. data/lib/taskjuggler/LeaveList.rb +1 -1
  17. data/lib/taskjuggler/Limits.rb +3 -5
  18. data/lib/taskjuggler/MessageHandler.rb +173 -19
  19. data/lib/taskjuggler/Painter.rb +75 -0
  20. data/lib/taskjuggler/Painter/BasicShapes.rb +76 -0
  21. data/lib/taskjuggler/Painter/Color.rb +273 -0
  22. data/lib/taskjuggler/Painter/Element.rb +56 -0
  23. data/lib/taskjuggler/Painter/FontData.rb +221 -0
  24. data/lib/taskjuggler/Painter/FontMetrics.rb +125 -0
  25. data/lib/taskjuggler/Painter/FontMetricsData.rb +151 -0
  26. data/lib/taskjuggler/Painter/Group.rb +77 -0
  27. data/lib/taskjuggler/Painter/Points.rb +47 -0
  28. data/lib/taskjuggler/Painter/Primitives.rb +100 -0
  29. data/lib/taskjuggler/Painter/SVGSupport.rb +36 -0
  30. data/lib/taskjuggler/Painter/Text.rb +36 -0
  31. data/lib/taskjuggler/Project.rb +46 -29
  32. data/lib/taskjuggler/ProjectFileParser.rb +24 -22
  33. data/lib/taskjuggler/ProjectFileScanner.rb +2 -2
  34. data/lib/taskjuggler/PropertyTreeNode.rb +26 -34
  35. data/lib/taskjuggler/Query.rb +8 -5
  36. data/lib/taskjuggler/RealFormat.rb +3 -0
  37. data/lib/taskjuggler/Resource.rb +3 -5
  38. data/lib/taskjuggler/ResourceScenario.rb +19 -7
  39. data/lib/taskjuggler/RichText.rb +4 -6
  40. data/lib/taskjuggler/RichText/FunctionExample.rb +1 -1
  41. data/lib/taskjuggler/RichText/FunctionHandler.rb +5 -6
  42. data/lib/taskjuggler/RichText/Parser.rb +4 -6
  43. data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
  44. data/lib/taskjuggler/RichText/RTFQuery.rb +2 -3
  45. data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
  46. data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -2
  47. data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
  48. data/lib/taskjuggler/RichText/Scanner.rb +6 -6
  49. data/lib/taskjuggler/RichText/Snip.rb +1 -2
  50. data/lib/taskjuggler/RuntimeConfig.rb +9 -6
  51. data/lib/taskjuggler/ScenarioData.rb +4 -3
  52. data/lib/taskjuggler/Scoreboard.rb +6 -0
  53. data/lib/taskjuggler/SheetHandlerBase.rb +25 -8
  54. data/lib/taskjuggler/SimpleQueryExpander.rb +14 -5
  55. data/lib/taskjuggler/SyntaxReference.rb +1 -2
  56. data/lib/taskjuggler/TableColumnSorter.rb +84 -0
  57. data/lib/taskjuggler/Task.rb +3 -5
  58. data/lib/taskjuggler/TaskJuggler.rb +36 -29
  59. data/lib/taskjuggler/TaskScenario.rb +154 -66
  60. data/lib/taskjuggler/TextParser.rb +24 -17
  61. data/lib/taskjuggler/TextParser/Scanner.rb +16 -11
  62. data/lib/taskjuggler/TextParser/SourceFileInfo.rb +20 -15
  63. data/lib/taskjuggler/TimeSheets.rb +6 -12
  64. data/lib/taskjuggler/Tj3AppBase.rb +35 -16
  65. data/lib/taskjuggler/Tj3Config.rb +1 -1
  66. data/lib/taskjuggler/TjpSyntaxRules.rb +239 -49
  67. data/lib/taskjuggler/XMLElement.rb +9 -2
  68. data/lib/taskjuggler/apps/Tj3.rb +43 -37
  69. data/lib/taskjuggler/apps/Tj3Client.rb +62 -112
  70. data/lib/taskjuggler/apps/Tj3Daemon.rb +66 -29
  71. data/lib/taskjuggler/apps/Tj3Man.rb +5 -5
  72. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +10 -13
  73. data/lib/taskjuggler/apps/Tj3SsSender.rb +13 -16
  74. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +10 -13
  75. data/lib/taskjuggler/apps/Tj3TsSender.rb +12 -15
  76. data/lib/taskjuggler/apps/Tj3TsSummary.rb +12 -15
  77. data/lib/taskjuggler/apps/Tj3WebD.rb +99 -0
  78. data/lib/taskjuggler/daemon/Daemon.rb +50 -10
  79. data/lib/taskjuggler/daemon/DaemonConnector.rb +127 -0
  80. data/lib/taskjuggler/daemon/ProcessIntercom.rb +36 -21
  81. data/lib/taskjuggler/daemon/ProjectBroker.rb +122 -112
  82. data/lib/taskjuggler/daemon/ProjectServer.rb +78 -46
  83. data/lib/taskjuggler/daemon/ReportServer.rb +52 -28
  84. data/lib/taskjuggler/daemon/ReportServlet.rb +92 -21
  85. data/lib/taskjuggler/daemon/WebServer.rb +75 -22
  86. data/lib/taskjuggler/daemon/WelcomePage.rb +1 -0
  87. data/lib/taskjuggler/reports/AccountListRE.rb +3 -3
  88. data/lib/taskjuggler/reports/CSVFile.rb +9 -2
  89. data/lib/taskjuggler/reports/ChartPlotter.rb +453 -0
  90. data/lib/taskjuggler/reports/Navigator.rb +1 -0
  91. data/lib/taskjuggler/reports/NikuReport.rb +4 -4
  92. data/lib/taskjuggler/reports/Report.rb +6 -18
  93. data/lib/taskjuggler/reports/ReportBase.rb +9 -9
  94. data/lib/taskjuggler/reports/ReportContext.rb +2 -2
  95. data/lib/taskjuggler/reports/StatusSheetReport.rb +6 -6
  96. data/lib/taskjuggler/reports/TableReport.rb +24 -15
  97. data/lib/taskjuggler/reports/TimeSheetReport.rb +5 -5
  98. data/lib/taskjuggler/reports/TraceReport.rb +251 -0
  99. data/lib/tj3webd.rb +17 -0
  100. data/manual/Day_To_Day_Juggling +10 -3
  101. data/manual/Installation +38 -19
  102. data/manual/Software +25 -19
  103. data/manual/Tutorial +119 -110
  104. data/manual/html/Day_To_Day_Juggling.html +7 -5
  105. data/manual/html/Getting_Started.html +4 -4
  106. data/manual/html/How_To_Contribute.html +4 -4
  107. data/manual/html/Installation.html +19 -11
  108. data/manual/html/Intro.html +4 -4
  109. data/manual/html/Reporting_Bugs.html +4 -4
  110. data/manual/html/Rich_Text_Attributes.html +4 -4
  111. data/manual/html/Software.html +15 -11
  112. data/manual/html/TaskJuggler_2x_Migration.html +4 -4
  113. data/manual/html/TaskJuggler_Internals.html +4 -4
  114. data/manual/html/The_TaskJuggler_Syntax.html +4 -4
  115. data/manual/html/Tutorial.html +41 -32
  116. data/manual/html/account.html +4 -4
  117. data/manual/html/account.task.html +4 -4
  118. data/manual/html/accountprefix.html +4 -4
  119. data/manual/html/accountreport.html +27 -9
  120. data/manual/html/accountroot.html +5 -5
  121. data/manual/html/active.html +4 -4
  122. data/manual/html/adopt.task.html +4 -4
  123. data/manual/html/aggregate.html +4 -4
  124. data/manual/html/alert.html +4 -4
  125. data/manual/html/alertlevels.html +4 -4
  126. data/manual/html/allocate.html +5 -5
  127. data/manual/html/alphabet.html +4 -4
  128. data/manual/html/alternative.html +4 -4
  129. data/manual/html/author.html +4 -4
  130. data/manual/html/balance.html +5 -5
  131. data/manual/html/booking.resource.html +4 -4
  132. data/manual/html/booking.task.html +4 -4
  133. data/manual/html/caption.html +5 -5
  134. data/manual/html/cellcolor.column.html +43 -8
  135. data/manual/html/celltext.column.html +4 -4
  136. data/manual/html/center.html +5 -5
  137. data/manual/html/charge.html +4 -4
  138. data/manual/html/chargeset.html +4 -4
  139. data/manual/html/columnid.html +27 -15
  140. data/manual/html/columns.html +5 -5
  141. data/manual/html/complete.html +4 -4
  142. data/manual/html/copyright.html +4 -4
  143. data/manual/html/credits.html +4 -4
  144. data/manual/html/css/tjreport.css +14 -5
  145. data/manual/html/currency.html +4 -4
  146. data/manual/html/currencyformat.html +5 -5
  147. data/manual/html/dailymax.html +5 -5
  148. data/manual/html/dailymin.html +5 -5
  149. data/manual/html/dailyworkinghours.html +4 -4
  150. data/manual/html/date.extend.html +4 -4
  151. data/manual/html/date.html +5 -5
  152. data/manual/html/definitions.html +4 -4
  153. data/manual/html/depends.html +4 -4
  154. data/manual/html/details.html +4 -4
  155. data/manual/html/disabled.html +4 -4
  156. data/manual/html/duration.html +4 -4
  157. data/manual/html/efficiency.html +4 -4
  158. data/manual/html/effort.html +4 -4
  159. data/manual/html/email.html +4 -4
  160. data/manual/html/enabled.html +4 -4
  161. data/manual/html/end.column.html +4 -4
  162. data/manual/html/end.html +4 -4
  163. data/manual/html/end.limit.html +4 -4
  164. data/manual/html/end.report.html +5 -5
  165. data/manual/html/end.timesheet.html +4 -4
  166. data/manual/html/endcredit.html +4 -4
  167. data/manual/html/epilog.html +5 -5
  168. data/manual/html/export.html +4 -4
  169. data/manual/html/extend.html +4 -4
  170. data/manual/html/fail.html +43 -8
  171. data/manual/html/fdl.html +4 -4
  172. data/manual/html/flags.account.html +4 -4
  173. data/manual/html/flags.html +4 -4
  174. data/manual/html/flags.journalentry.html +4 -4
  175. data/manual/html/flags.report.html +5 -5
  176. data/manual/html/flags.resource.html +4 -4
  177. data/manual/html/flags.statussheet.html +4 -4
  178. data/manual/html/flags.task.html +4 -4
  179. data/manual/html/flags.timesheet.html +4 -4
  180. data/manual/html/fontcolor.column.html +43 -8
  181. data/manual/html/footer.html +5 -5
  182. data/manual/html/formats.html +5 -5
  183. data/manual/html/functions.html +4 -4
  184. data/manual/html/gapduration.html +4 -4
  185. data/manual/html/gaplength.html +4 -4
  186. data/manual/html/halign.center.html +4 -4
  187. data/manual/html/halign.column.html +43 -8
  188. data/manual/html/halign.left.html +4 -4
  189. data/manual/html/halign.right.html +4 -4
  190. data/manual/html/hasalert.html +4 -4
  191. data/manual/html/header.html +5 -5
  192. data/manual/html/headline.html +7 -7
  193. data/manual/html/height.html +72 -0
  194. data/manual/html/hideaccount.html +46 -11
  195. data/manual/html/hidejournalentry.html +5 -5
  196. data/manual/html/hidereport.html +43 -8
  197. data/manual/html/hideresource.html +44 -9
  198. data/manual/html/hidetask.html +44 -9
  199. data/manual/html/icalreport.html +4 -4
  200. data/manual/html/include.macro.html +4 -4
  201. data/manual/html/include.project.html +4 -4
  202. data/manual/html/include.properties.html +4 -4
  203. data/manual/html/index.html +2 -1
  204. data/manual/html/inherit.extend.html +4 -4
  205. data/manual/html/interval1.html +4 -4
  206. data/manual/html/interval2.html +4 -4
  207. data/manual/html/interval3.html +4 -4
  208. data/manual/html/interval4.html +4 -4
  209. data/manual/html/isactive.html +4 -4
  210. data/manual/html/ischildof.html +4 -4
  211. data/manual/html/isdependencyof.html +4 -4
  212. data/manual/html/isdutyof.html +4 -4
  213. data/manual/html/isfeatureof.html +4 -4
  214. data/manual/html/isleaf.html +4 -4
  215. data/manual/html/ismilestone.html +4 -4
  216. data/manual/html/isongoing.html +4 -4
  217. data/manual/html/isresource.html +4 -4
  218. data/manual/html/isresponsibilityof.html +4 -4
  219. data/manual/html/istask.html +4 -4
  220. data/manual/html/journalattributes.html +11 -7
  221. data/manual/html/journalentry.html +4 -4
  222. data/manual/html/journalmode.html +5 -5
  223. data/manual/html/leaveallowance.html +5 -5
  224. data/manual/html/leaves.html +5 -6
  225. data/manual/html/left.html +5 -5
  226. data/manual/html/length.html +4 -4
  227. data/manual/html/limits.allocate.html +4 -4
  228. data/manual/html/limits.html +4 -4
  229. data/manual/html/limits.resource.html +4 -4
  230. data/manual/html/limits.task.html +4 -4
  231. data/manual/html/listitem.column.html +4 -4
  232. data/manual/html/listtype.column.html +4 -4
  233. data/manual/html/loadunit.html +5 -5
  234. data/manual/html/logicalexpression.html +8 -44
  235. data/manual/html/logicalflagexpression.html +4 -4
  236. data/manual/html/macro.html +4 -4
  237. data/manual/html/managers.html +4 -4
  238. data/manual/html/mandatory.html +4 -4
  239. data/manual/html/maxend.html +4 -4
  240. data/manual/html/maximum.html +5 -5
  241. data/manual/html/maxstart.html +4 -4
  242. data/manual/html/milestone.html +4 -4
  243. data/manual/html/minend.html +4 -4
  244. data/manual/html/minimum.html +5 -5
  245. data/manual/html/minstart.html +4 -4
  246. data/manual/html/monthlymax.html +5 -5
  247. data/manual/html/monthlymin.html +5 -5
  248. data/manual/html/navbar.html +10 -4
  249. data/manual/html/navigator.html +4 -4
  250. data/manual/html/newtask.html +4 -4
  251. data/manual/html/nikureport.html +4 -4
  252. data/manual/html/note.task.html +4 -4
  253. data/manual/html/now.html +4 -4
  254. data/manual/html/numberformat.html +5 -5
  255. data/manual/html/onend.html +4 -4
  256. data/manual/html/onstart.html +4 -4
  257. data/manual/html/opennodes.html +5 -5
  258. data/manual/html/overtime.booking.html +4 -4
  259. data/manual/html/period.column.html +4 -4
  260. data/manual/html/period.limit.html +4 -4
  261. data/manual/html/period.report.html +5 -5
  262. data/manual/html/period.task.html +4 -4
  263. data/manual/html/persistent.html +4 -4
  264. data/manual/html/precedes.html +4 -4
  265. data/manual/html/priority.html +4 -4
  266. data/manual/html/priority.timesheet.html +4 -4
  267. data/manual/html/project.html +4 -4
  268. data/manual/html/projectid.html +4 -4
  269. data/manual/html/projectid.task.html +4 -4
  270. data/manual/html/projectids.html +4 -4
  271. data/manual/html/projection.html +5 -7
  272. data/manual/html/prolog.html +5 -5
  273. data/manual/html/properties.html +11 -5
  274. data/manual/html/purge.html +5 -5
  275. data/manual/html/rate.html +4 -4
  276. data/manual/html/rate.resource.html +4 -4
  277. data/manual/html/reference.extend.html +4 -4
  278. data/manual/html/remaining.html +4 -4
  279. data/manual/html/replace.html +4 -4
  280. data/manual/html/reportprefix.html +4 -4
  281. data/manual/html/resource.html +4 -10
  282. data/manual/html/resourceattributes.html +4 -4
  283. data/manual/html/resourceprefix.html +4 -4
  284. data/manual/html/resourcereport.html +28 -10
  285. data/manual/html/resourceroot.html +5 -5
  286. data/manual/html/resources.limit.html +4 -4
  287. data/manual/html/responsible.html +4 -4
  288. data/manual/html/richtext.extend.html +4 -4
  289. data/manual/html/right.html +5 -5
  290. data/manual/html/rollupaccount.html +44 -9
  291. data/manual/html/rollupresource.html +44 -9
  292. data/manual/html/rolluptask.html +44 -9
  293. data/manual/html/scale.column.html +4 -4
  294. data/manual/html/scenario.html +4 -22
  295. data/manual/html/scenario.ical.html +4 -4
  296. data/manual/html/scenarios.export.html +4 -4
  297. data/manual/html/scenarios.html +5 -5
  298. data/manual/html/scenariospecific.extend.html +4 -4
  299. data/manual/html/scheduled.html +4 -4
  300. data/manual/html/scheduling.html +4 -4
  301. data/manual/html/select.html +4 -4
  302. data/manual/html/selfcontained.html +5 -5
  303. data/manual/html/shift.allocate.html +4 -4
  304. data/manual/html/shift.html +4 -4
  305. data/manual/html/shift.resource.html +5 -5
  306. data/manual/html/shift.task.html +4 -4
  307. data/manual/html/shift.timesheet.html +4 -4
  308. data/manual/html/shifts.allocate.html +4 -4
  309. data/manual/html/shifts.resource.html +4 -4
  310. data/manual/html/shifts.task.html +4 -4
  311. data/manual/html/shorttimeformat.html +4 -4
  312. data/manual/html/sloppy.booking.html +4 -4
  313. data/manual/html/sloppy.projection.html +5 -5
  314. data/manual/html/sortaccounts.html +5 -5
  315. data/manual/html/sortjournalentries.html +5 -5
  316. data/manual/html/sortresources.html +5 -5
  317. data/manual/html/sorttasks.html +5 -5
  318. data/manual/html/start.column.html +4 -4
  319. data/manual/html/start.html +4 -4
  320. data/manual/html/start.limit.html +4 -4
  321. data/manual/html/start.report.html +5 -5
  322. data/manual/html/startcredit.html +4 -4
  323. data/manual/html/status.statussheet.html +4 -4
  324. data/manual/html/status.timesheet.html +4 -4
  325. data/manual/html/statussheet.html +4 -4
  326. data/manual/html/statussheetreport.html +4 -4
  327. data/manual/html/strict.projection.html +5 -5
  328. data/manual/html/summary.html +4 -4
  329. data/manual/html/supplement.html +4 -4
  330. data/manual/html/supplement.resource.html +4 -10
  331. data/manual/html/supplement.task.html +4 -28
  332. data/manual/html/tagfile.html +4 -4
  333. data/manual/html/task.html +4 -28
  334. data/manual/html/task.statussheet.html +4 -4
  335. data/manual/html/task.timesheet.html +4 -4
  336. data/manual/html/taskattributes.html +4 -4
  337. data/manual/html/taskprefix.html +4 -4
  338. data/manual/html/taskreport.html +28 -10
  339. data/manual/html/taskroot.html +5 -5
  340. data/manual/html/text.extend.html +4 -4
  341. data/manual/html/textreport.html +27 -9
  342. data/manual/html/timeformat.html +5 -5
  343. data/manual/html/timeoff.nikureport.html +4 -4
  344. data/manual/html/timesheet.html +4 -4
  345. data/manual/html/timesheetreport.html +23 -5
  346. data/manual/html/timezone.export.html +4 -4
  347. data/manual/html/timezone.html +4 -4
  348. data/manual/html/timezone.report.html +5 -5
  349. data/manual/html/timezone.shift.html +4 -4
  350. data/manual/html/timingresolution.html +4 -4
  351. data/manual/html/title.column.html +4 -4
  352. data/manual/html/title.html +5 -5
  353. data/manual/html/toc.html +207 -179
  354. data/manual/html/tooltip.column.html +45 -10
  355. data/manual/html/tracereport.html +405 -0
  356. data/manual/html/trackingscenario.html +6 -6
  357. data/manual/html/treelevel.html +4 -4
  358. data/manual/html/vacation.html +4 -4
  359. data/manual/html/vacation.resource.html +4 -4
  360. data/manual/html/vacation.shift.html +4 -4
  361. data/manual/html/warn.html +43 -8
  362. data/manual/html/weeklymax.html +5 -5
  363. data/manual/html/weeklymin.html +5 -5
  364. data/manual/html/weekstartsmonday.html +4 -4
  365. data/manual/html/weekstartssunday.html +6 -6
  366. data/manual/html/width.column.html +6 -6
  367. data/manual/html/width.html +72 -0
  368. data/manual/html/work.html +4 -4
  369. data/manual/html/workinghours.project.html +4 -4
  370. data/manual/html/workinghours.resource.html +4 -4
  371. data/manual/html/workinghours.shift.html +4 -4
  372. data/manual/html/yearlyworkingdays.html +4 -4
  373. data/spec/Color_spec.rb +60 -0
  374. data/spec/ProjectBroker_spec.rb +3 -2
  375. data/spec/StatusSheets_spec.rb +5 -4
  376. data/spec/TableColumnSorter_spec.rb +78 -0
  377. data/spec/TimeSheets_spec.rb +6 -2
  378. data/spec/Tj3Daemon_spec.rb +2 -2
  379. data/spec/TraceReport_spec.rb +117 -0
  380. data/taskjuggler.gemspec +1 -1
  381. data/test/MessageChecker.rb +3 -1
  382. data/test/ReferenceGenerator.rb +1 -1
  383. data/test/TestSuite/CSV-Reports/Leave.tjp +1 -1
  384. data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +3 -0
  385. data/test/TestSuite/CSV-Reports/refs/taskcounter.csv +9 -0
  386. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +19 -16
  387. data/test/TestSuite/CSV-Reports/refs/weekly.csv +1 -0
  388. data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +14 -2
  389. data/test/TestSuite/Export-Reports/refs/tutorial.tjp +98 -86
  390. data/test/TestSuite/Scheduler/Correct/Leaves.tjp +25 -0
  391. data/test/TestSuite/Syntax/Correct/Leave.tjp +1 -1
  392. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +9 -1
  393. data/test/TestSuite/Syntax/Correct/TraceReport.tjp +10 -0
  394. data/test/TestSuite/Syntax/Correct/tutorial.tjp +10 -4
  395. data/test/test_CSV-Reports.rb +3 -3
  396. data/test/test_Export-Reports.rb +91 -86
  397. data/test/test_Journal.rb +15 -12
  398. data/test/test_Limits.rb +3 -3
  399. data/test/test_Project.rb +1 -2
  400. data/test/test_ProjectFileScanner.rb +1 -1
  401. data/test/test_PropertySet.rb +1 -1
  402. data/test/test_Query.rb +5 -6
  403. data/test/test_ReportGenerator.rb +15 -7
  404. data/test/test_RichText.rb +4 -3
  405. data/test/test_Scheduler.rb +19 -7
  406. data/test/test_ShiftAssignments.rb +2 -2
  407. data/test/test_SimpleQueryExpander.rb +29 -2
  408. data/test/test_Syntax.rb +14 -5
  409. metadata +49 -10
  410. data/lib/taskjuggler/LogFile.rb +0 -73
@@ -42,7 +42,7 @@ copyright "© 2002 Crappy Software, Inc."
42
42
  rate 390.0
43
43
 
44
44
  # Register Good Friday as a global holiday for all resources.
45
- vacation "Good Friday" 2002-03-29
45
+ leaves holiday "Good Friday" 2002-03-29
46
46
  flags team
47
47
 
48
48
  # This is one way to form teams
@@ -83,7 +83,7 @@ resource dev "Developers" {
83
83
  resource dev3 "Klaus Müller" {
84
84
  email "Klaus.Mueller@crappysoftware.com"
85
85
  Phone "x490"
86
- vacation 2002-02-01 - 2002-02-05
86
+ leaves annual 2002-02-01 - 2002-02-05
87
87
  }
88
88
  flags team
89
89
  }
@@ -99,7 +99,7 @@ resource misc "The Others" {
99
99
  email "sung@crappysoftware.com"
100
100
  Phone "x482"
101
101
  rate 300.0
102
- vacation 2002-03-11 - 2002-03-16
102
+ leaves annual 2002-03-11 - 2002-03-16
103
103
  }
104
104
 
105
105
  flags team
@@ -174,6 +174,12 @@ task AcSo "Accounting Software" {
174
174
  delayed:effort 40d
175
175
  depends !database, !backend
176
176
  allocate dev2, dev3
177
+ # Resource dev2 should only work 6 hours per day on this task.
178
+ limits {
179
+ dailymax 6h {
180
+ resources dev2
181
+ }
182
+ }
177
183
  }
178
184
 
179
185
  task backend "Back-End Functions" {
@@ -290,7 +296,7 @@ task AcSo "Accounting Software" {
290
296
  # results.
291
297
 
292
298
  navigator navbar {
293
- hidereport 0
299
+ hidereport @none
294
300
  }
295
301
 
296
302
  macro TaskTip [
@@ -378,7 +384,7 @@ taskreport overview "" {
378
384
  # of the date. %a is the tag for this.
379
385
  timeformat "%a %Y-%m-%d"
380
386
  loadunit days
381
- hideresource 1
387
+ hideresource @all
382
388
  balance cost rev
383
389
  caption 'All effort values are in man days.'
384
390
 
@@ -459,7 +465,7 @@ taskreport deliveries "" {
459
465
  columns bsi { title 'WBS' }, name, start, end, note { width 150 }, complete,
460
466
  chart { ${TaskTip} }
461
467
  taskroot AcSo.deliveries
462
- hideresource 1
468
+ hideresource @all
463
469
  scenarios plan, delayed
464
470
  }
465
471
  # A list of all employees with their contact details.
@@ -473,7 +479,7 @@ resourcereport contactList "" {
473
479
  chart { scale day }
474
480
  hideresource ~isleaf()
475
481
  sortresources name.up
476
- hidetask 1
482
+ hidetask @all
477
483
  }
478
484
 
479
485
  # A graph showing resource allocation. It identifies whether each
@@ -499,9 +499,8 @@ class TaskJuggler
499
499
  if query
500
500
  get.each do |r|
501
501
  if query.listItem
502
- rti = RichText.new(query.listItem, RTFHandlers.create(r.project),
503
- r.project.messageHandler).
504
- generateIntermediateFormat
502
+ rti = RichText.new(query.listItem, RTFHandlers.create(r.project)).
503
+ generateIntermediateFormat
505
504
  q = query.dup
506
505
  q.property = r
507
506
  rti.setQuery(q)
@@ -28,30 +28,35 @@ class TaskJuggler
28
28
  # When creating a HTMLDocument the caller can specify the type of HTML that
29
29
  # will be used. The constructor then generates the proper XML declaration
30
30
  # for it. :strict, :transitional and :frameset are supported for _docType_.
31
- def initialize(docType = :strict, &block)
31
+ def initialize(docType = :html5, &block)
32
32
  super(&block)
33
33
 
34
- @elements << XMLBlob.new('<?xml version="1.0" encoding="UTF-8"?>')
35
- case docType
36
- when :strict
37
- dtdRef = 'Strict'
38
- url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
39
- when :transitional
40
- dtdRef = 'Transitional'
41
- url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
42
- when :frameset
43
- dtdRef = 'Frameset'
44
- url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'
34
+ unless docType == :html5
35
+ @elements << XMLBlob.new('<?xml version="1.0" encoding="UTF-8"?>')
36
+ case docType
37
+ when :strict
38
+ dtdRef = 'Strict'
39
+ url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
40
+ when :transitional
41
+ dtdRef = 'Transitional'
42
+ url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
43
+ when :frameset
44
+ dtdRef = 'Frameset'
45
+ url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'
46
+ else
47
+ raise "Unsupported docType"
48
+ end
49
+ @elements << XMLBlob.new(
50
+ '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ' +
51
+ "#{dtdRef}//EN\" \"#{url}\">")
45
52
  else
46
- raise "Unsupported docType"
53
+ @elements << XMLBlob.new('<!DOCTYPE>')
47
54
  end
48
- @elements << XMLBlob.new('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ' +
49
- "#{dtdRef}//EN\" \"#{url}\">")
50
55
  @elements << XMLComment.new('This file has been generated by ' +
51
56
  "#{AppConfig.appName} v#{AppConfig.version}")
52
- @elements << (@html =
53
- HTML.new({ 'xml:lang' => 'en', 'lang' => 'en',
54
- 'xmlns' => 'http://www.w3.org/1999/xhtml' }))
57
+ attrs = { 'xml:lang' => 'en', 'lang' => 'en' }
58
+ attrs['xmlns'] ='http://www.w3.org/1999/xhtml' unless docType == :html5
59
+ @elements << (@html = HTML.new(attrs))
55
60
  end
56
61
 
57
62
  # Generate the 'head' section of an HTML page.
@@ -61,6 +66,8 @@ class TaskJuggler
61
66
  TITLE.new { title },
62
67
  META.new({ 'http-equiv' => 'Content-Type',
63
68
  'content' => 'text/html; charset=utf-8' }),
69
+ # Ugly hack to force IE into IE-9 mode.
70
+ META.new({ 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=9' })
64
71
  ]
65
72
  # Include optional meta tags.
66
73
  metaTags.each do |name, content|
@@ -11,6 +11,8 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
+ require 'taskjuggler/MessageHandler'
15
+
14
16
  class TaskJuggler
15
17
 
16
18
  # A JournalEntry stores some RichText strings to describe a status or a
@@ -342,6 +344,8 @@ class TaskJuggler
342
344
  # information.
343
345
  class Journal
344
346
 
347
+ include MessageHandler
348
+
345
349
  # Create a new Journal object.
346
350
  def initialize
347
351
  # This list holds all entries.
@@ -435,15 +439,14 @@ class TaskJuggler
435
439
  if query.property
436
440
  if query.property.is_a?(Task)
437
441
  entries += currentEntriesR(query.end, query.property, 0,
438
- query.start, query.hideJournalEntry)
442
+ query.start, query)
439
443
  end
440
444
  else
441
445
  query.project.tasks.each do |task|
442
446
  # We only care about top-level tasks.
443
447
  next if task.parent
444
448
 
445
- entries += currentEntriesR(query.end, task, 0, query.start,
446
- query.hideJournalEntry)
449
+ entries += currentEntriesR(query.end, task, 0, query.start, query)
447
450
  # Eliminate duplicates due to entries from adopted tasks
448
451
  entries.uniq!
449
452
  end
@@ -455,15 +458,14 @@ class TaskJuggler
455
458
  if query.property
456
459
  if query.property.is_a?(Task)
457
460
  entries += alertEntries(query.end, query.property, 1, query.start,
458
- query.hideJournalEntry)
461
+ query)
459
462
  end
460
463
  else
461
464
  query.project.tasks.each do |task|
462
465
  # We only care about top-level tasks.
463
466
  next if task.parent
464
467
 
465
- entries += alertEntries(query.end, task, 1, query.start,
466
- query.hideJournalEntry)
468
+ entries += alertEntries(query.end, task, 1, query.start, query)
467
469
  # Eliminate duplicates due to entries from adopted tasks
468
470
  entries.uniq!
469
471
  end
@@ -485,11 +487,9 @@ class TaskJuggler
485
487
 
486
488
  # Now convert the RichText markup String into RichTextIntermediate
487
489
  # format.
488
- unless (rti = RichText.new(rText, RTFHandlers.create(query.project),
489
- query.project.messageHandler).
490
+ unless (rti = RichText.new(rText, RTFHandlers.create(query.project)).
490
491
  generateIntermediateFormat)
491
- query.project.warning('ptn_journal',
492
- "Syntax error in journal: #{rText}")
492
+ warning('ptn_journal', "Syntax error in journal: #{rText}")
493
493
  return nil
494
494
  end
495
495
  # No section numbers, please!
@@ -579,12 +579,12 @@ class TaskJuggler
579
579
  # If the property does not have any JournalEntry objects or they are out
580
580
  # of date compared to the child properties, the level is computed based on
581
581
  # the highest level of the children. Only take the entries that are not
582
- # filtered by _logExp_ into account.
583
- def alertLevel(date, property, logExp)
582
+ # filtered by _query_.hideJournalEntry into account.
583
+ def alertLevel(date, property, query)
584
584
  maxLevel = 0
585
585
  # Gather all the current (as of the specified _date_) JournalEntry
586
586
  # objects for the property and than find the highest level.
587
- currentEntriesR(date, property, 0, nil, logExp).each do |e|
587
+ currentEntriesR(date, property, 0, nil, query).each do |e|
588
588
  maxLevel = e.alertLevel if maxLevel < e.alertLevel
589
589
  end
590
590
  maxLevel
@@ -594,12 +594,12 @@ class TaskJuggler
594
594
  # _date_, are for _property_ or any of its childs, have at least _level_
595
595
  # alert and are after _minDate_. We only return those entries with the
596
596
  # highest overall alert level.
597
- def alertEntries(date, property, minLevel, minDate, logExp)
597
+ def alertEntries(date, property, minLevel, minDate, query)
598
598
  maxLevel = 0
599
599
  entries = []
600
600
  # Gather all the current (as of the specified _date_) JournalEntry
601
601
  # objects for the property and than find the highest level.
602
- currentEntriesR(date, property, minLevel, minDate, logExp).each do |e|
602
+ currentEntriesR(date, property, minLevel, minDate, query).each do |e|
603
603
  if maxLevel < e.alertLevel
604
604
  maxLevel = e.alertLevel
605
605
  entries = [ e ]
@@ -653,62 +653,82 @@ class TaskJuggler
653
653
  # property unless there is a property in the sub-tree specified by the
654
654
  # root _property_ with more up-to-date entries. The result is a
655
655
  # JournalEntryList.
656
- def currentEntriesR(date, property, minLevel = 0, minDate = nil,
657
- logExp = nil)
658
- # See if this property has any current JournalEntry objects.
659
- pEntries = getEntries(property) ? getEntries(property).last(date) :
660
- JournalEntryList.new
661
- # Remove entries below the minium alert level or before the timeout
662
- # date.
663
- pEntries.delete_if do |e|
664
- e.headline.empty? || e.alertLevel < minLevel ||
665
- (e.alertLevel == minLevel && minDate && e.date < minDate)
666
- end
656
+ def currentEntriesR(date, property, minLevel, minDate, query)
657
+ DataCache.instance.cached(self, :currentEntriesR, date, property,
658
+ minLevel, minDate, query) do
659
+ # See if this property has any current JournalEntry objects.
660
+ pEntries = getEntries(property) ? getEntries(property).last(date) :
661
+ JournalEntryList.new
662
+ # Remove entries below the minium alert level or before the timeout
663
+ # date.
664
+ pEntries.delete_if do |e|
665
+ e.headline.empty? || e.alertLevel < minLevel ||
666
+ (e.alertLevel == minLevel && minDate && e.date < minDate)
667
+ end
667
668
 
668
- # Determine the highest alert level of the pEntries.
669
- maxPAlertLevel = 0
670
- pEntries.each do |e|
671
- maxPAlertLevel = e.alertLevel if e.alertLevel > maxPAlertLevel
672
- end
669
+ # Determine the highest alert level of the pEntries.
670
+ maxPAlertLevel = 0
671
+ pEntries.each do |e|
672
+ maxPAlertLevel = e.alertLevel if e.alertLevel > maxPAlertLevel
673
+ end
673
674
 
674
- cEntries = JournalEntryList.new
675
- latestDate = nil
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
-
681
- # Now gather all current entries of the child properties and find the
682
- # date that is closest to and right before the given _date_.
683
- property.kids.each do |p|
684
- currentEntriesR(date, p, minLevel, minDate).each do |e|
685
- # Find the date of the most recent entry.
686
- latestDate = e.date if latestDate.nil? || e.date > latestDate
687
- # Find the highest alert level.
688
- maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
689
- cEntries << e
675
+ cEntries = JournalEntryList.new
676
+ latestDate = nil
677
+ maxAlertLevel = 0
678
+ # If we have an entry from this property, we only care about child
679
+ # entries that are from a later date.
680
+ minDate = pEntries.first.date + 1 unless pEntries.empty?
681
+
682
+ # Now gather all current entries of the child properties and find the
683
+ # date that is closest to and right before the given _date_.
684
+ property.kids.each do |p|
685
+ currentEntriesR(date, p, minLevel, minDate, query).each do |e|
686
+ # Find the date of the most recent entry.
687
+ latestDate = e.date if latestDate.nil? || e.date > latestDate
688
+ # Find the highest alert level.
689
+ maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
690
+ cEntries << e
691
+ end
690
692
  end
691
- end
692
693
 
693
- if !pEntries.empty? && (maxPAlertLevel > maxAlertLevel ||
694
- latestDate.nil? ||
695
- pEntries.first.date >= latestDate)
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
703
- end
694
+ # Only Task properties have dependencies.
695
+ #if property.is_a?(Task)
696
+ # # Now gather all current entries of the dependency properties and find
697
+ # # the date that is closest to and right before the given _date_.
698
+ # property['startpreds', query.scenarioIdx].each do |p, onEnd|
699
+ # # We only follow end->start dependencies.
700
+ # next unless onEnd
701
+
702
+ # currentEntriesR(date, p, minLevel, minDate, query).each do |e|
703
+ # # Find the date of the most recent entry.
704
+ # latestDate = e.date if latestDate.nil? || e.date > latestDate
705
+ # # Find the highest alert level.
706
+ # maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
707
+ # cEntries << e
708
+ # end
709
+ # end
710
+ #end
711
+
712
+ if !pEntries.empty? && (maxPAlertLevel > maxAlertLevel ||
713
+ latestDate.nil? ||
714
+ pEntries.first.date >= latestDate)
715
+ # If no child property has a more current JournalEntry or one with a
716
+ # higher alert level than this property and this property has
717
+ # JournalEntry objects, than those are taken.
718
+ entries = pEntries
719
+ else
720
+ # Otherwise we take the entries from the kids.
721
+ entries = cEntries
722
+ end
704
723
 
705
- # Remove all entries that are filtered by logExp.
706
- if logExp
707
- entries.delete_if { |e| hidden(e, logExp) }
708
- end
724
+ # Remove all entries that are filtered by query.hideJournalEntry.
725
+ if query.hideJournalEntry
726
+ entries.delete_if { |e| hidden(e, query.hideJournalEntry) }
727
+ end
709
728
 
710
- # Otherwise return the list provided by the childen.
711
- entries
729
+ # Otherwise return the list provided by the childen.
730
+ entries
731
+ end
712
732
  end
713
733
 
714
734
  private
@@ -12,6 +12,7 @@
12
12
  #
13
13
 
14
14
  require 'term/ansicolor'
15
+ require 'taskjuggler/MessageHandler'
15
16
  require 'taskjuggler/HTMLDocument'
16
17
  require 'taskjuggler/RichText'
17
18
  require 'taskjuggler/TjpExample'
@@ -34,6 +35,7 @@ class TaskJuggler
34
35
 
35
36
  include HTMLElements
36
37
  include Term::ANSIColor
38
+ include MessageHandler
37
39
 
38
40
  attr_reader :keyword, :names, :pattern, :references, :optionalAttributes
39
41
  attr_accessor :contexts, :scenarioSpecific, :inheritedFromProject,
@@ -46,7 +48,6 @@ class TaskJuggler
46
48
  # _pattern_. _optAttrPatterns_ is an Array with references to
47
49
  # TextParser::Patterns that are optional attributes to this keyword.
48
50
  def initialize(rule, pattern, syntax, args, optAttrPatterns, manual)
49
- @messageHandler = MessageHandler.new(true)
50
51
  @rule = rule
51
52
  @pattern = pattern
52
53
  # The unique identifier. Usually the attribute or property name. To
@@ -160,7 +161,7 @@ class TaskJuggler
160
161
  end
161
162
  end
162
163
  if property
163
- project = Project.new('id', 'dummy', '1.0', nil)
164
+ project = Project.new('id', 'dummy', '1.0')
164
165
  propertySet = case property
165
166
  when 'task'
166
167
  project.tasks
@@ -339,7 +340,7 @@ class TaskJuggler
339
340
  # Return a String that represents the keyword documentation in an XML
340
341
  # formatted form.
341
342
  def generateHTML(directory)
342
- html = HTMLDocument.new(:strict)
343
+ html = HTMLDocument.new
343
344
  head = html.generateHead(keyword,
344
345
  { 'description' => 'The TaskJuggler Manual',
345
346
  'keywords' =>
@@ -406,10 +407,9 @@ class TaskJuggler
406
407
  # catches all RichTextScanner processing problems and converts the exception
407
408
  # data into an error message.
408
409
  def newRichText(text)
409
- rText = RichText.new(text, [], @messageHandler)
410
+ rText = RichText.new(text, [])
410
411
  unless (rti = rText.generateIntermediateFormat)
411
- @messageHandler.error('rich_text',
412
- "Error in RichText of rule #{@keyword}")
412
+ error('rich_text', "Error in RichText of rule #{@keyword}")
413
413
  end
414
414
  @references += rti.internalReferences
415
415
  rti
@@ -545,17 +545,18 @@ class TaskJuggler
545
545
  end
546
546
 
547
547
  def generateHTMLContextLine
548
- if @contexts.empty?
548
+ descr = []
549
+ @contexts.each do |c|
550
+ next if [ :deprecated, :removed ].include?(c.pattern.supportLevel)
551
+
552
+ descr << ', ' unless descr.empty?
553
+ descr << A.new('href' => "#{c.keyword}.html") { c.title }
554
+ end
555
+ if descr.empty?
549
556
  descr = A.new('href' =>
550
557
  'Getting_Started.html#Structure_of_a_TJP_File') do
551
558
  'Global scope'
552
559
  end
553
- else
554
- descr = []
555
- @contexts.each do |c|
556
- descr << ', ' unless descr.empty?
557
- descr << A.new('href' => "#{c.keyword}.html") { c.title }
558
- end
559
560
  end
560
561
  generateHTMLTableLine('Context', descr)
561
562
  end
@@ -564,6 +565,8 @@ class TaskJuggler
564
565
  unless @seeAlso.empty?
565
566
  descr = []
566
567
  @seeAlso.each do |a|
568
+ next if [ :deprecated, :removed ].include?(a.pattern.supportLevel)
569
+
567
570
  descr << ', ' unless descr.empty?
568
571
  descr << A.new('href' => "#{a.keyword}.html") { a.title }
569
572
  end
@@ -629,6 +632,10 @@ class TaskJuggler
629
632
  end
630
633
 
631
634
  @optionalAttributes.each do |attr|
635
+ if [ :deprecated, :removed ].include?(attr.pattern.supportLevel)
636
+ next
637
+ end
638
+
632
639
  rows << TR.new('align' => 'left') do
633
640
  [
634
641
  TD.new('align' => 'left', 'class' => 'descr') do
@@ -657,6 +664,11 @@ class TaskJuggler
657
664
  TD.new('class' => 'descr', 'style' => 'width:84%') do
658
665
  list = []
659
666
  @optionalAttributes.each do |attr|
667
+ if [ :deprecated, :removed ].
668
+ include?(attr.pattern.supportLevel)
669
+ next
670
+ end
671
+
660
672
  list << ', ' unless list.empty?
661
673
  list << A.new('href' => "#{attr.keyword}.html") do
662
674
  attr.title