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/TjpSyntaxRules.rb
CHANGED
|
@@ -28,6 +28,8 @@ be used to track turnover. When the cost of a task is split over multiple
|
|
|
28
28
|
accounts they all must have the same top-level group account. Top-level
|
|
29
29
|
accounts can be used for profit/loss calculations. The sub-account structure
|
|
30
30
|
of a top-level account should be organized accordingly.
|
|
31
|
+
|
|
32
|
+
Accounts have a global name space. All IDs must be unique within the accounts of the project.
|
|
31
33
|
EOT
|
|
32
34
|
)
|
|
33
35
|
example('Account', '1')
|
|
@@ -49,11 +51,11 @@ EOT
|
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
def rule_accountHeader
|
|
52
|
-
pattern(%w( _account
|
|
54
|
+
pattern(%w( _account !optionalID $STRING ), lambda {
|
|
53
55
|
if @property.nil? && !@accountprefix.empty?
|
|
54
|
-
@property = @project.
|
|
56
|
+
@property = @project.accout(@accountprefix)
|
|
55
57
|
end
|
|
56
|
-
if @project.account(@val[1])
|
|
58
|
+
if @val[1] && @project.account(@val[1])
|
|
57
59
|
error('account_exists', "Account #{@val[1]} has already been defined.")
|
|
58
60
|
end
|
|
59
61
|
@property = Account.new(@project, @val[1], @val[2], @property)
|
|
@@ -61,11 +63,6 @@ EOT
|
|
|
61
63
|
@property.inheritAttributes
|
|
62
64
|
@scenarioIdx = 0
|
|
63
65
|
})
|
|
64
|
-
arg(1, 'id', <<'EOT'
|
|
65
|
-
The ID of the account. Accounts have a global name space. The ID must be
|
|
66
|
-
unique within the whole project.
|
|
67
|
-
EOT
|
|
68
|
-
)
|
|
69
66
|
arg(2, 'name', 'A name or short description of the account')
|
|
70
67
|
end
|
|
71
68
|
|
|
@@ -450,7 +447,8 @@ EOT
|
|
|
450
447
|
|
|
451
448
|
def rule_columnId
|
|
452
449
|
pattern(%w( !reportableAttributes ), lambda {
|
|
453
|
-
title =
|
|
450
|
+
title = TableReport.defaultColumnTitle(@val[0]) ||
|
|
451
|
+
@project.attributeName(@val[0])
|
|
454
452
|
@column = TableColumnDefinition.new(@val[0], title)
|
|
455
453
|
})
|
|
456
454
|
doc('columnid', <<'EOT'
|
|
@@ -492,6 +490,15 @@ EOT
|
|
|
492
490
|
doc('hidecelltext', <<'EOT'
|
|
493
491
|
This logical expression is evaluated during report generation for each report
|
|
494
492
|
cell. If it evaluates to true, the cell will have no content.
|
|
493
|
+
EOT
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
pattern(%w( _hidecellurl !logicalExpression ), lambda {
|
|
497
|
+
@column.hideCellURL = @val[1]
|
|
498
|
+
})
|
|
499
|
+
doc('hidecellurl', <<'EOT'
|
|
500
|
+
This logical expression is evaluated during report generation for each report
|
|
501
|
+
cell. If it evaluates to true, the cell will have no URL attached.
|
|
495
502
|
EOT
|
|
496
503
|
)
|
|
497
504
|
|
|
@@ -524,71 +531,10 @@ EOT
|
|
|
524
531
|
)
|
|
525
532
|
end
|
|
526
533
|
|
|
527
|
-
def rule_csvFileName
|
|
528
|
-
pattern(%w( $STRING ), lambda {
|
|
529
|
-
# '.' means 'use $stdout'
|
|
530
|
-
if @val[0] == '.'
|
|
531
|
-
name = '.'
|
|
532
|
-
else
|
|
533
|
-
unless @val[0][-4,4] == '.csv'
|
|
534
|
-
error('no_csv_suffix',
|
|
535
|
-
"Report name must have .csv suffix: #{@val[0]}")
|
|
536
|
-
end
|
|
537
|
-
# Strip '.csv' suffix from file name
|
|
538
|
-
name = @val[0][0..-5]
|
|
539
|
-
end
|
|
540
|
-
if @project.reports[name]
|
|
541
|
-
error('report_redefinition',
|
|
542
|
-
"A report with the name #{name} has already been defined.")
|
|
543
|
-
end
|
|
544
|
-
name
|
|
545
|
-
})
|
|
546
|
-
arg(1, 'file name', <<'EOT'
|
|
547
|
-
The name of the report file to generate. It should end with a .html extension.
|
|
548
|
-
EOT
|
|
549
|
-
)
|
|
550
|
-
end
|
|
551
|
-
|
|
552
|
-
def rule_csvResourceReport
|
|
553
|
-
pattern(%w( !csvResourceReportHeader !reportBody ))
|
|
554
|
-
doc('csvresourcereport', <<'EOT'
|
|
555
|
-
The report lists all resources and their respective values as colon-separated-value (CSV) file. Due to
|
|
556
|
-
the very simple nature of the CSV format, only a small subset of features will
|
|
557
|
-
be supported for CSV output. Including tasks or listing multiple scenarios
|
|
558
|
-
will result in very difficult to read reports.
|
|
559
|
-
EOT
|
|
560
|
-
)
|
|
561
|
-
end
|
|
562
|
-
|
|
563
|
-
def rule_csvResourceReportHeader
|
|
564
|
-
pattern(%w( _csvresourcereport !csvFileName ), lambda {
|
|
565
|
-
@report = Report.new(@project, @val[1], :csv, sourceFileInfo)
|
|
566
|
-
@reportElement = ResourceListRE.new(@report)
|
|
567
|
-
})
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
def rule_csvTaskReport
|
|
571
|
-
pattern(%w( !csvTaskReportHeader !reportBody ))
|
|
572
|
-
doc('csvtaskreport', <<'EOT'
|
|
573
|
-
The report lists all tasks and their respective values as
|
|
574
|
-
colon-separated-value (CSV) file. Due to the very simple nature of the CSV
|
|
575
|
-
format, only a small subset of features will be supported for CSV output.
|
|
576
|
-
Including resources or listing multiple scenarios will result in very
|
|
577
|
-
difficult to read reports.
|
|
578
|
-
EOT
|
|
579
|
-
)
|
|
580
|
-
end
|
|
581
|
-
|
|
582
|
-
def rule_csvTaskReportHeader
|
|
583
|
-
pattern(%w( _csvtaskreport !csvFileName ), lambda {
|
|
584
|
-
@report = Report.new(@project, @val[1], :csv, sourceFileInfo)
|
|
585
|
-
@reportElement = TaskListRE.new(@report)
|
|
586
|
-
})
|
|
587
|
-
end
|
|
588
|
-
|
|
589
534
|
def rule_date
|
|
590
535
|
pattern(%w( $DATE ), lambda {
|
|
591
|
-
resolution = @project.nil? ?
|
|
536
|
+
resolution = @project.nil? ? Project.maxScheduleGranularity :
|
|
537
|
+
@project['scheduleGranularity']
|
|
592
538
|
if @val[0] % resolution != 0
|
|
593
539
|
error('misaligned_date',
|
|
594
540
|
"The date must be aligned to the timing resolution (" +
|
|
@@ -655,49 +601,11 @@ EOT
|
|
|
655
601
|
example('Export')
|
|
656
602
|
end
|
|
657
603
|
|
|
658
|
-
def rule_exportableResourceAttribute
|
|
659
|
-
singlePattern('_all')
|
|
660
|
-
singlePattern('_none')
|
|
661
|
-
singlePattern('_vacation')
|
|
662
|
-
singlePattern('_workinghours')
|
|
663
|
-
end
|
|
664
|
-
|
|
665
|
-
def rule_exportableResourceAttributes
|
|
666
|
-
listRule('moreExportableResourceAttributes', '!exportableResourceAttribute')
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
def rule_exportableTaskAttribute
|
|
670
|
-
singlePattern('_all')
|
|
671
|
-
singlePattern('_booking')
|
|
672
|
-
singlePattern('_complete')
|
|
673
|
-
singlePattern('_depends')
|
|
674
|
-
singlePattern('_flags')
|
|
675
|
-
singlePattern('_maxend')
|
|
676
|
-
singlePattern('_maxstart')
|
|
677
|
-
singlePattern('_minend')
|
|
678
|
-
singlePattern('_minstart')
|
|
679
|
-
singlePattern('_none')
|
|
680
|
-
singlePattern('_note')
|
|
681
|
-
singlePattern('_priority')
|
|
682
|
-
singlePattern('_responsible')
|
|
683
|
-
end
|
|
684
|
-
|
|
685
|
-
def rule_exportableTaskAttributes
|
|
686
|
-
listRule('moreExportableTaskAttributes', '!exportableTaskAttribute')
|
|
687
|
-
end
|
|
688
|
-
|
|
689
604
|
def rule_exportHeader
|
|
690
605
|
pattern(%w( _export $STRING ), lambda {
|
|
691
|
-
if @val[1]
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
else
|
|
695
|
-
extension = @val[1][-4, 4]
|
|
696
|
-
if extension == '.tjp'
|
|
697
|
-
mainFile = true
|
|
698
|
-
elsif extension == '.tji'
|
|
699
|
-
mainFile = false
|
|
700
|
-
else
|
|
606
|
+
if @val[1] != '.'
|
|
607
|
+
suffix = @val[1][-4, 4]
|
|
608
|
+
if suffix != '.tjp' && suffix != '.tji'
|
|
701
609
|
error('export_bad_extn',
|
|
702
610
|
'Export report files must have a .tjp or .tji extension.')
|
|
703
611
|
end
|
|
@@ -705,12 +613,11 @@ EOT
|
|
|
705
613
|
name = @val[1][0..-5]
|
|
706
614
|
end
|
|
707
615
|
|
|
708
|
-
if @project.reports[
|
|
616
|
+
if @project.reports[@val[1]]
|
|
709
617
|
error('report_redefinition',
|
|
710
618
|
"A report with the name #{name} has already been defined.")
|
|
711
619
|
end
|
|
712
|
-
|
|
713
|
-
@reportElement = TjpExportRE.new(@report, mainFile)
|
|
620
|
+
newReport(@val[1], :export, sourceFileInfo)
|
|
714
621
|
})
|
|
715
622
|
arg(1, 'file name', <<'EOT'
|
|
716
623
|
The name of the report file to generate. It must end with a .tjp or .tji
|
|
@@ -723,29 +630,54 @@ EOT
|
|
|
723
630
|
optional
|
|
724
631
|
repeatable
|
|
725
632
|
|
|
633
|
+
pattern(%w( _definitions !exportDefinitions ), lambda {
|
|
634
|
+
@property.set('definitions', @val[1])
|
|
635
|
+
})
|
|
636
|
+
doc('definitions', <<"EOT"
|
|
637
|
+
This attributes controls what definitions will be contained in the report. By default, '.tjp' reports have all definitions included and '.tji' reports have no definitions included.
|
|
638
|
+
EOT
|
|
639
|
+
)
|
|
640
|
+
allOrNothingListRule('exportDefinitions',
|
|
641
|
+
{ 'flags' => 'Include flag definitions',
|
|
642
|
+
'projecids' => 'Include project IDs',
|
|
643
|
+
'tasks' => 'Include task definitions',
|
|
644
|
+
'resources' => 'Include resource definitions' })
|
|
726
645
|
pattern(%w( !hideresource ))
|
|
727
646
|
pattern(%w( !hidetask ))
|
|
728
647
|
pattern(%w( !reportEnd ))
|
|
729
648
|
pattern(%w( !reportPeriod ))
|
|
730
649
|
pattern(%w( !reportStart ))
|
|
650
|
+
|
|
731
651
|
pattern(%w( _resourceattributes !exportableResourceAttributes ), lambda {
|
|
732
|
-
@
|
|
652
|
+
@property.set('resourceAttributes', @val[1])
|
|
733
653
|
})
|
|
734
654
|
doc('resourceattributes', <<"EOT"
|
|
735
|
-
Define a list of resource attributes that should be included in the report.
|
|
736
|
-
include all supported attributes just use ''''all''''. When ''''none'''' is
|
|
737
|
-
used, no optional resource attributes will be exported.
|
|
655
|
+
Define a list of resource attributes that should be included in the report.
|
|
738
656
|
EOT
|
|
739
|
-
|
|
657
|
+
)
|
|
658
|
+
allOrNothingListRule('exportableResourceAttributes',
|
|
659
|
+
{ 'vacation' => 'Include vacations',
|
|
660
|
+
'workinghours' => 'Include working hours' })
|
|
661
|
+
|
|
740
662
|
pattern(%w( _taskattributes !exportableTaskAttributes ), lambda {
|
|
741
|
-
@
|
|
663
|
+
@property.set('taskAttributes', @val[1])
|
|
742
664
|
})
|
|
743
665
|
doc('taskattributes', <<"EOT"
|
|
744
|
-
Define a list of task attributes that should be included in the report.
|
|
745
|
-
include all supported attributes just use ''''all''''. When ''''none'''' is
|
|
746
|
-
used, no optional task attributes will be exported.
|
|
666
|
+
Define a list of task attributes that should be included in the report.
|
|
747
667
|
EOT
|
|
748
|
-
|
|
668
|
+
)
|
|
669
|
+
allOrNothingListRule('exportableTaskAttributes',
|
|
670
|
+
{ 'booking' => 'Include bookings',
|
|
671
|
+
'complete' => 'Include completion values',
|
|
672
|
+
'depends' => 'Include dependencies',
|
|
673
|
+
'flags' => 'Include flags',
|
|
674
|
+
'maxend' => 'Include maximum end dates',
|
|
675
|
+
'maxstart' => 'Include maximum start dates',
|
|
676
|
+
'minend' => 'Include minimum end dates',
|
|
677
|
+
'minstart' => 'Include minimum start dates',
|
|
678
|
+
'note' => 'Include notes',
|
|
679
|
+
'priority' => 'Include priorities',
|
|
680
|
+
'responsible' => 'Include responsible resource' })
|
|
749
681
|
end
|
|
750
682
|
|
|
751
683
|
def rule_exportBody
|
|
@@ -885,7 +817,7 @@ EOT
|
|
|
885
817
|
def rule_flag
|
|
886
818
|
pattern(%w( $ID ), lambda {
|
|
887
819
|
unless @project['flags'].include?(@val[0])
|
|
888
|
-
error('undecl_flag', "Undeclared flag #{@val[0]}")
|
|
820
|
+
error('undecl_flag', "Undeclared flag '#{@val[0]}'")
|
|
889
821
|
end
|
|
890
822
|
@val[0]
|
|
891
823
|
})
|
|
@@ -943,7 +875,7 @@ EOT
|
|
|
943
875
|
|
|
944
876
|
def rule_hideresource
|
|
945
877
|
pattern(%w( _hideresource !logicalExpression ), lambda {
|
|
946
|
-
@
|
|
878
|
+
@property.set('hideResource', @val[1])
|
|
947
879
|
})
|
|
948
880
|
doc('hideresource', <<'EOT'
|
|
949
881
|
Do not include resources that match the specified logical expression. If the
|
|
@@ -955,7 +887,7 @@ EOT
|
|
|
955
887
|
|
|
956
888
|
def rule_hidetask
|
|
957
889
|
pattern(%w( _hidetask !logicalExpression ), lambda {
|
|
958
|
-
@
|
|
890
|
+
@property.set('hideTask', @val[1])
|
|
959
891
|
})
|
|
960
892
|
doc('hidetask', <<'EOT'
|
|
961
893
|
Do not include tasks that match the specified logical expression. If the
|
|
@@ -965,58 +897,6 @@ EOT
|
|
|
965
897
|
)
|
|
966
898
|
end
|
|
967
899
|
|
|
968
|
-
def rule_htmlFileName
|
|
969
|
-
pattern(%w( $STRING ), lambda {
|
|
970
|
-
unless @val[0][-5,5] == '.html'
|
|
971
|
-
error('no_html_suffix',
|
|
972
|
-
"Report name must have .html suffix: #{@val[0]}")
|
|
973
|
-
end
|
|
974
|
-
# Strip '.html' suffix from file name
|
|
975
|
-
name = @val[0][0..-6]
|
|
976
|
-
if @project.reports[name]
|
|
977
|
-
error('report_redefinition',
|
|
978
|
-
"A report with the name #{name} has already been defined.")
|
|
979
|
-
end
|
|
980
|
-
name
|
|
981
|
-
})
|
|
982
|
-
arg(1, 'file name', <<'EOT'
|
|
983
|
-
The name of the report file to generate. It should end with a .html extension.
|
|
984
|
-
EOT
|
|
985
|
-
)
|
|
986
|
-
end
|
|
987
|
-
|
|
988
|
-
def rule_htmlResourceReport
|
|
989
|
-
pattern(%w( !htmlResourceReportHeader !reportBody ))
|
|
990
|
-
doc('htmlresourcereport', <<'EOT'
|
|
991
|
-
The report lists all resources and their respective values as a HTML page. The
|
|
992
|
-
task that are the resources are allocated to can be listed as well.
|
|
993
|
-
EOT
|
|
994
|
-
)
|
|
995
|
-
end
|
|
996
|
-
|
|
997
|
-
def rule_htmlResourceReportHeader
|
|
998
|
-
pattern(%w( _htmlresourcereport !htmlFileName ), lambda {
|
|
999
|
-
@report = Report.new(@project, @val[1], :html, sourceFileInfo)
|
|
1000
|
-
@reportElement = ResourceListRE.new(@report)
|
|
1001
|
-
})
|
|
1002
|
-
end
|
|
1003
|
-
|
|
1004
|
-
def rule_htmlTaskReport
|
|
1005
|
-
pattern(%w( !htmlTaskReportHeader !reportBody ))
|
|
1006
|
-
doc('htmltaskreport', <<'EOT'
|
|
1007
|
-
The report lists all tasks and their respective values as a HTML page. The
|
|
1008
|
-
resources that are allocated to each task can be listed as well.
|
|
1009
|
-
EOT
|
|
1010
|
-
)
|
|
1011
|
-
end
|
|
1012
|
-
|
|
1013
|
-
def rule_htmlTaskReportHeader
|
|
1014
|
-
pattern(%w( _htmltaskreport !htmlFileName ), lambda {
|
|
1015
|
-
@report = Report.new(@project, @val[1], :html, sourceFileInfo)
|
|
1016
|
-
@reportElement = TaskListRE.new(@report)
|
|
1017
|
-
})
|
|
1018
|
-
end
|
|
1019
|
-
|
|
1020
900
|
def rule_includeAttributes
|
|
1021
901
|
optionsRule('includeAttributesBody')
|
|
1022
902
|
end
|
|
@@ -1034,8 +914,20 @@ sub-account of the account specified by ID. The parent account must already be
|
|
|
1034
914
|
defined.
|
|
1035
915
|
EOT
|
|
1036
916
|
)
|
|
917
|
+
arg(1, 'account ID', 'The absolute ID of an already defined account')
|
|
918
|
+
|
|
919
|
+
pattern(%w( _reportprefix !taskId ), lambda {
|
|
920
|
+
@reportprefix = @val[1].fullId
|
|
921
|
+
})
|
|
922
|
+
doc('reportprefix', <<'EOT'
|
|
923
|
+
This attribute can be used to insert the reports of the included file as
|
|
924
|
+
sub-report of the report specified by ID. The parent report must already
|
|
925
|
+
be defined.
|
|
926
|
+
EOT
|
|
927
|
+
)
|
|
928
|
+
arg(1, 'report ID', 'The absolute ID of an already defined report.')
|
|
1037
929
|
|
|
1038
|
-
pattern(%w( _resourceprefix !
|
|
930
|
+
pattern(%w( _resourceprefix !resourceId ), lambda {
|
|
1039
931
|
@resourceprefix = @val[1].fullId
|
|
1040
932
|
})
|
|
1041
933
|
doc('resourceprefix', <<'EOT'
|
|
@@ -1044,6 +936,7 @@ sub-resource of the resource specified by ID. The parent resource must already
|
|
|
1044
936
|
be defined.
|
|
1045
937
|
EOT
|
|
1046
938
|
)
|
|
939
|
+
arg(1, 'resource ID', 'The ID of an already defined resource')
|
|
1047
940
|
|
|
1048
941
|
pattern(%w( _taskprefix !taskId ), lambda {
|
|
1049
942
|
@taskprefix = @val[1].fullId
|
|
@@ -1053,6 +946,7 @@ This attribute can be used to insert the tasks of the included file as
|
|
|
1053
946
|
sub-task of the task specified by ID. The parent task must already be defined.
|
|
1054
947
|
EOT
|
|
1055
948
|
)
|
|
949
|
+
arg(1, 'task ID', 'The absolute ID of an already defined task.')
|
|
1056
950
|
end
|
|
1057
951
|
|
|
1058
952
|
def rule_includeFile
|
|
@@ -1178,11 +1072,67 @@ EOT
|
|
|
1178
1072
|
singlePattern('!intervals')
|
|
1179
1073
|
end
|
|
1180
1074
|
|
|
1075
|
+
def rule_journalEntry
|
|
1076
|
+
pattern(%w( !journalEntryHeader !journalEntryBody ), lambda {
|
|
1077
|
+
@val[0]
|
|
1078
|
+
})
|
|
1079
|
+
doc('journalentry', <<'EOT'
|
|
1080
|
+
This attribute adds an entry to the journal of the project. A journal can be used to record events, decisions or news that happened at a particular moment during the project. Depending on the context, a journal entry may or may not be associated with a specific property.
|
|
1081
|
+
|
|
1082
|
+
A journal entry consists of three parts. The headline is mandatory and should be only 5 to 10 words long. The introduction is optional and should be only one or two sentences long. All other details should be put into the third part.
|
|
1083
|
+
|
|
1084
|
+
Depending on the context, journal entries are listed with headlines only, as headlines plus introduction or in full.
|
|
1085
|
+
EOT
|
|
1086
|
+
)
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1089
|
+
def rule_journalEntryAttributes
|
|
1090
|
+
optional
|
|
1091
|
+
repeatable
|
|
1092
|
+
|
|
1093
|
+
pattern(%w( _intro $STRING ), lambda {
|
|
1094
|
+
@journalEntry.intro = newRichText(@val[1])
|
|
1095
|
+
})
|
|
1096
|
+
doc('intro', <<'EOT'
|
|
1097
|
+
This is the introductory part of the journal entry. It should summarize the
|
|
1098
|
+
full entry but should contain more details than the headline.
|
|
1099
|
+
EOT
|
|
1100
|
+
)
|
|
1101
|
+
arg(1, 'text', <<'EOT'
|
|
1102
|
+
The text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
1103
|
+
EOT
|
|
1104
|
+
)
|
|
1105
|
+
|
|
1106
|
+
pattern(%w( _more $STRING ), lambda {
|
|
1107
|
+
@journalEntry.more = newRichText(@val[1])
|
|
1108
|
+
})
|
|
1109
|
+
doc('more', <<'EOT'
|
|
1110
|
+
This is a continuation of the [[intro introduction]] of the journal entry. It
|
|
1111
|
+
is usually several paragraphs long.
|
|
1112
|
+
EOT
|
|
1113
|
+
)
|
|
1114
|
+
arg(1, 'text', <<'EOT'
|
|
1115
|
+
The text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
1116
|
+
EOT
|
|
1117
|
+
)
|
|
1118
|
+
end
|
|
1119
|
+
|
|
1120
|
+
def rule_journalEntryBody
|
|
1121
|
+
optionsRule('journalEntryAttributes')
|
|
1122
|
+
end
|
|
1123
|
+
|
|
1124
|
+
def rule_journalEntryHeader
|
|
1125
|
+
pattern(%w( _journalentry !valDate $STRING ), lambda {
|
|
1126
|
+
@journalEntry = JournalEntry.new(@project['journal'], @val[1], @val[2],
|
|
1127
|
+
@property)
|
|
1128
|
+
})
|
|
1129
|
+
end
|
|
1181
1130
|
def rule_leafResourceId
|
|
1182
1131
|
pattern(%w( !resourceId ), lambda {
|
|
1183
1132
|
resource = @val[0]
|
|
1184
1133
|
unless resource.leaf?
|
|
1185
|
-
error('leaf_resource_id_expected',
|
|
1134
|
+
error('leaf_resource_id_expected',
|
|
1135
|
+
"#{resource.id} is not a leaf resource.")
|
|
1186
1136
|
end
|
|
1187
1137
|
resource
|
|
1188
1138
|
})
|
|
@@ -1415,6 +1365,9 @@ EOT
|
|
|
1415
1365
|
|
|
1416
1366
|
def rule_macro
|
|
1417
1367
|
pattern(%w( _macro $ID $MACRO ), lambda {
|
|
1368
|
+
if @scanner.macroDefined?(@val[1])
|
|
1369
|
+
warning('marco_redefinition', "Redefining macro #{@val[1]}")
|
|
1370
|
+
end
|
|
1418
1371
|
@scanner.addMacro(Macro.new(@val[1], @val[2], @scanner.sourceFileInfo))
|
|
1419
1372
|
})
|
|
1420
1373
|
doc('macro', <<'EOT'
|
|
@@ -1481,6 +1434,10 @@ EOT
|
|
|
1481
1434
|
commaListRule('!weekDayInterval')
|
|
1482
1435
|
end
|
|
1483
1436
|
|
|
1437
|
+
def rule_moreOutputFormats
|
|
1438
|
+
commaListRule('!outputFormat')
|
|
1439
|
+
end
|
|
1440
|
+
|
|
1484
1441
|
def rule_moreProjectIDs
|
|
1485
1442
|
commaListRule('$ID')
|
|
1486
1443
|
end
|
|
@@ -1501,6 +1458,45 @@ EOT
|
|
|
1501
1458
|
commaListRule('!timeInterval')
|
|
1502
1459
|
end
|
|
1503
1460
|
|
|
1461
|
+
def rule_navigator
|
|
1462
|
+
pattern(%w( !navigatorHeader !navigatorBody ), lambda {
|
|
1463
|
+
@project['navigators'][@navigator.id] = @navigator
|
|
1464
|
+
})
|
|
1465
|
+
doc('navigator', <<'EOT'
|
|
1466
|
+
Defines a navigator object with the specified ID. This object can be used in
|
|
1467
|
+
reports to include a navigation bar with references to other reports.
|
|
1468
|
+
EOT
|
|
1469
|
+
)
|
|
1470
|
+
end
|
|
1471
|
+
|
|
1472
|
+
def rule_navigatorAttributes
|
|
1473
|
+
optional
|
|
1474
|
+
repeatable
|
|
1475
|
+
pattern(%w( _hidereport !logicalExpression ), lambda {
|
|
1476
|
+
@navigator.hideReport = @val[1]
|
|
1477
|
+
})
|
|
1478
|
+
doc('hidereport', <<'EOT'
|
|
1479
|
+
This attribute can be used to exclude the reports that match the specified
|
|
1480
|
+
expression from the navigation bar.
|
|
1481
|
+
EOT
|
|
1482
|
+
)
|
|
1483
|
+
end
|
|
1484
|
+
|
|
1485
|
+
def rule_navigatorBody
|
|
1486
|
+
optional
|
|
1487
|
+
pattern(%w( _{ !navigatorAttributes _} ))
|
|
1488
|
+
end
|
|
1489
|
+
|
|
1490
|
+
def rule_navigatorHeader
|
|
1491
|
+
pattern(%w( _navigator $ID ), lambda {
|
|
1492
|
+
if @project['navigators'][@val[1]]
|
|
1493
|
+
error('navigator_exists',
|
|
1494
|
+
"The navigator #{@val[1]} has already been defined.")
|
|
1495
|
+
end
|
|
1496
|
+
@navigator = Navigator.new(@val[1], @project)
|
|
1497
|
+
})
|
|
1498
|
+
end
|
|
1499
|
+
|
|
1504
1500
|
def rule_number
|
|
1505
1501
|
singlePattern('$INTEGER')
|
|
1506
1502
|
singlePattern('$FLOAT')
|
|
@@ -1534,7 +1530,7 @@ EOT
|
|
|
1534
1530
|
pattern(%w( $ID !argumentList ), lambda {
|
|
1535
1531
|
if @val[1].nil?
|
|
1536
1532
|
unless @project['flags'].include?(@val[0])
|
|
1537
|
-
error('operand_unkn_flag', "Undeclared flag #{@val[0]}")
|
|
1533
|
+
error('operand_unkn_flag', "Undeclared flag '#{@val[0]}'")
|
|
1538
1534
|
end
|
|
1539
1535
|
LogicalFlag.new(@val[0])
|
|
1540
1536
|
else
|
|
@@ -1606,6 +1602,20 @@ EOT
|
|
|
1606
1602
|
descr('The \'smaller-or-equal\' operator')
|
|
1607
1603
|
end
|
|
1608
1604
|
|
|
1605
|
+
def rule_optionalID
|
|
1606
|
+
optional
|
|
1607
|
+
pattern(%w( $ID ), lambda {
|
|
1608
|
+
@val[0]
|
|
1609
|
+
})
|
|
1610
|
+
arg(0, 'id', <<"EOT"
|
|
1611
|
+
An optional ID. If you ever want to reference this property, you must specify
|
|
1612
|
+
your own unique ID. If no ID is specified one will be automatically generated.
|
|
1613
|
+
These IDs may become visible in reports, but may change at any time. You may
|
|
1614
|
+
never rely on automatically generated IDs.
|
|
1615
|
+
EOT
|
|
1616
|
+
)
|
|
1617
|
+
end
|
|
1618
|
+
|
|
1609
1619
|
def rule_optionalPercent
|
|
1610
1620
|
optional
|
|
1611
1621
|
pattern(%w( !number _% ), lambda {
|
|
@@ -1613,6 +1623,43 @@ EOT
|
|
|
1613
1623
|
})
|
|
1614
1624
|
end
|
|
1615
1625
|
|
|
1626
|
+
def rule_optionalVersion
|
|
1627
|
+
optional
|
|
1628
|
+
pattern(%w( $STRING ), lambda {
|
|
1629
|
+
@val[0]
|
|
1630
|
+
})
|
|
1631
|
+
arg(0, 'version', <<"EOT"
|
|
1632
|
+
An optional version ID. This can be something simple as "4.2" or an ID tag of
|
|
1633
|
+
a revision control system. If not specified, it defaults to "1.0".
|
|
1634
|
+
EOT
|
|
1635
|
+
)
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
def rule_outputFormat
|
|
1639
|
+
pattern(%w( _csv ), lambda {
|
|
1640
|
+
:csv
|
|
1641
|
+
})
|
|
1642
|
+
descr(<<'EOT'
|
|
1643
|
+
The report lists the resources and their respective values as
|
|
1644
|
+
colon-separated-value (CSV) format. Due to the very simple nature of the CSV
|
|
1645
|
+
format, only a small subset of features will be supported for CSV output.
|
|
1646
|
+
Including tasks or listing multiple scenarios will result in very difficult to
|
|
1647
|
+
read reports.
|
|
1648
|
+
EOT
|
|
1649
|
+
)
|
|
1650
|
+
|
|
1651
|
+
pattern(%w( _html ), lambda {
|
|
1652
|
+
:html
|
|
1653
|
+
})
|
|
1654
|
+
descr('Generate a web page (HTML file)')
|
|
1655
|
+
end
|
|
1656
|
+
|
|
1657
|
+
def rule_outputFormats
|
|
1658
|
+
pattern(%w( !outputFormat !moreOutputFormats ), lambda {
|
|
1659
|
+
[ @val[0] ] + @val[1]
|
|
1660
|
+
})
|
|
1661
|
+
end
|
|
1662
|
+
|
|
1616
1663
|
def rule_project
|
|
1617
1664
|
pattern(%w( !projectProlog !projectDeclaration !properties ), lambda {
|
|
1618
1665
|
@val[1]
|
|
@@ -1629,7 +1676,7 @@ EOT
|
|
|
1629
1676
|
|
|
1630
1677
|
pattern(%w( _currencyformat $STRING $STRING $STRING $STRING $INTEGER ),
|
|
1631
1678
|
lambda {
|
|
1632
|
-
@project['
|
|
1679
|
+
@project['currencyFormat'] = RealFormat.new(@val.slice(1, 5))
|
|
1633
1680
|
})
|
|
1634
1681
|
doc('currencyformat',
|
|
1635
1682
|
'These values specify the default format used for all currency ' +
|
|
@@ -1679,6 +1726,8 @@ EOT
|
|
|
1679
1726
|
|
|
1680
1727
|
pattern(%w( !projectBodyInclude ))
|
|
1681
1728
|
|
|
1729
|
+
pattern(%w( !journalEntry ))
|
|
1730
|
+
|
|
1682
1731
|
pattern(%w( _now !date ), lambda {
|
|
1683
1732
|
@project['now'] = @val[1]
|
|
1684
1733
|
@scanner.addMacro(Macro.new('now', @val[1].to_s,
|
|
@@ -1695,7 +1744,7 @@ EOT
|
|
|
1695
1744
|
|
|
1696
1745
|
pattern(%w( _numberformat $STRING $STRING $STRING $STRING $INTEGER ),
|
|
1697
1746
|
lambda {
|
|
1698
|
-
@project['
|
|
1747
|
+
@project['numberFormat'] = RealFormat.new(@val.slice(1, 5))
|
|
1699
1748
|
})
|
|
1700
1749
|
doc('numberformat',
|
|
1701
1750
|
'These values specify the default format used for all numerical ' +
|
|
@@ -1708,7 +1757,7 @@ EOT
|
|
|
1708
1757
|
|
|
1709
1758
|
pattern(%w( !scenario ))
|
|
1710
1759
|
pattern(%w( _shorttimeformat $STRING ), lambda {
|
|
1711
|
-
@project['
|
|
1760
|
+
@project['shortTimeFormat'] = @val[1]
|
|
1712
1761
|
})
|
|
1713
1762
|
doc('shorttimeformat',
|
|
1714
1763
|
'Specifies time format for time short specifications. This is normal' +
|
|
@@ -1716,7 +1765,7 @@ EOT
|
|
|
1716
1765
|
arg(1, 'format', 'strftime like format string')
|
|
1717
1766
|
|
|
1718
1767
|
pattern(%w( !timeformat ), lambda {
|
|
1719
|
-
@project['
|
|
1768
|
+
@project['timeFormat'] = @val[0]
|
|
1720
1769
|
})
|
|
1721
1770
|
|
|
1722
1771
|
pattern(%w( !timezone ), lambda {
|
|
@@ -1729,6 +1778,11 @@ EOT
|
|
|
1729
1778
|
error('bad_timing_res',
|
|
1730
1779
|
"Timing resolution must be one of #{goodValues.join(', ')} min.")
|
|
1731
1780
|
end
|
|
1781
|
+
if @val[1] > (Project.maxScheduleGranularity / 60)
|
|
1782
|
+
error('too_large_timing_res',
|
|
1783
|
+
'The maximum allowed timing resolution for the timezone is ' +
|
|
1784
|
+
"#{Project.maxScheduleGranularity / 60} minutes.")
|
|
1785
|
+
end
|
|
1732
1786
|
@project['scheduleGranularity'] = @val[1] * 60
|
|
1733
1787
|
})
|
|
1734
1788
|
doc('timingresolution', <<'EOT'
|
|
@@ -1746,14 +1800,14 @@ EOT
|
|
|
1746
1800
|
)
|
|
1747
1801
|
|
|
1748
1802
|
pattern(%w( _weekstartsmonday ), lambda {
|
|
1749
|
-
@project['
|
|
1803
|
+
@project['weekStartsMonday'] = true
|
|
1750
1804
|
})
|
|
1751
1805
|
doc('weekstartsmonday',
|
|
1752
1806
|
'Specify that you want to base all week calculation on weeks ' +
|
|
1753
1807
|
'starting on Monday. This is common in many European countries.')
|
|
1754
1808
|
|
|
1755
1809
|
pattern(%w( _weekstartssunday ), lambda {
|
|
1756
|
-
@project['
|
|
1810
|
+
@project['weekStartsMonday'] = false
|
|
1757
1811
|
})
|
|
1758
1812
|
doc('weekstartssunday',
|
|
1759
1813
|
'Specify that you want to base all week calculation on weeks ' +
|
|
@@ -1792,18 +1846,17 @@ EOT
|
|
|
1792
1846
|
end
|
|
1793
1847
|
|
|
1794
1848
|
def rule_projectHeader
|
|
1795
|
-
pattern(%w( _project
|
|
1849
|
+
pattern(%w( _project !optionalID $STRING !optionalVersion !interval ), lambda {
|
|
1796
1850
|
@project = Project.new(@val[1], @val[2], @val[3],
|
|
1797
1851
|
@messageHandler)
|
|
1798
1852
|
@project['start'] = @val[4].start
|
|
1799
1853
|
@project['end'] = @val[4].end
|
|
1800
1854
|
setGlobalMacros
|
|
1801
1855
|
@property = nil
|
|
1856
|
+
@reportCounter = 0
|
|
1802
1857
|
@project
|
|
1803
1858
|
})
|
|
1804
|
-
arg(1, 'id', 'The ID of the project')
|
|
1805
1859
|
arg(2, 'name', 'The name of the project')
|
|
1806
|
-
arg(3, 'version', 'The version of the project plan')
|
|
1807
1860
|
end
|
|
1808
1861
|
|
|
1809
1862
|
def rule_projectIDs
|
|
@@ -1849,7 +1902,7 @@ EOT
|
|
|
1849
1902
|
# documentation.
|
|
1850
1903
|
pattern(%w( !projectPropertiesBody ))
|
|
1851
1904
|
doc('properties', <<'EOT'
|
|
1852
|
-
The project properties. Every project must consists of at least one task.
|
|
1905
|
+
The project properties. Every project must consists of at least one task. The other properties are optional. To save the scheduled data at least one output generating property should be used.
|
|
1853
1906
|
EOT
|
|
1854
1907
|
)
|
|
1855
1908
|
end
|
|
@@ -1915,6 +1968,8 @@ EOT
|
|
|
1915
1968
|
@project['revenueAccount'] = @val[0][1]
|
|
1916
1969
|
})
|
|
1917
1970
|
|
|
1971
|
+
pattern(%w( !export ))
|
|
1972
|
+
|
|
1918
1973
|
pattern(%w( _flags !declareFlagList ), lambda {
|
|
1919
1974
|
unless @project['flags'].include?(@val[1])
|
|
1920
1975
|
@project['flags'] += @val[1]
|
|
@@ -1939,6 +1994,8 @@ EOT
|
|
|
1939
1994
|
|
|
1940
1995
|
pattern(%w( !macro ))
|
|
1941
1996
|
|
|
1997
|
+
pattern(%w( !navigator ))
|
|
1998
|
+
|
|
1942
1999
|
pattern(%w( _projectid $ID ), lambda {
|
|
1943
2000
|
@project['projectids'] << @val[1]
|
|
1944
2001
|
@project['projectids'].uniq!
|
|
@@ -1969,7 +2026,7 @@ Set the default rate for all subsequently defined resources. The rate describes
|
|
|
1969
2026
|
EOT
|
|
1970
2027
|
)
|
|
1971
2028
|
|
|
1972
|
-
pattern(%w( !
|
|
2029
|
+
pattern(%w( !report ))
|
|
1973
2030
|
pattern(%w( !resource ))
|
|
1974
2031
|
pattern(%w( !shift ))
|
|
1975
2032
|
|
|
@@ -2065,195 +2122,62 @@ EOT
|
|
|
2065
2122
|
optionsRule('referenceAttributes')
|
|
2066
2123
|
end
|
|
2067
2124
|
|
|
2068
|
-
def
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
pattern(%w( !balance ), lambda {
|
|
2073
|
-
@reportElement.costAccount = @val[0][0]
|
|
2074
|
-
@reportElement.revenueAccount = @val[0][1]
|
|
2125
|
+
def rule_report
|
|
2126
|
+
pattern(%w( !reportHeader !reportBody ), lambda {
|
|
2127
|
+
@property = @property.parent
|
|
2075
2128
|
})
|
|
2129
|
+
doc('report', <<'EOT'
|
|
2130
|
+
Reports are used to store and vizualize the results of a scheduled project.
|
|
2131
|
+
The content, the output format and the appearance of a report can be adjusted
|
|
2132
|
+
with report attributes. Reports can be nested to create structured document
|
|
2133
|
+
trees. As with other properties, the resource attributes can be inherited from
|
|
2134
|
+
the enclosing report or the project.
|
|
2076
2135
|
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
})
|
|
2080
|
-
doc('caption', <<'EOT'
|
|
2081
|
-
The caption will be embedded in the footer of the table or data segment. The
|
|
2082
|
-
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2136
|
+
Reports have a local name space. All IDs must be unique within the reports
|
|
2137
|
+
that belong to the same enclosing report.
|
|
2083
2138
|
EOT
|
|
2084
2139
|
)
|
|
2085
|
-
|
|
2140
|
+
end
|
|
2086
2141
|
|
|
2087
|
-
pattern(%w( _columns !columnDef !moreColumnDef ), lambda {
|
|
2088
|
-
columns = [ @val[1] ]
|
|
2089
|
-
columns += @val[2] if @val[2]
|
|
2090
|
-
@reportElement.columns = columns
|
|
2091
|
-
})
|
|
2092
|
-
doc('columns', <<'EOT'
|
|
2093
|
-
Specifies which columns shall be included in a report.
|
|
2094
2142
|
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2143
|
+
def rule_reportableAttributes
|
|
2144
|
+
singlePattern('_chart')
|
|
2145
|
+
descr(<<'EOT'
|
|
2146
|
+
A Gantt chart. This column type requires all lines to have the same fixed
|
|
2147
|
+
height. This does not work well with rich text columns in some browsers. Some
|
|
2148
|
+
show a scrollbar for the compressed table cells, others don't. It is
|
|
2149
|
+
recommended, that you don't use rich text columns in conjuction with the chart
|
|
2150
|
+
column.
|
|
2101
2151
|
EOT
|
|
2102
|
-
|
|
2152
|
+
)
|
|
2103
2153
|
|
|
2104
|
-
|
|
2105
|
-
|
|
2154
|
+
singlePattern('_complete')
|
|
2155
|
+
descr('The completion degree of a task')
|
|
2156
|
+
|
|
2157
|
+
pattern([ '_completed' ], lambda {
|
|
2158
|
+
'complete'
|
|
2106
2159
|
})
|
|
2107
|
-
|
|
2108
|
-
Define a text section that is printed right after the actual report data. The
|
|
2109
|
-
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2110
|
-
EOT
|
|
2111
|
-
)
|
|
2160
|
+
descr('Deprecated alias for complete')
|
|
2112
2161
|
|
|
2113
|
-
|
|
2162
|
+
singlePattern('_criticalness')
|
|
2163
|
+
descr('A measure for how much effort the resource is allocated for, or' +
|
|
2164
|
+
'how strained the allocated resources of a task are')
|
|
2114
2165
|
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
Specifies the headline for a report.
|
|
2166
|
+
singlePattern('_cost')
|
|
2167
|
+
descr(<<'EOT'
|
|
2168
|
+
The cost of the task or resource. The use of this column requires that a cost
|
|
2169
|
+
account has been set for the report using the [[balance]] attribute.
|
|
2120
2170
|
EOT
|
|
2121
|
-
|
|
2171
|
+
)
|
|
2122
2172
|
|
|
2123
|
-
|
|
2173
|
+
singlePattern('_daily')
|
|
2174
|
+
descr('A group of columns with one column for each day')
|
|
2124
2175
|
|
|
2125
|
-
|
|
2176
|
+
singlePattern('_depends')
|
|
2177
|
+
descr('A comma separated list of tasks that have to precede this task.')
|
|
2126
2178
|
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
})
|
|
2130
|
-
doc('loadunit', <<'EOT'
|
|
2131
|
-
Determines what unit should be used to display all load values in this report.
|
|
2132
|
-
EOT
|
|
2133
|
-
)
|
|
2134
|
-
|
|
2135
|
-
pattern(%w( _prolog $STRING ), lambda {
|
|
2136
|
-
@reportElement.prolog = newRichText(@val[1])
|
|
2137
|
-
})
|
|
2138
|
-
doc('prolog', <<'EOT'
|
|
2139
|
-
Define a text section that is printed right before the actual report data. The
|
|
2140
|
-
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2141
|
-
EOT
|
|
2142
|
-
)
|
|
2143
|
-
|
|
2144
|
-
pattern(%w( _rawhead $STRING ), lambda {
|
|
2145
|
-
@reportElement.rawHead = @val[1]
|
|
2146
|
-
})
|
|
2147
|
-
doc('rawhead', <<'EOT'
|
|
2148
|
-
Specifies a section of raw HTML code that will be inserted at the top of the
|
|
2149
|
-
report.
|
|
2150
|
-
EOT
|
|
2151
|
-
)
|
|
2152
|
-
|
|
2153
|
-
pattern(%w( _rawtail $STRING ), lambda {
|
|
2154
|
-
@reportElement.rawTail = @val[1]
|
|
2155
|
-
})
|
|
2156
|
-
doc('rawtail', <<'EOT'
|
|
2157
|
-
Specifies a section of raw HTML code that will be inserted at the bottom of
|
|
2158
|
-
the report.
|
|
2159
|
-
EOT
|
|
2160
|
-
)
|
|
2161
|
-
|
|
2162
|
-
pattern(%w( !reportPeriod ))
|
|
2163
|
-
|
|
2164
|
-
pattern(%w( _rolluptask !logicalExpression ), lambda {
|
|
2165
|
-
@reportElement.rollupTask = @val[1]
|
|
2166
|
-
})
|
|
2167
|
-
doc('rolluptask', <<'EOT'
|
|
2168
|
-
Do not show sub-tasks of tasks that match the specified logical expression.
|
|
2169
|
-
EOT
|
|
2170
|
-
)
|
|
2171
|
-
|
|
2172
|
-
pattern(%w( _scenarios !scenarioIdList ), lambda {
|
|
2173
|
-
# Don't include disabled scenarios in the report
|
|
2174
|
-
@val[1].delete_if { |sc| !@project.scenario(sc).get('enabled') }
|
|
2175
|
-
@reportElement.scenarios = @val[1]
|
|
2176
|
-
})
|
|
2177
|
-
doc('scenrios', <<'EOT'
|
|
2178
|
-
List of scenarios that should be included in the report.
|
|
2179
|
-
EOT
|
|
2180
|
-
)
|
|
2181
|
-
|
|
2182
|
-
pattern(%w( _sortresources !sortCriteria ), lambda {
|
|
2183
|
-
@reportElement.sortResources = @val[1]
|
|
2184
|
-
})
|
|
2185
|
-
doc('sortresources', <<'EOT'
|
|
2186
|
-
Determines how the resources are sorted in the report. Multiple criteria can be
|
|
2187
|
-
specified as a comma separated list. If one criteria is not sufficient to sort
|
|
2188
|
-
a group of resources, the next criteria will be used to sort the resources in
|
|
2189
|
-
this group.
|
|
2190
|
-
EOT
|
|
2191
|
-
)
|
|
2192
|
-
|
|
2193
|
-
pattern(%w( _sorttasks !sortCriteria ), lambda {
|
|
2194
|
-
@reportElement.sortTasks = @val[1]
|
|
2195
|
-
})
|
|
2196
|
-
doc('sorttasks', <<'EOT'
|
|
2197
|
-
Determines how the tasks are sorted in the report. Multiple criteria can be
|
|
2198
|
-
specified as comma separated list. If one criteria is not sufficient to sort a
|
|
2199
|
-
group of tasks, the next criteria will be used to sort the tasks within
|
|
2200
|
-
this group.
|
|
2201
|
-
EOT
|
|
2202
|
-
)
|
|
2203
|
-
|
|
2204
|
-
pattern(%w( !reportStart ))
|
|
2205
|
-
|
|
2206
|
-
pattern(%w( _taskroot !taskId), lambda {
|
|
2207
|
-
@reportElement.taskRoot = @val[1]
|
|
2208
|
-
})
|
|
2209
|
-
doc('taskroot', <<'EOT'
|
|
2210
|
-
Only tasks below the specified root-level tasks are exported. The exported
|
|
2211
|
-
tasks will have the id of the root-level task stripped from their ID, so that
|
|
2212
|
-
the sub-tasks of the root-level task become top-level tasks in the exported
|
|
2213
|
-
file.
|
|
2214
|
-
EOT
|
|
2215
|
-
)
|
|
2216
|
-
|
|
2217
|
-
pattern(%w( !timeformat ), lambda {
|
|
2218
|
-
@reportElement.timeFormat = @val[0]
|
|
2219
|
-
})
|
|
2220
|
-
end
|
|
2221
|
-
|
|
2222
|
-
def rule_reportableAttributes
|
|
2223
|
-
singlePattern('_chart')
|
|
2224
|
-
descr(<<'EOT'
|
|
2225
|
-
A Gantt chart. This column type requires all lines to have the same fixed
|
|
2226
|
-
height. This does not work well with rich text columns in some browsers. Some
|
|
2227
|
-
show a scrollbar for the compressed table cells, others don't. It is
|
|
2228
|
-
recommended, that you don't use rich text columns in conjuction with the chart
|
|
2229
|
-
column.
|
|
2230
|
-
EOT
|
|
2231
|
-
)
|
|
2232
|
-
|
|
2233
|
-
singlePattern('_complete')
|
|
2234
|
-
descr('The completion degree of a task')
|
|
2235
|
-
|
|
2236
|
-
pattern([ '_completed' ], lambda {
|
|
2237
|
-
'complete'
|
|
2238
|
-
})
|
|
2239
|
-
descr('Deprecated alias for complete')
|
|
2240
|
-
|
|
2241
|
-
singlePattern('_criticalness')
|
|
2242
|
-
descr('A measure for how much effort the resource is allocated for, or' +
|
|
2243
|
-
'how strained the allocated resources of a task are')
|
|
2244
|
-
|
|
2245
|
-
singlePattern('_cost')
|
|
2246
|
-
descr(<<'EOT'
|
|
2247
|
-
The cost of the task or resource. The use of this column requires that a cost
|
|
2248
|
-
account has been set for the report using the [[balance]] attribute.
|
|
2249
|
-
EOT
|
|
2250
|
-
)
|
|
2251
|
-
|
|
2252
|
-
singlePattern('_daily')
|
|
2253
|
-
descr('A group of columns with one column for each day')
|
|
2254
|
-
|
|
2255
|
-
singlePattern('_duration')
|
|
2256
|
-
descr('The duration of a task')
|
|
2179
|
+
singlePattern('_duration')
|
|
2180
|
+
descr('The duration of a task')
|
|
2257
2181
|
|
|
2258
2182
|
singlePattern('_duties')
|
|
2259
2183
|
descr('List of tasks that the resource is allocated to')
|
|
@@ -2312,7 +2236,7 @@ EOT
|
|
|
2312
2236
|
descr('A group of columns with one column for each month')
|
|
2313
2237
|
|
|
2314
2238
|
singlePattern('_no')
|
|
2315
|
-
descr('The object line number in the report')
|
|
2239
|
+
descr('The object line number in the report (Cannot be used for sorting!)')
|
|
2316
2240
|
|
|
2317
2241
|
singlePattern('_name')
|
|
2318
2242
|
descr('The name or description of the item')
|
|
@@ -2324,6 +2248,9 @@ EOT
|
|
|
2324
2248
|
descr('The criticalness of the task with respect to all the paths that ' +
|
|
2325
2249
|
'it is a part of.')
|
|
2326
2250
|
|
|
2251
|
+
singlePattern('_precedes')
|
|
2252
|
+
descr('A comma separated list of tasks that have to follow this task.')
|
|
2253
|
+
|
|
2327
2254
|
singlePattern('_priority')
|
|
2328
2255
|
descr('The priority of a task')
|
|
2329
2256
|
|
|
@@ -2333,6 +2260,10 @@ EOT
|
|
|
2333
2260
|
singlePattern('_rate')
|
|
2334
2261
|
descr('The daily cost of a resource.')
|
|
2335
2262
|
|
|
2263
|
+
singlePattern('_resources')
|
|
2264
|
+
descr('A list of resources that are assigned to the task in the report ' +
|
|
2265
|
+
'time frame.')
|
|
2266
|
+
|
|
2336
2267
|
singlePattern('_responsible')
|
|
2337
2268
|
descr('The responsible people for this task')
|
|
2338
2269
|
|
|
@@ -2343,6 +2274,9 @@ revenue account has been set for the report using the [[balance]] attribute.
|
|
|
2343
2274
|
EOT
|
|
2344
2275
|
)
|
|
2345
2276
|
|
|
2277
|
+
singlePattern('_scenario')
|
|
2278
|
+
descr('The name of the scenario')
|
|
2279
|
+
|
|
2346
2280
|
singlePattern('_seqno')
|
|
2347
2281
|
descr('The index of the item based on the declaration order')
|
|
2348
2282
|
|
|
@@ -2360,33 +2294,228 @@ EOT
|
|
|
2360
2294
|
|
|
2361
2295
|
end
|
|
2362
2296
|
|
|
2363
|
-
def
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
pattern(%w( !export ))
|
|
2367
|
-
pattern(%w( !htmlResourceReport ))
|
|
2368
|
-
pattern(%w( !htmlTaskReport ))
|
|
2369
|
-
pattern(%w( !resourceReport ))
|
|
2370
|
-
pattern(%w( !taskReport ))
|
|
2371
|
-
end
|
|
2297
|
+
def rule_reportAttributes
|
|
2298
|
+
optional
|
|
2299
|
+
repeatable
|
|
2372
2300
|
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
end
|
|
2301
|
+
pattern(%w( !balance ), lambda {
|
|
2302
|
+
@property.set('costAccount', @val[0][0])
|
|
2303
|
+
@property.set('revenueAccount', @val[0][1])
|
|
2304
|
+
})
|
|
2378
2305
|
|
|
2379
|
-
|
|
2380
|
-
|
|
2306
|
+
pattern(%w( _caption $STRING ), lambda {
|
|
2307
|
+
@property.set('caption', newRichText(@val[1]))
|
|
2308
|
+
})
|
|
2309
|
+
doc('caption', <<'EOT'
|
|
2310
|
+
The caption will be embedded in the footer of the table or data segment. The
|
|
2311
|
+
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2312
|
+
EOT
|
|
2313
|
+
)
|
|
2314
|
+
arg(1, 'text', 'The caption text.')
|
|
2315
|
+
example('Caption', '1')
|
|
2316
|
+
|
|
2317
|
+
pattern(%w( _center $STRING ), lambda {
|
|
2318
|
+
@property.set('center', newRichText(@val[1]))
|
|
2319
|
+
})
|
|
2320
|
+
doc('center', <<'EOT'
|
|
2321
|
+
This attribute defines the center section of the [[textreport]]. The text will
|
|
2322
|
+
be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2323
|
+
EOT
|
|
2324
|
+
)
|
|
2325
|
+
arg(1, 'text', 'The text')
|
|
2326
|
+
|
|
2327
|
+
pattern(%w( _columns !columnDef !moreColumnDef ), lambda {
|
|
2328
|
+
columns = [ @val[1] ]
|
|
2329
|
+
columns += @val[2] if @val[2]
|
|
2330
|
+
@property.set('columns', columns)
|
|
2331
|
+
})
|
|
2332
|
+
doc('columns', <<'EOT'
|
|
2333
|
+
Specifies which columns shall be included in a report.
|
|
2334
|
+
|
|
2335
|
+
All columns support macro expansion. Contrary to the normal macro expansion,
|
|
2336
|
+
these macros are expanded during the report generation. So the value of the
|
|
2337
|
+
macro is being changed after each table cell or table line. Consequently only
|
|
2338
|
+
build in macros can be used. To protect the macro calls against expansion
|
|
2339
|
+
during the initial file processing, the report macros must be prefixed with an
|
|
2340
|
+
additional ''''$''''.
|
|
2341
|
+
EOT
|
|
2342
|
+
)
|
|
2343
|
+
|
|
2344
|
+
pattern(%w( !reportEnd ))
|
|
2345
|
+
|
|
2346
|
+
pattern(%w( _epilog $STRING ), lambda {
|
|
2347
|
+
@property.set('epilog', newRichText(@val[1]))
|
|
2348
|
+
})
|
|
2349
|
+
doc('epilog', <<'EOT'
|
|
2350
|
+
Define a text section that is printed right after the actual report data. The
|
|
2351
|
+
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2352
|
+
EOT
|
|
2353
|
+
)
|
|
2354
|
+
also(%w( footer header prolog ))
|
|
2355
|
+
|
|
2356
|
+
pattern(%w( _footer $STRING ), lambda {
|
|
2357
|
+
@property.set('footer', newRichText(@val[1]))
|
|
2358
|
+
})
|
|
2359
|
+
doc('footer', <<'EOT'
|
|
2360
|
+
Define a text section that is put at the bottom of the report. The
|
|
2361
|
+
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2362
|
+
EOT
|
|
2363
|
+
)
|
|
2364
|
+
also(%w( epilog header prolog ))
|
|
2365
|
+
|
|
2366
|
+
pattern(%w( _formats !outputFormats ), lambda {
|
|
2367
|
+
@property.set('formats', @val[1])
|
|
2368
|
+
})
|
|
2369
|
+
doc('formats', <<'EOT'
|
|
2370
|
+
EOT
|
|
2371
|
+
)
|
|
2372
|
+
|
|
2373
|
+
pattern(%w( _header $STRING ), lambda {
|
|
2374
|
+
@property.set('header', newRichText(@val[1]))
|
|
2375
|
+
})
|
|
2376
|
+
doc('header', <<'EOT'
|
|
2377
|
+
Define a text section that is put at the top of the report. The
|
|
2378
|
+
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2379
|
+
EOT
|
|
2380
|
+
)
|
|
2381
|
+
also(%w( epilog footer prolog ))
|
|
2382
|
+
|
|
2383
|
+
pattern(%w( _headline $STRING ), lambda {
|
|
2384
|
+
@property.set('headline', @val[1])
|
|
2385
|
+
})
|
|
2386
|
+
doc('headline', <<'EOT'
|
|
2387
|
+
Specifies the headline for a report.
|
|
2388
|
+
EOT
|
|
2389
|
+
)
|
|
2390
|
+
|
|
2391
|
+
pattern(%w( !hideresource ))
|
|
2392
|
+
|
|
2393
|
+
pattern(%w( !hidetask ))
|
|
2394
|
+
|
|
2395
|
+
pattern(%w( _left $STRING ), lambda {
|
|
2396
|
+
@property.set('left', newRichText(@val[1]))
|
|
2397
|
+
})
|
|
2398
|
+
doc('left', <<'EOT'
|
|
2399
|
+
This attribute defines the left margin section of the [[textreport]]. The text
|
|
2400
|
+
will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
|
|
2401
|
+
span the [[header]] or [[footer]] sections.
|
|
2402
|
+
EOT
|
|
2403
|
+
)
|
|
2404
|
+
|
|
2405
|
+
pattern(%w( _loadunit !loadunit ), lambda {
|
|
2406
|
+
@property.set('loadUnit', "#{@val[1]}")
|
|
2407
|
+
})
|
|
2408
|
+
doc('loadunit', <<'EOT'
|
|
2409
|
+
Determines what unit should be used to display all load values in this report.
|
|
2410
|
+
EOT
|
|
2411
|
+
)
|
|
2412
|
+
|
|
2413
|
+
pattern(%w( _prolog $STRING ), lambda {
|
|
2414
|
+
@property.set('prolog', newRichText(@val[1]))
|
|
2415
|
+
})
|
|
2416
|
+
doc('prolog', <<'EOT'
|
|
2417
|
+
Define a text section that is printed right before the actual report data. The
|
|
2418
|
+
text will be interpreted as [[Rich_Text_Attributes Rich Text]].
|
|
2419
|
+
EOT
|
|
2420
|
+
)
|
|
2421
|
+
also(%w( epilog footer header ))
|
|
2422
|
+
|
|
2423
|
+
pattern(%w( _rawhead $STRING ), lambda {
|
|
2424
|
+
@property.set('rawHead', @val[1])
|
|
2425
|
+
})
|
|
2426
|
+
doc('rawhead', <<'EOT'
|
|
2427
|
+
Specifies a section of raw HTML code that will be inserted at the top of the
|
|
2428
|
+
report.
|
|
2429
|
+
EOT
|
|
2430
|
+
)
|
|
2431
|
+
|
|
2432
|
+
pattern(%w( _rawtail $STRING ), lambda {
|
|
2433
|
+
@property.set('rawTail', @val[1])
|
|
2434
|
+
})
|
|
2435
|
+
doc('rawtail', <<'EOT'
|
|
2436
|
+
Specifies a section of raw HTML code that will be inserted at the bottom of
|
|
2437
|
+
the report.
|
|
2438
|
+
EOT
|
|
2439
|
+
)
|
|
2440
|
+
|
|
2441
|
+
pattern(%w( !report ))
|
|
2442
|
+
pattern(%w( !reportPeriod ))
|
|
2443
|
+
|
|
2444
|
+
pattern(%w( _right $STRING ), lambda {
|
|
2445
|
+
@property.set('right', newRichText(@val[1]))
|
|
2446
|
+
})
|
|
2447
|
+
doc('right', <<'EOT'
|
|
2448
|
+
This attribute defines the right margin section of the [[textreport]]. The text
|
|
2449
|
+
will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
|
|
2450
|
+
span the [[header]] or [[footer]] sections.
|
|
2451
|
+
EOT
|
|
2452
|
+
)
|
|
2453
|
+
|
|
2454
|
+
pattern(%w( _rolluptask !logicalExpression ), lambda {
|
|
2455
|
+
@property.set('rollupTask', @val[1])
|
|
2456
|
+
})
|
|
2457
|
+
doc('rolluptask', <<'EOT'
|
|
2458
|
+
Do not show sub-tasks of tasks that match the specified logical expression.
|
|
2459
|
+
EOT
|
|
2460
|
+
)
|
|
2461
|
+
|
|
2462
|
+
pattern(%w( _scenarios !scenarioIdList ), lambda {
|
|
2463
|
+
# Don't include disabled scenarios in the report
|
|
2464
|
+
@val[1].delete_if { |sc| !@project.scenario(sc).get('enabled') }
|
|
2465
|
+
@property.set('scenarios', @val[1])
|
|
2466
|
+
})
|
|
2467
|
+
doc('scenarios', <<'EOT'
|
|
2468
|
+
List of scenarios that should be included in the report.
|
|
2469
|
+
EOT
|
|
2470
|
+
)
|
|
2471
|
+
|
|
2472
|
+
pattern(%w( _sortresources !sortCriteria ), lambda {
|
|
2473
|
+
@property.set('sortResources', @val[1])
|
|
2474
|
+
})
|
|
2475
|
+
doc('sortresources', <<'EOT'
|
|
2476
|
+
Determines how the resources are sorted in the report. Multiple criteria can be
|
|
2477
|
+
specified as a comma separated list. If one criteria is not sufficient to sort
|
|
2478
|
+
a group of resources, the next criteria will be used to sort the resources in
|
|
2479
|
+
this group.
|
|
2480
|
+
EOT
|
|
2481
|
+
)
|
|
2482
|
+
|
|
2483
|
+
pattern(%w( _sorttasks !sortCriteria ), lambda {
|
|
2484
|
+
@property.set('sortTasks', @val[1])
|
|
2485
|
+
})
|
|
2486
|
+
doc('sorttasks', <<'EOT'
|
|
2487
|
+
Determines how the tasks are sorted in the report. Multiple criteria can be
|
|
2488
|
+
specified as comma separated list. If one criteria is not sufficient to sort a
|
|
2489
|
+
group of tasks, the next criteria will be used to sort the tasks within
|
|
2490
|
+
this group.
|
|
2491
|
+
EOT
|
|
2492
|
+
)
|
|
2493
|
+
|
|
2494
|
+
pattern(%w( !reportStart ))
|
|
2495
|
+
|
|
2496
|
+
pattern(%w( _taskroot !taskId), lambda {
|
|
2497
|
+
@property.set('taskRoot', @val[1])
|
|
2498
|
+
})
|
|
2499
|
+
doc('taskroot', <<'EOT'
|
|
2500
|
+
Only tasks below the specified root-level tasks are exported. The exported
|
|
2501
|
+
tasks will have the id of the root-level task stripped from their ID, so that
|
|
2502
|
+
the sub-tasks of the root-level task become top-level tasks in the exported
|
|
2503
|
+
file.
|
|
2504
|
+
EOT
|
|
2505
|
+
)
|
|
2506
|
+
|
|
2507
|
+
pattern(%w( !timeformat ), lambda {
|
|
2508
|
+
@property.set('timeFormat', @val[0])
|
|
2509
|
+
})
|
|
2381
2510
|
end
|
|
2382
2511
|
|
|
2383
2512
|
def rule_reportEnd
|
|
2384
2513
|
pattern(%w( _end !date ), lambda {
|
|
2385
|
-
if @val[1] < @
|
|
2514
|
+
if @val[1] < @property.get('start')
|
|
2386
2515
|
error('report_end',
|
|
2387
|
-
"End date must be before start date #{@
|
|
2516
|
+
"End date must be before start date #{@property.get('start')}")
|
|
2388
2517
|
end
|
|
2389
|
-
@
|
|
2518
|
+
@property.set('end', @val[1])
|
|
2390
2519
|
})
|
|
2391
2520
|
doc('end.report', <<'EOT'
|
|
2392
2521
|
Specifies the end date of the report. In task reports only tasks that start
|
|
@@ -2398,8 +2527,8 @@ EOT
|
|
|
2398
2527
|
|
|
2399
2528
|
def rule_reportPeriod
|
|
2400
2529
|
pattern(%w( _period !interval ), lambda {
|
|
2401
|
-
@
|
|
2402
|
-
@
|
|
2530
|
+
@property.set('start', @val[1].start)
|
|
2531
|
+
@property.set('end', @val[1].end)
|
|
2403
2532
|
})
|
|
2404
2533
|
doc('period.report', <<'EOT'
|
|
2405
2534
|
This property is a shortcut for setting the start and end property at the
|
|
@@ -2410,11 +2539,11 @@ EOT
|
|
|
2410
2539
|
|
|
2411
2540
|
def rule_reportStart
|
|
2412
2541
|
pattern(%w( _start !date ), lambda {
|
|
2413
|
-
if @val[1] > @
|
|
2542
|
+
if @val[1] > @property.get('end')
|
|
2414
2543
|
error('report_start',
|
|
2415
|
-
"Start date must be before end date #{@
|
|
2544
|
+
"Start date must be before end date #{@property.get('end')}")
|
|
2416
2545
|
end
|
|
2417
|
-
@
|
|
2546
|
+
@property.set('start', @val[1])
|
|
2418
2547
|
})
|
|
2419
2548
|
doc('start.report', <<'EOT'
|
|
2420
2549
|
Specifies the start date of the report. In task reports only tasks that end
|
|
@@ -2422,25 +2551,106 @@ after this end date are listed.
|
|
|
2422
2551
|
EOT
|
|
2423
2552
|
)
|
|
2424
2553
|
end
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2554
|
+
|
|
2555
|
+
def rule_reportBody
|
|
2556
|
+
optionsRule('reportAttributes')
|
|
2557
|
+
end
|
|
2558
|
+
|
|
2559
|
+
def rule_reportHeader
|
|
2560
|
+
pattern(%w( !reportType !optionalID $STRING ), lambda {
|
|
2561
|
+
if @property.nil? && !@reportprefix.empty?
|
|
2562
|
+
@property = @project.report(@reportprefix)
|
|
2563
|
+
end
|
|
2564
|
+
if @val[1]
|
|
2565
|
+
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
|
2566
|
+
if @project.report(id)
|
|
2567
|
+
error('report_exists', "report #{id} has already been defined.")
|
|
2568
|
+
end
|
|
2569
|
+
end
|
|
2570
|
+
@property = Report.new(@project, @val[1], @val[2], @property)
|
|
2571
|
+
@property.sourceFileInfo = @scanner.sourceFileInfo
|
|
2572
|
+
@property.inheritAttributes
|
|
2573
|
+
case @val[0]
|
|
2574
|
+
when 'taskreport'
|
|
2575
|
+
@property.typeSpec = :taskreport
|
|
2576
|
+
# Set the default columns for this report.
|
|
2577
|
+
%w( wbs name start end effort chart ).each do |col|
|
|
2578
|
+
@property.get('columns') <<
|
|
2579
|
+
TableColumnDefinition.new(col, columnTitle(col))
|
|
2580
|
+
end
|
|
2581
|
+
# Show all tasks, sorted by tree, start-up, seqno-up.
|
|
2582
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
|
2583
|
+
@property.set('sortTasks',
|
|
2584
|
+
[ [ 'tree', true, -1 ],
|
|
2585
|
+
[ 'start', true, 0 ],
|
|
2586
|
+
[ 'seqno', true, -1 ] ])
|
|
2587
|
+
# Show no resources, but set sorting to id-up.
|
|
2588
|
+
@property.set('hideResource',
|
|
2589
|
+
LogicalExpression.new(LogicalOperation.new(1)))
|
|
2590
|
+
@property.set('sortResources', [ [ 'id', true, -1 ] ])
|
|
2591
|
+
when 'resourcereport'
|
|
2592
|
+
@property.typeSpec = :resourcereport
|
|
2593
|
+
# Set the default columns for this report.
|
|
2594
|
+
%w( no name ).each do |col|
|
|
2595
|
+
@property.get('columns') <<
|
|
2596
|
+
TableColumnDefinition.new(col, columnTitle(col))
|
|
2597
|
+
end
|
|
2598
|
+
# Show all resources, sorted by tree and id-up.
|
|
2599
|
+
@property.set('hideResource',
|
|
2600
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
|
2601
|
+
@property.set('sortResources', [ [ 'tree', true, -1 ],
|
|
2602
|
+
[ 'id', true, -1 ] ])
|
|
2603
|
+
# Hide all resources, but set sorting to tree, start-up, seqno-up.
|
|
2604
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(1)))
|
|
2605
|
+
@property.set('sortTasks',
|
|
2606
|
+
[ [ 'tree', true, -1 ],
|
|
2607
|
+
[ 'start', true, 0 ],
|
|
2608
|
+
[ 'seqno', true, -1 ] ])
|
|
2609
|
+
when 'textreport'
|
|
2610
|
+
@property.typeSpec = :textreport
|
|
2611
|
+
else
|
|
2612
|
+
raise "Unsupported report type #{@val[0]}"
|
|
2613
|
+
end
|
|
2614
|
+
})
|
|
2615
|
+
arg(2, 'name', <<'EOT'
|
|
2616
|
+
The name of the report. This will be the base name for generated output files.
|
|
2617
|
+
The suffix will depend on the specified [[formats]].It will also be used in
|
|
2618
|
+
navigation bars.
|
|
2432
2619
|
EOT
|
|
2433
2620
|
)
|
|
2434
2621
|
end
|
|
2435
2622
|
|
|
2623
|
+
def rule_reportType
|
|
2624
|
+
singlePattern('_resourcereport')
|
|
2625
|
+
doc('resourcereport', <<'EOT'
|
|
2626
|
+
The report lists resources and their respective values in a table. The task
|
|
2627
|
+
that are the resources are allocated to can be listed as well.
|
|
2628
|
+
EOT
|
|
2629
|
+
)
|
|
2630
|
+
singlePattern('_taskreport')
|
|
2631
|
+
doc('taskreport', <<'EOT'
|
|
2632
|
+
The report lists tasks and their respective values in a table. The
|
|
2633
|
+
resources that are allocated to each task can be listed as well.
|
|
2634
|
+
EOT
|
|
2635
|
+
)
|
|
2636
|
+
singlePattern('_textreport')
|
|
2637
|
+
doc('textreport', <<'EOT'
|
|
2638
|
+
This report consists of 5 RichText sections, a header, a center section with a left and right margin and a footer. The sections may contain the output of other defined reports.
|
|
2639
|
+
EOT
|
|
2640
|
+
)
|
|
2641
|
+
end
|
|
2436
2642
|
|
|
2437
2643
|
def rule_resource
|
|
2438
2644
|
pattern(%w( !resourceHeader !resourceBody ), lambda {
|
|
2439
2645
|
@property = @property.parent
|
|
2440
2646
|
})
|
|
2441
2647
|
doc('resource', <<'EOT'
|
|
2442
|
-
Tasks that have an effort specification need to have
|
|
2443
|
-
the work. Use this property to define resources
|
|
2648
|
+
Tasks that have an effort specification need to have at least one resource
|
|
2649
|
+
assigned to do the work. Use this property to define resources or groups of
|
|
2650
|
+
resources.
|
|
2651
|
+
|
|
2652
|
+
Resources have a global name space. All IDs must be unique within the resources
|
|
2653
|
+
of the project.
|
|
2444
2654
|
EOT
|
|
2445
2655
|
)
|
|
2446
2656
|
end
|
|
@@ -2448,6 +2658,7 @@ EOT
|
|
|
2448
2658
|
def rule_resourceAttributes
|
|
2449
2659
|
repeatable
|
|
2450
2660
|
optional
|
|
2661
|
+
pattern(%w( !journalEntry ))
|
|
2451
2662
|
pattern(%w( !purge ))
|
|
2452
2663
|
pattern(%w( !resource ))
|
|
2453
2664
|
pattern(%w( !resourceScenarioAttributes ))
|
|
@@ -2507,11 +2718,11 @@ EOT
|
|
|
2507
2718
|
end
|
|
2508
2719
|
|
|
2509
2720
|
def rule_resourceHeader
|
|
2510
|
-
pattern(%w( _resource
|
|
2721
|
+
pattern(%w( _resource !optionalID $STRING ), lambda {
|
|
2511
2722
|
if @property.nil? && !@resourceprefix.empty?
|
|
2512
|
-
@property = @project.
|
|
2723
|
+
@property = @project.resource(@resourceprefix)
|
|
2513
2724
|
end
|
|
2514
|
-
if @project.resource(@val[1])
|
|
2725
|
+
if @val[1] && @project.resource(@val[1])
|
|
2515
2726
|
error('resource_exists', "Resource #{@val[1]} has already been defined.")
|
|
2516
2727
|
end
|
|
2517
2728
|
@property = Resource.new(@project, @val[1], @val[2], @property)
|
|
@@ -2519,11 +2730,11 @@ EOT
|
|
|
2519
2730
|
@property.inheritAttributes
|
|
2520
2731
|
@scenarioIdx = 0
|
|
2521
2732
|
})
|
|
2522
|
-
arg(1, 'id', <<'EOT'
|
|
2523
|
-
The ID of the resource. Resources have a global name space. The ID must be
|
|
2524
|
-
unique within the whole project.
|
|
2525
|
-
EOT
|
|
2526
|
-
)
|
|
2733
|
+
# arg(1, 'id', <<'EOT'
|
|
2734
|
+
#The ID of the resource. Resources have a global name space. The ID must be
|
|
2735
|
+
#unique within the whole project.
|
|
2736
|
+
#EOT
|
|
2737
|
+
# )
|
|
2527
2738
|
arg(2, 'name', 'The name of the resource')
|
|
2528
2739
|
end
|
|
2529
2740
|
|
|
@@ -2539,26 +2750,6 @@ EOT
|
|
|
2539
2750
|
})
|
|
2540
2751
|
end
|
|
2541
2752
|
|
|
2542
|
-
def rule_resourceReport
|
|
2543
|
-
pattern(%w( !resourceReportHeader !reportBody ))
|
|
2544
|
-
doc('resourcereport', <<'EOT'
|
|
2545
|
-
The report lists all resources and their respective values in the GUI. The
|
|
2546
|
-
task that are the resources are allocated to can be listed as well. In the commandline version this report is ignored.
|
|
2547
|
-
EOT
|
|
2548
|
-
)
|
|
2549
|
-
end
|
|
2550
|
-
|
|
2551
|
-
def rule_resourceReportHeader
|
|
2552
|
-
pattern(%w( _resourcereport $STRING ), lambda {
|
|
2553
|
-
@report = Report.new(@project, @val[1], :gui, sourceFileInfo)
|
|
2554
|
-
@reportElement = ResourceListRE.new(@report)
|
|
2555
|
-
})
|
|
2556
|
-
arg(1, 'file name', <<'EOT'
|
|
2557
|
-
The name of the report.
|
|
2558
|
-
EOT
|
|
2559
|
-
)
|
|
2560
|
-
end
|
|
2561
|
-
|
|
2562
2753
|
def rule_resourceScenarioAttributes
|
|
2563
2754
|
pattern(%w( _efficiency !number ), lambda {
|
|
2564
2755
|
@property['efficiency', @scenarioIdx] = @val[1]
|
|
@@ -2779,7 +2970,12 @@ EOT
|
|
|
2779
2970
|
@property = @property.parent
|
|
2780
2971
|
})
|
|
2781
2972
|
doc('shift', <<'EOT'
|
|
2782
|
-
A shift combines several workhours related settings in a reusable entity.
|
|
2973
|
+
A shift combines several workhours related settings in a reusable entity.
|
|
2974
|
+
Besides the weekly working hours it can also hold information such as
|
|
2975
|
+
vacations and a time zone.
|
|
2976
|
+
|
|
2977
|
+
Shifts have a global name space. All IDs must be unique within the shifts of
|
|
2978
|
+
the project.
|
|
2783
2979
|
EOT
|
|
2784
2980
|
)
|
|
2785
2981
|
end
|
|
@@ -2830,8 +3026,8 @@ EOT
|
|
|
2830
3026
|
end
|
|
2831
3027
|
|
|
2832
3028
|
def rule_shiftHeader
|
|
2833
|
-
pattern(%w( _shift
|
|
2834
|
-
if @project.shift(@val[1])
|
|
3029
|
+
pattern(%w( _shift !optionalID $STRING ), lambda {
|
|
3030
|
+
if @val[1] && @project.shift(@val[1])
|
|
2835
3031
|
error('shift_exists', "Shift #{@val[1]} has already been defined.")
|
|
2836
3032
|
end
|
|
2837
3033
|
@property = Shift.new(@project, @val[1], @val[2], @property)
|
|
@@ -2839,7 +3035,6 @@ EOT
|
|
|
2839
3035
|
@property.inheritAttributes
|
|
2840
3036
|
@scenarioIdx = 0
|
|
2841
3037
|
})
|
|
2842
|
-
arg(1, 'id', 'The ID of the shift')
|
|
2843
3038
|
arg(2, 'name', 'The name of the shift')
|
|
2844
3039
|
end
|
|
2845
3040
|
|
|
@@ -2862,17 +3057,20 @@ Use this attribute if the vacation definition for the shift should replace the v
|
|
|
2862
3057
|
EOT
|
|
2863
3058
|
)
|
|
2864
3059
|
|
|
2865
|
-
pattern(%w( _timezone
|
|
3060
|
+
pattern(%w( _timezone !validTimeZone ), lambda {
|
|
2866
3061
|
@property['timezone', @scenarioIdx] = @val[1]
|
|
2867
3062
|
})
|
|
2868
3063
|
doc('timezone.shift', <<'EOT'
|
|
2869
|
-
Sets the
|
|
3064
|
+
Sets the time zone of the shift. The working hours of the shift are assumed to
|
|
3065
|
+
be within the specified time zone. The time zone does not effect the vaction
|
|
3066
|
+
interval. The latter is assumed to be within the project time zone.
|
|
2870
3067
|
EOT
|
|
2871
3068
|
)
|
|
2872
3069
|
arg(1, 'zone', <<'EOT'
|
|
2873
3070
|
Time zone to use. E. g. 'Europe/Berlin' or 'America/Denver'. Don't use the 3
|
|
2874
|
-
letter acronyms.
|
|
2875
|
-
|
|
3071
|
+
letter acronyms. See
|
|
3072
|
+
[http://en.wikipedia.org/wiki/List_of_zoneinfo_time_zones Wikipedia] for
|
|
3073
|
+
possible values.
|
|
2876
3074
|
EOT
|
|
2877
3075
|
)
|
|
2878
3076
|
|
|
@@ -2999,6 +3197,9 @@ various steps and phases of the project. Depending on the attributes of that
|
|
|
2999
3197
|
task, a task can be a container task, a milestone or a regular leaf task. The
|
|
3000
3198
|
latter may have resources assigned. By specifying dependencies the user can
|
|
3001
3199
|
force a certain sequence of tasks.
|
|
3200
|
+
|
|
3201
|
+
Tasks have a local name space. All IDs must be unique within the tasks
|
|
3202
|
+
that belong to the same enclosing task.
|
|
3002
3203
|
EOT
|
|
3003
3204
|
)
|
|
3004
3205
|
end
|
|
@@ -3006,6 +3207,9 @@ EOT
|
|
|
3006
3207
|
def rule_taskAttributes
|
|
3007
3208
|
repeatable
|
|
3008
3209
|
optional
|
|
3210
|
+
|
|
3211
|
+
pattern(%w( !journalEntry ))
|
|
3212
|
+
|
|
3009
3213
|
pattern(%w( _note $STRING ), lambda {
|
|
3010
3214
|
@property.set('note', newRichText(@val[1]))
|
|
3011
3215
|
})
|
|
@@ -3161,20 +3365,21 @@ EOT
|
|
|
3161
3365
|
end
|
|
3162
3366
|
|
|
3163
3367
|
def rule_taskHeader
|
|
3164
|
-
pattern(%w( _task
|
|
3368
|
+
pattern(%w( _task !optionalID $STRING ), lambda {
|
|
3165
3369
|
if @property.nil? && !@taskprefix.empty?
|
|
3166
3370
|
@property = @project.task(@taskprefix)
|
|
3167
3371
|
end
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3372
|
+
if @val[1]
|
|
3373
|
+
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
|
3374
|
+
if @project.task(id)
|
|
3375
|
+
error('task_exists', "Task #{id} has already been defined.")
|
|
3376
|
+
end
|
|
3171
3377
|
end
|
|
3172
3378
|
@property = Task.new(@project, @val[1], @val[2], @property)
|
|
3173
3379
|
@property.sourceFileInfo = @scanner.sourceFileInfo
|
|
3174
3380
|
@property.inheritAttributes
|
|
3175
3381
|
@scenarioIdx = 0
|
|
3176
3382
|
})
|
|
3177
|
-
arg(1, 'id', 'The ID of the task')
|
|
3178
3383
|
arg(2, 'name', 'The name of the task')
|
|
3179
3384
|
end
|
|
3180
3385
|
|
|
@@ -3226,27 +3431,6 @@ EOT
|
|
|
3226
3431
|
})
|
|
3227
3432
|
end
|
|
3228
3433
|
|
|
3229
|
-
def rule_taskReport
|
|
3230
|
-
pattern(%w( !taskReportHeader !reportBody ))
|
|
3231
|
-
doc('taskreport', <<'EOT'
|
|
3232
|
-
The report lists all tasks and their respective values in the GUI. The
|
|
3233
|
-
resources that are allocated to each task can be listed as well. In the
|
|
3234
|
-
commandline version it is simply ignored.
|
|
3235
|
-
EOT
|
|
3236
|
-
)
|
|
3237
|
-
end
|
|
3238
|
-
|
|
3239
|
-
def rule_taskReportHeader
|
|
3240
|
-
pattern(%w( _taskreport $STRING ), lambda {
|
|
3241
|
-
@report = Report.new(@project, @val[1], :gui, sourceFileInfo)
|
|
3242
|
-
@reportElement = TaskListRE.new(@report)
|
|
3243
|
-
})
|
|
3244
|
-
arg(1, 'file name', <<'EOT'
|
|
3245
|
-
The name of the report.
|
|
3246
|
-
EOT
|
|
3247
|
-
)
|
|
3248
|
-
end
|
|
3249
|
-
|
|
3250
3434
|
def rule_taskScenarioAttributes
|
|
3251
3435
|
|
|
3252
3436
|
pattern(%w( _account $ID ), lambda {
|
|
@@ -3301,7 +3485,7 @@ duration of the task. The accounts to be charged are determined by the
|
|
|
3301
3485
|
[[chargeset]] setting of the task.
|
|
3302
3486
|
EOT
|
|
3303
3487
|
)
|
|
3304
|
-
arg(
|
|
3488
|
+
arg(1, 'amount', 'The amount to charge')
|
|
3305
3489
|
|
|
3306
3490
|
pattern(%w( !chargeset ))
|
|
3307
3491
|
|
|
@@ -3815,24 +3999,32 @@ EOT
|
|
|
3815
3999
|
end
|
|
3816
4000
|
|
|
3817
4001
|
def rule_timezone
|
|
3818
|
-
pattern(%w( _timezone
|
|
3819
|
-
|
|
4002
|
+
pattern(%w( _timezone !validTimeZone ), lambda{
|
|
4003
|
+
ENV['TZ'] = @project['timezone'] = @val[1]
|
|
3820
4004
|
})
|
|
3821
4005
|
doc('timezone', <<'EOT'
|
|
3822
|
-
Sets the default
|
|
3823
|
-
zones specified will be assumed to be in this
|
|
4006
|
+
Sets the default time zone of the project. All times that have no time
|
|
4007
|
+
zones specified will be assumed to be in this time zone. The value must be a
|
|
3824
4008
|
string just like those used for the TZ environment variable. Most
|
|
3825
4009
|
Linux systems have a command line utility called tzselect to lookup
|
|
3826
4010
|
possible values.
|
|
3827
4011
|
|
|
3828
4012
|
The project start and end time are not affected by this setting. You
|
|
3829
|
-
have to explicitly state the
|
|
3830
|
-
|
|
4013
|
+
have to explicitly state the time zone for those dates or the system defaults
|
|
4014
|
+
are assumed. Using the TZ environment variable is the recommended way to
|
|
4015
|
+
specify the time zone for your project. If you use this attribute within the
|
|
4016
|
+
project, it should be the very first thing you set. It must be set before you
|
|
4017
|
+
set the [[timingresolution]] or any attribute with a time or date.
|
|
4018
|
+
|
|
4019
|
+
In case the specified time zone is not hour-aligned with UTC, the
|
|
4020
|
+
[[timingresolution]] will automatically be decreased.
|
|
3831
4021
|
EOT
|
|
3832
4022
|
)
|
|
3833
4023
|
arg(1, 'zone', <<'EOT'
|
|
3834
4024
|
Time zone to use. E. g. 'Europe/Berlin' or 'America/Denver'. Don't use the 3
|
|
3835
|
-
letter acronyms.
|
|
4025
|
+
letter acronyms. See
|
|
4026
|
+
[http://en.wikipedia.org/wiki/List_of_zoneinfo_time_zones Wikipedia] for
|
|
4027
|
+
possible values.
|
|
3836
4028
|
EOT
|
|
3837
4029
|
)
|
|
3838
4030
|
end
|
|
@@ -3853,6 +4045,15 @@ EOT
|
|
|
3853
4045
|
})
|
|
3854
4046
|
end
|
|
3855
4047
|
|
|
4048
|
+
def rule_validTimeZone
|
|
4049
|
+
pattern(%w( $STRING ), lambda {
|
|
4050
|
+
unless TjTime.checkTimeZone(@val[0])
|
|
4051
|
+
error('bad_time_zone', "#{@val[0]} is not a known time zone")
|
|
4052
|
+
end
|
|
4053
|
+
@val[0]
|
|
4054
|
+
})
|
|
4055
|
+
end
|
|
4056
|
+
|
|
3856
4057
|
def rule_valIntervalOrDate
|
|
3857
4058
|
pattern(%w( !date !intervalOptionalEnd ), lambda {
|
|
3858
4059
|
if @val[1]
|