taskjuggler 0.0.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/COPYING +280 -0
- data/README +31 -0
- data/Rakefile +20 -0
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/allocate.tjp +30 -0
- data/benchmarks/booking.tjp +62 -0
- data/benchmarks/depends.tjp +112 -0
- data/benchmarks/htmltaskreport.tjp +45 -0
- data/benchmarks/runbench.rb +24 -0
- data/bin/tj3 +3 -0
- data/bin/tj3man +3 -0
- data/doc/classes/AppConfig.html +808 -0
- data/doc/classes/Arguments.html +226 -0
- data/doc/classes/String.html +395 -0
- data/doc/classes/TaskJuggler.html +1358 -0
- data/doc/classes/TaskJuggler/Account.html +257 -0
- data/doc/classes/TaskJuggler/AccountScenario.html +218 -0
- data/doc/classes/TaskJuggler/Allocation.html +419 -0
- data/doc/classes/TaskJuggler/AllocationAttribute.html +291 -0
- data/doc/classes/TaskJuggler/AttributeBase.html +608 -0
- data/doc/classes/TaskJuggler/AttributeDefinition.html +259 -0
- data/doc/classes/TaskJuggler/Booking.html +307 -0
- data/doc/classes/TaskJuggler/BookingListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/BooleanAttribute.html +261 -0
- data/doc/classes/TaskJuggler/CSVFile.html +325 -0
- data/doc/classes/TaskJuggler/Charge.html +279 -0
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +229 -0
- data/doc/classes/TaskJuggler/ChargeSet.html +440 -0
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +276 -0
- data/doc/classes/TaskJuggler/ColumnTable.html +260 -0
- data/doc/classes/TaskJuggler/DateAttribute.html +194 -0
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/DurationAttribute.html +229 -0
- data/doc/classes/TaskJuggler/FixnumAttribute.html +194 -0
- data/doc/classes/TaskJuggler/FlagListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/FloatAttribute.html +229 -0
- data/doc/classes/TaskJuggler/GanttChart.html +667 -0
- data/doc/classes/TaskJuggler/GanttContainer.html +441 -0
- data/doc/classes/TaskJuggler/GanttHeader.html +280 -0
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +245 -0
- data/doc/classes/TaskJuggler/GanttLine.html +398 -0
- data/doc/classes/TaskJuggler/GanttLoadStack.html +327 -0
- data/doc/classes/TaskJuggler/GanttMilestone.html +415 -0
- data/doc/classes/TaskJuggler/GanttRouter.html +425 -0
- data/doc/classes/TaskJuggler/GanttTaskBar.html +429 -0
- data/doc/classes/TaskJuggler/HTMLDocument.html +240 -0
- data/doc/classes/TaskJuggler/HTMLGraphics.html +231 -0
- data/doc/classes/TaskJuggler/Interval.html +552 -0
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +796 -0
- data/doc/classes/TaskJuggler/Limits.html +416 -0
- data/doc/classes/TaskJuggler/Limits/Limit.html +381 -0
- data/doc/classes/TaskJuggler/LimitsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/Log.html +613 -0
- data/doc/classes/TaskJuggler/LogicalAttribute.html +226 -0
- data/doc/classes/TaskJuggler/LogicalExpression.html +251 -0
- data/doc/classes/TaskJuggler/LogicalFlag.html +229 -0
- data/doc/classes/TaskJuggler/LogicalFunction.html +324 -0
- data/doc/classes/TaskJuggler/LogicalOperation.html +299 -0
- data/doc/classes/TaskJuggler/Macro.html +194 -0
- data/doc/classes/TaskJuggler/MacroParser.html +360 -0
- data/doc/classes/TaskJuggler/MacroTable.html +366 -0
- data/doc/classes/TaskJuggler/Message.html +281 -0
- data/doc/classes/TaskJuggler/MessageHandler.html +215 -0
- data/doc/classes/TaskJuggler/Project.html +1606 -0
- data/doc/classes/TaskJuggler/ProjectFileParser.html +412 -0
- data/doc/classes/TaskJuggler/PropertyList.html +597 -0
- data/doc/classes/TaskJuggler/PropertySet.html +1200 -0
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +1449 -0
- data/doc/classes/TaskJuggler/Query.html +600 -0
- data/doc/classes/TaskJuggler/RealFormat.html +252 -0
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +194 -0
- data/doc/classes/TaskJuggler/Report.html +528 -0
- data/doc/classes/TaskJuggler/ReportElement.html +1070 -0
- data/doc/classes/TaskJuggler/ReportTable.html +497 -0
- data/doc/classes/TaskJuggler/ReportTableCell.html +518 -0
- data/doc/classes/TaskJuggler/ReportTableColumn.html +364 -0
- data/doc/classes/TaskJuggler/ReportTableElement.html +644 -0
- data/doc/classes/TaskJuggler/ReportTableLegend.html +343 -0
- data/doc/classes/TaskJuggler/ReportTableLine.html +431 -0
- data/doc/classes/TaskJuggler/Resource.html +211 -0
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/ResourceListRE.html +249 -0
- data/doc/classes/TaskJuggler/ResourceScenario.html +1137 -0
- data/doc/classes/TaskJuggler/RichText.html +537 -0
- data/doc/classes/TaskJuggler/RichTextAttribute.html +229 -0
- data/doc/classes/TaskJuggler/RichTextDocument.html +418 -0
- data/doc/classes/TaskJuggler/RichTextElement.html +829 -0
- data/doc/classes/TaskJuggler/RichTextException.html +212 -0
- data/doc/classes/TaskJuggler/RichTextParser.html +317 -0
- data/doc/classes/TaskJuggler/RichTextProtocolExample.html +303 -0
- data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +194 -0
- data/doc/classes/TaskJuggler/RichTextScanner.html +561 -0
- data/doc/classes/TaskJuggler/RichTextSnip.html +364 -0
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +883 -0
- data/doc/classes/TaskJuggler/Scenario.html +163 -0
- data/doc/classes/TaskJuggler/ScenarioData.html +354 -0
- data/doc/classes/TaskJuggler/Scoreboard.html +638 -0
- data/doc/classes/TaskJuggler/Shift.html +255 -0
- data/doc/classes/TaskJuggler/ShiftAssignment.html +488 -0
- data/doc/classes/TaskJuggler/ShiftAssignments.html +715 -0
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/ShiftScenario.html +282 -0
- data/doc/classes/TaskJuggler/SourceFileInfo.html +247 -0
- data/doc/classes/TaskJuggler/StringAttribute.html +229 -0
- data/doc/classes/TaskJuggler/SymbolAttribute.html +194 -0
- data/doc/classes/TaskJuggler/SyntaxReference.html +516 -0
- data/doc/classes/TaskJuggler/TOCEntry.html +242 -0
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +273 -0
- data/doc/classes/TaskJuggler/TableOfContents.html +256 -0
- data/doc/classes/TaskJuggler/Task.html +203 -0
- data/doc/classes/TaskJuggler/TaskDependency.html +251 -0
- data/doc/classes/TaskJuggler/TaskListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/TaskListRE.html +250 -0
- data/doc/classes/TaskJuggler/TaskScenario.html +2206 -0
- data/doc/classes/TaskJuggler/TextParser.html +670 -0
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +923 -0
- data/doc/classes/TaskJuggler/TextParser/Rule.html +779 -0
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +267 -0
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +212 -0
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +221 -0
- data/doc/classes/TaskJuggler/TextScanner.html +708 -0
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +355 -0
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +341 -0
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +260 -0
- data/doc/classes/TaskJuggler/TjException.html +185 -0
- data/doc/classes/TaskJuggler/TjTime.html +1845 -0
- data/doc/classes/TaskJuggler/TjpExample.html +310 -0
- data/doc/classes/TaskJuggler/TjpExportRE.html +329 -0
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +8928 -0
- data/doc/classes/TaskJuggler/UserManual.html +606 -0
- data/doc/classes/TaskJuggler/WorkingHours.html +582 -0
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +284 -0
- data/doc/classes/TaskJuggler/XMLBlob.html +207 -0
- data/doc/classes/TaskJuggler/XMLComment.html +206 -0
- data/doc/classes/TaskJuggler/XMLDocument.html +293 -0
- data/doc/classes/TaskJuggler/XMLElement.html +341 -0
- data/doc/classes/TaskJuggler/XMLNamedText.html +174 -0
- data/doc/classes/TaskJuggler/XMLText.html +221 -0
- data/doc/files/COPYING.html +448 -0
- data/doc/files/README.html +134 -0
- data/doc/files/lib/AccountScenario_rb.html +116 -0
- data/doc/files/lib/Account_rb.html +118 -0
- data/doc/files/lib/Allocation_rb.html +118 -0
- data/doc/files/lib/AppConfig_rb.html +116 -0
- data/doc/files/lib/AttributeBase_rb.html +106 -0
- data/doc/files/lib/AttributeDefinition_rb.html +106 -0
- data/doc/files/lib/Attributes_rb.html +130 -0
- data/doc/files/lib/Booking_rb.html +106 -0
- data/doc/files/lib/ChargeSet_rb.html +116 -0
- data/doc/files/lib/Charge_rb.html +116 -0
- data/doc/files/lib/HTMLDocument_rb.html +116 -0
- data/doc/files/lib/Interval_rb.html +116 -0
- data/doc/files/lib/KeywordDocumentation_rb.html +122 -0
- data/doc/files/lib/Limits_rb.html +116 -0
- data/doc/files/lib/Log_rb.html +116 -0
- data/doc/files/lib/LogicalExpression_rb.html +122 -0
- data/doc/files/lib/LogicalFlag_rb.html +116 -0
- data/doc/files/lib/LogicalFunction_rb.html +116 -0
- data/doc/files/lib/LogicalOperation_rb.html +116 -0
- data/doc/files/lib/MacroParser_rb.html +118 -0
- data/doc/files/lib/MacroTable_rb.html +122 -0
- data/doc/files/lib/MessageHandler_rb.html +106 -0
- data/doc/files/lib/Message_rb.html +116 -0
- data/doc/files/lib/ProjectFileParser_rb.html +122 -0
- data/doc/files/lib/Project_rb.html +148 -0
- data/doc/files/lib/PropertyList_rb.html +106 -0
- data/doc/files/lib/PropertySet_rb.html +118 -0
- data/doc/files/lib/PropertyTreeNode_rb.html +106 -0
- data/doc/files/lib/Query_rb.html +116 -0
- data/doc/files/lib/RealFormat_rb.html +106 -0
- data/doc/files/lib/ResourceScenario_rb.html +116 -0
- data/doc/files/lib/Resource_rb.html +118 -0
- data/doc/files/lib/RichTextDocument_rb.html +120 -0
- data/doc/files/lib/RichTextElement_rb.html +120 -0
- data/doc/files/lib/RichTextParser_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolExample_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolHandler_rb.html +106 -0
- data/doc/files/lib/RichTextScanner_rb.html +116 -0
- data/doc/files/lib/RichTextSnip_rb.html +118 -0
- data/doc/files/lib/RichTextSyntaxRules_rb.html +106 -0
- data/doc/files/lib/RichText_rb.html +118 -0
- data/doc/files/lib/ScenarioData_rb.html +118 -0
- data/doc/files/lib/Scenario_rb.html +116 -0
- data/doc/files/lib/Scoreboard_rb.html +106 -0
- data/doc/files/lib/ShiftAssignments_rb.html +116 -0
- data/doc/files/lib/ShiftScenario_rb.html +116 -0
- data/doc/files/lib/Shift_rb.html +118 -0
- data/doc/files/lib/SourceFileInfo_rb.html +106 -0
- data/doc/files/lib/SyntaxReference_rb.html +122 -0
- data/doc/files/lib/TOCEntry_rb.html +118 -0
- data/doc/files/lib/TableColumnDefinition_rb.html +106 -0
- data/doc/files/lib/TableOfContents_rb.html +118 -0
- data/doc/files/lib/TaskDependency_rb.html +106 -0
- data/doc/files/lib/TaskJuggler_rb.html +120 -0
- data/doc/files/lib/TaskScenario_rb.html +116 -0
- data/doc/files/lib/Task_rb.html +118 -0
- data/doc/files/lib/TextParser/Pattern_rb.html +116 -0
- data/doc/files/lib/TextParser/Rule_rb.html +106 -0
- data/doc/files/lib/TextParser/StackElement_rb.html +106 -0
- data/doc/files/lib/TextParser/TokenDoc_rb.html +106 -0
- data/doc/files/lib/TextParser_rb.html +124 -0
- data/doc/files/lib/TextScanner_rb.html +128 -0
- data/doc/files/lib/Tj3Config_rb.html +118 -0
- data/doc/files/lib/TjException_rb.html +106 -0
- data/doc/files/lib/TjTime_rb.html +118 -0
- data/doc/files/lib/TjpExample_rb.html +116 -0
- data/doc/files/lib/TjpSyntaxRules_rb.html +106 -0
- data/doc/files/lib/UTF8String_rb.html +132 -0
- data/doc/files/lib/UserManual_rb.html +124 -0
- data/doc/files/lib/WorkingHours_rb.html +116 -0
- data/doc/files/lib/XMLDocument_rb.html +116 -0
- data/doc/files/lib/XMLElement_rb.html +116 -0
- data/doc/files/lib/reports/CSVFile_rb.html +116 -0
- data/doc/files/lib/reports/ColumnTable_rb.html +116 -0
- data/doc/files/lib/reports/GanttChart_rb.html +122 -0
- data/doc/files/lib/reports/GanttContainer_rb.html +116 -0
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +106 -0
- data/doc/files/lib/reports/GanttHeader_rb.html +116 -0
- data/doc/files/lib/reports/GanttLine_rb.html +126 -0
- data/doc/files/lib/reports/GanttLoadStack_rb.html +116 -0
- data/doc/files/lib/reports/GanttMilestone_rb.html +116 -0
- data/doc/files/lib/reports/GanttRouter_rb.html +106 -0
- data/doc/files/lib/reports/GanttTaskBar_rb.html +116 -0
- data/doc/files/lib/reports/HTMLGraphics_rb.html +106 -0
- data/doc/files/lib/reports/ReportElement_rb.html +118 -0
- data/doc/files/lib/reports/ReportTableCell_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableColumn_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableElement_rb.html +122 -0
- data/doc/files/lib/reports/ReportTableLegend_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableLine_rb.html +116 -0
- data/doc/files/lib/reports/ReportTable_rb.html +118 -0
- data/doc/files/lib/reports/Report_rb.html +126 -0
- data/doc/files/lib/reports/ResourceListRE_rb.html +122 -0
- data/doc/files/lib/reports/TaskListRE_rb.html +122 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +116 -0
- data/doc/files/lib/taskjuggler3_rb.html +276 -0
- data/doc/files/lib/tj3man_rb.html +189 -0
- data/doc/fr_class_index.html +285 -0
- data/doc/fr_file_index.html +223 -0
- data/doc/fr_method_index.html +1953 -0
- data/doc/index.html +21 -0
- data/doc/rdoc-style.css +299 -0
- data/examples/tutorial.tjp +361 -0
- data/gem_spec.rb +30 -0
- data/lib/Account.rb +50 -0
- data/lib/AccountScenario.rb +39 -0
- data/lib/Allocation.rb +102 -0
- data/lib/AppConfig.rb +134 -0
- data/lib/AttributeBase.rb +131 -0
- data/lib/AttributeDefinition.rb +47 -0
- data/lib/Attributes.rb +478 -0
- data/lib/BatchProcessor.rb +209 -0
- data/lib/Booking.rb +59 -0
- data/lib/Charge.rb +71 -0
- data/lib/ChargeSet.rb +126 -0
- data/lib/HTMLDocument.rb +59 -0
- data/lib/Interval.rb +127 -0
- data/lib/KeywordDocumentation.rb +560 -0
- data/lib/Limits.rb +219 -0
- data/lib/Log.rb +160 -0
- data/lib/LogicalExpression.rb +71 -0
- data/lib/LogicalFlag.rb +34 -0
- data/lib/LogicalFunction.rb +102 -0
- data/lib/LogicalOperation.rb +118 -0
- data/lib/MacroParser.rb +77 -0
- data/lib/MacroTable.rb +84 -0
- data/lib/Message.rb +56 -0
- data/lib/MessageHandler.rb +34 -0
- data/lib/Project.rb +662 -0
- data/lib/ProjectFileParser.rb +333 -0
- data/lib/PropertyList.rb +181 -0
- data/lib/PropertySet.rb +304 -0
- data/lib/PropertyTreeNode.rb +461 -0
- data/lib/Query.rb +227 -0
- data/lib/RealFormat.rb +73 -0
- data/lib/Resource.rb +42 -0
- data/lib/ResourceScenario.rb +511 -0
- data/lib/RichText.rb +147 -0
- data/lib/RichTextDocument.rb +139 -0
- data/lib/RichTextElement.rb +391 -0
- data/lib/RichTextParser.rb +66 -0
- data/lib/RichTextProtocolExample.rb +65 -0
- data/lib/RichTextProtocolHandler.rb +35 -0
- data/lib/RichTextScanner.rb +390 -0
- data/lib/RichTextSnip.rb +104 -0
- data/lib/RichTextSyntaxRules.rb +265 -0
- data/lib/Scenario.rb +27 -0
- data/lib/ScenarioData.rb +65 -0
- data/lib/Scoreboard.rb +141 -0
- data/lib/Shift.rb +48 -0
- data/lib/ShiftAssignments.rb +291 -0
- data/lib/ShiftScenario.rb +46 -0
- data/lib/SourceFileInfo.rb +37 -0
- data/lib/SyntaxReference.rb +284 -0
- data/lib/TOCEntry.rb +76 -0
- data/lib/TableColumnDefinition.rb +54 -0
- data/lib/TableOfContents.rb +46 -0
- data/lib/Task.rb +37 -0
- data/lib/TaskDependency.rb +39 -0
- data/lib/TaskJuggler.rb +84 -0
- data/lib/TaskScenario.rb +1622 -0
- data/lib/TextParser.rb +416 -0
- data/lib/TextParser/Pattern.rb +263 -0
- data/lib/TextParser/Rule.rb +171 -0
- data/lib/TextParser/StackElement.rb +45 -0
- data/lib/TextParser/TokenDoc.rb +38 -0
- data/lib/TextScanner.rb +682 -0
- data/lib/Tj3Config.rb +27 -0
- data/lib/TjException.rb +27 -0
- data/lib/TjTime.rb +395 -0
- data/lib/TjpExample.rb +119 -0
- data/lib/TjpSyntaxRules.rb +4022 -0
- data/lib/UTF8String.rb +100 -0
- data/lib/UserManual.rb +282 -0
- data/lib/WorkingHours.rb +323 -0
- data/lib/XMLDocument.rb +54 -0
- data/lib/XMLElement.rb +175 -0
- data/lib/reports/CSVFile.rb +146 -0
- data/lib/reports/ColumnTable.rb +66 -0
- data/lib/reports/GanttChart.rb +308 -0
- data/lib/reports/GanttContainer.rb +107 -0
- data/lib/reports/GanttHeader.rb +141 -0
- data/lib/reports/GanttHeaderScaleItem.rb +42 -0
- data/lib/reports/GanttLine.rb +329 -0
- data/lib/reports/GanttLoadStack.rb +113 -0
- data/lib/reports/GanttMilestone.rb +80 -0
- data/lib/reports/GanttRouter.rb +375 -0
- data/lib/reports/GanttTaskBar.rb +95 -0
- data/lib/reports/HTMLGraphics.rb +65 -0
- data/lib/reports/Report.rb +344 -0
- data/lib/reports/ReportElement.rb +427 -0
- data/lib/reports/ReportTable.rb +144 -0
- data/lib/reports/ReportTableCell.rb +142 -0
- data/lib/reports/ReportTableColumn.rb +82 -0
- data/lib/reports/ReportTableElement.rb +852 -0
- data/lib/reports/ReportTableLegend.rb +167 -0
- data/lib/reports/ReportTableLine.rb +87 -0
- data/lib/reports/ResourceListRE.rb +72 -0
- data/lib/reports/TaskListRE.rb +73 -0
- data/lib/reports/TjpExportRE.rb +394 -0
- data/lib/taskjuggler3.rb +106 -0
- data/lib/tj3man.rb +88 -0
- data/manual/Day_To_Day_Juggling +168 -0
- data/manual/Getting_Started +61 -0
- data/manual/How_To_Contribute +185 -0
- data/manual/Installation +68 -0
- data/manual/Intro +102 -0
- data/manual/Reporting_Bugs +26 -0
- data/manual/Rich_Text_Attributes +90 -0
- data/manual/TaskJuggler_2x_Migration +40 -0
- data/manual/Tutorial +579 -0
- data/manual/fdl +450 -0
- data/prj_cfg.rb +43 -0
- data/setup.rb +1585 -0
- data/tasks/csts.rake +72 -0
- data/tasks/gem.rake +14 -0
- data/tasks/manual.rake +10 -0
- data/tasks/missing.rake +21 -0
- data/tasks/rcov.rake +14 -0
- data/tasks/rdoc.rake +17 -0
- data/tasks/rexml_fix.rb +16 -0
- data/tasks/rexml_fix_19.rb +49 -0
- data/tasks/show.rake +21 -0
- data/tasks/stats.rake +25 -0
- data/tasks/test.rake +11 -0
- data/test/MessageChecker.rb +53 -0
- data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +7 -0
- data/test/TestSuite/CSV-Reports/genrefs +6 -0
- data/test/TestSuite/CSV-Reports/project-1.tji +57 -0
- data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -0
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +11 -0
- data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +8 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/taskreport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +24 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +11 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +86 -0
- data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +63 -0
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +161 -0
- data/test/TestSuite/Scheduler/Correct/Depends.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +129 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +81 -0
- data/test/TestSuite/Scheduler/Correct/MultipleMandatories.tjp +43 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +28 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +62 -0
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Shift.tjp +102 -0
- data/test/TestSuite/Scheduler/Errors/account_no_leaf.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/booking_conflict.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/booking_no_duty.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/booking_on_vacation.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/container_booking.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/container_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/effort_no_allocations.tjp +7 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +19 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +26 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +24 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +18 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +37 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +35 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +46 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +51 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/maxend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/maxstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_booking.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/milestone_duration.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_start_end.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/no_tasks.tjp +6 -0
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_child.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_parent.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_self.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_unknown.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_1.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_2.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_3.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_1.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_3.tjp +9 -0
- data/test/TestSuite/Syntax/Correct/Account.tjp +53 -0
- data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/Alternative.tjp +13 -0
- data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Booking.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Caption.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Comments.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Complete.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji +20 -0
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Depends1.tjp +22 -0
- data/test/TestSuite/Syntax/Correct/Durations.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Efficiency.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Export.tjp +40 -0
- data/test/TestSuite/Syntax/Correct/Flags.tjp +32 -0
- data/test/TestSuite/Syntax/Correct/Freeze.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Gap.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Limits-1.tjp +71 -0
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Mandatory.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Milestone.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/MinMax.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Numberformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Period.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Persistent.tjp +11 -0
- data/test/TestSuite/Syntax/Correct/Precedes1.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Priority.tjp +30 -0
- data/test/TestSuite/Syntax/Correct/Project.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +23 -0
- data/test/TestSuite/Syntax/Correct/RawHTML.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Reports.tjp +54 -0
- data/test/TestSuite/Syntax/Correct/Resource.tjp +20 -0
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Scenario.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/Scheduling.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Select.tjp +27 -0
- data/test/TestSuite/Syntax/Correct/Shift.tjp +55 -0
- data/test/TestSuite/Syntax/Correct/Simple.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/String.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Supplement.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +34 -0
- data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Timezone.tjp +8 -0
- data/test/TestSuite/Syntax/Correct/Vacation.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/csvtest +16 -0
- data/test/TestSuite/Syntax/Correct/manual2example.rb +24 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +485 -0
- data/test/TestSuite/Syntax/Errors/bad_include.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/booking_group.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/booking_milestone.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/booking_no_leaf.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/chargeset.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/container_attribute.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/date_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/effort_zero.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/extend_id_cap.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_end_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_start_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/leaf_resource_id_expected.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/misaligned_date.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/operand_attribute.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/overtime_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/purge_unknown_id.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/report_end.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_start.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/resource_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/resource_id_expected.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/scenario_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_assignment_overlap.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/shift_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_id_expected.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/sloppy_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/sort_direction.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/start_before_end1.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/start_before_end2.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/task_complete.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/task_priority.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_without_chargeset.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/time_interval.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/too_many_bangs.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/undecl_flag.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_projectid.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_id.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/unknown_task.tjp +10 -0
- data/test/all.rb +31 -0
- data/test/test_BatchProcessor.rb +54 -0
- data/test/test_CSV-Reports.rb +101 -0
- data/test/test_Limits.rb +104 -0
- data/test/test_LogicalExpression.rb +110 -0
- data/test/test_MacroTable.rb +51 -0
- data/test/test_Project.rb +57 -0
- data/test/test_PropertySet.rb +71 -0
- data/test/test_Query.rb +83 -0
- data/test/test_RealFormat.rb +83 -0
- data/test/test_RichText.rb +869 -0
- data/test/test_Scheduler.rb +42 -0
- data/test/test_ShiftAssignments.rb +77 -0
- data/test/test_Syntax.rb +41 -0
- data/test/test_TextScanner.rb +95 -0
- data/test/test_TjTime.rb +114 -0
- data/test/test_TjpExample.rb +169 -0
- data/test/test_UTF8String.rb +84 -0
- data/test/test_WorkingHours.rb +56 -0
- metadata +649 -0
data/manual/Installation
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
== Installation ==
|
|
2
|
+
|
|
3
|
+
TaskJuggler III is written in [http://www.ruby-lang.org Ruby]. It
|
|
4
|
+
should run on any platform that Ruby is available on. It uses the
|
|
5
|
+
standard Ruby mechanism for distribution. The package format is called
|
|
6
|
+
[http://docs.rubygems.org Ruby Gems]. Alternatively, you can install
|
|
7
|
+
from a the source code using ''''setup.rb''''.
|
|
8
|
+
|
|
9
|
+
This is a prototype. Consider it being alpha quality at best!
|
|
10
|
+
|
|
11
|
+
=== Requirements ===
|
|
12
|
+
|
|
13
|
+
Ruby applications are platform independent. There is no need to
|
|
14
|
+
compile anything. But TaskJuggler has a very small set of
|
|
15
|
+
dependencies that you have to take care of first. Please make sure you
|
|
16
|
+
have the minimum required version installed.
|
|
17
|
+
|
|
18
|
+
* ''Ruby'' TaskJuggler III is written in Ruby. You need a Ruby
|
|
19
|
+
runtime environment to run it. This can be downloaded from
|
|
20
|
+
[http://www.ruby-lang.org/en/downloads/ here]. Most Linux
|
|
21
|
+
distributions usually have Ruby already included. So does MacOS X
|
|
22
|
+
Leopard. For Windows, there is a one-click installer available.
|
|
23
|
+
TaskJuggler currently needs at least Ruby version 1.8.5.
|
|
24
|
+
|
|
25
|
+
* ''RubyGems'' If it did not come with your OS or Ruby package, see
|
|
26
|
+
[http://docs.rubygems.org here] how to get and install it.
|
|
27
|
+
|
|
28
|
+
* ''TaskJuggler'' Get TaskJuggler III from the
|
|
29
|
+
[http://www.taskjuggler.org/download.php Download Page].
|
|
30
|
+
|
|
31
|
+
=== Installation Process ===
|
|
32
|
+
|
|
33
|
+
If you have downloaded the gem package, you can skip to the next
|
|
34
|
+
paragraph. If you have checked-out the git repository, you need to
|
|
35
|
+
build the Gem package first. Make sure, you have removed all other
|
|
36
|
+
instances of TaskJuggler from you system before doing so. It is a
|
|
37
|
+
common mistake to have an old version of the TaskJuggler installed and
|
|
38
|
+
then use parts of the old and new version together.
|
|
39
|
+
|
|
40
|
+
In addition to the above listed dependencies, you need to have the
|
|
41
|
+
following packages installed:
|
|
42
|
+
|
|
43
|
+
* [http://rake.rubyforge.org Rake] The Ruby build tool.
|
|
44
|
+
|
|
45
|
+
* [http://eigenclass.org/hiki.rb?rcov rcov] The rcov code
|
|
46
|
+
coverage analysis tool.
|
|
47
|
+
|
|
48
|
+
The following command will create an archive file called a gem
|
|
49
|
+
package.
|
|
50
|
+
|
|
51
|
+
cd taskjuggler3; rake gem
|
|
52
|
+
|
|
53
|
+
A gem package is an operating system and architecture independent
|
|
54
|
+
archive file for Ruby programs. You can install it on any system that
|
|
55
|
+
has Ruby and ruby-gems installed. Normally, you should be logged-in
|
|
56
|
+
as root or administrator to run the following installation command.
|
|
57
|
+
|
|
58
|
+
gem install pkg/taskjuggler-X.X.X.gem
|
|
59
|
+
|
|
60
|
+
It will install all components of the Gem in the appropriate place.
|
|
61
|
+
|
|
62
|
+
=== Update from previous versions ===
|
|
63
|
+
|
|
64
|
+
Updates work just like the installation.
|
|
65
|
+
|
|
66
|
+
gem update pkg/taskjuggler-X.X.X.gem
|
|
67
|
+
|
|
68
|
+
|
data/manual/Intro
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
== Introduction ==
|
|
2
|
+
|
|
3
|
+
=== About TaskJuggler ===
|
|
4
|
+
|
|
5
|
+
TaskJuggler is a modern and powerful project management tool. Its new
|
|
6
|
+
approach to project planning and tracking is far superior to the
|
|
7
|
+
commonly used Gantt chart editing tools. It has already been
|
|
8
|
+
successfully used in many projects and scales easily to projects with
|
|
9
|
+
hundreds of resources and thousands of tasks.
|
|
10
|
+
|
|
11
|
+
TaskJuggler is an Open Source tool for serious project managers. It
|
|
12
|
+
covers the complete spectrum of project management tasks from the
|
|
13
|
+
first idea to the completion of the project. It assists you during
|
|
14
|
+
project scoping, resource assignment, cost and revenue planning, risk
|
|
15
|
+
and communication management.
|
|
16
|
+
|
|
17
|
+
TaskJuggler provides an optimizing scheduler that computes your
|
|
18
|
+
project time lines and resource assignments based on the project
|
|
19
|
+
outline and the constrains that you have provided. The built-in
|
|
20
|
+
resource balancer and consistency checker offload you from having to
|
|
21
|
+
worry about irrelevant details and ring the alarm if the project gets
|
|
22
|
+
out of hand. Its flexible "as many details as necessary"-approach
|
|
23
|
+
allows you to still plan your project as you go, making it also ideal
|
|
24
|
+
for new management strategies such as Extreme Programming and Agile
|
|
25
|
+
Project Management.
|
|
26
|
+
|
|
27
|
+
If you are about to build a skyscraper or just want to put together
|
|
28
|
+
your colleague's shift plan for the next month, TaskJuggler is the
|
|
29
|
+
right tool for you. If you just want to draw nice looking Gantt
|
|
30
|
+
charts to impress your boss or your investors, TaskJuggler might not
|
|
31
|
+
be right for you. It takes some effort to master its power, but it
|
|
32
|
+
will become a companion you don't want to miss anymore.
|
|
33
|
+
|
|
34
|
+
=== About TaskJuggler III ===
|
|
35
|
+
|
|
36
|
+
TaskJuggler III is the completely re-implemented version of the TaskJuggler
|
|
37
|
+
2.x series. It is currently still in the development stage. It
|
|
38
|
+
already is mostly stable and feature complete, but not yet recommended
|
|
39
|
+
for any serious work. The code base is still in active development
|
|
40
|
+
and the quality and reliability may change daily. You are welcome to try
|
|
41
|
+
it and play with it, but expect it to fail.
|
|
42
|
+
|
|
43
|
+
TaskJuggler is a commandline tool that you use from a
|
|
44
|
+
[http://en.wikipedia.org/wiki/Shell_(computing) shell]. This does not
|
|
45
|
+
mean that you don't get fancy looking Gantt-charts. It just means
|
|
46
|
+
that for entering your project data you will use one of the most
|
|
47
|
+
versatile and powerful tools there is: your favorite
|
|
48
|
+
[http://en.wikipedia.org/wiki/Text_editor text editor]. To get a
|
|
49
|
+
first impression, you can look at this
|
|
50
|
+
[http://www.taskjuggler.org/tj3/examples/tutorial.tjp project file]. The
|
|
51
|
+
project description is fairly intuitive, but very powerful as well.
|
|
52
|
+
The [[Tutorial]] will explain this file line by line. Please look at
|
|
53
|
+
the [http://www.taskjuggler.org/tj3/examples/ProjectPlanOverview.html
|
|
54
|
+
resulting reports] that visualize the project.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
=== License and Copyright ===
|
|
58
|
+
|
|
59
|
+
This program is free software; you can redistribute it and/or modify
|
|
60
|
+
it under the terms of
|
|
61
|
+
[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html version 2 of
|
|
62
|
+
the GNU General Public License] as published by the Free Software
|
|
63
|
+
Foundation. You accept the terms of this license by distributing or
|
|
64
|
+
using this software.
|
|
65
|
+
|
|
66
|
+
This manual is Copyright (C) 2006, 2007, 2008, 2009 Chris Schlaeger.
|
|
67
|
+
|
|
68
|
+
Permission is granted to copy, distribute and/or modify this document
|
|
69
|
+
under the terms of the GNU Free Documentation License, Version 1.3
|
|
70
|
+
or any later version published by the Free Software Foundation; with
|
|
71
|
+
no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
|
72
|
+
A copy of the license is included in the section entitled "GNU
|
|
73
|
+
Free Documentation License".
|
|
74
|
+
|
|
75
|
+
=== Features and Highlights ===
|
|
76
|
+
|
|
77
|
+
* Manages tasks, resources and costs in one package
|
|
78
|
+
* Automatic resource leveling and tasks conflict resolution
|
|
79
|
+
* Flexible working hours and vacation handling
|
|
80
|
+
* Multiple timezone support
|
|
81
|
+
* Support for shift working
|
|
82
|
+
* Project tracking and status reporting
|
|
83
|
+
* Unlimited number of scenarios (baselines) of same project for what-if
|
|
84
|
+
analysis
|
|
85
|
+
* CSV data export for exchange with popular office software
|
|
86
|
+
* Project breakdown and management team support
|
|
87
|
+
* Powerful and flexible filtering functions to provide the right
|
|
88
|
+
amount of detail to the right audience
|
|
89
|
+
* Tasks may have initial costs, finishing costs and run rates
|
|
90
|
+
* Resources may have running costs
|
|
91
|
+
* Support for profit/loss analysis
|
|
92
|
+
* Powerful project description syntax with macro support
|
|
93
|
+
|
|
94
|
+
=== TaskJuggler on the Web ===
|
|
95
|
+
|
|
96
|
+
The official TaskJuggler web site can be found at
|
|
97
|
+
[http://www.taskjuggler.org].
|
|
98
|
+
|
|
99
|
+
Since the developers are mostly busy project managers themselves, we
|
|
100
|
+
have created a [http://www.taskjuggler.org/FUDforum2 forum] for users
|
|
101
|
+
to help each other.
|
|
102
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
=== Reporting Bugs and Sending Feedback ===
|
|
2
|
+
|
|
3
|
+
All official releases of TaskJuggler are meant to be stable releases
|
|
4
|
+
unless explicitly noted differently. But our test suite is still very
|
|
5
|
+
small and some features are not tested at all. So it's very likely
|
|
6
|
+
that your current version of TaskJuggler contains some bugs. If you
|
|
7
|
+
find a bug, please follow this procedure:
|
|
8
|
+
|
|
9
|
+
* Read this manual to make sure that it is actually a bug and not a
|
|
10
|
+
feature.
|
|
11
|
+
|
|
12
|
+
* Check the [http://www.taskjuggler.org TaskJuggler web page] and the
|
|
13
|
+
[http://www.taskjuggler.org/FUDforum2 Discussion Forum].
|
|
14
|
+
|
|
15
|
+
* Possibly the bug was already found
|
|
16
|
+
and a patch or workaround exists.
|
|
17
|
+
|
|
18
|
+
* Try to create a test project that is as small as possible but still
|
|
19
|
+
reproduces the bug.
|
|
20
|
+
|
|
21
|
+
* Send the test project and a detailed description of the problem to
|
|
22
|
+
the [http://www.taskjuggler.org/FUDforum2 TaskJuggler Developer
|
|
23
|
+
Forum]. Not sending a test project is the most common mistake when
|
|
24
|
+
reporting bugs. This usually triggers requests or leads to bug reports
|
|
25
|
+
being ignored.
|
|
26
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
=== Rich Text Attributes ===
|
|
2
|
+
|
|
3
|
+
TaskJuggler supports Rich Text data for some STRING attributes that
|
|
4
|
+
are marked accordingly in the syntax reference. Rich Text means, that
|
|
5
|
+
you can use certain markup symbols to structure the text into
|
|
6
|
+
sections, include headlines, bullet lists and the like. The following
|
|
7
|
+
sections describe the supported markup elements and how to use them.
|
|
8
|
+
|
|
9
|
+
The markup syntax is mostly compatible to the syntax used by the
|
|
10
|
+
popular [http://www.mediawiki.org MediaWiki].
|
|
11
|
+
|
|
12
|
+
==== Block Markups ====
|
|
13
|
+
|
|
14
|
+
All block markups are delimited by an empty line. The markup must
|
|
15
|
+
always start at the beginning of the first line of the block. Block
|
|
16
|
+
markups cannot be nested.
|
|
17
|
+
|
|
18
|
+
The simplest form of a block is a paragraph. It's a block of text
|
|
19
|
+
that is separated by empty lines from other blocks. There is no
|
|
20
|
+
markup needed to start a text block.
|
|
21
|
+
|
|
22
|
+
Headlines can be inserted by using ''''='''' characters to start a
|
|
23
|
+
line. There are 3 level of headlines.
|
|
24
|
+
|
|
25
|
+
== Headline Level 1 ==
|
|
26
|
+
=== Headline Level 2 ===
|
|
27
|
+
==== Headline Level 3 ====
|
|
28
|
+
|
|
29
|
+
A line that starts with four dashes creates a horizontal line.
|
|
30
|
+
|
|
31
|
+
----
|
|
32
|
+
|
|
33
|
+
Items of a bullet list start with a star. The number of stars
|
|
34
|
+
determines the bullet list level of the item. Three levels are
|
|
35
|
+
supported. Bullet items may span multiple lines but cannot contain
|
|
36
|
+
paragraphs.
|
|
37
|
+
|
|
38
|
+
* Bullet 1
|
|
39
|
+
** Bullet 2
|
|
40
|
+
*** Bullet 3
|
|
41
|
+
|
|
42
|
+
Enumerated lists are formed by using a ''''#'''' instead of ''''*''''.
|
|
43
|
+
|
|
44
|
+
# Enumeration Level 1
|
|
45
|
+
## Enumeration Level 2
|
|
46
|
+
### Enumeration Level 3
|
|
47
|
+
|
|
48
|
+
Sections of lines that start with a space character are interpreted
|
|
49
|
+
as pre-formatted text. The formatting will be preserved by using a
|
|
50
|
+
fixed-width font and by not interpreting any markup characters within
|
|
51
|
+
the text.
|
|
52
|
+
|
|
53
|
+
Preformatted text start with
|
|
54
|
+
a single space at the start of
|
|
55
|
+
each line.
|
|
56
|
+
|
|
57
|
+
==== In-Line Markups ====
|
|
58
|
+
|
|
59
|
+
In-line markups may occur within a text block. They don't have to
|
|
60
|
+
start at the start of the line.
|
|
61
|
+
|
|
62
|
+
This is an ''italic'' word.
|
|
63
|
+
This is a '''bold''' word.
|
|
64
|
+
This is a ''''monospaced'''' word.
|
|
65
|
+
This is a '''''italic and bold''''' word.
|
|
66
|
+
|
|
67
|
+
The monospace format is not part of the original MediaWiki markup, but
|
|
68
|
+
we found it useful to have for this manual.
|
|
69
|
+
|
|
70
|
+
Links to external documents are possible as well. In the first form,
|
|
71
|
+
the URL will appear in the readable text as well. In the second form,
|
|
72
|
+
the text after the URL will be visible but the link will be available
|
|
73
|
+
if the output format supports it.
|
|
74
|
+
|
|
75
|
+
[http://www.taskjuggler.org]
|
|
76
|
+
[http://www.taskjuggler.org The TaskJuggler Web Site]
|
|
77
|
+
|
|
78
|
+
For local references, the second form is available as well. In this
|
|
79
|
+
form, ''''.html'''' is appended to the first word in the reference to
|
|
80
|
+
create the URL.
|
|
81
|
+
|
|
82
|
+
[[item]]
|
|
83
|
+
[[item An item]]
|
|
84
|
+
|
|
85
|
+
In some situations, it is desirable to not interpret certain markup
|
|
86
|
+
sequences and reproduce the text verbatim. Such text must be enclosed
|
|
87
|
+
in nowiki tags.
|
|
88
|
+
|
|
89
|
+
<nowiki> This is not '''bold''' text. </nowiki>
|
|
90
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
=== TaskJuggler 2.x Migration ===
|
|
2
|
+
|
|
3
|
+
This section will cover changes between TaskJuggler 2.x and 3.x.
|
|
4
|
+
|
|
5
|
+
* The ''''shift'''' attribute for tasks and resources has been
|
|
6
|
+
renamed to ''''shifts'''' to allow support for multiple shifts.
|
|
7
|
+
|
|
8
|
+
* The global ''''limits'''' attribute has been removed. Since both
|
|
9
|
+
tasks and resources have a ''''limits'''' attribute, a global
|
|
10
|
+
attribute was inconsistent as only resources inherited this
|
|
11
|
+
attribute. Use a parent resource to emulate the old behaviour.
|
|
12
|
+
|
|
13
|
+
* The ''''startbuffer'''' and ''''endbuffer'''' attributes have been
|
|
14
|
+
deprecated. They have not been widely used and had no impact on
|
|
15
|
+
scheduling.
|
|
16
|
+
|
|
17
|
+
* The ''''barlabels'''' attribute for reports is no longer needed.
|
|
18
|
+
HTML reports have always empty Gantt-chart bars and the calendar
|
|
19
|
+
reports always have values.
|
|
20
|
+
|
|
21
|
+
* The project attribute ''''allowredifinitions'''' has been dropped.
|
|
22
|
+
It was an ugly workaround for a rare corner case. Using [[supplement]] is
|
|
23
|
+
the clean way to do this.
|
|
24
|
+
|
|
25
|
+
* Camel case names for function names in logical expressions have
|
|
26
|
+
been deprecated. Function names need to be all lower case now.
|
|
27
|
+
|
|
28
|
+
* Top-level accounts no longer need a ''''cost'''' or ''''revenue''''
|
|
29
|
+
attribute. Any two top level accounts can now be balanced against
|
|
30
|
+
each other using the [[balance]] attribute in the report.
|
|
31
|
+
|
|
32
|
+
* The sorting modes have been extended to include the scenario. Also,
|
|
33
|
+
the sorting direction is no longer mangled with the attribute name.
|
|
34
|
+
What used to be ''''startup'''' is now ''''plan.start.up''''. See
|
|
35
|
+
[[sorttasks]] or [[sortresources]] for details.
|
|
36
|
+
|
|
37
|
+
* The attribute ''''properties'''' for ''''export'''' reports is no
|
|
38
|
+
longer supported. The naming was inconsistent with TaskJuggler lingo
|
|
39
|
+
and did not handle tasks and resources separately. It has been
|
|
40
|
+
replaced with [[taskattributes]] and [[resourceattributes]].
|
data/manual/Tutorial
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
== The Tutorial: Your first Project ==
|
|
2
|
+
|
|
3
|
+
We have mentioned already that TaskJuggler uses plain text files that
|
|
4
|
+
describe the project to schedule it. As you will see now, the syntax
|
|
5
|
+
of these files is easy to understand and very intuitive. This chapter
|
|
6
|
+
will walk you step by step through your first project. You create the
|
|
7
|
+
project plan for a made-up accounting software project. This project
|
|
8
|
+
demonstrates some of the commonly used features of TaskJuggler. The
|
|
9
|
+
complete example can be downloaded
|
|
10
|
+
[http://www.taskjuggler.org/tj3/examples/tutorial.tjp here]. The
|
|
11
|
+
resulting reports can be found
|
|
12
|
+
[http://www.taskjuggler.org/tj3/examples/ProjectPlanOverview.html
|
|
13
|
+
here].
|
|
14
|
+
|
|
15
|
+
=== Starting the project ===
|
|
16
|
+
|
|
17
|
+
To start a TaskJuggler project file you need to use the [[project]]
|
|
18
|
+
property. It tells TaskJuggler the default project ID, a short name
|
|
19
|
+
for your project, a version number and a start and end date. The start
|
|
20
|
+
and end dates don't need to be exact, but must fit all tasks of the
|
|
21
|
+
project. It is the time interval the TaskJuggler scheduler will use
|
|
22
|
+
to fit the tasks in. So, make it large enough for all your tasks to
|
|
23
|
+
fit in. But don't make it too large, because this will result in
|
|
24
|
+
longer scheduling times and higher memory consumption.
|
|
25
|
+
|
|
26
|
+
[[example:tutorial header1]]
|
|
27
|
+
|
|
28
|
+
All TaskJuggler properties have a certain number of fixed attributes
|
|
29
|
+
and a set of optional attributes. Optional attributes are always
|
|
30
|
+
enclosed in curly braces. If no optional attributes are specified,
|
|
31
|
+
the braces can be omitted as well. In this example we will introduce
|
|
32
|
+
a number of there attributes that may or may not matter to you. If
|
|
33
|
+
you don't see an immediate need for a specific attribute, feel free
|
|
34
|
+
to ignore it for now. You can always come back to them later. A full
|
|
35
|
+
list of the supported attributes can be found in the ''attributes''
|
|
36
|
+
section of the [[project]] property documentation.
|
|
37
|
+
|
|
38
|
+
Attributes always start with a keyword that is unique in the context.
|
|
39
|
+
A context is delimited by a set of curly braces that enclose optional
|
|
40
|
+
attributes of a property. The area between properties is called the
|
|
41
|
+
global scope. Usually, attributes have one or more arguments. These
|
|
42
|
+
arguments can be dates, character strings, numbers or symbols. Strings
|
|
43
|
+
must be enclosed in single or double quotes. The argument types and
|
|
44
|
+
meaning is explained for each keyword in the syntax reference section
|
|
45
|
+
of this manual.
|
|
46
|
+
|
|
47
|
+
The [[currency]] attribute specifies the unit of currency values.
|
|
48
|
+
|
|
49
|
+
[[example:tutorial currency]]
|
|
50
|
+
|
|
51
|
+
Because each culture has its own way of specifying dates and numbers,
|
|
52
|
+
the format for these are configurable. Use the [[timeformat]]
|
|
53
|
+
attribute to specify the default format for dates. This format is used
|
|
54
|
+
for reports, it does not affect the way you specify dates in the
|
|
55
|
+
project files. Here you always need to use the [[date ISO standardized
|
|
56
|
+
notation]].
|
|
57
|
+
|
|
58
|
+
[[example:tutorial formats]]
|
|
59
|
+
|
|
60
|
+
We also can specify the way numbers or currency values are shown in
|
|
61
|
+
the reports. Use the [[numberformat]] and [[currencyformat]]
|
|
62
|
+
attributes for this.
|
|
63
|
+
|
|
64
|
+
The optional attribute [[now]] is used to set the current day for the
|
|
65
|
+
scheduler to another value than to the moment your invoke TaskJuggler.
|
|
66
|
+
When this attribute is not present, TaskJuggler will use the current
|
|
67
|
+
moment of time to determine where you are with your tasks. To get a
|
|
68
|
+
defined result for the reports in this example we've picked a specific
|
|
69
|
+
date that fits our purpose here. In your projects, you would use
|
|
70
|
+
[[now]] to generate status reports for the date you specify.
|
|
71
|
+
|
|
72
|
+
[[example:tutorial now]]
|
|
73
|
+
|
|
74
|
+
In this tutorial we would like to compare two scenarios of the
|
|
75
|
+
project. The first scenario is the one that we have planned. The
|
|
76
|
+
second scenario is how it really happened. The two scenarios have the
|
|
77
|
+
same task structure, but the start and end dates of the task may vary.
|
|
78
|
+
In reality we assume that the project got delayed, so we call the
|
|
79
|
+
second scenario "Delayed". The scenario property is used to specify
|
|
80
|
+
the scenarios. The delayed scenario is nested into the plan scenario.
|
|
81
|
+
This tells TaskJuggler to use all values from the plan scenario also
|
|
82
|
+
for the second scenario unless the second scenario has it's own
|
|
83
|
+
values. This is a very easy but also powerful way to analyze the
|
|
84
|
+
impact of certain changes to the plan of record. We'll see further
|
|
85
|
+
below, how to specify values for a scenario and how to compare the
|
|
86
|
+
results.
|
|
87
|
+
|
|
88
|
+
[[example:tutorial scenario]]
|
|
89
|
+
|
|
90
|
+
To summarize the above, let's look at the complete header again.
|
|
91
|
+
Don't get scared by the wealth of attributes here. They are all
|
|
92
|
+
optional and mostly used to illustrate the flexibility of TaskJuggler.
|
|
93
|
+
|
|
94
|
+
[[example:tutorial header2]]
|
|
95
|
+
|
|
96
|
+
=== Global Attributes ===
|
|
97
|
+
|
|
98
|
+
For this tutorial, we also like to do a simple profit and loss
|
|
99
|
+
analysis of the project. We will track labor cost versus customer
|
|
100
|
+
payments. To calculate the labor costs we have to specify the default
|
|
101
|
+
daily costs of an employee. This can be changed for certain employees
|
|
102
|
+
later, but it illustrates an important concept of TaskJuggler –
|
|
103
|
+
inheritance of attributes. In order to reduce the size of the
|
|
104
|
+
TaskJuggler project file to a readable minimum, properties inherit
|
|
105
|
+
many optional attributes from their enclosing scopes. We'll see
|
|
106
|
+
further below, what this actually means. Right after the project
|
|
107
|
+
property we are at top-level scope, so this is the default for all
|
|
108
|
+
following properties.
|
|
109
|
+
|
|
110
|
+
[[example:tutorial rate]]
|
|
111
|
+
|
|
112
|
+
The [[rate]] attribute can be used to specify the daily costs of
|
|
113
|
+
resources. All subsequent resources will get this rate. But it can be
|
|
114
|
+
changed to a different rate at group or individual resource level.
|
|
115
|
+
|
|
116
|
+
You may also want to tell TaskJuggler about holidays that affect
|
|
117
|
+
all resources. Global vacations are time periods where TaskJuggler
|
|
118
|
+
does not do any resource assignments to tasks.
|
|
119
|
+
|
|
120
|
+
[[example:tutorial vacation]]
|
|
121
|
+
|
|
122
|
+
Use the [[vacation]] attribute to define a global vacation. Global
|
|
123
|
+
vacations must have a name and a date or date range. This is slightly
|
|
124
|
+
different from vacations of individual resources. They are defined
|
|
125
|
+
with the [[vacation.resource vacation attribute for resources]] where
|
|
126
|
+
the name is optional. The vacation name is purely for documentation
|
|
127
|
+
purposes.
|
|
128
|
+
|
|
129
|
+
=== Macros ===
|
|
130
|
+
|
|
131
|
+
Macros are another TaskJuggler feature to keep project files small.
|
|
132
|
+
Macros are text patterns that can be defined once and inserted
|
|
133
|
+
multiple times in the project file. A [[macro]] always has a name and the
|
|
134
|
+
text pattern is enclosed by square brackets.
|
|
135
|
+
|
|
136
|
+
[[example:tutorial macro]]
|
|
137
|
+
|
|
138
|
+
To use the macro you simply have to write
|
|
139
|
+
''''${allocate_developers}'''' and TaskJuggler will replace the term
|
|
140
|
+
''''${allocate_developers}'''' with the pattern. We will use this
|
|
141
|
+
macro further below in the example and then explain the meaning of the
|
|
142
|
+
pattern.
|
|
143
|
+
|
|
144
|
+
=== Declaring Flags ===
|
|
145
|
+
|
|
146
|
+
A TaskJuggler feature that you will probably make heavy use of is
|
|
147
|
+
flags. Once declared you can attach them to many properties. When you
|
|
148
|
+
generate reports of the TaskJuggler results, you can use the flags to
|
|
149
|
+
filter out information and limit the report to exactly those details
|
|
150
|
+
that you want to have included.
|
|
151
|
+
|
|
152
|
+
[[example:tutorial flags]]
|
|
153
|
+
|
|
154
|
+
This is flag declaration. All [[flags]] need to be declared, before they
|
|
155
|
+
can be used to avoid hard to find errors due to misspelled flag
|
|
156
|
+
names. The flags should be declared shortly below the project header.
|
|
157
|
+
We will see further down, how we can make use of these flags.
|
|
158
|
+
|
|
159
|
+
=== Declaring Accounts ===
|
|
160
|
+
|
|
161
|
+
The use of our resources will create costs. For a profit and loss
|
|
162
|
+
analysis, we need to balance the costs against the customer payments.
|
|
163
|
+
In order not to get lost with all the various amounts, we declare 3
|
|
164
|
+
[[account accounts]] to credit the amounts to. We create one account
|
|
165
|
+
for the development costs, one for the documentation costs, and one
|
|
166
|
+
for the customer payments.
|
|
167
|
+
|
|
168
|
+
[[example:tutorial accounts]]
|
|
169
|
+
|
|
170
|
+
Like all TaskJuggler properties, the account needs an ID and a name.
|
|
171
|
+
IDs may only consist of ASCII characters, numbers and the underline
|
|
172
|
+
character. All global TaskJuggler properties have IDs. The ID is
|
|
173
|
+
necessary so that we can reference the property again later without
|
|
174
|
+
having to write the potentially much longer name. The name may
|
|
175
|
+
contain space characters and therefore has to be enclosed with single
|
|
176
|
+
or double quotes.
|
|
177
|
+
|
|
178
|
+
Accounts can be grouped by nesting them. You can use this feature to
|
|
179
|
+
create sets of accounts. Such sets can then be balanced against each
|
|
180
|
+
other to create a profit and loss analysis. When you have specified
|
|
181
|
+
accounts in your project, you must at least define one default
|
|
182
|
+
[[balance]].
|
|
183
|
+
|
|
184
|
+
[[example:tutorial balance]]
|
|
185
|
+
|
|
186
|
+
=== Declaring Resources ===
|
|
187
|
+
|
|
188
|
+
While the above introduced account property is only needed if you
|
|
189
|
+
want to do a P&L analysis, resources are usually found in almost any
|
|
190
|
+
project.
|
|
191
|
+
|
|
192
|
+
[[example:tutorial resources]]
|
|
193
|
+
|
|
194
|
+
This snippet of the example shows the use of the [[resource
|
|
195
|
+
resource property]]. Just like accounts, resources always have an ID
|
|
196
|
+
and a Name. These IDs also need to be unique within their property
|
|
197
|
+
class. Names are strings and as such enclosed in double quotes. As
|
|
198
|
+
you can see, resource properties can be nested: ''''dev'''' is a group
|
|
199
|
+
or container resource, a team that consists of three other resources.
|
|
200
|
+
|
|
201
|
+
''''dev1'''', alias Paul Smith, costs more than the normal employee.
|
|
202
|
+
So the declaration of ''''dev1'''' overwrites the inherited default
|
|
203
|
+
rate with a higher value.
|
|
204
|
+
|
|
205
|
+
The default value has been inherited from the enclosing scope,
|
|
206
|
+
resource ''''dev'''', which in turn has inherited it from the global
|
|
207
|
+
scope. The declaration of the resource Klaus Müller uses another
|
|
208
|
+
optional attribute. With vacation you can specify a certain time
|
|
209
|
+
interval where the resource is not available. Vacations are list
|
|
210
|
+
attributes. They accumulate the declarations. If you want to get rid
|
|
211
|
+
of inherited values, you can use the [[purge]] attribute to clear the
|
|
212
|
+
list.
|
|
213
|
+
|
|
214
|
+
It is important that you understand how TaskJuggler handles time
|
|
215
|
+
intervals. Internally, TaskJuggler uses the number of seconds after
|
|
216
|
+
January 1st, 1970 to store any date. So all dates are actually stored
|
|
217
|
+
with an accuracy of 1 second in UTC time. ''''2002-02-01'''' specifies
|
|
218
|
+
midnight February 1st, 2002. Following the TaskJuggler concept of
|
|
219
|
+
requiring as little information as necessary and extending the rest
|
|
220
|
+
with sensible defaults, TaskJuggler adds the time 0:00:00 if nothing
|
|
221
|
+
else has been specified. So the vacation ends on midnight February
|
|
222
|
+
5th, 2002. Well, almost. Every time you specify a time interval, the
|
|
223
|
+
end date is not included in the interval. So Klaus Müller's vacation
|
|
224
|
+
ends exactly at 0:00:00 on February 4th, 2002.
|
|
225
|
+
|
|
226
|
+
Peter Murphy only works 6.4 hours a day. So we use the
|
|
227
|
+
[[limits.resource limits]] attribute to limit his daily working hours.
|
|
228
|
+
We could also define exact working hours using the [[shift shift
|
|
229
|
+
property]], but we ignore this for now.
|
|
230
|
+
|
|
231
|
+
Note that we have attached the flag team after the declaration of the
|
|
232
|
+
sub-resources to the team resources. This way, these flags don't get
|
|
233
|
+
passed down to the sub-resources. If we would have declared the flags
|
|
234
|
+
before the sub-resources, then they would have the flags attached as
|
|
235
|
+
well.
|
|
236
|
+
|
|
237
|
+
=== Specifying the Tasks ===
|
|
238
|
+
|
|
239
|
+
Let's focus on the real work now. The project should solve a problem:
|
|
240
|
+
the creation of an accounting software. Because the job is quite
|
|
241
|
+
complicated, we break it down into several subtasks. We need to do a
|
|
242
|
+
specification, develop the software, test the software, and write a
|
|
243
|
+
manual. Using the [[task task property]], thiis would look as follows:
|
|
244
|
+
|
|
245
|
+
[[example:tutorial task1]]
|
|
246
|
+
|
|
247
|
+
Similar to resources, tasks are declared by using the task keyword
|
|
248
|
+
followed by an ID and a name string. All TaskJuggler properties have
|
|
249
|
+
their own namespaces. This means, that it is quite OK to have a
|
|
250
|
+
resource and a task with the same ID. Tasks may have optional
|
|
251
|
+
attributes which can be tasks again, so tasks can be nested. In
|
|
252
|
+
contrast to all other TaskJuggler properties, task IDs inherit the ID
|
|
253
|
+
of the enclosing task as a prefix to the ID. The full ID of the spec
|
|
254
|
+
task is AcSo.spec. You need to use this absolute ID when you want to
|
|
255
|
+
reference the task later on. This hierarchical name space for tasks
|
|
256
|
+
was chosen to support large projects where multiple project managers
|
|
257
|
+
may use the same ID in different sub tasks.
|
|
258
|
+
|
|
259
|
+
To track important milestones of the project, we also added a task
|
|
260
|
+
called Milestones. This task, like most of the other tasks will get
|
|
261
|
+
some subtasks later on.
|
|
262
|
+
|
|
263
|
+
We consider the specification task simple enough, so we don't have to
|
|
264
|
+
break it into further subtasks. So let's add some more details to it.
|
|
265
|
+
|
|
266
|
+
[[example:tutorial spec]]
|
|
267
|
+
|
|
268
|
+
The [[effort]] to complete the task is specified with 20 man-days.
|
|
269
|
+
Alternatively we could have used the [[length]] attribute or
|
|
270
|
+
the [[duration]] attribute. ''''length'''' specifies the
|
|
271
|
+
duration of the task in working days while ''''duration'''' specifies
|
|
272
|
+
the duration in calendar days. Contrary to ''''effort'''', these two don't
|
|
273
|
+
have to have a specification of the involved resources. Since
|
|
274
|
+
''''effort'''' specifies the duration in man-days, we need to say who
|
|
275
|
+
should be allocated to the task. The task won't finish before the
|
|
276
|
+
resources could be allocated long enough to reach the specified
|
|
277
|
+
effort. Tasks with ''''length'''' or ''''duration'''' criteria and
|
|
278
|
+
allocated resources will last exactly as long as requested. Resources
|
|
279
|
+
will be allocated only if available. It's possible that such a tasks
|
|
280
|
+
ends up with no allocations at all since the resources are always
|
|
281
|
+
assigned to other tasks for that period. Each task can only have one
|
|
282
|
+
of the three duration criteria. Container tasks may never have a
|
|
283
|
+
duration specification. They are automatically adjusted to fit all
|
|
284
|
+
sub tasks.
|
|
285
|
+
|
|
286
|
+
Here we use the allocate_developers macro mentioned above. The
|
|
287
|
+
expression ''''${allocate_developers}'''' is simply expanded to
|
|
288
|
+
|
|
289
|
+
[[example:tutorial expandedmacro]]
|
|
290
|
+
|
|
291
|
+
If you need to [[allocate]] the same bunch of people to several tasks,
|
|
292
|
+
the macro saves you some typing. You could have written the allocate
|
|
293
|
+
attributes directly instead of using the macro. Since the allocation
|
|
294
|
+
of multiple resources to a task is a very common place for macro
|
|
295
|
+
usage, we found it a good idea to use it in this example as well.
|
|
296
|
+
|
|
297
|
+
One more interesting thing to note is the fact that we like the
|
|
298
|
+
resource ''''dev2'''' only to work 4 hours each day on this task, so
|
|
299
|
+
we use the optional attribute [[limits.resource]] to specify this.
|
|
300
|
+
|
|
301
|
+
For TaskJuggler to schedule a task, it needs to know either the start
|
|
302
|
+
and end criteria of a task, or one of them and a duration
|
|
303
|
+
specification. The start and end criteria can either be fixed dates or
|
|
304
|
+
relative dates. Relative dates are specifications of the type ''task B
|
|
305
|
+
starts after task A has finished''. Or in other words, task B depends
|
|
306
|
+
on task A. In this example the spec task depends on a subtasks of the
|
|
307
|
+
deliveries task. We have not specified it yet, but it has the local ID
|
|
308
|
+
start.
|
|
309
|
+
|
|
310
|
+
To specify the dependency between the two tasks, we use the
|
|
311
|
+
[[depends]] attribute. This attribute must be followed by one or more
|
|
312
|
+
task IDs. If more than one ID is specified, each ID has to be
|
|
313
|
+
separated with a comma from the previous one. Task IDs can be either
|
|
314
|
+
absolute IDs or relative IDs. An absolute ID of a task is the ID of
|
|
315
|
+
this task prepended by the IDs of all enclosing tasks. The task IDs
|
|
316
|
+
are separated by a dot from each other. The absolute ID of the
|
|
317
|
+
specification task would be ''''AcSo.spec''''.
|
|
318
|
+
|
|
319
|
+
Relative IDs always start with one or more exclamation marks. Each
|
|
320
|
+
exclamation mark moves the scope to the next enclosing task. So
|
|
321
|
+
''''!deliveries.start'''' is expanded to ''''AcSo.deliveries.start''''
|
|
322
|
+
since ''''AcSo'''' is the enclosing task of deliveries. Relative task
|
|
323
|
+
IDs are a little bit confusing at first, but have a real advantage
|
|
324
|
+
over absolute IDs. Sooner or later you want to move tasks around in
|
|
325
|
+
your project and then it's a lot less likely that you have to fix
|
|
326
|
+
dependency specifications of relative IDs.
|
|
327
|
+
|
|
328
|
+
The software development task is still too complex to specify it
|
|
329
|
+
directly. So we split it further into subtasks.
|
|
330
|
+
|
|
331
|
+
[[example:tutorial software]]
|
|
332
|
+
|
|
333
|
+
We use the [[priority]] attribute to mark the importance of
|
|
334
|
+
the tasks. 500 is the default priority of top-level tasks. Setting the
|
|
335
|
+
priority to 1000 marks the task as most important task, since the
|
|
336
|
+
possible range is 1 (not important at all) to 1000 (ultimately
|
|
337
|
+
important). priority is an attribute that is passed down to subtasks
|
|
338
|
+
if specified before the subtasks' declaration. So all subtasks of
|
|
339
|
+
software have a priority of 1000 as well, unless they have their own
|
|
340
|
+
priority definition.
|
|
341
|
+
|
|
342
|
+
[[example:tutorial database]]
|
|
343
|
+
|
|
344
|
+
The work on the database coupling should not start before the
|
|
345
|
+
specification has been finished. So we again use the [[depends]]
|
|
346
|
+
attribute to let TaskJuggler know about this. This time we use two
|
|
347
|
+
exclamation marks for the relative ID. The first one puts us in the
|
|
348
|
+
scope of the enclosing software task. The second one is to get into
|
|
349
|
+
the AcSo scope that contains the spec tasks. For a change, we
|
|
350
|
+
[[allocate]] resources directly without using a macro.
|
|
351
|
+
|
|
352
|
+
[[example:tutorial gui]]
|
|
353
|
+
|
|
354
|
+
TaskJuggler can schedule your project for two different [[scenario
|
|
355
|
+
scenarios]]. We have called the first scenario ''''plan'''' scenario
|
|
356
|
+
and the second ''''delayed'''' scenario. Many of the reports allow you
|
|
357
|
+
to put the values of both scenarios side by side to each other, so you
|
|
358
|
+
can compare the scenarios. All scenario-specific values that are
|
|
359
|
+
not explicitly stated for the ''''delayed'''' scenario are taken from
|
|
360
|
+
the ''''plan'''' scenario. So the user only has to specify the values
|
|
361
|
+
that differ in the delayed scenario. The two scenarios must have the
|
|
362
|
+
same task structure and the same dependencies. But the start and end
|
|
363
|
+
dates of tasks as well as the duration may vary. In the example we
|
|
364
|
+
have planned the work on the graphical user interface to be 35
|
|
365
|
+
man-days. It turned out that we actually needed 40 man-days. By
|
|
366
|
+
prefixing the [[effort]] attribute with ''''delayed:'''', the
|
|
367
|
+
effort value for the ''''delayed'''' scenario can be specified.
|
|
368
|
+
|
|
369
|
+
[[example:tutorial backend]]
|
|
370
|
+
|
|
371
|
+
By default, TaskJuggler assumes that all tasks are on schedule.
|
|
372
|
+
Sometimes you want to generate reports that show how much of a task
|
|
373
|
+
actually has been completed. TaskJuggler uses the current date for
|
|
374
|
+
this, unless you have specified another date using the now attribute.
|
|
375
|
+
If a task is ahead of schedule or late, this can be specified using
|
|
376
|
+
the [[complete]] attribute. This specifies how many percent
|
|
377
|
+
of the task have been completed up to the current date. In our case
|
|
378
|
+
the back-end implementation is slightly ahead of schedule as we will
|
|
379
|
+
see from the report.
|
|
380
|
+
|
|
381
|
+
[[example:tutorial test]]
|
|
382
|
+
|
|
383
|
+
The software testing task has been split up into an alpha and
|
|
384
|
+
a beta test task. The interesting thing here is, that efforts can not
|
|
385
|
+
only be specified as man-days, but also man-weeks, man-hours, etc. By
|
|
386
|
+
default, TaskJuggler assumes a man-day is 8 hours, man-week is 40
|
|
387
|
+
man-hours or 5 man-days. The conversion factor can be changed using the
|
|
388
|
+
[[dailyworkinghours]] attribute.
|
|
389
|
+
|
|
390
|
+
Let's go back to the outermost task again. At the beginning of the
|
|
391
|
+
example we stated that we want to credit all development work to one
|
|
392
|
+
account with ID dev and all documentation work to the account doc. To
|
|
393
|
+
achieve this, we use the attribute [[chargeset]] to credit
|
|
394
|
+
all tasks to the ''''dev'''' account.
|
|
395
|
+
|
|
396
|
+
For the duration of the ''''AcSo'''' task we also have running costs
|
|
397
|
+
for the lease on the building and the equipment. To compensate this,
|
|
398
|
+
we charge a daily rate of USD 170 per day using the [[charge]]
|
|
399
|
+
attribute.
|
|
400
|
+
|
|
401
|
+
[[example:tutorial charge]]
|
|
402
|
+
|
|
403
|
+
Since we specify the attribute for the top-level task before we
|
|
404
|
+
declare any subtasks, this attribute will be inherited by all subtasks
|
|
405
|
+
and their subtasks and so on. The only exception is the writing of the
|
|
406
|
+
manual. We need to change the chargeset for this task again, as it is
|
|
407
|
+
also a subtask of AcSo and we want to use a different account for it.
|
|
408
|
+
|
|
409
|
+
[[example:tutorial manual]]
|
|
410
|
+
|
|
411
|
+
=== Specifying Milestones ===
|
|
412
|
+
|
|
413
|
+
All tasks that have been discussed so far, had a certain duration. We
|
|
414
|
+
did not always specify the duration explicitly, but we expect them to
|
|
415
|
+
last for a certain period of time. Sometimes you just want to capture
|
|
416
|
+
a certain moment in your project plan. These moments are usually
|
|
417
|
+
called milestones, since they have some level of importance for the
|
|
418
|
+
progress of the project.
|
|
419
|
+
|
|
420
|
+
TaskJuggler has support for milestones as well. Milestones are leaf
|
|
421
|
+
tasks that don't have a duration specification.
|
|
422
|
+
|
|
423
|
+
[[example:tutorial deliveries]]
|
|
424
|
+
|
|
425
|
+
We have put all important milestones of the project as subtasks of the
|
|
426
|
+
deliveries task. This way they show up nicely grouped in the reports.
|
|
427
|
+
All milestones either have a dependency or a fixed start date. For the
|
|
428
|
+
first milestone we have used the attribute [[start]] to set a fixed start
|
|
429
|
+
date. All other tasks have direct or indirect dependencies on this
|
|
430
|
+
task. Moving back the start date will slip the whole project. This has
|
|
431
|
+
actually happened, so we use the ''''delayed:'''' prefix again to
|
|
432
|
+
specify the start date for the delayed scenario.
|
|
433
|
+
|
|
434
|
+
Every milestone is linked to a customer payment. By using the
|
|
435
|
+
[[charge]] attribute we can credit the specified amount to the
|
|
436
|
+
account associated with this task. Since we have assigned the
|
|
437
|
+
''''rev'''' account to the enclosing task, all milestones will use
|
|
438
|
+
this account as well. This time, we use the keyword ''''onstart''''
|
|
439
|
+
to indicate that this is not a continuous charge but a one-time
|
|
440
|
+
charge that is credited at the begin of the task.
|
|
441
|
+
|
|
442
|
+
Did you notice the line in the task done that starts with a hash? This
|
|
443
|
+
line is commented out. If TaskJuggler finds a hash, it ignores the
|
|
444
|
+
rest of the line. This way you can include comments in your project.
|
|
445
|
+
The [[maxend]] attribute specifies that the task should end no
|
|
446
|
+
later than the specified date. This information is not used for
|
|
447
|
+
scheduling, but only for checking the schedule afterwards. Since the
|
|
448
|
+
task will end later than the specified date, commenting out the line
|
|
449
|
+
would trigger a warning.
|
|
450
|
+
|
|
451
|
+
Now the project has been completely specified. Stopping here would
|
|
452
|
+
result in a valid TaskJuggler file that could be processed and
|
|
453
|
+
scheduled. But no reports would be generated to visualize the results.
|
|
454
|
+
|
|
455
|
+
=== Generating Reports of the scheduled Project ===
|
|
456
|
+
|
|
457
|
+
TaskJuggler offers a number of report types. Probably the most popular ones are interactive reports and HTML reports.
|
|
458
|
+
|
|
459
|
+
==== Generating Interactive Reports ====
|
|
460
|
+
|
|
461
|
+
Interactive reports are only available in the TaskJuggler GUI. The
|
|
462
|
+
command line version will just ignore interactive report definitions.
|
|
463
|
+
To view a task report in the GUI, you have to add the following lines
|
|
464
|
+
to your project. This will give you a list of all the project's tasks
|
|
465
|
+
and the classical Gantt chart.
|
|
466
|
+
|
|
467
|
+
[[example:tutorial planoverview]]
|
|
468
|
+
|
|
469
|
+
The GUI requires the name column to be present in the report. If you
|
|
470
|
+
don't specify it, it will be added automatically. It does not support
|
|
471
|
+
any of the index columns. They will not be shown in the GUI.
|
|
472
|
+
Nonetheless, it's a good idea to request it, as the printed version of
|
|
473
|
+
the interactive reports behave like the other reports. They only show
|
|
474
|
+
specified columns. The printed reports repeat the first column on
|
|
475
|
+
every page in case it does not fit on a single page. To print a report
|
|
476
|
+
from the GUI just select File->Print from the menu or click the
|
|
477
|
+
printer icon in the toolbar.
|
|
478
|
+
|
|
479
|
+
For this report we like to have the abbreviated weekday in front of
|
|
480
|
+
the date. %a is the tag for this. See the manual for a complete list
|
|
481
|
+
of all options.
|
|
482
|
+
|
|
483
|
+
We don't want to see any resources in this report, so we hide them
|
|
484
|
+
all. 1 means always hide a resource. To show all resources we could
|
|
485
|
+
write a 0, which means never hide a resource. Or we could write a
|
|
486
|
+
logical expression that only shows the leaf resources and sorts them
|
|
487
|
+
by name as we did for the next report. It's a list of all tasks
|
|
488
|
+
showing the resources assigned to each task.
|
|
489
|
+
|
|
490
|
+
taskreport "Task Usage" {
|
|
491
|
+
headline "Task Usage Report"
|
|
492
|
+
columns hierarchindex, name, start, end, effort { title "Work" }, duration,
|
|
493
|
+
cost, revenue
|
|
494
|
+
timeformat "%Y-%m-%d"
|
|
495
|
+
loadunit days
|
|
496
|
+
hideresource ~isLeaf()
|
|
497
|
+
sortresources nameup
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
The default title for the effort column is replaced with a custom
|
|
501
|
+
title. Additionally we show the cost and revenue of all tasks and
|
|
502
|
+
resources. All loads are shown as resource-days. The next report is
|
|
503
|
+
similar to the first one, but has the completion degree as additional
|
|
504
|
+
column.
|
|
505
|
+
|
|
506
|
+
# A list of all tasks with the percentage complete for each task
|
|
507
|
+
taskreport "Tracking Gantt" {
|
|
508
|
+
headline "Tracking Gantt Chart"
|
|
509
|
+
columns hierarchindex, name, start, end, effort { title "Work" }, duration,
|
|
510
|
+
completed, chart
|
|
511
|
+
timeformat "%a %Y-%m-%d"
|
|
512
|
+
loadunit days
|
|
513
|
+
hideresource 1
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
We can also have resource-centric reports. This is done with the
|
|
517
|
+
report type resourcereport. The following report is showing resource
|
|
518
|
+
allocation. It identifies whether each resource is under- or
|
|
519
|
+
over-allocated for.
|
|
520
|
+
|
|
521
|
+
resourcereport "Resource Graph" {
|
|
522
|
+
headline "Resource Allocation Graph"
|
|
523
|
+
columns no, name, rate, utilization, freeload, chart
|
|
524
|
+
loadunit days
|
|
525
|
+
hidetask 1
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
The next report is a list of all project resources, both human and
|
|
529
|
+
material resources, together with the associated costs.
|
|
530
|
+
|
|
531
|
+
resourcereport "Resource Sheet" {
|
|
532
|
+
headline "Resource Sheet"
|
|
533
|
+
columns no, name, efficiency, id, maxeffort, rate
|
|
534
|
+
loadunit days
|
|
535
|
+
hidetask 1
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
The next report is similar to the previous one, but also lists the
|
|
539
|
+
tasks for each of the resources. It also provides details about the
|
|
540
|
+
cost for each resource and task.
|
|
541
|
+
|
|
542
|
+
# A list of resources and each task associated with each resource.
|
|
543
|
+
resourcereport "Resource Usage" {
|
|
544
|
+
headline "Resource Usage Report"
|
|
545
|
+
columns no, name, utilization, freeload, cost
|
|
546
|
+
loadunit days
|
|
547
|
+
hidetask 0
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
==== Generating HTML Reports ====
|
|
551
|
+
|
|
552
|
+
In addition to the interactive reports, TaskJuggler also provides HTML
|
|
553
|
+
reports. These reports have the benefit that you can create report
|
|
554
|
+
files that you can publish on a web server. TaskJuggler supports a
|
|
555
|
+
variety of HTML reports. Please refer to the manual for a full list.
|
|
556
|
+
In this tutorial we will only cover a subset of them.
|
|
557
|
+
|
|
558
|
+
To conclude the HTML reports, a report is generated that shows how
|
|
559
|
+
poorly the project is calculated. The company won't get rich with this
|
|
560
|
+
project. Due to the slip, it actually needs a loan from the bank to
|
|
561
|
+
pay the salaries.
|
|
562
|
+
|
|
563
|
+
htmlaccountreport "Accounting.html" {
|
|
564
|
+
columns no, name, scenario, total, monthly
|
|
565
|
+
headline "P&L for the Project"
|
|
566
|
+
caption "The table shows the profit and loss analysis as well as
|
|
567
|
+
the cashflow situation of the Accounting Software Project."
|
|
568
|
+
accumulate
|
|
569
|
+
scenarios plan, delayed
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
The htmlaccountreport property produces similar reports as the ones
|
|
573
|
+
shown above, but it lists accounts instead of tasks or resources. The
|
|
574
|
+
total column shows the value of the account at the end of the reported
|
|
575
|
+
time interval. The accumulate attribute puts the calendar in
|
|
576
|
+
accumulation mode. The monthly columns list the value of the account
|
|
577
|
+
at the end of the month. Normally the amount that has been added or
|
|
578
|
+
subtracted from the account would be listed.
|
|
579
|
+
|