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/lib/taskjuggler3.rb
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = taskjuggler3.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'optparse'
|
|
14
|
+
require 'Tj3Config'
|
|
15
|
+
require 'TaskJuggler'
|
|
16
|
+
|
|
17
|
+
# Name of the application suite
|
|
18
|
+
AppConfig.appName = 'taskjuggler3'
|
|
19
|
+
|
|
20
|
+
def processArguments(argv)
|
|
21
|
+
opts = OptionParser.new
|
|
22
|
+
|
|
23
|
+
opts.banner = "#{AppConfig.packageName} v#{AppConfig.version} - " +
|
|
24
|
+
"#{AppConfig.packageInfo}\n\n" +
|
|
25
|
+
"Copyright (c) #{AppConfig.copyright.join(', ')}" +
|
|
26
|
+
" by #{AppConfig.authors.join(', ')}\n\n" +
|
|
27
|
+
"#{AppConfig.license}\n" +
|
|
28
|
+
"For more info about #{AppConfig.packageName} see " +
|
|
29
|
+
"#{AppConfig.contact}\n\n" +
|
|
30
|
+
"Usage: #{AppConfig.appName} [options] file.tjp " +
|
|
31
|
+
"[ file1.tji ... ]"
|
|
32
|
+
opts.separator ""
|
|
33
|
+
opts.on('--debuglevel N', Integer, "Verbosity of debug output") do |arg|
|
|
34
|
+
TaskJuggler::Log.level = arg
|
|
35
|
+
end
|
|
36
|
+
opts.on('--debugmodules x,y,z', Array,
|
|
37
|
+
'Restrict debug output to a list of modules') do |arg|
|
|
38
|
+
TaskJuggler::Log.segments = arg.split(',')
|
|
39
|
+
end
|
|
40
|
+
opts.on('--silent', "Don't show program and progress information") do
|
|
41
|
+
TaskJuggler::Log.silent = true
|
|
42
|
+
end
|
|
43
|
+
opts.on('-f', '--force-reports',
|
|
44
|
+
'Generate reports despite scheduling errors') do
|
|
45
|
+
@forceReports = true
|
|
46
|
+
end
|
|
47
|
+
opts.on('-c N', Integer, 'Maximum number of CPU cores to use') do |arg|
|
|
48
|
+
@maxCpuCores = arg
|
|
49
|
+
end
|
|
50
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
|
51
|
+
puts opts.to_s
|
|
52
|
+
exit 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
opts.on_tail('--version', 'Show version info') do
|
|
56
|
+
puts "#{AppConfig.packageName} v#{AppConfig.version} - " +
|
|
57
|
+
"#{AppConfig.packageInfo}"
|
|
58
|
+
exit 0
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Show some progress information by default
|
|
62
|
+
TaskJuggler::Log.silent = false
|
|
63
|
+
begin
|
|
64
|
+
files = opts.parse(argv)
|
|
65
|
+
rescue OptionParser::ParseError => msg
|
|
66
|
+
puts opts.to_s + "\n"
|
|
67
|
+
$stderr.puts msg
|
|
68
|
+
exit 0
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if files.empty?
|
|
72
|
+
puts opts.to_s
|
|
73
|
+
$stderr.puts "\nNo file name specified!"
|
|
74
|
+
exit 1
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
unless TaskJuggler::Log.silent
|
|
78
|
+
puts "#{AppConfig.packageName} v#{AppConfig.version} - " +
|
|
79
|
+
"#{AppConfig.packageInfo}\n\n" +
|
|
80
|
+
"Copyright (c) #{AppConfig.copyright.join(', ')}" +
|
|
81
|
+
" by #{AppConfig.authors.join(', ')}\n\n" +
|
|
82
|
+
"#{AppConfig.license}\n"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
files
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def main
|
|
89
|
+
@maxCpuCores = 1
|
|
90
|
+
@forceReports = false
|
|
91
|
+
|
|
92
|
+
errors = false
|
|
93
|
+
tj = TaskJuggler.new(files = processArguments(ARGV))
|
|
94
|
+
tj.maxCpuCores = @maxCpuCores
|
|
95
|
+
exit 1 unless tj.parse(files)
|
|
96
|
+
if !tj.schedule
|
|
97
|
+
errors = true
|
|
98
|
+
exit 1 unless @forceReports
|
|
99
|
+
end
|
|
100
|
+
exit 1 if !tj.generateReports || errors
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
main()
|
|
105
|
+
exit 0
|
|
106
|
+
|
data/lib/tj3man.rb
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = tj3man.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'optparse'
|
|
14
|
+
require 'Tj3Config'
|
|
15
|
+
require 'SyntaxReference'
|
|
16
|
+
require 'UserManual'
|
|
17
|
+
|
|
18
|
+
AppConfig.appName = 'tj3man'
|
|
19
|
+
|
|
20
|
+
class Arguments
|
|
21
|
+
|
|
22
|
+
attr_reader :keywords, :directory, :manual
|
|
23
|
+
|
|
24
|
+
def initialize(argv)
|
|
25
|
+
@keywords = []
|
|
26
|
+
@directory = './'
|
|
27
|
+
@manual = false
|
|
28
|
+
|
|
29
|
+
opts = OptionParser.new
|
|
30
|
+
opts.banner = "#{AppConfig.packageName} v#{AppConfig.version} - " +
|
|
31
|
+
"#{AppConfig.packageInfo}\n\n" +
|
|
32
|
+
"Copyright (c) #{AppConfig.copyright.join(', ')}" +
|
|
33
|
+
" by #{AppConfig.authors.join(', ')}\n\n" +
|
|
34
|
+
"#{AppConfig.license}\n" +
|
|
35
|
+
"For more info about #{AppConfig.packageName} see " +
|
|
36
|
+
"#{AppConfig.contact}\n"
|
|
37
|
+
opts.separator ''
|
|
38
|
+
opts.separator "Usage: #{AppConfig.appName} [options] [<keyword> ...]"
|
|
39
|
+
opts.separator 'Options:'
|
|
40
|
+
|
|
41
|
+
opts.on('-d', '--dir <directory>', String,
|
|
42
|
+
'directory to put the manual') do |dir|
|
|
43
|
+
@directory = dir
|
|
44
|
+
end
|
|
45
|
+
opts.on('-m', '--manual',
|
|
46
|
+
'Generate the user manual into the current directory or ' +
|
|
47
|
+
'the directory specified with the -d option.') do
|
|
48
|
+
@manual = true
|
|
49
|
+
end
|
|
50
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
|
51
|
+
puts opts
|
|
52
|
+
exit
|
|
53
|
+
end
|
|
54
|
+
opts.on_tail('--version', 'Show version number.') do
|
|
55
|
+
puts opts.banner
|
|
56
|
+
exit
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
@keywords = opts.parse(argv)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def main
|
|
65
|
+
args = Arguments.new(ARGV)
|
|
66
|
+
|
|
67
|
+
man = TaskJuggler::SyntaxReference.new
|
|
68
|
+
keywords = args.keywords
|
|
69
|
+
|
|
70
|
+
if args.manual
|
|
71
|
+
TaskJuggler::UserManual.new.generate(args.directory)
|
|
72
|
+
elsif keywords.empty?
|
|
73
|
+
puts man.all.join("\n")
|
|
74
|
+
else
|
|
75
|
+
keywords.each do |keyword|
|
|
76
|
+
puts man.to_s(keyword)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#$stderr.puts "#{AppConfig.packageName} v#{AppConfig.version} - " +
|
|
81
|
+
# "#{AppConfig.packageInfo}\n\n"
|
|
82
|
+
#puts man.to_s(args.keyword)
|
|
83
|
+
|
|
84
|
+
exit 0
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
main()
|
|
88
|
+
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
== Day To Day Juggling ==
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
=== Tracking the Project ===
|
|
5
|
+
|
|
6
|
+
Once the initial plan has been made and the project has started, TaskJuggler
|
|
7
|
+
can be turned from a planning tool into a tracking tool. You don't have to
|
|
8
|
+
change a lot to do this. After all, as the initial plan is almost always just a
|
|
9
|
+
first guess, you need to continue planning your project as new details become
|
|
10
|
+
evident. So what you really want is a way to gradually freeze the plan as work
|
|
11
|
+
has been completed, while still having full flexibility with all future work.
|
|
12
|
+
|
|
13
|
+
While it is generally accepted to invest some amount of time in project
|
|
14
|
+
planning, it is very common that once the project has been started, project
|
|
15
|
+
managers tend to avoid a proper tracking of the project. Our bet is that the
|
|
16
|
+
vast majority of project plans are only made to get management or investor
|
|
17
|
+
approval. After the approval phase, many project managers only work with their
|
|
18
|
+
project plan again when the project is running really late. On the other hand
|
|
19
|
+
there are projects that are done using strict project management techniques
|
|
20
|
+
that require detailed status tracking. Both extremes probably have their fans
|
|
21
|
+
and TaskJuggler offers good support for both extremes as well as various
|
|
22
|
+
techniques in between.
|
|
23
|
+
|
|
24
|
+
=== Recording Progress ===
|
|
25
|
+
|
|
26
|
+
As mentioned previously, your initial project plan is only a first estimate of
|
|
27
|
+
how the project will progress. During the course of the project you will have
|
|
28
|
+
to make changes to the plan as new information needs to be taken into account
|
|
29
|
+
and you probably want to track the progress of the project in a formalized
|
|
30
|
+
form. TaskJuggler will support you during this phase of the project as well,
|
|
31
|
+
but it needs your help. You have to provide the additional information in the
|
|
32
|
+
project file. In return you get current status reports and an updated project
|
|
33
|
+
plan based on the current status of the project.
|
|
34
|
+
|
|
35
|
+
The most simple form of capturing the current status of the project is to use
|
|
36
|
+
the complete attribute.
|
|
37
|
+
|
|
38
|
+
task impl "Implementation" {
|
|
39
|
+
depends !spec
|
|
40
|
+
effort 4w
|
|
41
|
+
allocate dev1, dev2
|
|
42
|
+
complete 50
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
This tells TaskJuggler that 50% of the task's effort has been completed by the
|
|
46
|
+
current date. Tasks that have no completion specification will be assumed to be
|
|
47
|
+
on track. TaskJuggler calculates the completion degree based on the current
|
|
48
|
+
date. Completion specifications only need to be supplied for tasks that are
|
|
49
|
+
either ahead of schedule or behind schedule. Please keep in mind that the
|
|
50
|
+
completion degree does not affect the scheduling and resource allocation. It is
|
|
51
|
+
only for reporting purposes. It also does not tell TaskJuggler which resource
|
|
52
|
+
actually worked on the tasks.
|
|
53
|
+
|
|
54
|
+
If you want the past work to affect scheduling you must use the booking
|
|
55
|
+
statements as outlined in the next section.
|
|
56
|
+
|
|
57
|
+
When your project plan reflects the current status of your project, TaskJuggler
|
|
58
|
+
can generate nice status reports for you. To generate an HTML report for the
|
|
59
|
+
last week listing all tasks that are running late, all tasks that are ongoing,
|
|
60
|
+
tasks that have been completed last week, and task that will be started next
|
|
61
|
+
week, you just specify
|
|
62
|
+
|
|
63
|
+
htmlstatusreport "Status-Report.html" {
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
=== Recording Resource Usage ===
|
|
67
|
+
|
|
68
|
+
The initial project plan should be made by entering the minimum amount of
|
|
69
|
+
required information such as task dependencies and efforts. TaskJuggler will
|
|
70
|
+
then compute all the missing data based on this initial setup. This is your
|
|
71
|
+
project baseline. As the project progresses you can now track the work already
|
|
72
|
+
completed by recording the work that your resources have done. Let's assume you
|
|
73
|
+
had the following task in your original plan:
|
|
74
|
+
|
|
75
|
+
task impl "Implementation" {
|
|
76
|
+
depends !spec
|
|
77
|
+
effort 4w
|
|
78
|
+
allocate dev1, dev2
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
After the first week of work on this task the two resources have really been
|
|
82
|
+
able to complete half the job. You can capture this in your project plan using
|
|
83
|
+
the booking attribute. Bookings are resource specific, so you have to add the
|
|
84
|
+
booking to the resource definition, not the task definition.
|
|
85
|
+
|
|
86
|
+
resource dev1 "Developer 1" {
|
|
87
|
+
booking impl 2005-04-11 - 2005-04-16 { sloppy 2 }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
resource dev2 "Developer 2" {
|
|
91
|
+
booking impl 2005-04-11 - 2005-04-16 { sloppy 2 }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
The sloppy attribute defines the accuracy of your bookings. If it's missing or
|
|
95
|
+
0, the booking must only describe a continuous working period during working
|
|
96
|
+
hours. With higher values the interval may overlap with off-hour or vacation
|
|
97
|
+
time slots. See details on sloppy.
|
|
98
|
+
|
|
99
|
+
If you don't like to mix the resource definitions and their bookings, you can
|
|
100
|
+
specify the bookings with supplement statements. These supplement statements
|
|
101
|
+
can even reside in an other file. Some companies have created a web front-end
|
|
102
|
+
for their developers to report the completed work against the project plan. The
|
|
103
|
+
reports are stored in a database and include files for TaskJuggler are
|
|
104
|
+
generated from this database. This way the project manager gets a very current
|
|
105
|
+
status of the project and can compute the current project plan based on these
|
|
106
|
+
data without much effort. If you are interested in this you should have a look
|
|
107
|
+
at the download section of the TaskJuggler web site.
|
|
108
|
+
|
|
109
|
+
It is ok to specify bookings beyond the effort value found in the task
|
|
110
|
+
definition. In case you want to declare a task as done, even if the bookings do
|
|
111
|
+
not reach the specified effort or length, you can use the scheduled property.
|
|
112
|
+
|
|
113
|
+
supplement task impl {
|
|
114
|
+
actual:scheduled
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
As a side note we would like to mention that the recording of the work time of
|
|
118
|
+
employees is regulated by labor law in certain countries. You might also
|
|
119
|
+
require approval from a Worker's Council before you can deploy time recording
|
|
120
|
+
tools.
|
|
121
|
+
|
|
122
|
+
In case your actual progress does not deviate a lot from your project plan, you
|
|
123
|
+
can generate the file with the booking statements automatically.
|
|
124
|
+
|
|
125
|
+
export "DoneWork-Week15.tji" {
|
|
126
|
+
hideresource 0
|
|
127
|
+
start 2005-04-11
|
|
128
|
+
end 2005-04-16
|
|
129
|
+
properties bookings
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
This will generate a TaskJuggler include file that contains all bookings
|
|
133
|
+
according to the project plan for the specified interval. You can then use this
|
|
134
|
+
file as a baseline and modify it to reflect the real work that has happened
|
|
135
|
+
during the interval. After that you can include it into your project again.
|
|
136
|
+
|
|
137
|
+
include "DoneWork-Week15.tji"
|
|
138
|
+
|
|
139
|
+
As this include file references the tasks and resources of your project you
|
|
140
|
+
should include it after all task and resource definitions.
|
|
141
|
+
|
|
142
|
+
To make TaskJuggler aware that you want to compute the end date based on the
|
|
143
|
+
bookings and the effort you need to enable the projection mode for the
|
|
144
|
+
scenario. This has to be done in the scenario definition in the project header.
|
|
145
|
+
If you don't have a scenario definition because you are only using the built-in
|
|
146
|
+
default scenario, you have to add a scenario definition.
|
|
147
|
+
|
|
148
|
+
project prj "Project" "1.0" 2005-04-01 - 2005-05-01 {
|
|
149
|
+
scenario plan "Plan" {
|
|
150
|
+
# Compute when the task will be ready based on the already
|
|
151
|
+
# done work and the current date.
|
|
152
|
+
projection
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
TaskJuggler now assumes that for all tasks that have bookings, all work has
|
|
157
|
+
been specified with bookings up to the current date. It then calculates the end
|
|
158
|
+
date of the task based on the effort that is still left over. It also computes
|
|
159
|
+
the complete value based on the specified bookings. So if you specify bookings
|
|
160
|
+
for a task you should not specify a completion value as well. It will be
|
|
161
|
+
ignored and replaced by a value based on the specified bookings.
|
|
162
|
+
|
|
163
|
+
When you now schedule the project again, it will take these bookings into
|
|
164
|
+
account and generate a new project plan based on your current project status.
|
|
165
|
+
Each time you review your project status you should generate such an include
|
|
166
|
+
file for the period that you are reviewing. Then you sync the content with the
|
|
167
|
+
feedback that you get from your resources and add the file to the project plan.
|
|
168
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
== Getting Started ==
|
|
2
|
+
|
|
3
|
+
=== Basics ===
|
|
4
|
+
|
|
5
|
+
TaskJuggler uses one or more text files to describe a project. The
|
|
6
|
+
main project should be placed in a file with the .tjp extension. This
|
|
7
|
+
main project may include other files. Such included files must have
|
|
8
|
+
file names with a ''''.tji'''' extension.
|
|
9
|
+
|
|
10
|
+
The graphical user interface from the 2.x version has not been ported
|
|
11
|
+
to TaskJuggler III yet. So all work with TaskJuggler needs to be done
|
|
12
|
+
in your favorite text editor and in a command shell.
|
|
13
|
+
|
|
14
|
+
The commandline version of TaskJuggler works like a compiler. You
|
|
15
|
+
provide the source files, it computes the contents and creates the
|
|
16
|
+
output files. Let's say you have a project file called
|
|
17
|
+
''''AcSo.tjp''''. It contains the tasks of your project and their
|
|
18
|
+
dependencies. To schedule the project and create report files you have
|
|
19
|
+
to ask TaskJuggler to process it.
|
|
20
|
+
|
|
21
|
+
tj3 AcSo.tjp
|
|
22
|
+
|
|
23
|
+
TaskJuggler will try to schedule all tasks with the specified
|
|
24
|
+
conditions and generate the reports that were requested with the
|
|
25
|
+
[[htmltaskreport]], [[htmlresourcereport]] or other report properties
|
|
26
|
+
in the input file. The report files will be generated in the current
|
|
27
|
+
directory or relative to it.
|
|
28
|
+
|
|
29
|
+
If you specify file names in a project file, you need to use the
|
|
30
|
+
''''/'''' as directory separator. This way, projects are portable
|
|
31
|
+
across all operating systems. Do not use the ''''\'''' or '''':''''
|
|
32
|
+
that are used on some operating systems.
|
|
33
|
+
|
|
34
|
+
=== Structure of a TJP File ===
|
|
35
|
+
|
|
36
|
+
Each TaskJuggler project consists of one or more text files. There is
|
|
37
|
+
always a main project file that may [[include.properties]] other
|
|
38
|
+
files. The main file name should have a ''''.tjp'''' suffix, the
|
|
39
|
+
included files must have a ''''.tji'''' suffix.
|
|
40
|
+
|
|
41
|
+
Every project must start with a [[project project header]]. The
|
|
42
|
+
project header must be in the main project file. All other elements
|
|
43
|
+
may be put into include files. The project header must then be
|
|
44
|
+
followed by any number of project properties such as [[account
|
|
45
|
+
accounts]], [[resource resources]] and [[task tasks]]. Each project
|
|
46
|
+
must have at least one task defined and should have at least one
|
|
47
|
+
[[reports report]]. Properties don't have to be listed in a
|
|
48
|
+
particular order, but may have interdependencies that require such an
|
|
49
|
+
order. If you want to assign a resource to work on a task, this
|
|
50
|
+
resource needs to be defined first. It is therefor recommended to
|
|
51
|
+
define them in the following sequence.
|
|
52
|
+
|
|
53
|
+
* [[macro macros]]
|
|
54
|
+
* [[flags]]
|
|
55
|
+
* [[account accounts]]
|
|
56
|
+
* [[shift shifts]]
|
|
57
|
+
* [[vacation vacations]]
|
|
58
|
+
* [[resource resources]]
|
|
59
|
+
* [[task tasks]]
|
|
60
|
+
* [[reports]]
|
|
61
|
+
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
=== How to Contribute ===
|
|
2
|
+
|
|
3
|
+
==== Why contribute? ====
|
|
4
|
+
|
|
5
|
+
TaskJuggler is an Open Source Project. It was developed by volunteers
|
|
6
|
+
mostly in their spare time. Made available under the GNU General
|
|
7
|
+
Public license and similar licenses, TaskJuggler can be shared and
|
|
8
|
+
used free of charge by anybody who respects the license conditions.
|
|
9
|
+
Does that mean you can use it without worrying about anything? Clearly
|
|
10
|
+
not! Though users have no legal obligation to contribute, you should
|
|
11
|
+
feel a moral obligation to support Open Source in whatever way you
|
|
12
|
+
can. This can range from helping out other users with their first
|
|
13
|
+
Linux installation to actively contributing to the TaskJuggler
|
|
14
|
+
Project, not just as a programmer. The following section describes,
|
|
15
|
+
how you can contribute to any of the components that are part of the
|
|
16
|
+
TaskJuggler software releases.
|
|
17
|
+
|
|
18
|
+
==== Preparing a contribution ====
|
|
19
|
+
|
|
20
|
+
All TaskJuggler development is coordinated using the
|
|
21
|
+
[http://git.or.cz/ Git revision control system]. All changes must be
|
|
22
|
+
submitted using Git so that we can track the authorship of each
|
|
23
|
+
submission. To contribute you need to have at least Git version 1.5.0
|
|
24
|
+
installed. Git was developed as a tool for the Linux Kernel
|
|
25
|
+
developers but is now very popular with many other Open Source
|
|
26
|
+
projects as well. Git and the TaskJuggler development environment are
|
|
27
|
+
primarily designed to be used on Linux or Unix-like systems. While it
|
|
28
|
+
is possible to use it on other systems such as Microsoft Windows, we
|
|
29
|
+
do not recommend this. If you can't switch to a Linux installation
|
|
30
|
+
for your TaskJuggler contributions, you should consider using a Linux
|
|
31
|
+
Live (or bootable) CD/DVD or use a VmWare Player image of a Linux
|
|
32
|
+
distribution.
|
|
33
|
+
|
|
34
|
+
As a first step, you need to checkout the latest version of
|
|
35
|
+
the TaskJuggler. This will create a directory called taskjuggler in
|
|
36
|
+
your current directory. It not only contains the latest sources, but
|
|
37
|
+
also the full revision history of the code. It is your local copy of
|
|
38
|
+
the TaskJuggler source repository.
|
|
39
|
+
|
|
40
|
+
git clone http://www.taskjuggler.org/git-repos/taskjuggler.git
|
|
41
|
+
|
|
42
|
+
If you have never used Git before, you need to configure it first. You
|
|
43
|
+
need to set your name and email address. This information will be
|
|
44
|
+
present in all patches that you submit.
|
|
45
|
+
|
|
46
|
+
git config --global user.name "Your Name"
|
|
47
|
+
git config --global user.email "firstname.lastname@domain.org"
|
|
48
|
+
|
|
49
|
+
See the [[Installation]] section for how to build and install
|
|
50
|
+
TaskJuggler.
|
|
51
|
+
|
|
52
|
+
Do not use the development snapshots and send your patches as plain
|
|
53
|
+
diff files. After having switched to Git, we no longer accept such
|
|
54
|
+
patches.
|
|
55
|
+
|
|
56
|
+
Next you need to find the files where you want to make your
|
|
57
|
+
modifications. Sometimes files will be generated from other files. Do
|
|
58
|
+
not change those generated files. Your changes will be overwritten the
|
|
59
|
+
next time you call the make utility. To identify those files, some
|
|
60
|
+
familiarity with make and other Linux tools are helpful. Whenever
|
|
61
|
+
there is a file with the same base name and the extension .in in the
|
|
62
|
+
same directory, then the file is generated from the .in-file. You need
|
|
63
|
+
to modify the .in-file, not the one with just the base name. Another
|
|
64
|
+
indicator is the fact that the file is not part of the repository.
|
|
65
|
+
With few exceptions the repository does not contain any generated
|
|
66
|
+
files.
|
|
67
|
+
|
|
68
|
+
==== Creating a Patch ====
|
|
69
|
+
|
|
70
|
+
When you are done with your changes, it's a good idea to test them. In
|
|
71
|
+
the taskjuggler directory run the following commands.
|
|
72
|
+
|
|
73
|
+
cd taskjuggler3
|
|
74
|
+
rake test
|
|
75
|
+
rake manual
|
|
76
|
+
rake gem
|
|
77
|
+
|
|
78
|
+
If there are no errors, you can check or test the result. If
|
|
79
|
+
everything works fine, you can lock at your changes again.
|
|
80
|
+
|
|
81
|
+
git diff
|
|
82
|
+
|
|
83
|
+
The git-diff utility performs a line-by-line comparison of the files
|
|
84
|
+
against the latest version in you local repository. Try to only make
|
|
85
|
+
changes that have an impact on the generated files. Do not change
|
|
86
|
+
indentation or line wrapping of paragraphs unless absolutely
|
|
87
|
+
necessary. These kinds of changes increase the size of diff files and
|
|
88
|
+
make it much harder to evaluate the patches. When making changes to
|
|
89
|
+
the program code, please use exactly the same coding style. If your
|
|
90
|
+
contribution is large enough to justify a copyright claim, please
|
|
91
|
+
indicate what copyright you claim in the patch. For modifications to
|
|
92
|
+
existing files, we will assume that your contribution falls under the
|
|
93
|
+
same license as the modified file. All new files will need to contain
|
|
94
|
+
a license declaration, preferably GPL version 2. In any case, the
|
|
95
|
+
license must be [http://www.opensource.org/licenses an OSI accepted
|
|
96
|
+
license] and be compatible with the rest of the project.
|
|
97
|
+
|
|
98
|
+
Review all changes carefully. In case you have created new source
|
|
99
|
+
files, you need to register them with your repository.
|
|
100
|
+
|
|
101
|
+
git add FILENAME
|
|
102
|
+
|
|
103
|
+
If you think you are done, you can commit your changes to your local
|
|
104
|
+
repository.
|
|
105
|
+
|
|
106
|
+
git commit -a
|
|
107
|
+
|
|
108
|
+
Whenever you have made a certain change or added a certain feature,
|
|
109
|
+
you should commit your changes to your local repository. This keeps
|
|
110
|
+
patches small and makes reviewing them easier. The easier your patches
|
|
111
|
+
can be reviewed, the more likely they will get in.
|
|
112
|
+
|
|
113
|
+
The final step to submit your changes is to package them up and sign
|
|
114
|
+
them. It is always a good idea to check for upstream changes again.
|
|
115
|
+
|
|
116
|
+
git pull
|
|
117
|
+
|
|
118
|
+
This makes sure you are really committing your patches against the
|
|
119
|
+
latest version of the source code. In case there were upstream
|
|
120
|
+
changes, you need to merge them first. Usually Git does this
|
|
121
|
+
automatically. Refer to the
|
|
122
|
+
[http://www.kernel.org/pub/software/scm/git/docs/user-manual.html Git
|
|
123
|
+
manual] for details on resolving conflicts during merges. Now you can
|
|
124
|
+
create the patch or patch-set.
|
|
125
|
+
|
|
126
|
+
git format-patch -s origin
|
|
127
|
+
|
|
128
|
+
This will generate a number of files starting with 5-digit file names.
|
|
129
|
+
You then need to attach these files to a posting in the
|
|
130
|
+
[http://www.taskjuggler.org/FUDforum2/index.php?t=thread&frm_id=5
|
|
131
|
+
TaskJuggler Developer Forum].
|
|
132
|
+
|
|
133
|
+
==== Contributing to the User Manual ====
|
|
134
|
+
|
|
135
|
+
The user manual is currently a rough port of the 2.x manual. It
|
|
136
|
+
contains many inaccuracies and does not provide much more than a
|
|
137
|
+
tutorial and a syntax reference. Any help to turn this into a real
|
|
138
|
+
user manual is greatly appreciated.
|
|
139
|
+
|
|
140
|
+
The manual is composed from 3 different sources.
|
|
141
|
+
|
|
142
|
+
# The sources for normal pages are in MediaWiki format and can be
|
|
143
|
+
found in the ''''manual'''' directory of the source distribution.
|
|
144
|
+
|
|
145
|
+
# The information in the syntax reference is extracted from the TJP
|
|
146
|
+
parser source code. It can be found in the file
|
|
147
|
+
''''lib/TjpSyntaxRules.rb''''. You can ignore all but the
|
|
148
|
+
''''doc(...)'''', ''''arg(...)'''' and ''''example(...)'''' sections.
|
|
149
|
+
|
|
150
|
+
# The TJP examples are in the ''''test/TestSuite/Syntax/Correct''''
|
|
151
|
+
directory.
|
|
152
|
+
|
|
153
|
+
The following commands build the HTML files for the manual in the
|
|
154
|
+
''''data/manual'''' directory.
|
|
155
|
+
|
|
156
|
+
cd lib
|
|
157
|
+
ruby UserManual.rb
|
|
158
|
+
|
|
159
|
+
==== Contributing to the Test Suite ====
|
|
160
|
+
|
|
161
|
+
The test suite can be found in the ''''test'''' directory. It
|
|
162
|
+
contains unit and system tests but is very rudimentary at the moment.
|
|
163
|
+
Adding more system tests to the CSV-Report directory is probably the
|
|
164
|
+
best place to start.
|
|
165
|
+
|
|
166
|
+
==== Contributing to the Ruby code ====
|
|
167
|
+
|
|
168
|
+
For the first stable TaskJuggler III release we should have all 2.x
|
|
169
|
+
features supported. The few things that break backwards compatibility
|
|
170
|
+
should be documented in the [[TaskJuggler_2x_Migration]] section.
|
|
171
|
+
|
|
172
|
+
In general, patches are very welcome. Please follow the coding style
|
|
173
|
+
and naming conventions used in the existing code. Larger changes
|
|
174
|
+
should be preceded by a discussion in the
|
|
175
|
+
[http://www.taskjuggler.org/FUDforum2/index.php?t=thread&frm_id=5
|
|
176
|
+
TaskJuggler Developer Forum].
|
|
177
|
+
|
|
178
|
+
==== Some final words to Contributors ====
|
|
179
|
+
|
|
180
|
+
We do welcome all contributions, but please understand that we reserve
|
|
181
|
+
the right to reject any contribution that does not follow the above
|
|
182
|
+
guidelines or otherwise conflicts with the goals of the TaskJuggler
|
|
183
|
+
team. It is a good idea to contact the team prior to making any larger
|
|
184
|
+
efforts.
|
|
185
|
+
|