taskjuggler 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/benchmarks/depends.tjp +2 -1
- data/benchmarks/htmltaskreport.tjp +2 -1
- data/doc/classes/AppConfig.html +124 -120
- data/doc/classes/Arguments.html +10 -6
- data/doc/classes/Object.html +229 -0
- data/doc/classes/String.html +35 -31
- data/doc/classes/TaskJuggler/Account.html +18 -18
- data/doc/classes/TaskJuggler/AccountAttribute.html +261 -0
- data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
- data/doc/classes/TaskJuggler/Allocation.html +34 -30
- data/doc/classes/TaskJuggler/AllocationAttribute.html +70 -70
- data/doc/classes/TaskJuggler/AttributeBase.html +131 -147
- data/doc/classes/TaskJuggler/AttributeDefinition.html +38 -21
- data/doc/classes/TaskJuggler/BatchProcessor.html +313 -0
- data/doc/classes/TaskJuggler/Booking.html +22 -18
- data/doc/classes/TaskJuggler/BookingListAttribute.html +42 -42
- data/doc/classes/TaskJuggler/BooleanAttribute.html +40 -40
- data/doc/classes/TaskJuggler/CSVFile.html +28 -24
- data/doc/classes/TaskJuggler/Charge.html +22 -18
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +30 -30
- data/doc/classes/TaskJuggler/ChargeSet.html +41 -37
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/ColumnListAttribute.html +231 -0
- data/doc/classes/TaskJuggler/ColumnTable.html +23 -21
- data/doc/classes/TaskJuggler/DateAttribute.html +20 -20
- data/doc/classes/TaskJuggler/DefinitionListAttribute.html +162 -0
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
- data/doc/classes/TaskJuggler/FlagListAttribute.html +42 -42
- data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FormatListAttribute.html +197 -0
- data/doc/classes/TaskJuggler/GanttChart.html +236 -207
- data/doc/classes/TaskJuggler/GanttContainer.html +46 -42
- data/doc/classes/TaskJuggler/GanttHeader.html +16 -12
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +16 -12
- data/doc/classes/TaskJuggler/GanttLine.html +28 -24
- data/doc/classes/TaskJuggler/GanttLoadStack.html +22 -18
- data/doc/classes/TaskJuggler/GanttMilestone.html +46 -42
- data/doc/classes/TaskJuggler/GanttRouter.html +104 -98
- data/doc/classes/TaskJuggler/GanttTaskBar.html +46 -42
- data/doc/classes/TaskJuggler/HTMLDocument.html +12 -12
- data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
- data/doc/classes/TaskJuggler/Interval.html +126 -120
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/JobInfo.html +284 -0
- data/doc/classes/TaskJuggler/Journal.html +197 -0
- data/doc/classes/TaskJuggler/JournalEntry.html +218 -0
- data/doc/classes/TaskJuggler/KeywordArray.html +179 -0
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +445 -396
- data/doc/classes/TaskJuggler/Limits/Limit.html +34 -30
- data/doc/classes/TaskJuggler/Limits.html +68 -62
- data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ListAttributeBase.html +207 -0
- data/doc/classes/TaskJuggler/Log.html +72 -68
- data/doc/classes/TaskJuggler/LogicalAttribute.html +38 -34
- data/doc/classes/TaskJuggler/LogicalExpression.html +16 -12
- data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +194 -0
- data/doc/classes/TaskJuggler/LogicalFlag.html +32 -32
- data/doc/classes/TaskJuggler/LogicalFunction.html +28 -24
- data/doc/classes/TaskJuggler/LogicalOperation.html +17 -13
- data/doc/classes/TaskJuggler/Macro.html +10 -6
- data/doc/classes/TaskJuggler/MacroParser.html +36 -36
- data/doc/classes/TaskJuggler/MacroTable.html +40 -36
- data/doc/classes/TaskJuggler/Message.html +16 -12
- data/doc/classes/TaskJuggler/MessageHandler.html +16 -12
- data/doc/classes/TaskJuggler/Navigator.html +249 -0
- data/doc/classes/TaskJuggler/OnShiftCache.html +316 -0
- data/doc/classes/TaskJuggler/Project.html +1064 -678
- data/doc/classes/TaskJuggler/ProjectFileParser.html +90 -85
- data/doc/classes/TaskJuggler/PropertyAttribute.html +194 -0
- data/doc/classes/TaskJuggler/PropertyList.html +114 -113
- data/doc/classes/TaskJuggler/PropertySet.html +355 -312
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +527 -474
- data/doc/classes/TaskJuggler/Query.html +90 -85
- data/doc/classes/TaskJuggler/RTPNavigator.html +292 -0
- data/doc/classes/TaskJuggler/RTPReport.html +301 -0
- data/doc/classes/TaskJuggler/RealFormat.html +114 -57
- data/doc/classes/TaskJuggler/RealFormatAttribute.html +162 -0
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +87 -20
- data/doc/classes/TaskJuggler/Report.html +82 -291
- data/doc/classes/TaskJuggler/ReportBase.html +448 -0
- data/doc/classes/TaskJuggler/ReportContext.html +243 -0
- data/doc/classes/TaskJuggler/ReportTable.html +158 -129
- data/doc/classes/TaskJuggler/ReportTableCell.html +30 -26
- data/doc/classes/TaskJuggler/ReportTableColumn.html +29 -25
- data/doc/classes/TaskJuggler/ReportTableLegend.html +28 -24
- data/doc/classes/TaskJuggler/ReportTableLine.html +34 -30
- data/doc/classes/TaskJuggler/Resource.html +12 -12
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/ResourceListRE.html +49 -57
- data/doc/classes/TaskJuggler/ResourceScenario.html +126 -126
- data/doc/classes/TaskJuggler/RichText.html +52 -48
- data/doc/classes/TaskJuggler/RichTextAttribute.html +30 -30
- data/doc/classes/TaskJuggler/RichTextDocument.html +41 -37
- data/doc/classes/TaskJuggler/RichTextElement.html +274 -264
- data/doc/classes/TaskJuggler/RichTextException.html +13 -13
- data/doc/classes/TaskJuggler/RichTextParser.html +48 -47
- data/doc/classes/TaskJuggler/RichTextProtocolExample.html +52 -55
- data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +55 -10
- data/doc/classes/TaskJuggler/RichTextScanner.html +106 -245
- data/doc/classes/TaskJuggler/RichTextSnip.html +28 -24
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +381 -301
- data/doc/classes/TaskJuggler/Scenario.html +6 -6
- data/doc/classes/TaskJuggler/ScenarioData.html +40 -36
- data/doc/classes/TaskJuggler/ScenarioListAttribute.html +229 -0
- data/doc/classes/TaskJuggler/Scoreboard.html +70 -66
- data/doc/classes/TaskJuggler/Shift.html +18 -18
- data/doc/classes/TaskJuggler/ShiftAssignment.html +58 -54
- data/doc/classes/TaskJuggler/ShiftAssignments.html +82 -78
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
- data/doc/classes/TaskJuggler/SortListAttribute.html +196 -0
- data/doc/classes/TaskJuggler/SourceFileInfo.html +16 -12
- data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
- data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
- data/doc/classes/TaskJuggler/SyntaxReference.html +46 -42
- data/doc/classes/TaskJuggler/TOCEntry.html +16 -12
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +48 -33
- data/doc/classes/TaskJuggler/TableOfContents.html +22 -18
- data/doc/classes/TaskJuggler/TableReport.html +1036 -0
- data/doc/classes/TaskJuggler/Task.html +12 -12
- data/doc/classes/TaskJuggler/TaskDependency.html +16 -12
- data/doc/classes/TaskJuggler/TaskListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/TaskListRE.html +49 -58
- data/doc/classes/TaskJuggler/TaskScenario.html +1270 -1180
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +100 -96
- data/doc/classes/TaskJuggler/TextParser/Rule.html +88 -84
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -12
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +10 -6
- data/doc/classes/TaskJuggler/TextParser.html +203 -140
- data/doc/classes/TaskJuggler/TextReport.html +364 -0
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +50 -42
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +16 -12
- data/doc/classes/TaskJuggler/TextScanner.html +334 -240
- data/doc/classes/TaskJuggler/TjException.html +6 -6
- data/doc/classes/TaskJuggler/TjTime.html +547 -497
- data/doc/classes/TaskJuggler/TjpExample.html +29 -25
- data/doc/classes/TaskJuggler/TjpExportRE.html +77 -97
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +3911 -3886
- data/doc/classes/TaskJuggler/UserManual.html +54 -54
- data/doc/classes/TaskJuggler/WorkingHours.html +53 -49
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -85
- data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
- data/doc/classes/TaskJuggler/XMLComment.html +21 -21
- data/doc/classes/TaskJuggler/XMLDocument.html +28 -24
- data/doc/classes/TaskJuggler/XMLElement.html +70 -58
- data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
- data/doc/classes/TaskJuggler/XMLText.html +36 -36
- data/doc/classes/TaskJuggler.html +266 -183
- data/doc/files/COPYING.html +1 -1
- data/doc/files/README.html +1 -1
- data/doc/files/lib/AccountScenario_rb.html +1 -1
- data/doc/files/lib/Account_rb.html +1 -1
- data/doc/files/lib/Allocation_rb.html +1 -1
- data/doc/files/lib/AppConfig_rb.html +1 -1
- data/doc/files/lib/AttributeBase_rb.html +11 -1
- data/doc/files/lib/AttributeDefinition_rb.html +1 -1
- data/doc/files/lib/Attributes_rb.html +1 -1
- data/doc/files/lib/{LogicalFlag_rb.html → BatchProcessor_rb.html} +8 -6
- data/doc/files/lib/Booking_rb.html +1 -1
- data/doc/files/lib/ChargeSet_rb.html +1 -1
- data/doc/files/lib/Charge_rb.html +1 -1
- data/doc/files/lib/HTMLDocument_rb.html +1 -1
- data/doc/files/lib/Interval_rb.html +1 -1
- data/doc/files/lib/Journal_rb.html +106 -0
- data/doc/files/lib/KeywordArray_rb.html +106 -0
- data/doc/files/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/files/lib/Limits_rb.html +1 -1
- data/doc/files/lib/Log_rb.html +1 -1
- data/doc/files/lib/LogicalExpression_rb.html +1 -3
- data/doc/files/lib/LogicalFunction_rb.html +1 -1
- data/doc/files/lib/LogicalOperation_rb.html +1 -1
- data/doc/files/lib/MacroParser_rb.html +1 -1
- data/doc/files/lib/MacroTable_rb.html +1 -1
- data/doc/files/lib/MessageHandler_rb.html +1 -1
- data/doc/files/lib/Message_rb.html +1 -1
- data/doc/files/lib/ProjectFileParser_rb.html +5 -1
- data/doc/files/lib/Project_rb.html +5 -1
- data/doc/files/lib/PropertyList_rb.html +1 -1
- data/doc/files/lib/PropertySet_rb.html +1 -1
- data/doc/files/lib/PropertyTreeNode_rb.html +1 -1
- data/doc/files/lib/Query_rb.html +1 -1
- data/doc/files/lib/RTPNavigator_rb.html +120 -0
- data/doc/files/lib/RTPReport_rb.html +118 -0
- data/doc/files/lib/RealFormat_rb.html +1 -1
- data/doc/files/lib/ResourceScenario_rb.html +1 -1
- data/doc/files/lib/Resource_rb.html +1 -1
- data/doc/files/lib/RichTextDocument_rb.html +1 -1
- data/doc/files/lib/RichTextElement_rb.html +1 -1
- data/doc/files/lib/RichTextParser_rb.html +1 -1
- data/doc/files/lib/RichTextProtocolExample_rb.html +1 -1
- data/doc/files/lib/RichTextProtocolHandler_rb.html +1 -1
- data/doc/files/lib/RichTextScanner_rb.html +1 -1
- data/doc/files/lib/RichTextSnip_rb.html +1 -1
- data/doc/files/lib/RichTextSyntaxRules_rb.html +1 -1
- data/doc/files/lib/RichText_rb.html +1 -1
- data/doc/files/lib/ScenarioData_rb.html +1 -1
- data/doc/files/lib/Scenario_rb.html +1 -1
- data/doc/files/lib/Scoreboard_rb.html +1 -1
- data/doc/files/lib/ShiftAssignments_rb.html +1 -1
- data/doc/files/lib/ShiftScenario_rb.html +1 -1
- data/doc/files/lib/Shift_rb.html +1 -1
- data/doc/files/lib/SourceFileInfo_rb.html +1 -1
- data/doc/files/lib/SyntaxReference_rb.html +1 -1
- data/doc/files/lib/TOCEntry_rb.html +1 -1
- data/doc/files/lib/TableColumnDefinition_rb.html +1 -1
- data/doc/files/lib/TableOfContents_rb.html +1 -1
- data/doc/files/lib/TaskDependency_rb.html +1 -1
- data/doc/files/lib/TaskJuggler_rb.html +1 -1
- data/doc/files/lib/TaskScenario_rb.html +1 -1
- data/doc/files/lib/Task_rb.html +1 -1
- data/doc/files/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/files/lib/TextParser/Rule_rb.html +1 -1
- data/doc/files/lib/TextParser/StackElement_rb.html +1 -1
- data/doc/files/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/files/lib/TextParser_rb.html +1 -1
- data/doc/files/lib/TextScanner_rb.html +1 -1
- data/doc/files/lib/Tj3Config_rb.html +1 -1
- data/doc/files/lib/TjException_rb.html +1 -1
- data/doc/files/lib/TjTime_rb.html +1 -1
- data/doc/files/lib/TjpExample_rb.html +1 -1
- data/doc/files/lib/TjpSyntaxRules_rb.html +1 -1
- data/doc/files/lib/UTF8String_rb.html +1 -1
- data/doc/files/lib/UserManual_rb.html +1 -1
- data/doc/files/lib/WorkingHours_rb.html +1 -1
- data/doc/files/lib/XMLDocument_rb.html +1 -1
- data/doc/files/lib/XMLElement_rb.html +1 -1
- data/doc/files/lib/deep_copy_rb.html +106 -0
- data/doc/files/lib/ms_test_rb.html +90 -0
- data/doc/files/lib/reports/CSVFile_rb.html +1 -1
- data/doc/files/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/files/lib/reports/GanttChart_rb.html +1 -1
- data/doc/files/lib/reports/GanttContainer_rb.html +1 -1
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/files/lib/reports/GanttHeader_rb.html +1 -1
- data/doc/files/lib/reports/GanttLine_rb.html +1 -1
- data/doc/files/lib/reports/GanttLoadStack_rb.html +1 -1
- data/doc/files/lib/reports/GanttMilestone_rb.html +1 -1
- data/doc/files/lib/reports/GanttRouter_rb.html +1 -1
- data/doc/files/lib/reports/GanttTaskBar_rb.html +1 -1
- data/doc/files/lib/reports/HTMLGraphics_rb.html +1 -1
- data/doc/files/lib/reports/{ReportElement_rb.html → Navigator_rb.html} +6 -8
- data/doc/files/lib/reports/ReportBase_rb.html +106 -0
- data/doc/files/lib/reports/ReportContext_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableCell_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableLegend_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/files/lib/reports/ReportTable_rb.html +1 -1
- data/doc/files/lib/reports/Report_rb.html +8 -2
- data/doc/files/lib/reports/ResourceListRE_rb.html +2 -2
- data/doc/files/lib/reports/{ReportTableElement_rb.html → TableReport_rb.html} +7 -5
- data/doc/files/lib/reports/TaskListRE_rb.html +2 -2
- data/doc/files/lib/reports/TextReport_rb.html +116 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +2 -2
- data/doc/files/lib/taskjuggler3_rb.html +61 -56
- data/doc/files/lib/tj3man_rb.html +1 -1
- data/doc/fr_class_index.html +41 -3
- data/doc/fr_file_index.html +21 -5
- data/doc/fr_method_index.html +1069 -959
- data/examples/ContactList.html +1467 -0
- data/examples/Deliveries.html +485 -0
- data/examples/Development.html +2525 -0
- data/examples/Overview.html +747 -0
- data/examples/Resource Graph.html +616 -0
- data/examples/tutorial.tjp +63 -67
- data/lib/AttributeBase.rb +27 -31
- data/lib/AttributeDefinition.rb +12 -7
- data/lib/Attributes.rb +134 -34
- data/lib/Interval.rb +2 -0
- data/lib/Journal.rb +44 -0
- data/lib/{LogicalFlag.rb → KeywordArray.rb} +5 -13
- data/lib/KeywordDocumentation.rb +84 -47
- data/lib/Limits.rb +7 -5
- data/lib/LogicalExpression.rb +1 -1
- data/lib/LogicalOperation.rb +33 -0
- data/lib/Project.rb +313 -99
- data/lib/ProjectFileParser.rb +88 -11
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +13 -4
- data/lib/PropertyTreeNode.rb +34 -15
- data/lib/Query.rb +2 -1
- data/lib/RTPNavigator.rb +53 -0
- data/lib/RTPReport.rb +62 -0
- data/lib/RealFormat.rb +28 -10
- data/lib/RichTextElement.rb +18 -12
- data/lib/RichTextParser.rb +1 -0
- data/lib/RichTextProtocolExample.rb +8 -11
- data/lib/RichTextProtocolHandler.rb +11 -1
- data/lib/RichTextScanner.rb +308 -164
- data/lib/RichTextSyntaxRules.rb +24 -0
- data/lib/TableColumnDefinition.rb +5 -1
- data/lib/TaskJuggler.rb +3 -2
- data/lib/TaskScenario.rb +123 -31
- data/lib/TextParser.rb +14 -3
- data/lib/TextScanner.rb +210 -34
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +15 -0
- data/lib/TjpExample.rb +1 -1
- data/lib/TjpSyntaxRules.rb +674 -473
- data/lib/WorkingHours.rb +1 -1
- data/lib/XMLElement.rb +11 -3
- data/lib/deep_copy.rb +72 -0
- data/lib/ms_test.rb +27 -0
- data/lib/reports/ColumnTable.rb +7 -5
- data/lib/reports/GanttChart.rb +60 -34
- data/lib/reports/GanttHeader.rb +1 -1
- data/lib/reports/GanttRouter.rb +7 -5
- data/lib/reports/Navigator.rb +72 -0
- data/lib/reports/Report.rb +58 -73
- data/lib/reports/ReportBase.rb +241 -0
- data/lib/reports/ReportContext.rb +41 -0
- data/lib/reports/ReportTable.rb +7 -2
- data/lib/reports/ReportTableCell.rb +3 -3
- data/lib/reports/ResourceListRE.rb +19 -26
- data/lib/reports/{ReportTableElement.rb → TableReport.rb} +297 -97
- data/lib/reports/TaskListRE.rb +16 -24
- data/lib/reports/TextReport.rb +87 -0
- data/lib/reports/TjpExportRE.rb +55 -50
- data/lib/taskjuggler3.rb +6 -1
- data/manual/Getting_Started +57 -6
- data/manual/How_To_Contribute +2 -4
- data/manual/Intro +2 -2
- data/manual/Reporting_Bugs +9 -2
- data/manual/Rich_Text_Attributes +41 -0
- data/manual/Tutorial +219 -173
- data/tasks/test.rake +3 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +2 -1
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +2 -1
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +2 -1
- data/test/TestSuite/CSV-Reports/taskreport.tjp +2 -1
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +2 -1
- data/test/TestSuite/HTML-Reports/depArrows.tjp +72 -0
- data/test/TestSuite/HTML-Reports/reference-export.html +187 -0
- data/test/TestSuite/HTML-Reports/reference.tjp +21 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -1
- data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Container-2.tjp +37 -0
- data/test/TestSuite/Scheduler/Correct/Container.tjp +40 -0
- data/test/TestSuite/Scheduler/Correct/Depends.tjp +9 -14
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +2 -1
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +20 -29
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -13
- data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +6 -5
- data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +10 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +9 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +9 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +13 -10
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +9 -14
- data/test/TestSuite/Scheduler/Correct/Shift.tjp +9 -8
- data/test/TestSuite/Scheduler/Correct/checks.tji +4 -0
- data/test/TestSuite/Scheduler/Errors/weak_end_dep.tjp +16 -0
- data/test/TestSuite/Scheduler/Errors/weak_start_dep.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Account.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/AutoID.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Caption.tjp +7 -6
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +7 -4
- data/test/TestSuite/Syntax/Correct/Comments.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji +11 -19
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +4 -3
- data/test/TestSuite/Syntax/Correct/Export.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Flags.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Journal.tjp +18 -0
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Period.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/RawHTML.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.tji +2 -0
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.tjp +23 -0
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Simple.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/String.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +92 -70
- data/test/TestSuite/Syntax/Errors/bad_comment.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/bad_include.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/bad_time_zone.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/bad_timing_res.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/container_attribute.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +3 -2
- data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/eof_in_istring1.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring2.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring3.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring4.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring5.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/include_recursion.tji +1 -0
- data/test/TestSuite/Syntax/Errors/include_recursion.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/junk_after_cut.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/navigator_exists.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/report_end.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/report_exists.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_start.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sort_direction.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/too_large_timing_res.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/unknown_task.tjp +1 -1
- data/test/all.rb +1 -16
- data/test/test_CSV-Reports.rb +8 -5
- data/test/test_Query.rb +2 -2
- data/test/test_RichText.rb +95 -0
- data/test/test_Scheduler.rb +8 -4
- data/test/test_Syntax.rb +8 -4
- data/test/test_deep_copy.rb +83 -0
- metadata +549 -487
- data/benchmarks/UTF-8-Strings.rb +0 -58
- data/doc/classes/TaskJuggler/ReportElement.html +0 -1070
- data/doc/classes/TaskJuggler/ReportTableElement.html +0 -644
- data/lib/reports/ReportElement.rb +0 -427
- data/test/TestSuite/Syntax/Correct/csvtest +0 -16
- data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +0 -10
- data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +0 -10
- data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +0 -10
data/lib/TaskScenario.rb
CHANGED
@@ -64,6 +64,14 @@ class TaskJuggler
|
|
64
64
|
@property['end', @scenarioIdx] = nil
|
65
65
|
end
|
66
66
|
|
67
|
+
# Milestones may only have start or end date even when the 'scheduled'
|
68
|
+
# attribute is set. For further processing, we need to add the missing
|
69
|
+
# date.
|
70
|
+
if a('milestone') && a('scheduled')
|
71
|
+
@property['end', @scenarioIdx] = a('start') if a('start') && !a('end')
|
72
|
+
@property['start', @scenarioIdx] = a('end') if !a('start') && a('end')
|
73
|
+
end
|
74
|
+
|
67
75
|
# Collect the limits of this task and all parent tasks into a single
|
68
76
|
# Array.
|
69
77
|
@limits = []
|
@@ -265,8 +273,9 @@ class TaskJuggler
|
|
265
273
|
# - <-- |
|
266
274
|
# - <-- -D
|
267
275
|
# - <-- |D
|
268
|
-
if durationSpecs == 0 &&
|
269
|
-
|
276
|
+
if durationSpecs == 0 &&
|
277
|
+
((a('forward') && a('end').nil? && !hasDependencies(true)) ||
|
278
|
+
(!a('forward') && a('start').nil? && !hasDependencies(false)))
|
270
279
|
error('task_underspecified',
|
271
280
|
"Task #{@property.fullId} has too few specifations to be " +
|
272
281
|
"scheduled.")
|
@@ -375,7 +384,6 @@ class TaskJuggler
|
|
375
384
|
"The start time (#{a('start')}) of task #{@property.fullId} " +
|
376
385
|
"is too late. Must be before #{a('maxstart')}.")
|
377
386
|
end
|
378
|
-
|
379
387
|
# Check if the end time is ok
|
380
388
|
error('task_end_undef',
|
381
389
|
"Task #{@property.fullId} has undefined end time") if a('end').nil?
|
@@ -395,6 +403,13 @@ class TaskJuggler
|
|
395
403
|
"The end time (#{a('end')}) of task #{@property.fullId} " +
|
396
404
|
"is too late. Must be before #{a('maxend')}.")
|
397
405
|
end
|
406
|
+
# Make sure the start is before the end
|
407
|
+
if a('start') > a('end')
|
408
|
+
error('start_after_end',
|
409
|
+
"The start time (#{a('start')}) of task #{@property.fullId} " +
|
410
|
+
"is after the end time (#{a('end')}).")
|
411
|
+
end
|
412
|
+
|
398
413
|
|
399
414
|
# Check that tasks fits into parent task.
|
400
415
|
unless (parent = @property.parent).nil? ||
|
@@ -919,22 +934,18 @@ class TaskJuggler
|
|
919
934
|
a('length') > 0 || a('duration') > 0 || a('effort') > 0 || a('milestone')
|
920
935
|
end
|
921
936
|
|
922
|
-
#
|
923
|
-
#
|
924
|
-
#
|
925
|
-
def hasDependencies(atEnd)
|
926
|
-
thisEnd = atEnd ? 'end' : 'start'
|
927
|
-
!a(thisEnd + 'succs').empty? || !a(thisEnd + 'preds').empty?
|
928
|
-
end
|
929
|
-
|
937
|
+
# Find the earliest possible start date for the task. This date must be
|
938
|
+
# after the end date of all the task that this task depends on.
|
939
|
+
# Dependencies may also require a minimum gap between the tasks.
|
930
940
|
def earliestStart
|
931
|
-
#
|
941
|
+
# This is the date that we will return.
|
932
942
|
startDate = nil
|
933
943
|
a('depends').each do |dependency|
|
934
944
|
potentialStartDate =
|
935
945
|
dependency.task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
|
936
946
|
return nil if potentialStartDate.nil?
|
937
947
|
|
948
|
+
# Determine the end date of a 'length' gap.
|
938
949
|
dateAfterLengthGap = potentialStartDate
|
939
950
|
gapLength = dependency.gapLength
|
940
951
|
while gapLength > 0 && dateAfterLengthGap < @project['end'] do
|
@@ -944,6 +955,7 @@ class TaskJuggler
|
|
944
955
|
dateAfterLengthGap += @project['scheduleGranularity']
|
945
956
|
end
|
946
957
|
|
958
|
+
# Determine the end date of a 'duration' gap.
|
947
959
|
if dateAfterLengthGap > potentialStartDate + dependency.gapDuration
|
948
960
|
potentialStartDate = dateAfterLengthGap
|
949
961
|
else
|
@@ -960,21 +972,37 @@ class TaskJuggler
|
|
960
972
|
while (task = task.parent) do
|
961
973
|
if task['start', @scenarioIdx] &&
|
962
974
|
(startDate.nil? || task['start', @scenarioIdx] > startDate)
|
963
|
-
|
975
|
+
startDate = task['start', @scenarioIdx]
|
976
|
+
break
|
964
977
|
end
|
965
978
|
end
|
966
979
|
|
980
|
+
# When the computed start date is after the already determined end date
|
981
|
+
# of the task, the start dependencies were too weak. This happens when
|
982
|
+
# task B depends on A and they are specified this way:
|
983
|
+
# task A: | --> D-
|
984
|
+
# task B: -D <-- |
|
985
|
+
if a('end') && startDate > a('end')
|
986
|
+
error('weak_start_dep',
|
987
|
+
"Task #{@property.fullId} has a too weak start dependencies " +
|
988
|
+
"to be scheduled properly.")
|
989
|
+
end
|
990
|
+
|
967
991
|
startDate
|
968
992
|
end
|
969
993
|
|
994
|
+
# Find the latest possible end date for the task. This date must be
|
995
|
+
# before the start date of all the task that this task precedes.
|
996
|
+
# Dependencies may also require a minimum gap between the tasks.
|
970
997
|
def latestEnd
|
971
|
-
#
|
998
|
+
# This is the date that we will return.
|
972
999
|
endDate = nil
|
973
1000
|
a('precedes').each do |dependency|
|
974
1001
|
potentialEndDate =
|
975
1002
|
dependency.task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
|
976
1003
|
return nil if potentialEndDate.nil?
|
977
1004
|
|
1005
|
+
# Determine the end date of a 'length' gap.
|
978
1006
|
dateBeforeLengthGap = potentialEndDate
|
979
1007
|
gapLength = dependency.gapLength
|
980
1008
|
while gapLength > 0 && dateBeforeLengthGap > @project['start'] do
|
@@ -984,6 +1012,8 @@ class TaskJuggler
|
|
984
1012
|
end
|
985
1013
|
dateBeforeLengthGap -= @project['scheduleGranularity']
|
986
1014
|
end
|
1015
|
+
|
1016
|
+
# Determine the end date of a 'duration' gap.
|
987
1017
|
if dateBeforeLengthGap < potentialEndDate - dependency.gapDuration
|
988
1018
|
potentialEndDate = dateBeforeLengthGap
|
989
1019
|
else
|
@@ -999,10 +1029,22 @@ class TaskJuggler
|
|
999
1029
|
while (task = task.parent) do
|
1000
1030
|
if task['end', @scenarioIdx] &&
|
1001
1031
|
(endDate.nil? || task['end', @scenarioIdx] < endDate)
|
1002
|
-
|
1032
|
+
endDate = task['end', @scenarioIdx]
|
1033
|
+
break
|
1003
1034
|
end
|
1004
1035
|
end
|
1005
1036
|
|
1037
|
+
# When the computed end date is before the already determined start date
|
1038
|
+
# of the task, the end dependencies were too weak. This happens when
|
1039
|
+
# task A precedes B and they are specified this way:
|
1040
|
+
# task A: | --> D-
|
1041
|
+
# task B: -D <-- |
|
1042
|
+
if a('start') && endDate > a('start')
|
1043
|
+
error('weak_end_dep',
|
1044
|
+
"Task #{@property.fullId} has a too weak end dependencies " +
|
1045
|
+
"to be scheduled properly.")
|
1046
|
+
end
|
1047
|
+
|
1006
1048
|
endDate
|
1007
1049
|
end
|
1008
1050
|
|
@@ -1016,13 +1058,6 @@ class TaskJuggler
|
|
1016
1058
|
end
|
1017
1059
|
end
|
1018
1060
|
|
1019
|
-
def markAsRunaway
|
1020
|
-
warning('runaway', "Task #{@property.fullId} does not fit into " +
|
1021
|
-
"project time frame")
|
1022
|
-
|
1023
|
-
@isRunAway = true
|
1024
|
-
end
|
1025
|
-
|
1026
1061
|
def query_complete(query)
|
1027
1062
|
if @property.leaf?
|
1028
1063
|
query.sortableResult = query.numericalResult = a('complete').to_i
|
@@ -1063,6 +1098,19 @@ class TaskJuggler
|
|
1063
1098
|
query.result = query.scaleLoad(query.sortableResult)
|
1064
1099
|
end
|
1065
1100
|
|
1101
|
+
# A list of the resources that have been allocated to work on the task in
|
1102
|
+
# the report time frame.
|
1103
|
+
def query_resources(query)
|
1104
|
+
list = ''
|
1105
|
+
a('assignedresources').each do |resource|
|
1106
|
+
if getAllocatedTime(query.startIdx, query.endIdx, resource) > 0.0
|
1107
|
+
list += ', ' unless list.empty?
|
1108
|
+
list += resource.id
|
1109
|
+
end
|
1110
|
+
end
|
1111
|
+
query.sortableResult = query.result = list
|
1112
|
+
end
|
1113
|
+
|
1066
1114
|
# Compute the revenue generated by this Task for a given Account during a
|
1067
1115
|
# given interval. If a Resource is provided as scopeProperty only the
|
1068
1116
|
# revenue directly generated by the resource is taken into account.
|
@@ -1077,6 +1125,35 @@ class TaskJuggler
|
|
1077
1125
|
end
|
1078
1126
|
end
|
1079
1127
|
|
1128
|
+
# Compute the total time _resource_ or all resources are allocated during
|
1129
|
+
# interval specified by _startIdx_ and _endIdx_.
|
1130
|
+
def getAllocatedTime(startIdx, endIdx, resource = nil)
|
1131
|
+
return 0.0 if a('milestone')
|
1132
|
+
|
1133
|
+
allocatedTime = 0.0
|
1134
|
+
if @property.container?
|
1135
|
+
@property.children.each do |task|
|
1136
|
+
allocatedTime += task.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
|
1137
|
+
resource)
|
1138
|
+
end
|
1139
|
+
else
|
1140
|
+
if resource
|
1141
|
+
allocatedTime += resource.getAllocatedTime(@scenarioIdx,
|
1142
|
+
startIdx, endIdx,
|
1143
|
+
@property)
|
1144
|
+
else
|
1145
|
+
a('assignedresources').each do |r|
|
1146
|
+
allocatedTime += r.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
|
1147
|
+
@property)
|
1148
|
+
end
|
1149
|
+
end
|
1150
|
+
end
|
1151
|
+
allocatedTime
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
# Compute the effective work a _resource_ or all resources do during the
|
1155
|
+
# interval specified by _startIdx_ and _endIdx_. The effective work is the
|
1156
|
+
# actual work multiplied by the efficiency of the resource.
|
1080
1157
|
def getEffectiveWork(startIdx, endIdx, resource = nil)
|
1081
1158
|
return 0.0 if a('milestone')
|
1082
1159
|
|
@@ -1335,6 +1412,7 @@ class TaskJuggler
|
|
1335
1412
|
# booking describes the assignment of a Resource to a certain Task for a
|
1336
1413
|
# specified Interval.
|
1337
1414
|
def bookBookings
|
1415
|
+
scheduled = a('scheduled')
|
1338
1416
|
a('booking').each do |booking|
|
1339
1417
|
unless booking.resource.leaf?
|
1340
1418
|
error('booking_resource_not_leaf',
|
@@ -1363,8 +1441,9 @@ class TaskJuggler
|
|
1363
1441
|
@lastSlot = date if @lastSlot.nil? || date > @lastSlot
|
1364
1442
|
@tentativeEnd = tEnd if @tentativeEnd.nil? ||
|
1365
1443
|
@tentativeEnd < tEnd
|
1366
|
-
|
1367
|
-
|
1444
|
+
if !a('scheduled') && (a('start').nil? || date < a('start'))
|
1445
|
+
@property['start', @scenarioIdx] = date
|
1446
|
+
end
|
1368
1447
|
|
1369
1448
|
unless a('assignedresources').include?(booking.resource)
|
1370
1449
|
@property['assignedresources', @scenarioIdx] << booking.resource
|
@@ -1374,20 +1453,18 @@ class TaskJuggler
|
|
1374
1453
|
# For tasks with a 'length' we track the covered work time and
|
1375
1454
|
# set the task to 'scheduled' when we have enough length.
|
1376
1455
|
@doneLength += 1
|
1377
|
-
if @doneLength >= a('length')
|
1456
|
+
if !scheduled && @doneLength >= a('length')
|
1378
1457
|
@property['end', @scenarioIdx] = tEnd
|
1379
1458
|
@property['scheduled', @scenarioIdx] = true
|
1380
1459
|
end
|
1381
1460
|
end
|
1382
1461
|
date = tEnd
|
1383
1462
|
end
|
1384
|
-
if a('duration') > 0
|
1385
|
-
# For tasks with a 'duration' we track the covered duration and
|
1386
|
-
# set the task to 'scheduled' when we have enough duration.
|
1463
|
+
if a('duration') > 0 && @tentativeEnd
|
1387
1464
|
@doneDuration = ((@tentativeEnd - a('start')) /
|
1388
1465
|
@project['scheduleGranularity']).to_i
|
1389
|
-
if @doneDuration >= a('duration')
|
1390
|
-
@property['end', @scenarioIdx] =
|
1466
|
+
if !scheduled && @doneDuration >= a('duration')
|
1467
|
+
@property['end', @scenarioIdx] = @tentativeEnd
|
1391
1468
|
@property['scheduled', @scenarioIdx] = true
|
1392
1469
|
end
|
1393
1470
|
end
|
@@ -1395,6 +1472,21 @@ class TaskJuggler
|
|
1395
1472
|
end
|
1396
1473
|
end
|
1397
1474
|
|
1475
|
+
# This function checks if the task has a dependency on another task or
|
1476
|
+
# fixed date for a certain end. If +atEnd+ is true, the task end will be
|
1477
|
+
# checked. Otherwise the start.
|
1478
|
+
def hasDependencies(atEnd)
|
1479
|
+
thisEnd = atEnd ? 'end' : 'start'
|
1480
|
+
!a(thisEnd + 'succs').empty? || !a(thisEnd + 'preds').empty?
|
1481
|
+
end
|
1482
|
+
|
1483
|
+
def markAsRunaway
|
1484
|
+
warning('runaway', "Task #{@property.fullId} does not fit into " +
|
1485
|
+
"project time frame")
|
1486
|
+
|
1487
|
+
@isRunAway = true
|
1488
|
+
end
|
1489
|
+
|
1398
1490
|
# This function determines if a task is really a milestones and marks them
|
1399
1491
|
# accordingly.
|
1400
1492
|
def markMilestone
|
@@ -1527,7 +1619,7 @@ class TaskJuggler
|
|
1527
1619
|
# specified completion value.
|
1528
1620
|
def calcCompletion
|
1529
1621
|
# If the user provided a completion degree we are not touching it.
|
1530
|
-
if property.provided('complete')
|
1622
|
+
if @property.provided('complete', @scenarioIdx)
|
1531
1623
|
return
|
1532
1624
|
end
|
1533
1625
|
|
data/lib/TextParser.rb
CHANGED
@@ -97,7 +97,14 @@ class TaskJuggler
|
|
97
97
|
def newRule(name)
|
98
98
|
raise "Fatal Error: Rule #{name} already exists" if @rules.has_key?(name)
|
99
99
|
|
100
|
-
|
100
|
+
if block_given?
|
101
|
+
saveCr = @cr
|
102
|
+
@rules[name] = @cr = TextParser::Rule.new(name)
|
103
|
+
yield
|
104
|
+
@cr = saveCr
|
105
|
+
else
|
106
|
+
@rules[name] = @cr = TextParser::Rule.new(name)
|
107
|
+
end
|
101
108
|
end
|
102
109
|
|
103
110
|
# Add a new pattern to the most recently added rule. _tokens_ is an array of
|
@@ -140,7 +147,7 @@ class TaskJuggler
|
|
140
147
|
# To parse the input this function needs to be called with the name of the
|
141
148
|
# rule to start with. It returns the result of the processing function of
|
142
149
|
# the top-level parser rule that was specified by _ruleName_.
|
143
|
-
def parse(ruleName
|
150
|
+
def parse(ruleName)
|
144
151
|
@stack = []
|
145
152
|
@@expectedTokens = []
|
146
153
|
updateParserTables
|
@@ -175,6 +182,10 @@ class TaskJuggler
|
|
175
182
|
@scanner.error(id, text, property)
|
176
183
|
end
|
177
184
|
|
185
|
+
def warning(id, text, property = nil)
|
186
|
+
@scanner.warning(id, text, property)
|
187
|
+
end
|
188
|
+
|
178
189
|
private
|
179
190
|
|
180
191
|
# getTransitions recursively determines all possible target tokens
|
@@ -197,7 +208,7 @@ class TaskJuggler
|
|
197
208
|
if token[0] == ?!
|
198
209
|
unless @rules.has_key?(tokenId)
|
199
210
|
raise "Fatal Error: Unknown reference to #{tokenId} in pattern " +
|
200
|
-
|
211
|
+
"#{pat} + of rule #{rule.name}"
|
201
212
|
end
|
202
213
|
refRule = @rules[tokenId]
|
203
214
|
# If the referenced rule describes optional content, we need to look
|