taskjuggler 3.6.0 → 3.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (415) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +51 -0
  3. data/data/css/tjreport.css +4 -0
  4. data/data/tjp.vim +21 -15
  5. data/examples/ProjectTemplate/template.tjp +7 -7
  6. data/examples/Tutorial/tutorial.tjp +1 -1
  7. data/lib/taskjuggler/Allocation.rb +1 -1
  8. data/lib/taskjuggler/AttributeBase.rb +10 -4
  9. data/lib/taskjuggler/Attributes.rb +2 -2
  10. data/lib/taskjuggler/BatchProcessor.rb +1 -1
  11. data/lib/taskjuggler/Interval.rb +10 -12
  12. data/lib/taskjuggler/Journal.rb +2 -2
  13. data/lib/taskjuggler/LogicalFunction.rb +1 -1
  14. data/lib/taskjuggler/LogicalOperation.rb +7 -4
  15. data/lib/taskjuggler/MessageHandler.rb +1 -1
  16. data/lib/taskjuggler/PTNProxy.rb +1 -1
  17. data/lib/taskjuggler/Project.rb +27 -22
  18. data/lib/taskjuggler/PropertyList.rb +7 -1
  19. data/lib/taskjuggler/PropertySet.rb +1 -1
  20. data/lib/taskjuggler/PropertyTreeNode.rb +5 -3
  21. data/lib/taskjuggler/Query.rb +3 -3
  22. data/lib/taskjuggler/RealFormat.rb +1 -1
  23. data/lib/taskjuggler/Resource.rb +2 -2
  24. data/lib/taskjuggler/ResourceScenario.rb +37 -5
  25. data/lib/taskjuggler/RichText/Snip.rb +1 -1
  26. data/lib/taskjuggler/RuntimeConfig.rb +1 -1
  27. data/lib/taskjuggler/Scoreboard.rb +5 -2
  28. data/lib/taskjuggler/Shift.rb +2 -2
  29. data/lib/taskjuggler/ShiftAssignments.rb +1 -1
  30. data/lib/taskjuggler/TaskJuggler.rb +4 -4
  31. data/lib/taskjuggler/TextParser.rb +1 -1
  32. data/lib/taskjuggler/TextParser/Scanner.rb +3 -3
  33. data/lib/taskjuggler/TimeSheets.rb +2 -2
  34. data/lib/taskjuggler/Tj3AppBase.rb +23 -9
  35. data/lib/taskjuggler/Tj3Config.rb +5 -3
  36. data/lib/taskjuggler/TjpExample.rb +3 -1
  37. data/lib/taskjuggler/TjpSyntaxRules.rb +157 -130
  38. data/lib/taskjuggler/UTF8String.rb +3 -3
  39. data/lib/taskjuggler/WorkingHours.rb +3 -3
  40. data/lib/taskjuggler/XMLElement.rb +12 -1
  41. data/lib/taskjuggler/apps/Tj3.rb +3 -1
  42. data/lib/taskjuggler/apps/Tj3Client.rb +3 -2
  43. data/lib/taskjuggler/apps/Tj3Daemon.rb +3 -1
  44. data/lib/taskjuggler/apps/Tj3Man.rb +4 -2
  45. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +3 -1
  46. data/lib/taskjuggler/apps/Tj3SsSender.rb +3 -1
  47. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +3 -1
  48. data/lib/taskjuggler/apps/Tj3TsSender.rb +3 -1
  49. data/lib/taskjuggler/apps/Tj3TsSummary.rb +3 -1
  50. data/lib/taskjuggler/apps/Tj3WebD.rb +3 -1
  51. data/lib/taskjuggler/deep_copy.rb +1 -1
  52. data/lib/taskjuggler/reports/CSVFile.rb +3 -3
  53. data/lib/taskjuggler/reports/ChartPlotter.rb +1 -1
  54. data/lib/taskjuggler/reports/GanttChart.rb +8 -2
  55. data/lib/taskjuggler/reports/GanttHeader.rb +11 -1
  56. data/lib/taskjuggler/reports/GanttLine.rb +6 -0
  57. data/lib/taskjuggler/reports/ICalReport.rb +1 -1
  58. data/lib/taskjuggler/reports/Report.rb +1 -1
  59. data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
  60. data/lib/taskjuggler/reports/TableReport.rb +7 -12
  61. data/lib/taskjuggler/reports/TjpExportRE.rb +1 -5
  62. data/lib/taskjuggler/version.rb +1 -0
  63. data/man/tj3.1 +130 -0
  64. data/man/tj3client.1 +145 -0
  65. data/man/tj3d.1 +93 -0
  66. data/man/tj3man.1 +76 -0
  67. data/man/tj3ss_receiver.1 +86 -0
  68. data/man/tj3ss_sender.1 +100 -0
  69. data/man/tj3ts_receiver.1 +86 -0
  70. data/man/tj3ts_sender.1 +92 -0
  71. data/man/tj3ts_summary.1 +104 -0
  72. data/man/tj3webd.1 +86 -0
  73. data/manual/Day_To_Day_Juggling +8 -8
  74. data/manual/Installation +6 -6
  75. data/manual/List_Attributes +1 -1
  76. data/manual/Rich_Text_Attributes +6 -5
  77. data/manual/Software +6 -6
  78. data/manual/TaskJuggler_Internals +4 -4
  79. data/manual/The_TaskJuggler_Syntax +5 -5
  80. data/manual/Tutorial +13 -11
  81. data/manual/html/Day_To_Day_Juggling.html +9 -9
  82. data/manual/html/Getting_Started.html +2 -2
  83. data/manual/html/How_To_Contribute.html +2 -2
  84. data/manual/html/Installation.html +8 -8
  85. data/manual/html/Intro.html +2 -2
  86. data/manual/html/List_Attributes.html +3 -3
  87. data/manual/html/Reporting_Bugs.html +2 -2
  88. data/manual/html/Rich_Text_Attributes.html +5 -5
  89. data/manual/html/Software.html +7 -7
  90. data/manual/html/TaskJuggler_2x_Migration.html +2 -2
  91. data/manual/html/TaskJuggler_Internals.html +6 -6
  92. data/manual/html/The_TaskJuggler_Syntax.html +6 -6
  93. data/manual/html/Tutorial.html +17 -14
  94. data/manual/html/account.html +4 -4
  95. data/manual/html/account.task.html +2 -2
  96. data/manual/html/accountprefix.html +2 -2
  97. data/manual/html/accountreport.html +4 -4
  98. data/manual/html/accountroot.html +3 -3
  99. data/manual/html/active.html +3 -3
  100. data/manual/html/adopt.task.html +2 -2
  101. data/manual/html/aggregate.html +2 -2
  102. data/manual/html/alert.html +3 -3
  103. data/manual/html/alertlevels.html +2 -2
  104. data/manual/html/allocate.html +3 -3
  105. data/manual/html/alphabet.html +1 -1
  106. data/manual/html/alternative.html +2 -2
  107. data/manual/html/author.html +2 -2
  108. data/manual/html/auxdir.html +2 -2
  109. data/manual/html/auxdir.report.html +3 -3
  110. data/manual/html/balance.html +3 -3
  111. data/manual/html/booking.resource.html +4 -4
  112. data/manual/html/booking.task.html +4 -4
  113. data/manual/html/caption.html +3 -3
  114. data/manual/html/cellcolor.column.html +3 -3
  115. data/manual/html/celltext.column.html +3 -3
  116. data/manual/html/center.html +3 -3
  117. data/manual/html/charge.html +2 -2
  118. data/manual/html/chargeset.html +2 -2
  119. data/manual/html/columnid.html +17 -13
  120. data/manual/html/columns.html +3 -3
  121. data/manual/html/complete.html +2 -2
  122. data/manual/html/copyright.html +2 -2
  123. data/manual/html/credits.html +2 -2
  124. data/manual/html/css/tjreport.css +4 -0
  125. data/manual/html/currency.html +2 -2
  126. data/manual/html/currencyformat.html +4 -4
  127. data/manual/html/dailymax.html +2 -2
  128. data/manual/html/dailymin.html +3 -3
  129. data/manual/html/dailyworkinghours.html +2 -2
  130. data/manual/html/date.extend.html +2 -2
  131. data/manual/html/date.html +5 -5
  132. data/manual/html/definitions.html +4 -4
  133. data/manual/html/depends.html +4 -4
  134. data/manual/html/details.html +2 -2
  135. data/manual/html/disabled.html +2 -2
  136. data/manual/html/duration.html +2 -2
  137. data/manual/html/efficiency.html +3 -3
  138. data/manual/html/effort.html +2 -2
  139. data/manual/html/effortdone.html +2 -2
  140. data/manual/html/effortleft.html +2 -2
  141. data/manual/html/email.html +2 -2
  142. data/manual/html/enabled.html +2 -2
  143. data/manual/html/end.column.html +3 -3
  144. data/manual/html/end.html +4 -4
  145. data/manual/html/end.limit.html +2 -2
  146. data/manual/html/end.report.html +3 -3
  147. data/manual/html/end.timesheet.html +3 -3
  148. data/manual/html/endcredit.html +3 -3
  149. data/manual/html/epilog.html +3 -3
  150. data/manual/html/export.html +4 -4
  151. data/manual/html/extend.html +3 -3
  152. data/manual/html/fail.html +3 -3
  153. data/manual/html/fdl.html +2 -2
  154. data/manual/html/flags.account.html +2 -2
  155. data/manual/html/flags.html +2 -2
  156. data/manual/html/flags.journalentry.html +2 -2
  157. data/manual/html/flags.report.html +3 -3
  158. data/manual/html/flags.resource.html +2 -2
  159. data/manual/html/flags.statussheet.html +2 -2
  160. data/manual/html/flags.task.html +2 -2
  161. data/manual/html/flags.timesheet.html +2 -2
  162. data/manual/html/fontcolor.column.html +3 -3
  163. data/manual/html/footer.html +3 -3
  164. data/manual/html/formats.export.html +3 -3
  165. data/manual/html/formats.html +4 -4
  166. data/manual/html/functions.html +5 -5
  167. data/manual/html/gapduration.html +2 -2
  168. data/manual/html/gaplength.html +2 -2
  169. data/manual/html/halign.center.html +2 -2
  170. data/manual/html/halign.column.html +3 -3
  171. data/manual/html/halign.left.html +2 -2
  172. data/manual/html/halign.right.html +2 -2
  173. data/manual/html/hasalert.html +2 -2
  174. data/manual/html/header.html +3 -3
  175. data/manual/html/headline.html +3 -3
  176. data/manual/html/height.html +4 -4
  177. data/manual/html/hideaccount.html +4 -4
  178. data/manual/html/hidejournalentry.html +3 -3
  179. data/manual/html/hidereport.html +3 -3
  180. data/manual/html/hideresource.html +4 -4
  181. data/manual/html/hidetask.html +4 -4
  182. data/manual/html/icalreport.html +9 -3
  183. data/manual/html/include.macro.html +3 -3
  184. data/manual/html/include.project.html +3 -3
  185. data/manual/html/include.properties.html +3 -3
  186. data/manual/html/index.html +1 -1
  187. data/manual/html/inherit.extend.html +3 -3
  188. data/manual/html/interval1.html +3 -3
  189. data/manual/html/interval2.html +3 -3
  190. data/manual/html/interval3.html +2 -2
  191. data/manual/html/interval4.html +2 -2
  192. data/manual/html/isactive.html +2 -2
  193. data/manual/html/ischildof.html +2 -2
  194. data/manual/html/isdependencyof.html +2 -2
  195. data/manual/html/isdutyof.html +2 -2
  196. data/manual/html/isfeatureof.html +2 -2
  197. data/manual/html/isleaf.html +2 -2
  198. data/manual/html/ismilestone.html +2 -2
  199. data/manual/html/isongoing.html +3 -3
  200. data/manual/html/isresource.html +2 -2
  201. data/manual/html/isresponsibilityof.html +2 -2
  202. data/manual/html/istask.html +2 -2
  203. data/manual/html/isvalid.html +2 -2
  204. data/manual/html/journalattributes.html +3 -3
  205. data/manual/html/journalentry.html +3 -3
  206. data/manual/html/journalmode.html +4 -4
  207. data/manual/html/leaveallowance.html +3 -3
  208. data/manual/html/leaves.html +3 -3
  209. data/manual/html/left.html +3 -3
  210. data/manual/html/length.html +3 -3
  211. data/manual/html/limits.allocate.html +2 -2
  212. data/manual/html/limits.html +2 -2
  213. data/manual/html/limits.resource.html +2 -2
  214. data/manual/html/limits.task.html +2 -2
  215. data/manual/html/listitem.column.html +3 -3
  216. data/manual/html/listtype.column.html +2 -2
  217. data/manual/html/loadunit.html +3 -3
  218. data/manual/html/logicalexpression.html +4 -4
  219. data/manual/html/logicalflagexpression.html +4 -4
  220. data/manual/html/macro.html +4 -4
  221. data/manual/html/managers.html +2 -2
  222. data/manual/html/mandatory.html +4 -4
  223. data/manual/html/markdate.html +69 -0
  224. data/manual/html/maxend.html +4 -4
  225. data/manual/html/maximum.html +2 -2
  226. data/manual/html/maxstart.html +2 -2
  227. data/manual/html/milestone.html +3 -3
  228. data/manual/html/minend.html +2 -2
  229. data/manual/html/minimum.html +2 -2
  230. data/manual/html/minstart.html +2 -2
  231. data/manual/html/monthlymax.html +2 -2
  232. data/manual/html/monthlymin.html +3 -3
  233. data/manual/html/navbar.html +5 -1
  234. data/manual/html/navigator.html +2 -2
  235. data/manual/html/newtask.html +3 -3
  236. data/manual/html/nikureport.html +2 -2
  237. data/manual/html/note.task.html +4 -4
  238. data/manual/html/novevents.html +68 -0
  239. data/manual/html/now.html +4 -4
  240. data/manual/html/number.extend.html +2 -2
  241. data/manual/html/numberformat.html +3 -3
  242. data/manual/html/onend.html +2 -2
  243. data/manual/html/onstart.html +2 -2
  244. data/manual/html/opennodes.html +3 -3
  245. data/manual/html/outputdir.html +3 -3
  246. data/manual/html/overtime.booking.html +2 -2
  247. data/manual/html/period.column.html +2 -2
  248. data/manual/html/period.limit.html +2 -2
  249. data/manual/html/period.report.html +3 -3
  250. data/manual/html/period.task.html +2 -2
  251. data/manual/html/persistent.html +3 -3
  252. data/manual/html/precedes.html +5 -5
  253. data/manual/html/priority.html +4 -4
  254. data/manual/html/priority.timesheet.html +3 -3
  255. data/manual/html/project.html +4 -4
  256. data/manual/html/projectid.html +2 -2
  257. data/manual/html/projectid.task.html +3 -3
  258. data/manual/html/projectids.html +2 -2
  259. data/manual/html/projection.html +2 -2
  260. data/manual/html/prolog.html +3 -3
  261. data/manual/html/properties.html +3 -3
  262. data/manual/html/purge.html +3 -3
  263. data/manual/html/rate.html +2 -2
  264. data/manual/html/rate.resource.html +2 -2
  265. data/manual/html/rawhtmlhead.html +4 -4
  266. data/manual/html/reference.extend.html +2 -2
  267. data/manual/html/remaining.html +3 -3
  268. data/manual/html/replace.html +2 -2
  269. data/manual/html/reportprefix.html +2 -2
  270. data/manual/html/resource.html +3 -3
  271. data/manual/html/resourceattributes.html +2 -2
  272. data/manual/html/resourceprefix.html +2 -2
  273. data/manual/html/resourcereport.html +5 -5
  274. data/manual/html/resourceroot.html +4 -4
  275. data/manual/html/resources.limit.html +2 -2
  276. data/manual/html/responsible.html +2 -2
  277. data/manual/html/richtext.extend.html +2 -2
  278. data/manual/html/right.html +3 -3
  279. data/manual/html/rollupaccount.html +4 -4
  280. data/manual/html/rollupresource.html +4 -4
  281. data/manual/html/rolluptask.html +4 -4
  282. data/manual/html/scale.column.html +2 -2
  283. data/manual/html/scenario.html +3 -3
  284. data/manual/html/scenario.ical.html +3 -3
  285. data/manual/html/scenarios.export.html +2 -2
  286. data/manual/html/scenarios.html +3 -3
  287. data/manual/html/scenariospecific.extend.html +2 -2
  288. data/manual/html/scheduled.html +2 -2
  289. data/manual/html/scheduling.html +6 -6
  290. data/manual/html/schedulingmode.html +2 -2
  291. data/manual/html/select.html +4 -4
  292. data/manual/html/selfcontained.html +3 -3
  293. data/manual/html/shift.allocate.html +2 -2
  294. data/manual/html/shift.html +3 -3
  295. data/manual/html/shift.resource.html +4 -4
  296. data/manual/html/shift.task.html +2 -2
  297. data/manual/html/shift.timesheet.html +2 -2
  298. data/manual/html/shifts.allocate.html +2 -2
  299. data/manual/html/shifts.resource.html +2 -2
  300. data/manual/html/shifts.task.html +3 -3
  301. data/manual/html/shorttimeformat.html +3 -3
  302. data/manual/html/sloppy.booking.html +2 -2
  303. data/manual/html/sloppy.projection.html +2 -2
  304. data/manual/html/sortaccounts.html +3 -3
  305. data/manual/html/sortjournalentries.html +3 -3
  306. data/manual/html/sortresources.html +3 -3
  307. data/manual/html/sorttasks.html +3 -3
  308. data/manual/html/start.column.html +3 -3
  309. data/manual/html/start.html +4 -4
  310. data/manual/html/start.limit.html +2 -2
  311. data/manual/html/start.report.html +3 -3
  312. data/manual/html/startcredit.html +3 -3
  313. data/manual/html/status.statussheet.html +2 -2
  314. data/manual/html/status.timesheet.html +2 -2
  315. data/manual/html/statussheet.html +2 -2
  316. data/manual/html/statussheetreport.html +3 -3
  317. data/manual/html/strict.projection.html +2 -2
  318. data/manual/html/summary.html +2 -2
  319. data/manual/html/supplement.html +2 -2
  320. data/manual/html/supplement.resource.html +2 -2
  321. data/manual/html/supplement.task.html +2 -2
  322. data/manual/html/tagfile.html +3 -3
  323. data/manual/html/task.html +3 -3
  324. data/manual/html/task.statussheet.html +3 -3
  325. data/manual/html/task.timesheet.html +2 -2
  326. data/manual/html/taskattributes.html +2 -2
  327. data/manual/html/taskprefix.html +2 -2
  328. data/manual/html/taskreport.html +5 -5
  329. data/manual/html/taskroot.export.html +2 -2
  330. data/manual/html/taskroot.html +3 -3
  331. data/manual/html/text.extend.html +2 -2
  332. data/manual/html/textreport.html +5 -5
  333. data/manual/html/timeformat.html +4 -4
  334. data/manual/html/timeformat1.html +2 -2
  335. data/manual/html/timeformat2.html +2 -2
  336. data/manual/html/timeoff.nikureport.html +2 -2
  337. data/manual/html/timesheet.html +3 -3
  338. data/manual/html/timesheetreport.html +3 -3
  339. data/manual/html/timezone.export.html +2 -2
  340. data/manual/html/timezone.html +2 -2
  341. data/manual/html/timezone.report.html +3 -3
  342. data/manual/html/timezone.shift.html +2 -2
  343. data/manual/html/timingresolution.html +2 -2
  344. data/manual/html/title.column.html +2 -2
  345. data/manual/html/title.html +3 -3
  346. data/manual/html/toc.html +157 -143
  347. data/manual/html/tooltip.column.html +3 -3
  348. data/manual/html/tracereport.html +8 -8
  349. data/manual/html/trackingscenario.html +3 -3
  350. data/manual/html/treelevel.html +2 -2
  351. data/manual/html/vacation.html +2 -2
  352. data/manual/html/vacation.resource.html +2 -2
  353. data/manual/html/vacation.shift.html +2 -2
  354. data/manual/html/warn.html +4 -4
  355. data/manual/html/weeklymax.html +2 -2
  356. data/manual/html/weeklymin.html +3 -3
  357. data/manual/html/weekstartsmonday.html +2 -2
  358. data/manual/html/weekstartssunday.html +2 -2
  359. data/manual/html/width.column.html +2 -2
  360. data/manual/html/width.html +4 -4
  361. data/manual/html/work.html +3 -3
  362. data/manual/html/workinghours.project.html +3 -3
  363. data/manual/html/workinghours.resource.html +2 -2
  364. data/manual/html/workinghours.shift.html +2 -2
  365. data/manual/html/yearlyworkingdays.html +2 -2
  366. data/spec/ProjectBroker_spec.rb +6 -6
  367. data/spec/StatusSheets_spec.rb +1 -1
  368. data/spec/TimeSheets_spec.rb +1 -1
  369. data/taskjuggler.gemspec +7 -7
  370. data/tasks/changelog.rake +2 -0
  371. data/tasks/gem.rake +3 -0
  372. data/tasks/help2man.rake +18 -0
  373. data/tasks/kate.rake +2 -0
  374. data/tasks/manual.rake +2 -0
  375. data/tasks/test.rake +5 -0
  376. data/tasks/vim.rake +2 -0
  377. data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +0 -1
  378. data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +0 -2
  379. data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +0 -1
  380. data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +0 -1
  381. data/test/TestSuite/Export-Reports/refs/AutoID.tjp +0 -1
  382. data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +0 -1
  383. data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +0 -1
  384. data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +0 -2
  385. data/test/TestSuite/Export-Reports/refs/Depends1.tjp +0 -1
  386. data/test/TestSuite/Export-Reports/refs/Durations.tjp +0 -1
  387. data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +0 -1
  388. data/test/TestSuite/Export-Reports/refs/Gap.tjp +0 -3
  389. data/test/TestSuite/Export-Reports/refs/Include.tjp +0 -1
  390. data/test/TestSuite/Export-Reports/refs/Journal.tjp +0 -1
  391. data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +0 -1
  392. data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +0 -2
  393. data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +0 -1
  394. data/test/TestSuite/Export-Reports/refs/Manager.tjp +0 -1
  395. data/test/TestSuite/Export-Reports/refs/Milestone.tjp +0 -2
  396. data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +0 -1
  397. data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +0 -1
  398. data/test/TestSuite/Export-Reports/refs/Project.tjp +0 -1
  399. data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +0 -3
  400. data/test/TestSuite/Export-Reports/refs/Reports.tjp +0 -1
  401. data/test/TestSuite/Export-Reports/refs/Resource.tjp +0 -1
  402. data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +0 -1
  403. data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +0 -1
  404. data/test/TestSuite/Export-Reports/refs/Scenario.tjp +0 -2
  405. data/test/TestSuite/Export-Reports/refs/Timezone.tjp +0 -1
  406. data/test/TestSuite/Export-Reports/refs/Vacation.tjp +0 -1
  407. data/test/TestSuite/Export-Reports/refs/navigator.tjp +0 -4
  408. data/test/TestSuite/Export-Reports/refs/template.tjp +0 -6
  409. data/test/TestSuite/Export-Reports/refs/textreport.tjp +0 -1
  410. data/test/TestSuite/Export-Reports/refs/tutorial.tjp +0 -8
  411. data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -1
  412. data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +1 -1
  413. data/test/TestSuite/Syntax/Correct/tutorial.tjp +5 -0
  414. data/test/test_ProjectFileScanner.rb +8 -8
  415. metadata +43 -10
@@ -18,7 +18,7 @@ require 'base64'
18
18
  # This is an extension and modification of the standard String class. We do a
19
19
  # lot of UTF-8 character processing in the parser. Ruby 1.8 does not have good
20
20
  # enough UTF-8 support and Ruby 1.9 only handles UTF-8 characters as Strings.
21
- # This is very inefficient compared to representing them as Fixnum objects.
21
+ # This is very inefficient compared to representing them as Integer objects.
22
22
  # Some of these hacks can be removed once we have switched to 1.9 support
23
23
  # only.
24
24
  class String
@@ -58,8 +58,8 @@ class String
58
58
  alias old_double_left_angle <<
59
59
 
60
60
  # Replacement for the existing << operator that also works for characters
61
- # above Fixnum 255 (UTF-8 characters).
62
- def << (obj)
61
+ # above Integer 255 (UTF-8 characters).
62
+ def <<(obj)
63
63
  if obj.is_a?(String) || (obj < 256)
64
64
  # In this case we can use the built-in concat.
65
65
  concat(obj)
@@ -17,7 +17,7 @@ require 'taskjuggler/Scoreboard'
17
17
  class TaskJuggler
18
18
 
19
19
  # Class to store the working hours for each day of the week. The working hours
20
- # are stored as Arrays of Fixnum intervals for each day of the week. A day off
20
+ # are stored as Arrays of Integer intervals for each day of the week. A day off
21
21
  # is modelled as empty Array for that week day. The start end end times of
22
22
  # each working period are stored as seconds after midnight.
23
23
  class WorkingHours
@@ -100,7 +100,7 @@ class TaskJuggler
100
100
 
101
101
  # Set the working hours for a given week day. +dayOfWeek+ must be 0 for
102
102
  # Sunday, 1 for Monday and so on. +intervals+ must be an Array that
103
- # contains an Array with 2 Fixnums for each working period. Each value
103
+ # contains an Array with 2 Integers for each working period. Each value
104
104
  # specifies the time of day as minutes after midnight. The first value is
105
105
  # the start time of the interval, the second the end time.
106
106
  def setWorkingHours(dayOfWeek, intervals)
@@ -133,7 +133,7 @@ class TaskJuggler
133
133
 
134
134
  # Return the working hour intervals for a given day of the week.
135
135
  # +dayOfWeek+ must 0 for Sunday, 1 for Monday and so on. The result is an
136
- # Array that contains Arrays of 2 Fixnums.
136
+ # Array that contains Arrays of 2 Integers.
137
137
  def getWorkingHours(dayOfWeek)
138
138
  @days[dayOfWeek]
139
139
  end
@@ -204,7 +204,18 @@ class TaskJuggler
204
204
  end
205
205
 
206
206
  def to_s(indent)
207
- '<!-- ' + @text + " -->\n#{' ' * indent}"
207
+ '<!-- ' + canonicalize_comment(@text) + " -->\n#{' ' * indent}"
208
+ end
209
+
210
+ private
211
+
212
+ # It is crucial to canonicalize xml comment text because xml
213
+ # comment syntax forbids having a -- in the comment body. I
214
+ # picked emacs's "M-x comment-region" approach of putting a
215
+ # backslash between the two.
216
+ def canonicalize_comment(text)
217
+ new_text = text.gsub("--", "-\\-")
218
+ new_text
208
219
  end
209
220
 
210
221
  end
@@ -68,10 +68,12 @@ class TaskJuggler
68
68
 
69
69
  def processArguments(argv)
70
70
  super do
71
- @opts.banner += <<'EOT'
71
+ @opts.banner.prepend(<<'EOT'
72
72
  This is the main application. It reads in your project files, schedules the
73
73
  project and generates the reports.
74
+
74
75
  EOT
76
+ )
75
77
  @opts.on('--debuglevel N', Integer,
76
78
  format("Verbosity of debug output")) do |arg|
77
79
  TaskJuggler::Log.level = arg
@@ -100,7 +100,7 @@ class TaskJuggler
100
100
 
101
101
  def processArguments(argv)
102
102
  super do
103
- @opts.banner += <<'EOT'
103
+ prebanner = <<'EOT'
104
104
  The TaskJuggler client is used to send commands and data to the TaskJuggler
105
105
  daemon. The communication is done via TCP/IP.
106
106
 
@@ -125,9 +125,10 @@ EOT
125
125
  end
126
126
  end
127
127
  args = args.join(' ')
128
- @opts.banner += " #{cmd[:label] + ' ' + args + tail}" +
128
+ prebanner += " #{cmd[:label] + ' ' + args + tail}" +
129
129
  "\n\n#{' ' * 10 + format(cmd[:descr], 10)}\n"
130
130
  end
131
+ @opts.banner.prepend(prebanner)
131
132
  @opts.on('-p', '--port <NUMBER>', Integer,
132
133
  format('Use the specified TCP/IP port')) do |arg|
133
134
  @port = arg
@@ -42,11 +42,13 @@ class TaskJuggler
42
42
 
43
43
  def processArguments(argv)
44
44
  super do
45
- @opts.banner += <<'EOT'
45
+ @opts.banner.prepend(<<'EOT'
46
46
  The TaskJuggler daemon can be used to quickly generate reports for a number
47
47
  of scheduled projects that are resident in memory. Once the daemon has been
48
48
  started tj3client can be used to control it.
49
+
49
50
  EOT
51
+ )
50
52
  @opts.on('-d', '--dont-daemonize',
51
53
  format("Don't put program into daemon mode. Keep it " +
52
54
  'connected to the terminal and show debug output.')) do
@@ -36,17 +36,19 @@ class TaskJuggler
36
36
 
37
37
  def processArguments(argv)
38
38
  super do
39
- @opts.banner += <<'EOT'
39
+ @opts.banner.prepend(<<'EOT'
40
40
  This program can be used to generate the user manual in HTML format or to get
41
41
  a textual help for individual keywords.
42
+
42
43
  EOT
44
+ )
43
45
  @opts.on('-d', '--dir <directory>', String,
44
46
  format('directory to put the manual')) do |dir|
45
47
  @directory = dir
46
48
  end
47
49
  @opts.on('--html',
48
50
  format('Show the user manual in your local web browser. ' +
49
- 'By default, Firefox is used or the brower specified ' +
51
+ 'By default, Firefox is used or the browser specified ' +
50
52
  'with the $BROWSER environment variable.')) do
51
53
  @showHtml = true
52
54
  end
@@ -27,13 +27,15 @@ class TaskJuggler
27
27
 
28
28
  def processArguments(argv)
29
29
  super do
30
- @opts.banner += <<'EOT'
30
+ @opts.banner.prepend(<<'EOT'
31
31
  This program can be used to receive filled-out status sheets via email.
32
32
  It reads the emails from STDIN and extracts the status sheet from the
33
33
  attached files. The status sheet is checked for correctness. Good status
34
34
  sheets are filed away. The sender be informed by email that the status
35
35
  sheets was accepted or rejected.
36
+
36
37
  EOT
38
+ )
37
39
  end
38
40
  end
39
41
 
@@ -38,11 +38,13 @@ class TaskJuggler
38
38
 
39
39
  def processArguments(argv)
40
40
  super do
41
- @opts.banner += <<'EOT'
41
+ @opts.banner.prepend(<<'EOT'
42
42
  This program can be used to out status sheets templates via email. It will
43
43
  generate status sheet templates for managers of the project. The project data
44
44
  will be accesses via tj3client from a running TaskJuggler server process.
45
+
45
46
  EOT
47
+ )
46
48
  @opts.on('-r', '--resource <ID>', String,
47
49
  format('Only generate template for given resource')) do |arg|
48
50
  @resourceList << arg
@@ -30,13 +30,15 @@ class TaskJuggler
30
30
 
31
31
  def processArguments(argv)
32
32
  super do
33
- @opts.banner += <<'EOT'
33
+ @opts.banner.prepend(<<'EOT'
34
34
  This program can be used to receive filled-out time sheets via email. It
35
35
  reads the emails from STDIN and extracts the time sheet from the attached
36
36
  files. The time sheet is checked for correctness. Good time sheets are filed
37
37
  away. The sender will be informed by email that the time sheets was accepted
38
38
  or rejected.
39
+
39
40
  EOT
41
+ )
40
42
  end
41
43
  end
42
44
 
@@ -37,11 +37,13 @@ class TaskJuggler
37
37
 
38
38
  def processArguments(argv)
39
39
  super do
40
- @opts.banner += <<'EOT'
40
+ @opts.banner.prepend(<<'EOT'
41
41
  This program can be used to send out time sheets templates via email. It will
42
42
  generate time sheet templates for all resources of the project. The project
43
43
  data will be accesses via tj3client from a running TaskJuggler server process.
44
+
44
45
  EOT
46
+ )
45
47
  @opts.on('-r', '--resource <ID>', String,
46
48
  format('Only generate template for given resource')) do |arg|
47
49
  @resourceList << arg
@@ -36,12 +36,14 @@ class TaskJuggler
36
36
 
37
37
  def processArguments(argv)
38
38
  super do
39
- @opts.banner += <<'EOT'
39
+ @opts.banner.prepend(<<'EOT'
40
40
  This program can be used to send out individual copies and a summary of all
41
41
  accepted time sheets a list of email addresses. The directory structures for
42
42
  templates and submitted time sheets must be present. The project data will be
43
43
  accesses via tj3client from a running TaskJuggler server process.
44
+
44
45
  EOT
46
+ )
45
47
  @opts.on('-r', '--resource <ID>', String,
46
48
  format('Only generate summary for given resource')) do |arg|
47
49
  @resourceList << arg
@@ -40,11 +40,13 @@ class TaskJuggler
40
40
 
41
41
  def processArguments(argv)
42
42
  super do
43
- @opts.banner += <<'EOT'
43
+ @opts.banner.prepend(<<'EOT'
44
44
  The TaskJuggler web server can be used to serve the HTTP reports of
45
45
  TaskJuggler projects to be viewed by any HTML5 compliant web browser. It uses
46
46
  the TaskJuggler daemon (tj3d) for data hosting and report generation.
47
+
47
48
  EOT
49
+ )
48
50
  @opts.on('-d', '--dont-daemonize',
49
51
  format("Don't put program into daemon mode. Keep it " +
50
52
  'connected to the terminal and show debug output.')) do
@@ -37,7 +37,7 @@ class Object
37
37
  # We can't clone frozen objects. So just return a reference to them.
38
38
  # Built-in classed can't be cloned either. The check below is probably
39
39
  # cheaper than the frequent (hiddent) exceptions from those objects.
40
- return self if frozen? || nil? || is_a?(Fixnum) || is_a?(Float) ||
40
+ return self if frozen? || nil? || is_a?(Integer) || is_a?(Float) ||
41
41
  is_a?(TrueClass) || is_a?(FalseClass) || is_a?(Symbol)
42
42
 
43
43
  # In case we have loops in our graph, we return references, not
@@ -157,7 +157,7 @@ class TaskJuggler
157
157
  end
158
158
  when :fieldEnd
159
159
  # We've completed processing a field. Add the field to the list of
160
- # fields. Convert Fixnums and Floats in native types.
160
+ # fields. Convert Integers and Floats in native types.
161
161
  fields << unMarshal(field, quoted)
162
162
 
163
163
  if c == "\n"
@@ -198,7 +198,7 @@ class TaskJuggler
198
198
  if str.nil?
199
199
  nil
200
200
  elsif /^[-+]?\d+$/ =~ str
201
- # field is a Fixnum
201
+ # field is an Integer
202
202
  str.to_i
203
203
  elsif /^[-+]?\d*\.?\d+([eE][-+]?\d+)?$/ =~ str
204
204
  # field is a Float
@@ -216,7 +216,7 @@ class TaskJuggler
216
216
  def marshal(field)
217
217
  if field.nil?
218
218
  ''
219
- elsif field.is_a?(Fixnum) || field.is_a?(Float) || field.is_a?(Bignum)
219
+ elsif field.is_a?(Integer) || field.is_a?(Float)
220
220
  # Numbers don't have to be quoted.
221
221
  field.to_s
222
222
  else
@@ -163,7 +163,7 @@ class TaskJuggler
163
163
 
164
164
  @yMinDate = cell if @yMinDate.nil? || cell < @yMinDate
165
165
  @yMaxDate = cell if @yMaxDate.nil? || cell > @yMaxDate
166
- elsif cell.is_a?(Fixnum) || cell.is_a?(Float)
166
+ elsif cell.is_a?(Integer) || cell.is_a?(Float)
167
167
  if @dataType && @dataType != :number
168
168
  error("Column #{colIdx} contains non-number (#{cell}). " +
169
169
  "The columns will be ignored.")
@@ -35,7 +35,7 @@ class TaskJuggler
35
35
  include HTMLGraphics
36
36
 
37
37
  attr_reader :start, :end, :now, :weekStartsMonday, :header, :width,
38
- :scale, :scales, :table
38
+ :scale, :scales, :table, :markdate
39
39
  attr_writer :viewWidth
40
40
 
41
41
  # Create the GanttChart object, but don't do much right now. We still need
@@ -43,13 +43,14 @@ class TaskJuggler
43
43
  # is the date that should be used as current date. _weekStartsMonday_ is
44
44
  # true if the weeks should start on Mondays instead of Sundays. _table_ is a
45
45
  # reference to the TableReport that the chart is part of.
46
- def initialize(now, weekStartsMonday, columnDef, table = nil)
46
+ def initialize(now, weekStartsMonday, columnDef, table = nil, markdate = nil)
47
47
  # The start and end dates of the reported interval.
48
48
  @start = nil
49
49
  @end = nil
50
50
  @now = now
51
51
  @columnDef = columnDef
52
52
  @table = table
53
+ @markdate = markdate
53
54
 
54
55
  # This defines the possible horizontal scales that the Gantt chart can
55
56
  # have. The scales differ in their resolution and the amount of detail
@@ -256,6 +257,11 @@ class TaskJuggler
256
257
  # Also protect the current date line from other vertical lines.
257
258
  @router.addZone(@header.nowLineX - 1, 0, 3, @height - 1, false, true)
258
259
 
260
+ # Protect the date set in custom reference line from other vertical lines.
261
+ if @header.markdateLineX
262
+ @router.addZone(@header.markdateLineX - 1, 0, 3, @height - 1, false, true)
263
+ end
264
+
259
265
  # Generate the dependency arrows for all visible tasks.
260
266
  @tasks.each do |task, lines|
261
267
  generateDepLines(task, lines)
@@ -21,7 +21,7 @@ class TaskJuggler
21
21
  # holds the small scale (e. g. week or day).
22
22
  class GanttHeader
23
23
 
24
- attr_reader :gridLines, :nowLineX, :cellStartDates
24
+ attr_reader :gridLines, :nowLineX, :cellStartDates, :markdateLineX
25
25
  attr_accessor :height
26
26
 
27
27
  # Create a GanttHeader object and generate the scales for the header.
@@ -39,6 +39,10 @@ class TaskJuggler
39
39
  # X coordinate of the "now" line. nil if "now" is off-chart.
40
40
  @nowLineX = nil
41
41
 
42
+ # X coordinate of the custom "markdate" line with date specified by user.
43
+ # nil if "markdate" is off-chart.
44
+ @markdateLineX = nil
45
+
42
46
  # The x coordinates and width of the cells created by the small scale. The
43
47
  # values are stored as [ x, w ].
44
48
  @cellStartDates = []
@@ -103,6 +107,12 @@ class TaskJuggler
103
107
 
104
108
  nlx = @chart.dateToX(@chart.now)
105
109
  @nowLineX = nlx if nlx
110
+
111
+ if @chart.markdate
112
+ flx = @chart.dateToX(@chart.markdate)
113
+ @markdateLineX = flx if flx
114
+ end
115
+
106
116
  end
107
117
 
108
118
  # Generate the actual scale cells.
@@ -49,6 +49,7 @@ class TaskJuggler
49
49
  @y = y + chart.header.height + 1
50
50
  # The height of the line in screen pixels.
51
51
  @height = height
52
+
52
53
  # The index of the line in the chart. It starts with 0 and is
53
54
  # incremented for each line by one.
54
55
  @lineIndex = lineIndex
@@ -95,6 +96,11 @@ class TaskJuggler
95
96
  div << rectToHTML(@chart.header.nowLineX, 0, 1, @height, 'nowline')
96
97
  end
97
98
 
99
+ # Render the 'markdate' line
100
+ if @chart.header.markdateLineX
101
+ div << rectToHTML(@chart.header.markdateLineX, 0, 1, @height, 'markdateline')
102
+ end
103
+
98
104
  div
99
105
  end
100
106
 
@@ -96,7 +96,7 @@ class TaskJuggler
96
96
 
97
97
  # Generate an additional VEVENT entry for all leaf tasks that aren't
98
98
  # milestones.
99
- if task.leaf? && !task['milestone', scenarioIdx]
99
+ if task.leaf? && !task['milestone', scenarioIdx] && @report.get('novevents') == [false]
100
100
  event = ICalendar::Event.new(
101
101
  @ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
102
102
  task.name, task['start', scenarioIdx], task['end', scenarioIdx])
@@ -297,7 +297,7 @@ EOT
297
297
  if @name == '.'
298
298
  $stdout.write(@content.to_tjp)
299
299
  else
300
- fileName = absoluteFileName(@name)
300
+ fileName = @name
301
301
  fileName += a('definitions').include?('project') ? '.tjp' : '.tji'
302
302
  File.open(fileName, 'w') { |f| f.write(@content.to_tjp) }
303
303
  end
@@ -60,7 +60,7 @@ class TaskJuggler
60
60
  @alignment = :center
61
61
  # Horizontal padding between frame and cell content
62
62
  @padding = 3
63
- # Whether or not to indent the cell. If not nil, it is a Fixnum
63
+ # Whether or not to indent the cell. If not nil, it is an Integer
64
64
  # indicating the indentation level.
65
65
  @indent = nil
66
66
  # The basename of the icon file
@@ -32,6 +32,7 @@ class TaskJuggler
32
32
  'activetasks' => [ 'Active Tasks', true, :right, true ],
33
33
  'annualleave' => [ 'Annual Leave', true, :right, true ],
34
34
  'annualleavebalance'=> [ 'Annual Leave Balance', false, :right, true ],
35
+ 'annualleavelist' => [ 'Annual Leave List', false, :left, true ],
35
36
  'alert' => [ 'Alert', true, :left, false ],
36
37
  'alertmessages' => [ 'Alert Messages', false, :left, false ],
37
38
  'alertsummaries' => [ 'Alert Summaries', false, :left, false ],
@@ -79,7 +80,7 @@ class TaskJuggler
79
80
  @@propertiesByType = {
80
81
  # Type Indent Align
81
82
  DateAttribute => [ false, :left ],
82
- FixnumAttribute => [ false, :right ],
83
+ IntegerAttribute => [ false, :right ],
83
84
  FloatAttribute => [ false, :right ],
84
85
  ResourceListAttribute => [ false, :left ],
85
86
  RichTextAttribute => [ false, :left ],
@@ -338,9 +339,9 @@ class TaskJuggler
338
339
  when 'chart'
339
340
  # For the 'chart' column we generate a GanttChart object. The sizes are
340
341
  # set so that the lines of the Gantt chart line up with the lines of the
341
- # table.
342
+ # table
342
343
  gantt = GanttChart.new(a('now'),
343
- a('weekStartsMonday'), columnDef, self)
344
+ a('weekStartsMonday'), columnDef, self, a('markdate'))
344
345
 
345
346
  gantt.generateByScale(rStart, rEnd, columnDef.scale)
346
347
  # The header consists of 2 lines separated by a 1 pixel boundary.
@@ -867,12 +868,6 @@ class TaskJuggler
867
868
  # the next cell.
868
869
  def genCalChartTaskCell(query, line, columnDef, t, sameTimeNextFunc)
869
870
  task = line.property
870
- # Find out if we have an enclosing resource scope.
871
- if line.scopeLine && line.scopeLine.property.is_a?(Resource)
872
- resource = line.scopeLine.property
873
- else
874
- resource = nil
875
- end
876
871
 
877
872
  # Get the interval of the task. In case a date is invalid due to a
878
873
  # scheduling problem, we use the full project interval.
@@ -1048,11 +1043,11 @@ class TaskJuggler
1048
1043
  'busy'
1049
1044
  elsif workLoad > 0.0 && freeLoad > 0.0
1050
1045
  'loaded'
1051
- elsif workLoad == 0.0 && freeLoad > 0.0
1052
- 'free'
1053
- else
1046
+ elsif workLoad == 0.0 && freeLoad == 0.0
1054
1047
  cell.tooltip = nil
1055
1048
  'offduty'
1049
+ else
1050
+ 'free'
1056
1051
  end
1057
1052
  end
1058
1053
  cell.category += line.subLineNo % 2 == 1 ? '1' : '2'