taskjuggler 0.2.1 → 0.2.2
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.
- data/{tasks/missing.rake → .gemtest} +0 -0
- data/CHANGELOG +27 -0
- data/Rakefile +8 -9
- data/bin/tj3 +2 -1
- data/bin/tj3client +2 -1
- data/bin/tj3d +2 -1
- data/bin/tj3man +2 -1
- data/bin/tj3ss_receiver +2 -1
- data/bin/tj3ss_sender +2 -1
- data/bin/tj3ts_receiver +2 -1
- data/bin/tj3ts_sender +2 -1
- data/bin/tj3ts_summary +2 -1
- data/data/tjp.vim +425 -419
- data/examples/Fedora-20/f-20.tjp +2442 -0
- data/examples/Fedora-20/icons/fedoralogo.png +0 -0
- data/examples/Fedora-20/reports.tji +423 -0
- data/lib/header.tmpl +13 -0
- data/lib/taskjuggler/AppConfig.rb +5 -0
- data/lib/taskjuggler/Attributes.rb +22 -0
- data/lib/taskjuggler/Journal.rb +273 -10
- data/lib/taskjuggler/Log.rb +9 -8
- data/lib/taskjuggler/Project.rb +28 -60
- data/lib/taskjuggler/ProjectFileScanner.rb +2 -1
- data/lib/taskjuggler/PropertySet.rb +3 -0
- data/lib/taskjuggler/PropertyTreeNode.rb +4 -0
- data/lib/taskjuggler/Query.rb +2 -1
- data/lib/taskjuggler/Resource.rb +0 -103
- data/lib/taskjuggler/RichText/RTFQuery.rb +42 -4
- data/lib/taskjuggler/SheetHandlerBase.rb +0 -20
- data/lib/taskjuggler/SheetReceiver.rb +23 -21
- data/lib/taskjuggler/Task.rb +3 -5
- data/lib/taskjuggler/TaskJuggler.rb +4 -0
- data/lib/taskjuggler/TaskScenario.rb +81 -103
- data/lib/taskjuggler/TextParser/Scanner.rb +19 -18
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +180 -45
- data/lib/taskjuggler/UTF8String.rb +30 -0
- data/lib/taskjuggler/apps/Tj3.rb +1 -1
- data/lib/taskjuggler/apps/Tj3Man.rb +54 -2
- data/lib/taskjuggler/reports/ICalReport.rb +4 -4
- data/lib/taskjuggler/reports/NikuReport.rb +6 -0
- data/lib/taskjuggler/reports/Report.rb +5 -5
- data/lib/taskjuggler/reports/ReportContext.rb +4 -2
- data/lib/taskjuggler/reports/ResourceListRE.rb +10 -1
- data/lib/taskjuggler/reports/StatusSheetReport.rb +3 -0
- data/lib/taskjuggler/reports/TableReport.rb +8 -3
- data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -0
- data/lib/updateheader.sh +15 -0
- data/manual/Installation +11 -22
- data/manual/Software +17 -3
- data/manual/html/Day_To_Day_Juggling.html +359 -0
- data/manual/html/Getting_Started.html +62 -0
- data/manual/html/How_To_Contribute.html +88 -0
- data/manual/html/Installation.html +172 -0
- data/manual/html/Intro.html +74 -0
- data/manual/html/Reporting_Bugs.html +47 -0
- data/manual/html/Rich_Text_Attributes.html +174 -0
- data/manual/html/Software.html +147 -0
- data/manual/html/TaskJuggler_2x_Migration.html +71 -0
- data/manual/html/TaskJuggler_Internals.html +61 -0
- data/manual/html/The_TaskJuggler_Syntax.html +89 -0
- data/manual/html/Tutorial.html +498 -0
- data/manual/html/account.html +152 -0
- data/manual/html/account.task.html +68 -0
- data/manual/html/accountprefix.html +67 -0
- data/manual/html/active.html +66 -0
- data/manual/html/adopt.task.html +73 -0
- data/manual/html/alert level.html +66 -0
- data/manual/html/alert.html +66 -0
- data/manual/html/allocate.html +92 -0
- data/manual/html/alphabet.html +33 -0
- data/manual/html/alternative.html +77 -0
- data/manual/html/author.html +69 -0
- data/manual/html/balance.html +73 -0
- data/manual/html/booking.resource.html +122 -0
- data/manual/html/booking.task.html +120 -0
- data/manual/html/caption.html +96 -0
- data/manual/html/cellcolor.column.html +71 -0
- data/manual/html/celltext.column.html +68 -0
- data/manual/html/center.html +67 -0
- data/manual/html/charge.html +89 -0
- data/manual/html/chargeset.html +73 -0
- data/manual/html/columnid.html +358 -0
- data/manual/html/columns.html +73 -0
- data/manual/html/complete.html +80 -0
- data/manual/html/copyright.html +97 -0
- data/manual/html/credit.html +117 -0
- data/{benchmarks → manual/html}/css/tjmanual.css +0 -0
- data/{benchmarks → manual/html}/css/tjreport.css +0 -0
- data/manual/html/currency.html +120 -0
- data/manual/html/currencyformat.html +99 -0
- data/manual/html/dailymax.html +144 -0
- data/manual/html/dailymin.html +132 -0
- data/manual/html/dailyworkinghours.html +90 -0
- data/manual/html/date.extend.html +77 -0
- data/manual/html/date.html +100 -0
- data/manual/html/definitions.html +94 -0
- data/manual/html/depends.html +110 -0
- data/manual/html/details.html +69 -0
- data/manual/html/disabled.html +85 -0
- data/manual/html/duration.html +133 -0
- data/manual/html/efficiency.html +93 -0
- data/manual/html/effort.html +134 -0
- data/manual/html/email.html +68 -0
- data/manual/html/enabled.html +69 -0
- data/manual/html/end.column.html +67 -0
- data/manual/html/end.html +87 -0
- data/manual/html/end.limit.html +69 -0
- data/manual/html/end.report.html +99 -0
- data/manual/html/end.timesheet.html +94 -0
- data/manual/html/endcredit.html +110 -0
- data/manual/html/epilog.html +72 -0
- data/manual/html/export.html +197 -0
- data/manual/html/extend.html +87 -0
- data/manual/html/fail.html +69 -0
- data/manual/html/fdl.html +430 -0
- data/manual/html/flags.account.html +66 -0
- data/manual/html/flags.html +66 -0
- data/manual/html/flags.journalentry.html +66 -0
- data/manual/html/flags.report.html +66 -0
- data/manual/html/flags.resource.html +68 -0
- data/manual/html/flags.statussheet.html +66 -0
- data/manual/html/flags.task.html +68 -0
- data/manual/html/flags.timesheet.html +66 -0
- data/manual/html/fontcolor.column.html +71 -0
- data/manual/html/footer.html +72 -0
- data/manual/html/formats.html +80 -0
- data/manual/html/functions.html +78 -0
- data/manual/html/gapduration.html +93 -0
- data/manual/html/gaplength.html +93 -0
- data/manual/html/halign.center.html +66 -0
- data/manual/html/halign.column.html +67 -0
- data/manual/html/halign.left.html +66 -0
- data/manual/html/halign.right.html +66 -0
- data/manual/html/hasalert.html +71 -0
- data/manual/html/header.html +72 -0
- data/manual/html/headline.html +69 -0
- data/manual/html/hidejournalentry.html +69 -0
- data/manual/html/hidereport.html +67 -0
- data/manual/html/hideresource.html +73 -0
- data/manual/html/hidetask.html +73 -0
- data/manual/html/icalreport.html +137 -0
- data/manual/html/include.macro.html +70 -0
- data/manual/html/include.project.html +71 -0
- data/manual/html/include.properties.html +168 -0
- data/manual/html/index.html +18 -0
- data/manual/html/inherit.extend.html +68 -0
- data/manual/html/interval1.html +99 -0
- data/manual/html/interval2.html +98 -0
- data/manual/html/interval3.html +99 -0
- data/manual/html/interval4.html +100 -0
- data/manual/html/isactive.html +67 -0
- data/manual/html/ischildof.html +67 -0
- data/manual/html/isdependencyof.html +75 -0
- data/manual/html/isdutyof.html +71 -0
- data/manual/html/isfeatureof.html +71 -0
- data/manual/html/isleaf.html +66 -0
- data/manual/html/ismilestone.html +67 -0
- data/manual/html/isongoing.html +67 -0
- data/manual/html/isresource.html +66 -0
- data/manual/html/istask.html +66 -0
- data/manual/html/journalattributes.html +107 -0
- data/manual/html/journalentry.html +83 -0
- data/manual/html/journalmode.html +83 -0
- data/manual/html/left.html +66 -0
- data/manual/html/length.html +104 -0
- data/manual/html/limits.allocate.html +72 -0
- data/manual/html/limits.html +72 -0
- data/manual/html/limits.resource.html +80 -0
- data/manual/html/limits.task.html +113 -0
- data/manual/html/listitem.column.html +66 -0
- data/manual/html/listtype.column.html +79 -0
- data/manual/html/loadunit.html +99 -0
- data/manual/html/logicalexpression.html +110 -0
- data/manual/html/logicalflagexpression.html +82 -0
- data/manual/html/macro.html +103 -0
- data/manual/html/managers.html +109 -0
- data/manual/html/mandatory.html +66 -0
- data/manual/html/maxend.html +69 -0
- data/manual/html/maximum.html +99 -0
- data/manual/html/maxstart.html +69 -0
- data/manual/html/milestone.html +71 -0
- data/manual/html/minend.html +69 -0
- data/manual/html/minimum.html +99 -0
- data/manual/html/minstart.html +69 -0
- data/manual/html/monthlymax.html +99 -0
- data/manual/html/monthlymin.html +99 -0
- data/manual/html/navbar.html +513 -0
- data/manual/html/navigator.html +70 -0
- data/manual/html/newtask.html +83 -0
- data/manual/html/nikureport.html +216 -0
- data/manual/html/note.task.html +68 -0
- data/manual/html/now.html +67 -0
- data/manual/html/numberformat.html +85 -0
- data/manual/html/onend.html +68 -0
- data/manual/html/onstart.html +68 -0
- data/manual/html/opennodes.html +66 -0
- data/manual/html/overtime.booking.html +76 -0
- data/manual/html/period.column.html +67 -0
- data/manual/html/period.limit.html +69 -0
- data/manual/html/period.report.html +69 -0
- data/manual/html/period.task.html +69 -0
- data/manual/html/persistent.html +66 -0
- data/manual/html/precedes.html +86 -0
- data/manual/html/priority.html +114 -0
- data/manual/html/priority.timesheet.html +68 -0
- data/manual/html/project.html +88 -0
- data/manual/html/projectid.html +66 -0
- data/manual/html/projectid.task.html +68 -0
- data/manual/html/projectids.html +66 -0
- data/manual/html/projection.html +75 -0
- data/manual/html/prolog.html +72 -0
- data/manual/html/properties.html +64 -0
- data/manual/html/purge.html +69 -0
- data/manual/html/rate.html +66 -0
- data/manual/html/rate.resource.html +68 -0
- data/manual/html/reference.extend.html +77 -0
- data/manual/html/remaining.html +117 -0
- data/manual/html/replace.html +66 -0
- data/manual/html/report.html +333 -0
- data/manual/html/reportprefix.html +67 -0
- data/manual/html/resource.html +194 -0
- data/manual/html/resourceattributes.html +83 -0
- data/manual/html/resourceprefix.html +67 -0
- data/manual/html/resourcereport.html +69 -0
- data/manual/html/resourceroot.html +90 -0
- data/manual/html/resources.limit.html +82 -0
- data/manual/html/responsible.html +69 -0
- data/manual/html/richtext.extend.html +78 -0
- data/manual/html/right.html +66 -0
- data/manual/html/rollupresource.html +92 -0
- data/manual/html/rolluptask.html +69 -0
- data/manual/html/scale.column.html +87 -0
- data/manual/html/scenario.html +123 -0
- data/manual/html/scenario.ical.html +67 -0
- data/manual/html/scenarios.export.html +66 -0
- data/manual/html/scenarios.html +66 -0
- data/manual/html/scenariospecific.extend.html +68 -0
- data/manual/html/scheduled.html +68 -0
- data/manual/html/scheduling.html +74 -0
- data/manual/html/select.html +86 -0
- data/manual/html/selfcontained.html +66 -0
- data/manual/html/shift.html +128 -0
- data/manual/html/shift.resource.html +74 -0
- data/manual/html/shift.task.html +74 -0
- data/manual/html/shift.timesheet.html +70 -0
- data/manual/html/shifts.allocate.html +71 -0
- data/manual/html/shifts.resource.html +73 -0
- data/manual/html/shifts.task.html +73 -0
- data/manual/html/shorttimeformat.html +67 -0
- data/manual/html/sloppy.booking.html +77 -0
- data/manual/html/sloppy.projection.html +66 -0
- data/manual/html/sortjournalentries.html +81 -0
- data/manual/html/sortresources.html +73 -0
- data/manual/html/sorttasks.html +73 -0
- data/manual/html/start.column.html +67 -0
- data/manual/html/start.html +78 -0
- data/manual/html/start.limit.html +69 -0
- data/manual/html/start.report.html +69 -0
- data/manual/html/startcredit.html +68 -0
- data/manual/html/status.statussheet.html +73 -0
- data/manual/html/status.timesheet.html +91 -0
- data/manual/html/statussheet.html +124 -0
- data/manual/html/statussheetreport.html +125 -0
- data/manual/html/strict.projection.html +66 -0
- data/manual/html/summary.html +69 -0
- data/manual/html/supplement.html +108 -0
- data/manual/html/supplement.resource.html +195 -0
- data/manual/html/supplement.task.html +329 -0
- data/manual/html/tagfile.html +73 -0
- data/manual/html/task.html +320 -0
- data/manual/html/task.statussheet.html +74 -0
- data/manual/html/task.timesheet.html +89 -0
- data/manual/html/taskattributes.html +115 -0
- data/manual/html/taskprefix.html +67 -0
- data/manual/html/taskreport.html +69 -0
- data/manual/html/taskroot.html +103 -0
- data/manual/html/text.extend.html +77 -0
- data/manual/html/textreport.html +66 -0
- data/manual/html/timeformat.html +160 -0
- data/manual/html/timeoff.nikureport.html +71 -0
- data/manual/html/timesheet.html +129 -0
- data/manual/html/timesheetreport.html +107 -0
- data/manual/html/timezone.export.html +66 -0
- data/manual/html/timezone.html +72 -0
- data/manual/html/timezone.report.html +66 -0
- data/manual/html/timezone.shift.html +70 -0
- data/manual/html/timingresolution.html +71 -0
- data/manual/html/title.column.html +67 -0
- data/manual/html/title.html +68 -0
- data/manual/html/toc.html +1330 -0
- data/manual/html/tooltip.column.html +72 -0
- data/manual/html/trackingscenario.html +80 -0
- data/manual/html/treelevel.html +66 -0
- data/manual/html/vacation.html +71 -0
- data/manual/html/vacation.resource.html +73 -0
- data/manual/html/vacation.shift.html +71 -0
- data/manual/html/warn.html +69 -0
- data/manual/html/weeklymax.html +99 -0
- data/manual/html/weeklymin.html +99 -0
- data/manual/html/weekstartsmonday.html +66 -0
- data/manual/html/weekstartssunday.html +66 -0
- data/manual/html/width.column.html +66 -0
- data/manual/html/work.html +105 -0
- data/manual/html/workinghours.project.html +102 -0
- data/manual/html/workinghours.resource.html +79 -0
- data/manual/html/workinghours.shift.html +81 -0
- data/manual/html/yearlyworkingdays.html +70 -0
- data/spec/StatusSheets_spec.rb +0 -6
- data/spec/TimeSheets_spec.rb +0 -6
- data/spec/Tj3Daemon_spec.rb +2 -0
- data/spec/support/DaemonControl.rb +10 -0
- data/taskjuggler.gemspec +71 -0
- data/tasks/changelog.rake +2 -2
- data/tasks/gem.rake +50 -21
- data/tasks/manual.rake +1 -1
- data/tasks/rdoc.rake +5 -12
- data/tasks/spec.rake +1 -1
- data/tasks/test.rake +5 -8
- data/test/ReferenceGenerator.rb +91 -0
- data/test/TestSuite/CSV-Reports/refs/resourcereport.csv +4 -4
- data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +21 -0
- data/test/TestSuite/ReportGenerator/Correct/JournalMode.tjp +124 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +124 -124
- data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +1 -7
- data/test/TestSuite/ReportGenerator/Correct/refs/Journal-2.csv +7 -3
- data/test/TestSuite/ReportGenerator/Correct/refs/JournalMode-1.csv +79 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/JournalMode-2.csv +208 -0
- data/test/TjpGen.rb +152 -0
- metadata +1290 -741
- data/benchmarks/666tasks.tjp +0 -3183
- data/benchmarks/allocate.tjp +0 -30
- data/benchmarks/allocatedSlots.tjp +0 -1602
- data/benchmarks/booking.tjp +0 -76
- data/benchmarks/depends.tjp +0 -113
- data/benchmarks/gantt.tjp +0 -57
- data/benchmarks/htmltaskreport.tjp +0 -71
- data/benchmarks/icons/details.png +0 -0
- data/benchmarks/icons/flag-green.png +0 -0
- data/benchmarks/icons/flag-red.png +0 -0
- data/benchmarks/icons/flag-yellow.png +0 -0
- data/benchmarks/icons/resource.png +0 -0
- data/benchmarks/icons/resourcegroup.png +0 -0
- data/benchmarks/icons/task.png +0 -0
- data/benchmarks/icons/taskgroup.png +0 -0
- data/benchmarks/icons/trend-down.png +0 -0
- data/benchmarks/icons/trend-flat.png +0 -0
- data/benchmarks/icons/trend-up.png +0 -0
- data/benchmarks/runbench.rb +0 -30
- data/benchmarks/scripts/wz_tooltip.js +0 -1301
- data/gem_spec.rb +0 -37
- data/lib/exchangebug.rb +0 -42
- data/lib/ruby-signal-bug.rb +0 -55
- data/prj_cfg.rb +0 -50
- data/tasks/csts.rake +0 -72
- data/tasks/rcov.rake +0 -14
- data/tasks/rexml_fix.rb +0 -16
- data/tasks/rexml_fix_19.rb +0 -49
- data/tasks/show.rake +0 -21
- data/tasks/stats.rake +0 -25
- data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
- data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
- data/test/TestSuite/Export-Reports/tp.tjp +0 -49
- data/test/TestSuite/HTML-Reports/Alerts.html +0 -424
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +0 -86
- data/test/TestSuite/HTML-Reports/css/tjreport.css +0 -413
- data/test/TestSuite/HTML-Reports/icons/details.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-green.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-red.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-yellow.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resource.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resourcegroup.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/task.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/taskgroup.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/trend-down.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/trend-flat.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/trend-up.png +0 -0
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +0 -86
- data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -1075
- data/test/TestSuite/Scheduler/Correct/Duration.html +0 -610
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -85
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/missing-reports +0 -2
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
- data/test/TestSuite/StatusSheets/boss.tji +0 -45
- data/test/TestSuite/StatusSheets/boss_mail +0 -51
- data/test/TestSuite/StatusSheets/dev2_mail +0 -37
- data/test/TestSuite/StatusSheets/project.tjp +0 -275
- data/test/TestSuite/StatusSheets/run +0 -54
- data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
- data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
- data/test/TestSuite/Syntax/Correct/css/tjmanual.css +0 -86
- data/test/TestSuite/Syntax/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/TimeSheets/dev2_mail1 +0 -84
- data/test/TestSuite/TimeSheets/dev2_mail2 +0 -87
- data/test/TestSuite/TimeSheets/project.tjp +0 -271
- data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
- data/test/TestSuite/TimeSheets/run +0 -76
- data/test/TestSuite/TimeSheets/uu.txt +0 -29
|
@@ -306,6 +306,18 @@ class TaskJuggler
|
|
|
306
306
|
end
|
|
307
307
|
|
|
308
308
|
end
|
|
309
|
+
class JournalSortListAttribute < ListAttributeBase
|
|
310
|
+
|
|
311
|
+
def initialize(property, type, container)
|
|
312
|
+
super
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def JournalSortListAttribute ::tjpId
|
|
316
|
+
'journalsorting'
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
end
|
|
320
|
+
|
|
309
321
|
|
|
310
322
|
class TimeIntervalListAttribute < ListAttributeBase
|
|
311
323
|
def initialize(property, type, container)
|
|
@@ -577,6 +589,16 @@ class TaskJuggler
|
|
|
577
589
|
end
|
|
578
590
|
end
|
|
579
591
|
|
|
592
|
+
class SymbolListAttribute < ListAttributeBase
|
|
593
|
+
def initialize(property, type, container)
|
|
594
|
+
super
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
def SymbolListAttribute::tjpId
|
|
598
|
+
'symbollist'
|
|
599
|
+
end
|
|
600
|
+
end
|
|
601
|
+
|
|
580
602
|
class TaskDepListAttribute < ListAttributeBase
|
|
581
603
|
def initialize(property, type, container)
|
|
582
604
|
super
|
data/lib/taskjuggler/Journal.rb
CHANGED
|
@@ -56,6 +56,125 @@ class TaskJuggler
|
|
|
56
56
|
@journal.addEntry(self)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
+
# Convert the entry into a RichText string. The formatting is controlled
|
|
60
|
+
# by the Query parameters.
|
|
61
|
+
def to_rText(query)
|
|
62
|
+
# We use the alert level a sortable and numerical result.
|
|
63
|
+
if query.journalAttributes.include?('alert')
|
|
64
|
+
levelRecord = query.project['alertLevels'][alertLevel]
|
|
65
|
+
if query.selfContained
|
|
66
|
+
alertName = "<nowiki>[#{levelRecord[1]}]</nowiki> "
|
|
67
|
+
else
|
|
68
|
+
alertName = "[[File:icons/flag-#{levelRecord[0]}.png|" +
|
|
69
|
+
"alt=[#{levelRecord[1]}]|text-bottom]] "
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
alertName = ''
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# The String that will hold the result as RichText markup.
|
|
76
|
+
rText = ''
|
|
77
|
+
|
|
78
|
+
# Markup to use for headlines.
|
|
79
|
+
hlMark = '==='
|
|
80
|
+
|
|
81
|
+
if query.journalAttributes.include?('property') && @property
|
|
82
|
+
if @property.is_a?(Task)
|
|
83
|
+
# Include the alert level, task name and ID.
|
|
84
|
+
rText += "#{hlMark} #{alertName} <nowiki>#{@property.name}</nowiki>"
|
|
85
|
+
if query.journalAttributes.include?('propertyid')
|
|
86
|
+
rText += " (ID: #{@property.fullId})"
|
|
87
|
+
end
|
|
88
|
+
rText += " #{hlMark}\n\n"
|
|
89
|
+
|
|
90
|
+
if query.journalAttributes.include?('timesheet') && @timeSheetRecord
|
|
91
|
+
# Include the reported time sheet data for this task.
|
|
92
|
+
rText += "'''Work:''' #{@timeSheetRecord.actualWorkPercent.to_i}% "
|
|
93
|
+
if @timeSheetRecord.actualWorkPercent !=
|
|
94
|
+
@timeSheetRecord.planWorkPercent
|
|
95
|
+
rText += "(#{@timeSheetRecord.planWorkPercent.to_i}%) "
|
|
96
|
+
end
|
|
97
|
+
if @timeSheetRecord.remaining
|
|
98
|
+
rText += "'''Remaining:''' #{@timeSheetRecord.actualRemaining}d "
|
|
99
|
+
if @timeSheetRecord.actualRemaining !=
|
|
100
|
+
@timeSheetRecord.planRemaining
|
|
101
|
+
rText += "(#{@timeSheetRecord.planRemaining}d) "
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
rText += "'''End:''' " +
|
|
105
|
+
"#{@timeSheetRecord.actualEnd.to_s(query.timeFormat)} "
|
|
106
|
+
if @timeSheetRecord.actualEnd != @timeSheetRecord.planEnd
|
|
107
|
+
rText += "(#{@timeSheetRecord.planEnd.to_s(query.timeFormat)}) "
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
rText += "\n\n"
|
|
111
|
+
end
|
|
112
|
+
elsif !(@timeSheetRecord = @timeSheetRecord).nil? &&
|
|
113
|
+
@timeSheetRecord.task.is_a?(String)
|
|
114
|
+
# There is only an entry in the timesheet, but we don't have a
|
|
115
|
+
# corresponding Task in the Project. This must be a new task created
|
|
116
|
+
# by the timesheet submitter.
|
|
117
|
+
rText += "#{hlMark} #{alertName} <nowiki>[New Task] " +
|
|
118
|
+
"#{@timeSheetRecord.name}</nowiki>"
|
|
119
|
+
if query.journalAttributes.include?('propertyid')
|
|
120
|
+
rText += " (ID: #{@timeSheetRecord.task})"
|
|
121
|
+
end
|
|
122
|
+
rText += " #{hlMark}\n\n"
|
|
123
|
+
|
|
124
|
+
if query.journalAttributes.include?('timesheet') && @timeSheetRecord
|
|
125
|
+
# We don't have any plan data since it's a new task. Just include
|
|
126
|
+
# the reported time sheet actuals.
|
|
127
|
+
rText += "'''Work:''' #{@timeSheetRecord.actualWorkPercent}% "
|
|
128
|
+
if @timeSheetRecord.remaining
|
|
129
|
+
rText += "'''Remaining:''' #{@timeSheetRecord.actualRemaining}d "
|
|
130
|
+
else
|
|
131
|
+
rText += "'''End:''' " +
|
|
132
|
+
"#{@timeSheetRecord.actualEnd.to_s(query.timeFormat)} "
|
|
133
|
+
end
|
|
134
|
+
rText += "\n\n"
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
# Property must be a Resource
|
|
138
|
+
rText += "#{hlMark} #{alertName} Personal Notes #{hlMark}\n\n"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# We've shown the alert now. Don't show it again with the headline.
|
|
142
|
+
alertName = ''
|
|
143
|
+
# Increase level for subsequent headlines.
|
|
144
|
+
hlMark += '='
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
if query.journalAttributes.include?('headline')
|
|
148
|
+
rText += "#{hlMark} #{alertName}<nowiki>" + @headline +
|
|
149
|
+
"</nowiki> #{hlMark}\n\n"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
showDate = query.journalAttributes.include?('date')
|
|
153
|
+
showAuthor = query.journalAttributes.include?('author') && @author
|
|
154
|
+
if showDate || showAuthor
|
|
155
|
+
rText += "''Reported "
|
|
156
|
+
end
|
|
157
|
+
if showDate
|
|
158
|
+
rText += "on #{@date.to_s(query.timeFormat)} "
|
|
159
|
+
end
|
|
160
|
+
if showAuthor
|
|
161
|
+
rText += "by <nowiki>#{@author.name}</nowiki>"
|
|
162
|
+
end
|
|
163
|
+
rText += "''\n\n" if showDate || showAuthor
|
|
164
|
+
|
|
165
|
+
if query.journalAttributes.include?('flags') && !@flags.empty?
|
|
166
|
+
rText += "''Flags:'' #{@flags.join(', ')}\n\n"
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
if query.journalAttributes.include?('summary') && @summary
|
|
170
|
+
rText += @summary.richText.inputText + "\n\n"
|
|
171
|
+
end
|
|
172
|
+
if query.journalAttributes.include?('details') && @details
|
|
173
|
+
rText += @details.richText.inputText + "\n\n"
|
|
174
|
+
end
|
|
175
|
+
rText
|
|
176
|
+
end
|
|
177
|
+
|
|
59
178
|
# Just for debugging
|
|
60
179
|
def to_s # :nodoc:
|
|
61
180
|
"Headline: #{@headline}\nProperty: #{@property.class}: #{@property.fullId}"
|
|
@@ -70,11 +189,27 @@ class TaskJuggler
|
|
|
70
189
|
|
|
71
190
|
attr_reader :entries
|
|
72
191
|
|
|
192
|
+
JournalEntryList::SortingAttributes = [ :alert, :date, :seqno ]
|
|
193
|
+
|
|
73
194
|
def initialize
|
|
74
195
|
@entries = []
|
|
75
196
|
@sorted = false
|
|
197
|
+
@sortBy = [ [ :date, 1 ], [ :alert, 1 ], [ :seqno, 1 ] ]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def setSorting(by)
|
|
201
|
+
by.each do |attr, direction|
|
|
202
|
+
unless SortingAttributes.include?(attr)
|
|
203
|
+
raise ArgumentError, "Unknown attribute #{attr}"
|
|
204
|
+
end
|
|
205
|
+
if (direction != 1) && (direction != -1)
|
|
206
|
+
raise ArgumentError, "Unknown direction #{direction}"
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
@sortBy = by
|
|
76
210
|
end
|
|
77
211
|
|
|
212
|
+
|
|
78
213
|
# Return the number of entries.
|
|
79
214
|
def count
|
|
80
215
|
@entries.length
|
|
@@ -167,12 +302,21 @@ class TaskJuggler
|
|
|
167
302
|
else
|
|
168
303
|
return self if @sorted
|
|
169
304
|
|
|
170
|
-
@entries.sort!
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
305
|
+
@entries.sort! do |a, b|
|
|
306
|
+
res = 0
|
|
307
|
+
@sortBy.each do |attr, direction|
|
|
308
|
+
res = case attr
|
|
309
|
+
when :date
|
|
310
|
+
a.date <=> b.date
|
|
311
|
+
when :alert
|
|
312
|
+
a.alertLevel <=> b.alertLevel
|
|
313
|
+
when :seqno
|
|
314
|
+
a.property.sequenceNo <=> b.property.sequenceNo
|
|
315
|
+
end * direction
|
|
316
|
+
break if res != 0
|
|
317
|
+
end
|
|
318
|
+
res
|
|
319
|
+
end
|
|
176
320
|
end
|
|
177
321
|
@sorted = true
|
|
178
322
|
self
|
|
@@ -211,6 +355,124 @@ class TaskJuggler
|
|
|
211
355
|
@propertyToEntries[entry.property] << entry
|
|
212
356
|
end
|
|
213
357
|
|
|
358
|
+
def to_rti(query)
|
|
359
|
+
entries = JournalEntryList.new
|
|
360
|
+
|
|
361
|
+
case query.journalMode
|
|
362
|
+
when :journal
|
|
363
|
+
# This is the regular journal. It contains all journal entries that
|
|
364
|
+
# are dated in the query interval. If a property is given, only
|
|
365
|
+
# entries of this property are included.
|
|
366
|
+
if query.property
|
|
367
|
+
if query.property.is_a?(Task)
|
|
368
|
+
entries = entriesByTask(query.property, query.start, query.end,
|
|
369
|
+
query.hideJournalEntry)
|
|
370
|
+
elsif query.property.is_a?(Resource)
|
|
371
|
+
entries = entriesByResource(query.property, query.start, query.end,
|
|
372
|
+
query.hideJournalEntry)
|
|
373
|
+
end
|
|
374
|
+
else
|
|
375
|
+
entries = self.entries(query.start, query.end, query.hideJournalEntry)
|
|
376
|
+
end
|
|
377
|
+
when :journal_sub
|
|
378
|
+
# This mode also contains all journal entries that are dated in the
|
|
379
|
+
# query interval. A property must be given and only entries of this
|
|
380
|
+
# property and all its children are included.
|
|
381
|
+
if query.property.is_a?(Task)
|
|
382
|
+
entries = entriesByTaskR(query.property, query.start, query.end,
|
|
383
|
+
query.hideJournalEntry)
|
|
384
|
+
end
|
|
385
|
+
when :status_up
|
|
386
|
+
# In this mode only the last entries before the query end date for
|
|
387
|
+
# each task are included. An entry is not included if any of the
|
|
388
|
+
# parent tasks has a more recent entry that is still before the query
|
|
389
|
+
# end date.
|
|
390
|
+
if query.property
|
|
391
|
+
if query.property.is_a?(Task)
|
|
392
|
+
entries += currentEntries(query.end, query.property, 0, query.start,
|
|
393
|
+
query.hideJournalEntry)
|
|
394
|
+
end
|
|
395
|
+
else
|
|
396
|
+
query.project.tasks.each do |task|
|
|
397
|
+
# We only care about top-level tasks.
|
|
398
|
+
next if task.parent
|
|
399
|
+
|
|
400
|
+
entries += currentEntries(query.end, task, 0, query.start,
|
|
401
|
+
query.hideJournalEntry)
|
|
402
|
+
# Eliminate duplicates due to entries from adopted tasks
|
|
403
|
+
entries.uniq!
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
when :status_down
|
|
407
|
+
# In this mode only the last entries before the query end date for
|
|
408
|
+
# each task (incl. sub tasks) are included.
|
|
409
|
+
if query.property
|
|
410
|
+
if query.property.is_a?(Task)
|
|
411
|
+
entries += currentEntriesR(query.end, query.property, 0, query.start,
|
|
412
|
+
query.hideJournalEntry)
|
|
413
|
+
end
|
|
414
|
+
else
|
|
415
|
+
query.project.tasks.each do |task|
|
|
416
|
+
# We only care about top-level tasks.
|
|
417
|
+
next if task.parent
|
|
418
|
+
|
|
419
|
+
entries += currentEntriesR(query.end, task, 0, query.start,
|
|
420
|
+
query.hideJournalEntry)
|
|
421
|
+
# Eliminate duplicates due to entries from adopted tasks
|
|
422
|
+
entries.uniq!
|
|
423
|
+
end
|
|
424
|
+
end
|
|
425
|
+
when :alerts_down
|
|
426
|
+
# In this mode only the last entries before the query end date for
|
|
427
|
+
# each task (incl. sub tasks) and only the ones with the highest alert
|
|
428
|
+
# level are included.
|
|
429
|
+
if query.property
|
|
430
|
+
if query.property.is_a?(Task)
|
|
431
|
+
entries += alertEntries(query.end, query.property, 1, query.start,
|
|
432
|
+
query.hideJournalEntry)
|
|
433
|
+
end
|
|
434
|
+
else
|
|
435
|
+
query.project.tasks.each do |task|
|
|
436
|
+
# We only care about top-level tasks.
|
|
437
|
+
next if task.parent
|
|
438
|
+
|
|
439
|
+
entries += alertEntries(query.end, task, 1, query.start,
|
|
440
|
+
query.hideJournalEntry)
|
|
441
|
+
# Eliminate duplicates due to entries from adopted tasks
|
|
442
|
+
entries.uniq!
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
else
|
|
446
|
+
raise "Unknown jourmal mode: #{query.journalMode}"
|
|
447
|
+
end
|
|
448
|
+
# Sort entries according to the user specified sorting criteria.
|
|
449
|
+
entries.setSorting(query.sortJournalEntries)
|
|
450
|
+
entries.sort!
|
|
451
|
+
|
|
452
|
+
# The components of the message are either UTF-8 text or RichText. For
|
|
453
|
+
# the RichText components, we use the originally provided markup since
|
|
454
|
+
# we compose the result as RichText markup first.
|
|
455
|
+
rText = ''
|
|
456
|
+
entries.each do |entry|
|
|
457
|
+
rText += entry.to_rText(query)
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
# Now convert the RichText markup String into RichTextIntermediate
|
|
461
|
+
# format.
|
|
462
|
+
unless (rti = RichText.new(rText, RTFHandlers.create(query.project),
|
|
463
|
+
query.project.messageHandler).
|
|
464
|
+
generateIntermediateFormat)
|
|
465
|
+
query.project.warning('ptn_journal',
|
|
466
|
+
"Syntax error in journal: #{rText}")
|
|
467
|
+
return nil
|
|
468
|
+
end
|
|
469
|
+
# No section numbers, please!
|
|
470
|
+
rti.sectionNumbers = false
|
|
471
|
+
# We use a special class to allow CSS formating.
|
|
472
|
+
rti.cssClass = 'tj_journal'
|
|
473
|
+
query.rti = rti
|
|
474
|
+
end
|
|
475
|
+
|
|
214
476
|
# Return a list of all JournalEntry objects for the given _resource_ that
|
|
215
477
|
# are dated between _startDate_ and _endDate_, are not hidden by their
|
|
216
478
|
# flags matching _logExp_, are for Task _task_ and have at least the alert
|
|
@@ -218,7 +480,7 @@ class TaskJuggler
|
|
|
218
480
|
# the entry.
|
|
219
481
|
def entriesByResource(resource, startDate = nil, endDate = nil,
|
|
220
482
|
logExp = nil, task = nil, alertLevel = nil)
|
|
221
|
-
list =
|
|
483
|
+
list = JournalEntryList.new
|
|
222
484
|
@entries.each do |entry|
|
|
223
485
|
if entry.author == resource &&
|
|
224
486
|
(startDate.nil? || entry.date > startDate) &&
|
|
@@ -239,7 +501,7 @@ class TaskJuggler
|
|
|
239
501
|
# nil, it always matches the entry.
|
|
240
502
|
def entriesByTask(task, startDate = nil, endDate = nil, logExp = nil,
|
|
241
503
|
resource = nil, alertLevel = nil)
|
|
242
|
-
list =
|
|
504
|
+
list = JournalEntryList.new
|
|
243
505
|
@entries.each do |entry|
|
|
244
506
|
if entry.property == task &&
|
|
245
507
|
(startDate.nil? || entry.date >= startDate) &&
|
|
@@ -273,7 +535,7 @@ class TaskJuggler
|
|
|
273
535
|
|
|
274
536
|
def entries(startDate = nil, endDate = nil, logExp = nil, property = nil,
|
|
275
537
|
alertLevel = nil)
|
|
276
|
-
list =
|
|
538
|
+
list = JournalEntryList.new
|
|
277
539
|
@entries.each do |entry|
|
|
278
540
|
if (startDate.nil? || startDate <= entry.date) &&
|
|
279
541
|
(endDate.nil? || endDate >= entry.date) &&
|
|
@@ -304,7 +566,8 @@ class TaskJuggler
|
|
|
304
566
|
|
|
305
567
|
# Return the list of JournalEntry objects that are dated at or before
|
|
306
568
|
# _date_, are for _property_ or any of its childs, have at least _level_
|
|
307
|
-
# alert and are after _minDate_.
|
|
569
|
+
# alert and are after _minDate_. We only return those entries with the
|
|
570
|
+
# highest overall alert level.
|
|
308
571
|
def alertEntries(date, property, minLevel, minDate, logExp)
|
|
309
572
|
maxLevel = 0
|
|
310
573
|
entries = []
|
data/lib/taskjuggler/Log.rb
CHANGED
|
@@ -42,7 +42,7 @@ class TaskJuggler
|
|
|
42
42
|
# into the shown segments will be shown for the next @@level nested
|
|
43
43
|
# segments.
|
|
44
44
|
def Log.segments=(s)
|
|
45
|
-
@@segments =
|
|
45
|
+
@@segments = s
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# if +s+ is true, progress information will not be shown.
|
|
@@ -61,7 +61,7 @@ class TaskJuggler
|
|
|
61
61
|
return if @@level == 0
|
|
62
62
|
|
|
63
63
|
@@stack << segment
|
|
64
|
-
Log
|
|
64
|
+
Log.msg { ">> [#{segment}] #{message}" }
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
# This function is used to close an open segment. To make this mechanism a
|
|
@@ -70,7 +70,7 @@ class TaskJuggler
|
|
|
70
70
|
def Log.exit(segment, message = nil)
|
|
71
71
|
return if @@level == 0
|
|
72
72
|
|
|
73
|
-
Log
|
|
73
|
+
Log.msg { "<< [#{segment}] #{message}" } if message
|
|
74
74
|
if @@stack.include?(segment)
|
|
75
75
|
loop do
|
|
76
76
|
m = @@stack.pop
|
|
@@ -80,8 +80,9 @@ class TaskJuggler
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
# Use this function to show a log message within the currently active
|
|
83
|
-
# segment.
|
|
84
|
-
|
|
83
|
+
# segment. The message is the result of the passed block. The block will
|
|
84
|
+
# only be evaluated if the message will actually be shown.
|
|
85
|
+
def Log.msg(&block)
|
|
85
86
|
return if @@level == 0
|
|
86
87
|
|
|
87
88
|
offset = 0
|
|
@@ -91,8 +92,8 @@ class TaskJuggler
|
|
|
91
92
|
# If a segment list is used to filter the output, we look for the
|
|
92
93
|
# first listed segments on the stack. This and all nested segments
|
|
93
94
|
# will be shown.
|
|
94
|
-
if @@segments.include?(segment)
|
|
95
|
-
|
|
95
|
+
if @@segments.include?(segment)
|
|
96
|
+
offset = @@stack.index(segment)
|
|
96
97
|
showMessage = true
|
|
97
98
|
break
|
|
98
99
|
end
|
|
@@ -100,7 +101,7 @@ class TaskJuggler
|
|
|
100
101
|
return unless showMessage
|
|
101
102
|
end
|
|
102
103
|
if @@stack.length - offset < @@level
|
|
103
|
-
$stderr.puts ' ' * (@@stack.length - offset) +
|
|
104
|
+
$stderr.puts ' ' * (@@stack.length - offset) + yield(block)
|
|
104
105
|
end
|
|
105
106
|
end
|
|
106
107
|
|
data/lib/taskjuggler/Project.rb
CHANGED
|
@@ -368,6 +368,10 @@ class TaskJuggler
|
|
|
368
368
|
false, false, false, -1 ],
|
|
369
369
|
[ 'interactive', 'Interactive', BooleanAttribute,
|
|
370
370
|
false, false, false, false ],
|
|
371
|
+
[ 'journalAttributes', 'Journal Attributes', SymbolListAttribute,
|
|
372
|
+
true, false, false, KeywordArray.new([ '*' ]) ],
|
|
373
|
+
[ 'journalMode', 'Journal Mode', SymbolAttribute,
|
|
374
|
+
true, false, false, :journal ],
|
|
371
375
|
[ 'left', 'Left', RichTextAttribute,
|
|
372
376
|
true, false, false, nil ],
|
|
373
377
|
[ 'loadUnit', 'Load Unit', StringAttribute,
|
|
@@ -402,6 +406,8 @@ class TaskJuggler
|
|
|
402
406
|
false, false, false, nil ],
|
|
403
407
|
[ 'shortTimeFormat', 'Short Time Format', StringAttribute,
|
|
404
408
|
true, true, false, nil ],
|
|
409
|
+
[ 'sortJournalEntries', 'Sort Journal Entries', JournalSortListAttribute,
|
|
410
|
+
true, false, false, [[ :alert, 1 ], [ :date, 1 ], [ :seqno, 1 ]] ],
|
|
405
411
|
[ 'sortResources', 'Sort Resources', SortListAttribute,
|
|
406
412
|
true, false, false, [[ 'seqno', true, -1 ]] ],
|
|
407
413
|
[ 'sortTasks', 'Sort Tasks', SortListAttribute,
|
|
@@ -989,61 +995,9 @@ class TaskJuggler
|
|
|
989
995
|
end
|
|
990
996
|
|
|
991
997
|
def journal(query)
|
|
992
|
-
|
|
993
|
-
@tasks.each do |task|
|
|
994
|
-
# We only care about top-level tasks.
|
|
995
|
-
next if task.parent
|
|
996
|
-
|
|
997
|
-
entries += (e = @attributes['journal'].
|
|
998
|
-
currentEntriesR(query.end, task, 0, query.start,
|
|
999
|
-
query.hideJournalEntry))
|
|
1000
|
-
end
|
|
1001
|
-
|
|
1002
|
-
# Eliminate duplicates due to entries from adopted tasks
|
|
1003
|
-
entries.uniq!
|
|
1004
|
-
|
|
1005
|
-
journalMessages(entries, query, true)
|
|
1006
|
-
end
|
|
1007
|
-
|
|
1008
|
-
# Create a blog-style list of all alert messages that match the Query.
|
|
1009
|
-
def journalMessages(entries, query, longVersion)
|
|
1010
|
-
# The components of the message are either UTF-8 text or RichText. For
|
|
1011
|
-
# the RichText components, we use the originally provided markup since
|
|
1012
|
-
# we compose the result as RichText markup first.
|
|
1013
|
-
rText = ''
|
|
1014
|
-
entries.each do |entry|
|
|
1015
|
-
rText += "==== <nowiki>" + entry.headline + "</nowiki> ====\n"
|
|
1016
|
-
#rText += "''Reported on #{entry.date.to_s(query.timeFormat)}'' "
|
|
1017
|
-
#if entry.author
|
|
1018
|
-
# rText += "''by <nowiki>#{entry.author.name}</nowiki>''"
|
|
1019
|
-
#end
|
|
1020
|
-
#rText += "\n\n"
|
|
1021
|
-
#unless entry.flags.empty?
|
|
1022
|
-
# rText += "''Flags:'' #{entry.flags.join(', ')}\n\n"
|
|
1023
|
-
#end
|
|
1024
|
-
if entry.summary
|
|
1025
|
-
rText += entry.summary.richText.inputText + "\n\n"
|
|
1026
|
-
end
|
|
1027
|
-
if longVersion && entry.details
|
|
1028
|
-
rText += entry.details.richText.inputText + "\n\n"
|
|
1029
|
-
end
|
|
1030
|
-
end
|
|
1031
|
-
# Now convert the RichText markup String into RichTextIntermediate
|
|
1032
|
-
# format.
|
|
1033
|
-
unless (rti = RichText.new(rText, RTFHandlers.create(self),
|
|
1034
|
-
@messageHandler).
|
|
1035
|
-
generateIntermediateFormat)
|
|
1036
|
-
warning('ptn_journal', "Syntax error in journal message: #{rText}")
|
|
1037
|
-
return nil
|
|
1038
|
-
end
|
|
1039
|
-
# No section numbers, please!
|
|
1040
|
-
rti.sectionNumbers = false
|
|
1041
|
-
# We use a special class to allow CSS formating.
|
|
1042
|
-
rti.cssClass = 'tj_journal'
|
|
1043
|
-
query.rti = rti
|
|
998
|
+
@attributes['journal'].to_rti(query)
|
|
1044
999
|
end
|
|
1045
1000
|
|
|
1046
|
-
|
|
1047
1001
|
# Print the attribute values. It's used for debugging only.
|
|
1048
1002
|
def to_s
|
|
1049
1003
|
#raise "STOP!"
|
|
@@ -1071,6 +1025,8 @@ class TaskJuggler
|
|
|
1071
1025
|
protected
|
|
1072
1026
|
|
|
1073
1027
|
def prepareScenario(scIdx)
|
|
1028
|
+
Log.enter('prepareScenario',
|
|
1029
|
+
"Finishing scenario #{scenario(scIdx).get('name')}")
|
|
1074
1030
|
Log.startProgressMeter("Preparing scenario " +
|
|
1075
1031
|
"#{scenario(scIdx).get('name')}")
|
|
1076
1032
|
resources = PropertyList.new(@resources)
|
|
@@ -1141,9 +1097,13 @@ class TaskJuggler
|
|
|
1141
1097
|
puts "#{task}"
|
|
1142
1098
|
end
|
|
1143
1099
|
end
|
|
1100
|
+
Log.exit('prepareScenario',
|
|
1101
|
+
"Preparing scenario #{scenario(scIdx).get('name')} completed")
|
|
1144
1102
|
end
|
|
1145
1103
|
|
|
1146
1104
|
def finishScenario(scIdx)
|
|
1105
|
+
Log.enter('finishScenario',
|
|
1106
|
+
"Finishing scenario #{scenario(scIdx).get('name')}")
|
|
1147
1107
|
Log.startProgressMeter("Checking scenario #{scenario(scIdx).get('name')}")
|
|
1148
1108
|
@tasks.each do |task|
|
|
1149
1109
|
# Recursively traverse the top-level tasks to finish all tasks.
|
|
@@ -1164,6 +1124,8 @@ class TaskJuggler
|
|
|
1164
1124
|
end
|
|
1165
1125
|
|
|
1166
1126
|
Log.stopProgressMeter
|
|
1127
|
+
Log.exit('finishScenario',
|
|
1128
|
+
"Finishing scenario #{scenario(scIdx).get('name')} completed")
|
|
1167
1129
|
end
|
|
1168
1130
|
|
|
1169
1131
|
# Schedule all tasks for the given Scenario with index +scIdx+.
|
|
@@ -1208,13 +1170,10 @@ class TaskJuggler
|
|
|
1208
1170
|
# Task not ready? Ignore it.
|
|
1209
1171
|
next unless task.readyForScheduling?(scIdx)
|
|
1210
1172
|
|
|
1211
|
-
|
|
1212
|
-
Log << "Task #{task.fullId}: #{task['start', scIdx]} -> " +
|
|
1213
|
-
"#{task['end', scIdx]}"
|
|
1214
|
-
else
|
|
1173
|
+
unless task.schedule(scIdx)
|
|
1215
1174
|
failedTasks << task
|
|
1216
1175
|
end
|
|
1217
|
-
# The
|
|
1176
|
+
# The task has been completed or failed. But we can remove it from
|
|
1218
1177
|
# the todo list.
|
|
1219
1178
|
taskToRemove = task
|
|
1220
1179
|
# The scheduling of this task may cause other higher priority tasks
|
|
@@ -1227,9 +1186,18 @@ class TaskJuggler
|
|
|
1227
1186
|
# has found a set of tasks that deadlock each other.
|
|
1228
1187
|
if taskToRemove
|
|
1229
1188
|
tasks.delete(taskToRemove)
|
|
1189
|
+
elsif failedTasks.empty?
|
|
1190
|
+
warning('deadlock',
|
|
1191
|
+
'Some tasks reference each other but don\'t provide ' +
|
|
1192
|
+
'enough information to start the scheduling. The ' +
|
|
1193
|
+
'scheduler does not know where to start scheduling ' +
|
|
1194
|
+
'these tasks. You need to provide more fixed dates ' +
|
|
1195
|
+
'or dependencies on already scheduled tasks.')
|
|
1196
|
+
failedTasks = tasks
|
|
1197
|
+
break
|
|
1230
1198
|
else
|
|
1231
|
-
tasks
|
|
1232
|
-
|
|
1199
|
+
# We have some tasks that cannot be scheduled.
|
|
1200
|
+
break
|
|
1233
1201
|
end
|
|
1234
1202
|
end
|
|
1235
1203
|
|