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