taskjuggler 0.0.2 → 0.0.3
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/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
|