taskjuggler 3.1.0 → 3.2.0

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