taskjuggler 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +160 -0
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/data/css/tjreport.css +7 -2
- data/doc/AppConfig.html +10 -4
- data/doc/Arguments.html +10 -4
- data/doc/CHANGELOG.html +171 -5
- data/doc/COPYING.html +10 -4
- data/doc/Object.html +11 -107
- data/doc/README.html +10 -4
- data/doc/RuntimeConfig.html +10 -4
- data/doc/String.html +16 -11
- data/doc/StringIO.html +10 -4
- data/doc/TaskJuggler.html +506 -435
- data/doc/TaskJuggler/Account.html +10 -4
- data/doc/TaskJuggler/AccountAttribute.html +10 -4
- data/doc/TaskJuggler/AccountScenario.html +10 -4
- data/doc/TaskJuggler/Allocation.html +69 -60
- data/doc/TaskJuggler/AllocationAttribute.html +10 -4
- data/doc/TaskJuggler/AttributeBase.html +10 -4
- data/doc/TaskJuggler/AttributeDefinition.html +10 -4
- data/doc/TaskJuggler/BatchProcessor.html +202 -192
- data/doc/TaskJuggler/Booking.html +10 -4
- data/doc/TaskJuggler/BookingListAttribute.html +10 -4
- data/doc/TaskJuggler/BooleanAttribute.html +10 -4
- data/doc/TaskJuggler/CSVFile.html +10 -4
- data/doc/TaskJuggler/CellSettingPattern.html +10 -4
- data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
- data/doc/TaskJuggler/Charge.html +10 -4
- data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
- data/doc/TaskJuggler/ChargeSet.html +10 -4
- data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
- data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
- data/doc/TaskJuggler/ColumnTable.html +10 -4
- data/doc/TaskJuggler/Daemon.html +71 -52
- data/doc/TaskJuggler/DateAttribute.html +10 -4
- data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
- data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
- data/doc/TaskJuggler/DurationAttribute.html +10 -4
- data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
- data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
- data/doc/TaskJuggler/FixnumAttribute.html +10 -4
- data/doc/TaskJuggler/FlagListAttribute.html +10 -4
- data/doc/TaskJuggler/FloatAttribute.html +10 -4
- data/doc/TaskJuggler/FormatListAttribute.html +10 -4
- data/doc/TaskJuggler/GanttChart.html +10 -4
- data/doc/TaskJuggler/GanttContainer.html +14 -8
- data/doc/TaskJuggler/GanttHeader.html +10 -4
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
- data/doc/TaskJuggler/GanttLine.html +29 -24
- data/doc/TaskJuggler/GanttLoadStack.html +10 -4
- data/doc/TaskJuggler/GanttMilestone.html +10 -4
- data/doc/TaskJuggler/GanttRouter.html +10 -4
- data/doc/TaskJuggler/GanttTaskBar.html +20 -10
- data/doc/TaskJuggler/HTMLDocument.html +10 -4
- data/doc/TaskJuggler/HTMLGraphics.html +10 -4
- data/doc/TaskJuggler/Interval.html +10 -4
- data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
- data/doc/TaskJuggler/JobInfo.html +10 -4
- data/doc/TaskJuggler/Journal.html +227 -160
- data/doc/TaskJuggler/JournalEntry.html +10 -4
- data/doc/TaskJuggler/JournalEntryList.html +158 -72
- data/doc/TaskJuggler/KeywordArray.html +21 -9
- data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
- data/doc/TaskJuggler/Limits.html +13 -8
- data/doc/TaskJuggler/Limits/Limit.html +10 -4
- data/doc/TaskJuggler/LimitsAttribute.html +10 -4
- data/doc/TaskJuggler/ListAttributeBase.html +10 -4
- data/doc/TaskJuggler/Log.html +10 -4
- data/doc/TaskJuggler/LogFile.html +10 -4
- data/doc/TaskJuggler/LogicalAttribute.html +10 -4
- data/doc/TaskJuggler/LogicalExpression.html +11 -5
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
- data/doc/TaskJuggler/LogicalFlag.html +10 -4
- data/doc/TaskJuggler/LogicalFunction.html +132 -124
- data/doc/TaskJuggler/LogicalOperation.html +10 -4
- data/doc/TaskJuggler/Macro.html +16 -10
- data/doc/TaskJuggler/MacroTable.html +44 -38
- data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
- data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
- data/doc/TaskJuggler/Message.html +92 -68
- data/doc/TaskJuggler/MessageHandler.html +349 -28
- data/doc/TaskJuggler/Navigator.html +10 -4
- data/doc/TaskJuggler/NavigatorElement.html +10 -4
- data/doc/TaskJuggler/NikuProject.html +10 -4
- data/doc/TaskJuggler/NikuReport.html +10 -4
- data/doc/TaskJuggler/NikuResource.html +10 -4
- data/doc/TaskJuggler/NodeListAttribute.html +10 -4
- data/doc/TaskJuggler/OnShiftCache.html +10 -4
- data/doc/TaskJuggler/ProcessIntercom.html +118 -111
- data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
- data/doc/TaskJuggler/Project.html +886 -913
- data/doc/TaskJuggler/ProjectBroker.html +442 -331
- data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
- data/doc/TaskJuggler/ProjectFileParser.html +320 -317
- data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
- data/doc/TaskJuggler/ProjectRecord.html +119 -56
- data/doc/TaskJuggler/ProjectServer.html +282 -237
- data/doc/TaskJuggler/ProjectServerIface.html +45 -39
- data/doc/TaskJuggler/PropertyAttribute.html +10 -4
- data/doc/TaskJuggler/PropertyList.html +177 -173
- data/doc/TaskJuggler/PropertySet.html +11 -5
- data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
- data/doc/TaskJuggler/Query.html +280 -256
- data/doc/TaskJuggler/RTFHandlers.html +10 -4
- data/doc/TaskJuggler/RTFNavigator.html +33 -26
- data/doc/TaskJuggler/RTFQuery.html +135 -169
- data/doc/TaskJuggler/RTFReport.html +63 -56
- data/doc/TaskJuggler/RTFReportLink.html +58 -47
- data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
- data/doc/TaskJuggler/RealFormat.html +10 -4
- data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
- data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
- data/doc/TaskJuggler/Report.html +333 -290
- data/doc/TaskJuggler/ReportBase.html +182 -174
- data/doc/TaskJuggler/ReportContext.html +10 -4
- data/doc/TaskJuggler/ReportServer.html +144 -126
- data/doc/TaskJuggler/ReportServerIface.html +50 -44
- data/doc/TaskJuggler/ReportServerRecord.html +38 -32
- data/doc/TaskJuggler/ReportServlet.html +144 -137
- data/doc/TaskJuggler/ReportTable.html +10 -4
- data/doc/TaskJuggler/ReportTableCell.html +169 -164
- data/doc/TaskJuggler/ReportTableColumn.html +10 -4
- data/doc/TaskJuggler/ReportTableLegend.html +10 -4
- data/doc/TaskJuggler/ReportTableLine.html +10 -4
- data/doc/TaskJuggler/Resource.html +121 -115
- data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
- data/doc/TaskJuggler/ResourceListRE.html +10 -4
- data/doc/TaskJuggler/ResourceScenario.html +13 -7
- data/doc/TaskJuggler/RichText.html +61 -37
- data/doc/TaskJuggler/RichTextAttribute.html +10 -4
- data/doc/TaskJuggler/RichTextDocument.html +91 -81
- data/doc/TaskJuggler/RichTextElement.html +378 -317
- data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
- data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
- data/doc/TaskJuggler/RichTextImage.html +10 -4
- data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
- data/doc/TaskJuggler/RichTextParser.html +48 -40
- data/doc/TaskJuggler/RichTextScanner.html +328 -906
- data/doc/TaskJuggler/RichTextSnip.html +59 -57
- data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
- data/doc/TaskJuggler/Scenario.html +10 -4
- data/doc/TaskJuggler/ScenarioData.html +33 -30
- data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
- data/doc/TaskJuggler/Scoreboard.html +10 -4
- data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
- data/doc/TaskJuggler/SheetReceiver.html +334 -313
- data/doc/TaskJuggler/SheetSender.html +10 -4
- data/doc/TaskJuggler/Shift.html +10 -4
- data/doc/TaskJuggler/ShiftAssignment.html +10 -4
- data/doc/TaskJuggler/ShiftAssignments.html +10 -4
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
- data/doc/TaskJuggler/ShiftScenario.html +10 -4
- data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
- data/doc/TaskJuggler/SortListAttribute.html +10 -4
- data/doc/TaskJuggler/SourceFileInfo.html +10 -4
- data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
- data/doc/TaskJuggler/StatusSheetReport.html +10 -4
- data/doc/TaskJuggler/StatusSheetSender.html +10 -4
- data/doc/TaskJuggler/StringAttribute.html +10 -4
- data/doc/TaskJuggler/SymbolAttribute.html +10 -4
- data/doc/TaskJuggler/SyntaxReference.html +260 -230
- data/doc/TaskJuggler/TOCEntry.html +99 -42
- data/doc/TaskJuggler/TSResourceRecord.html +10 -4
- data/doc/TaskJuggler/TSTaskRecord.html +10 -4
- data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
- data/doc/TaskJuggler/TableOfContents.html +54 -12
- data/doc/TaskJuggler/TableReport.html +877 -872
- data/doc/TaskJuggler/Task.html +117 -68
- data/doc/TaskJuggler/TaskDependency.html +10 -4
- data/doc/TaskJuggler/TaskListAttribute.html +10 -4
- data/doc/TaskJuggler/TaskListRE.html +10 -4
- data/doc/TaskJuggler/TaskScenario.html +1681 -1563
- data/doc/TaskJuggler/TextFormatter.html +10 -4
- data/doc/TaskJuggler/TextParser.html +567 -534
- data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
- data/doc/TaskJuggler/TextParser/Rule.html +26 -15
- data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
- data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
- data/doc/TaskJuggler/TextReport.html +15 -6
- data/doc/TaskJuggler/TextScanner.html +319 -287
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
- data/doc/TaskJuggler/TimeSheet.html +138 -175
- data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
- data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
- data/doc/TaskJuggler/TimeSheetReport.html +47 -42
- data/doc/TaskJuggler/TimeSheetSender.html +10 -4
- data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
- data/doc/TaskJuggler/TimeSheets.html +22 -16
- data/doc/TaskJuggler/Tj3AppBase.html +10 -4
- data/doc/TaskJuggler/Tj3Client.html +399 -365
- data/doc/TaskJuggler/Tj3Daemon.html +107 -94
- data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
- data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
- data/doc/TaskJuggler/Tj3SsSender.html +10 -4
- data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
- data/doc/TaskJuggler/Tj3TsSender.html +10 -4
- data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
- data/doc/TaskJuggler/TjException.html +10 -4
- data/doc/TaskJuggler/TjTime.html +145 -140
- data/doc/TaskJuggler/TjpExample.html +10 -4
- data/doc/TaskJuggler/TjpExportRE.html +122 -118
- data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
- data/doc/TaskJuggler/URLParameter.html +10 -4
- data/doc/TaskJuggler/UserManual.html +162 -155
- data/doc/TaskJuggler/VimSyntax.html +1028 -0
- data/doc/TaskJuggler/WebServer.html +45 -27
- data/doc/TaskJuggler/WorkingHours.html +10 -4
- data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
- data/doc/TaskJuggler/XMLBlob.html +10 -4
- data/doc/TaskJuggler/XMLComment.html +10 -4
- data/doc/TaskJuggler/XMLDocument.html +10 -4
- data/doc/TaskJuggler/XMLElement.html +10 -4
- data/doc/TaskJuggler/XMLNamedText.html +10 -4
- data/doc/TaskJuggler/XMLText.html +10 -4
- data/doc/index.html +735 -677
- data/doc/lib/AccountScenario_rb.html +1 -1
- data/doc/lib/Account_rb.html +1 -1
- data/doc/lib/Allocation_rb.html +1 -1
- data/doc/lib/AppConfig_rb.html +1 -1
- data/doc/lib/AttributeBase_rb.html +1 -1
- data/doc/lib/AttributeDefinition_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +1 -1
- data/doc/lib/BatchProcessor_rb.html +1 -1
- data/doc/lib/Booking_rb.html +1 -1
- data/doc/lib/ChargeSet_rb.html +1 -1
- data/doc/lib/Charge_rb.html +1 -1
- data/doc/lib/{Message_rb.html → FileList_rb.html} +3 -5
- data/doc/lib/HTMLDocument_rb.html +1 -1
- data/doc/lib/Interval_rb.html +1 -1
- data/doc/lib/Journal_rb.html +1 -1
- data/doc/lib/KeywordArray_rb.html +1 -1
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/Limits_rb.html +1 -1
- data/doc/lib/LogFile_rb.html +1 -1
- data/doc/lib/Log_rb.html +1 -1
- data/doc/lib/LogicalExpression_rb.html +1 -1
- data/doc/lib/LogicalFunction_rb.html +1 -1
- data/doc/lib/LogicalOperation_rb.html +1 -1
- data/doc/lib/MacroTable_rb.html +1 -3
- data/doc/lib/MessageHandler_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +1 -1
- data/doc/lib/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/Project_rb.html +4 -2
- data/doc/lib/PropertyList_rb.html +1 -1
- data/doc/lib/PropertySet_rb.html +1 -1
- data/doc/lib/PropertyTreeNode_rb.html +1 -1
- data/doc/lib/Query_rb.html +1 -1
- data/doc/lib/RTFHandlers_rb.html +1 -1
- data/doc/lib/RTFNavigator_rb.html +1 -1
- data/doc/lib/RTFQuery_rb.html +2 -2
- data/doc/lib/RTFReportLink_rb.html +4 -2
- data/doc/lib/RTFReport_rb.html +1 -1
- data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +1 -1
- data/doc/lib/Resource_rb.html +1 -1
- data/doc/lib/RichTextDocument_rb.html +1 -1
- data/doc/lib/RichTextElement_rb.html +1 -1
- data/doc/lib/RichTextFunctionExample_rb.html +1 -1
- data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +1 -1
- data/doc/lib/RichTextScanner_rb.html +3 -1
- data/doc/lib/RichTextSnip_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
- data/doc/lib/RichText_rb.html +3 -1
- data/doc/lib/RuntimeConfig_rb.html +1 -1
- data/doc/lib/ScenarioData_rb.html +2 -2
- data/doc/lib/Scenario_rb.html +1 -1
- data/doc/lib/Scoreboard_rb.html +1 -1
- data/doc/lib/SheetHandlerBase_rb.html +5 -1
- data/doc/lib/SheetReceiver_rb.html +3 -1
- data/doc/lib/SheetSender_rb.html +1 -1
- data/doc/lib/ShiftAssignments_rb.html +1 -1
- data/doc/lib/ShiftScenario_rb.html +1 -1
- data/doc/lib/Shift_rb.html +1 -1
- data/doc/lib/SimpleQueryExpander_rb.html +67 -0
- data/doc/lib/SourceFileInfo_rb.html +1 -1
- data/doc/lib/StatusSheetReceiver_rb.html +1 -1
- data/doc/lib/StatusSheetSender_rb.html +1 -1
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TOCEntry_rb.html +1 -1
- data/doc/lib/TableColumnDefinition_rb.html +1 -1
- data/doc/lib/TableOfContents_rb.html +1 -1
- data/doc/lib/TaskDependency_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +1 -1
- data/doc/lib/TaskScenario_rb.html +1 -1
- data/doc/lib/Task_rb.html +1 -1
- data/doc/lib/TextFormatter_rb.html +1 -1
- data/doc/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/TextParser/Rule_rb.html +1 -1
- data/doc/lib/TextParser/StackElement_rb.html +1 -1
- data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/TextParser_rb.html +3 -1
- data/doc/lib/TextScanner_rb.html +1 -3
- data/doc/lib/TimeSheetReceiver_rb.html +1 -1
- data/doc/lib/TimeSheetSender_rb.html +1 -1
- data/doc/lib/TimeSheetSummary_rb.html +1 -1
- data/doc/lib/TimeSheets_rb.html +1 -1
- data/doc/lib/Tj3AppBase_rb.html +1 -1
- data/doc/lib/Tj3Config_rb.html +1 -1
- data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
- data/doc/lib/TjException_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +1 -1
- data/doc/lib/TjpExample_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/URLParameter_rb.html +1 -1
- data/doc/lib/UTF8String_rb.html +1 -1
- data/doc/lib/UserManual_rb.html +1 -1
- data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
- data/doc/lib/WorkingHours_rb.html +1 -1
- data/doc/lib/XMLDocument_rb.html +1 -1
- data/doc/lib/XMLElement_rb.html +1 -1
- data/doc/lib/daemon/Daemon_rb.html +1 -1
- data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
- data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
- data/doc/lib/daemon/ProjectServer_rb.html +1 -1
- data/doc/lib/daemon/ReportServer_rb.html +1 -3
- data/doc/lib/daemon/WebServer_rb.html +1 -1
- data/doc/lib/deep_copy_rb.html +1 -1
- data/doc/lib/reports/CSVFile_rb.html +1 -1
- data/doc/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/reports/GanttChart_rb.html +1 -1
- data/doc/lib/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/reports/GanttLine_rb.html +1 -1
- data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/reports/Navigator_rb.html +1 -1
- data/doc/lib/reports/NikuReport_rb.html +1 -1
- data/doc/lib/reports/ReportBase_rb.html +1 -1
- data/doc/lib/reports/ReportContext_rb.html +1 -1
- data/doc/lib/reports/ReportTableCell_rb.html +1 -1
- data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/reports/ReportTable_rb.html +1 -1
- data/doc/lib/reports/Report_rb.html +1 -1
- data/doc/lib/reports/ResourceListRE_rb.html +1 -1
- data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
- data/doc/lib/reports/TableReport_rb.html +1 -1
- data/doc/lib/reports/TaskListRE_rb.html +1 -1
- data/doc/lib/reports/TextReport_rb.html +1 -1
- data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
- data/doc/lib/reports/TjpExportRE_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +1 -1
- data/doc/lib/tj3client_rb.html +1 -1
- data/doc/lib/tj3d_rb.html +1 -1
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +1 -1
- data/doc/lib/tj3ts_receiver_rb.html +1 -1
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/lib/Allocation.rb +8 -5
- data/lib/BatchProcessor.rb +7 -3
- data/lib/FileList.rb +58 -0
- data/lib/Journal.rb +73 -33
- data/lib/KeywordArray.rb +4 -0
- data/lib/KeywordDocumentation.rb +45 -11
- data/lib/Limits.rb +0 -1
- data/lib/LogicalExpression.rb +1 -1
- data/lib/LogicalFunction.rb +14 -12
- data/lib/MacroTable.rb +3 -4
- data/lib/MessageHandler.rb +136 -7
- data/lib/Project.rb +72 -86
- data/lib/ProjectFileParser.rb +30 -33
- data/lib/ProjectFileScanner.rb +7 -16
- data/lib/PropertyList.rb +25 -27
- data/lib/PropertySet.rb +1 -1
- data/lib/PropertyTreeNode.rb +9 -12
- data/lib/Query.rb +5 -4
- data/lib/RTFNavigator.rb +2 -1
- data/lib/RTFQuery.rb +4 -11
- data/lib/RTFReport.rb +2 -1
- data/lib/RTFReportLink.rb +10 -4
- data/lib/RTFWithQuerySupport.rb +45 -0
- data/lib/Resource.rb +20 -20
- data/lib/ResourceScenario.rb +3 -3
- data/lib/RichText.rb +15 -7
- data/lib/RichTextDocument.rb +8 -4
- data/lib/RichTextElement.rb +35 -12
- data/lib/RichTextFunctionHandler.rb +11 -12
- data/lib/RichTextParser.rb +5 -3
- data/lib/RichTextScanner.rb +144 -565
- data/lib/RichTextSnip.rb +3 -7
- data/lib/RichTextSyntaxRules.rb +51 -32
- data/lib/ScenarioData.rb +16 -25
- data/lib/SheetHandlerBase.rb +59 -2
- data/lib/SheetReceiver.rb +36 -18
- data/lib/SimpleQueryExpander.rb +58 -0
- data/lib/SyntaxReference.rb +9 -5
- data/lib/TOCEntry.rb +2 -0
- data/lib/TableOfContents.rb +4 -0
- data/lib/Task.rb +23 -12
- data/lib/TaskJuggler.rb +72 -33
- data/lib/TaskScenario.rb +131 -53
- data/lib/TextParser.rb +43 -30
- data/lib/TextParser/Pattern.rb +17 -13
- data/lib/TextParser/Rule.rb +5 -0
- data/lib/TextScanner.rb +46 -25
- data/lib/TimeSheetSummary.rb +9 -7
- data/lib/TimeSheets.rb +14 -23
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +1 -2
- data/lib/TjpSyntaxRules.rb +128 -104
- data/lib/UTF8String.rb +0 -1
- data/lib/UserManual.rb +5 -4
- data/lib/VimSyntax.rb +223 -0
- data/lib/daemon/Daemon.rb +9 -0
- data/lib/daemon/ProcessIntercom.rb +19 -4
- data/lib/daemon/ProjectBroker.rb +149 -68
- data/lib/daemon/ProjectServer.rb +119 -79
- data/lib/daemon/ReportServer.rb +42 -31
- data/lib/daemon/WebServer.rb +21 -2
- data/lib/deep_copy.rb +1 -1
- data/lib/reports/GanttContainer.rb +2 -2
- data/lib/reports/GanttLine.rb +2 -3
- data/lib/reports/GanttTaskBar.rb +7 -3
- data/lib/reports/Report.rb +62 -57
- data/lib/reports/ReportBase.rb +6 -4
- data/lib/reports/ReportTableCell.rb +13 -14
- data/lib/reports/TableReport.rb +2 -1
- data/lib/reports/TextReport.rb +3 -0
- data/lib/reports/TimeSheetReport.rb +2 -3
- data/lib/reports/TjpExportRE.rb +0 -2
- data/lib/tj3client.rb +31 -3
- data/lib/tj3d.rb +8 -1
- data/manual/Day_To_Day_Juggling +2 -95
- data/manual/How_To_Contribute +2 -1
- data/manual/Rich_Text_Attributes +37 -3
- data/manual/Software +203 -0
- data/test/MessageChecker.rb +4 -4
- data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
- data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
- data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
- data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
- data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
- data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
- data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
- data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
- data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
- data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
- data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
- data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
- data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
- data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
- data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
- data/test/TestSuite/StatusSheets/dev2.tji +22 -0
- data/test/TestSuite/StatusSheets/resrep.tji +7 -0
- data/test/TestSuite/StatusSheets/run +6 -4
- data/test/TestSuite/StatusSheets/tj3d.log +312 -0
- data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
- data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
- data/test/TestSuite/TimeSheets/resrep.tji +7 -0
- data/test/TestSuite/TimeSheets/run +6 -5
- data/test/TestSuite/TimeSheets/statussheets.log +1 -0
- data/test/TestSuite/TimeSheets/ts.tji +351 -0
- data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
- data/test/test_PropertySet.rb +2 -2
- data/test/test_RichText.rb +178 -387
- data/test/test_SimpleQueryExpander.rb +55 -0
- data/test/test_deep_copy.rb +2 -2
- metadata +854 -834
- data/lib/MacroParser.rb +0 -77
- data/lib/Message.rb +0 -56
- data/lib/ruby-signal-bug.rb +0 -43
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
- data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
data/lib/TimeSheets.rb
CHANGED
@@ -175,7 +175,9 @@ class TaskJuggler
|
|
175
175
|
warning('ts_res_end_delta',
|
176
176
|
"#{resource.name} requests " +
|
177
177
|
"#{@expectedEnd < @task['end', scenarioIdx] ?
|
178
|
-
'earlier' : 'later'} end for task
|
178
|
+
'earlier' : 'later'} end (#{@expectedEnd}) for task " +
|
179
|
+
"#{@task.fullId}. Planned end is " +
|
180
|
+
"#{@task['end', scenarioIdx]}.")
|
179
181
|
end
|
180
182
|
end
|
181
183
|
end
|
@@ -214,8 +216,7 @@ class TaskJuggler
|
|
214
216
|
scenarioIdx = @timeSheet.scenarioIdx
|
215
217
|
startIdx = project.dateToIdx(project['now'], true)
|
216
218
|
endIdx = project.dateToIdx(@task['end', scenarioIdx])
|
217
|
-
|
218
|
-
resource)
|
219
|
+
@task.getEffectiveWork(scenarioIdx, startIdx, endIdx, resource)
|
219
220
|
end
|
220
221
|
|
221
222
|
# The reported expected end of the task.
|
@@ -231,11 +232,11 @@ class TaskJuggler
|
|
231
232
|
private
|
232
233
|
|
233
234
|
def error(id, text)
|
234
|
-
@timeSheet.
|
235
|
+
@timeSheet.error(id, text, @sourceFileInfo)
|
235
236
|
end
|
236
237
|
|
237
238
|
def warning(id, text)
|
238
|
-
@timeSheet.
|
239
|
+
@timeSheet.warning(id, text, @sourceFileInfo)
|
239
240
|
end
|
240
241
|
|
241
242
|
end
|
@@ -332,18 +333,6 @@ class TaskJuggler
|
|
332
333
|
@resource.getFreeSlots(@scenarioIdx, startIdx, endIdx)
|
333
334
|
end
|
334
335
|
|
335
|
-
# Report an error or warning to the TjMessageHandler. In case of an error
|
336
|
-
# an exception is raised.
|
337
|
-
def message(type, id, text, sourceFileInfo)
|
338
|
-
unless text.empty?
|
339
|
-
message = Message.new(id, type, text, @resource, nil, sourceFileInfo)
|
340
|
-
resource.project.messageHandler.send(message)
|
341
|
-
end
|
342
|
-
|
343
|
-
# An empty strings signals an already reported error
|
344
|
-
raise TjException.new, '' if type == 'error'
|
345
|
-
end
|
346
|
-
|
347
336
|
# Converts allocation percentage into time slots.
|
348
337
|
def percentToSlots(value)
|
349
338
|
@percentageUsed = true
|
@@ -366,16 +355,18 @@ class TaskJuggler
|
|
366
355
|
@resource.project['scheduleGranularity']).to_i
|
367
356
|
end
|
368
357
|
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
message('error', id, text, @sourceFileInfo)
|
358
|
+
def error(id, text, sourceFileInfo = nil)
|
359
|
+
@resource.project.messageHandler.error(
|
360
|
+
id, text, sourceFileInfo || @sourceFileInfo, nil, @resource)
|
373
361
|
end
|
374
362
|
|
375
|
-
def warning(id, text)
|
376
|
-
|
363
|
+
def warning(id, text, sourceFileInfo = nil)
|
364
|
+
@resource.project.messageHandler.warning(id, text, sourceFileInfo, nil,
|
365
|
+
@resource)
|
377
366
|
end
|
378
367
|
|
368
|
+
private
|
369
|
+
|
379
370
|
def workWithUnit(slots)
|
380
371
|
if @percentageUsed
|
381
372
|
"#{(slotsToPercent(slots) * 100.0).to_i}%"
|
data/lib/Tj3Config.rb
CHANGED
data/lib/TjTime.rb
CHANGED
@@ -260,8 +260,7 @@ class TaskJuggler
|
|
260
260
|
# Return a new time that is 1 month later than time but at the same time of
|
261
261
|
# day.
|
262
262
|
def sameTimeNextMonth
|
263
|
-
sec, min, hour, day, month, year
|
264
|
-
@time.localtime.to_a
|
263
|
+
sec, min, hour, day, month, year = @time.localtime.to_a
|
265
264
|
monMax = month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
|
266
265
|
month += 1
|
267
266
|
if month > 12
|
data/lib/TjpSyntaxRules.rb
CHANGED
@@ -57,7 +57,7 @@ EOT
|
|
57
57
|
end
|
58
58
|
if @val[1] && @project.account(@val[1])
|
59
59
|
error('account_exists', "Account #{@val[1]} has already been defined.",
|
60
|
-
@
|
60
|
+
@sourceFileInfo[1], @property)
|
61
61
|
end
|
62
62
|
@property = Account.new(@project, @val[1], @val[2], @property)
|
63
63
|
@property.sourceFileInfo = @sourceFileInfo[0]
|
@@ -74,8 +74,7 @@ EOT
|
|
74
74
|
# In case we have a nested supplement, we need to prepend the parent ID.
|
75
75
|
id = @property.fullId + '.' + id if @property && @property.is_a?(Account)
|
76
76
|
if (account = @project.account(id)).nil?
|
77
|
-
error('unknown_account', "Unknown account #{id}",
|
78
|
-
@sourceFileInfo[0])
|
77
|
+
error('unknown_account', "Unknown account #{id}", @sourceFileInfo[0])
|
79
78
|
end
|
80
79
|
account
|
81
80
|
})
|
@@ -109,7 +108,7 @@ EOT
|
|
109
108
|
level = @project.alertLevelIndex(@val[0])
|
110
109
|
unless level
|
111
110
|
error('bad_alert', "Unknown alert level #{@val[1]}. Must be " +
|
112
|
-
'green, yellow or red',
|
111
|
+
'green, yellow or red', @sourceFileInfo[0])
|
113
112
|
end
|
114
113
|
level
|
115
114
|
})
|
@@ -214,6 +213,18 @@ Makes a resource allocation mandatory. This means, that for each time slot
|
|
214
213
|
only then resources are allocated when all mandatory resources are available.
|
215
214
|
So either all mandatory resources can be allocated for the time slot, or no
|
216
215
|
resource will be allocated.
|
216
|
+
EOT
|
217
|
+
)
|
218
|
+
pattern(%w( _shift !allocationShiftAssignment ))
|
219
|
+
doc('shifts.allocate', <<'EOT'
|
220
|
+
Limits the allocations of resources during the specified interval to the
|
221
|
+
specified shift. Multiple shifts can be defined, but shift intervals may not
|
222
|
+
overlap. Allocation shifts are an additional restriction to the
|
223
|
+
[[shifts.task|task shifts]] and [[shifts.resource|resource shifts]] or
|
224
|
+
[[workinghours.resource|resource working hours]]. Allocations will only be
|
225
|
+
made for time slots that are specified as duty time in all relevant shifts.
|
226
|
+
The restriction to the shift is only active during the specified time
|
227
|
+
interval. Outside of this interval, no restrictions apply.
|
217
228
|
EOT
|
218
229
|
)
|
219
230
|
end
|
@@ -257,9 +268,9 @@ EOT
|
|
257
268
|
def rule_allocationShiftAssignment
|
258
269
|
pattern(%w( !shiftId !intervalsOptional ), lambda {
|
259
270
|
# Make sure we have a ShiftAssignment for the allocation.
|
260
|
-
if @allocate.
|
261
|
-
@allocate.
|
262
|
-
@allocate.
|
271
|
+
if @allocate.shifts.nil?
|
272
|
+
@allocate.shifts = ShiftAssignments.new
|
273
|
+
@allocate.shifts.project = @project
|
263
274
|
end
|
264
275
|
|
265
276
|
if @val[1].nil?
|
@@ -268,11 +279,11 @@ EOT
|
|
268
279
|
intervals = @val[1]
|
269
280
|
end
|
270
281
|
intervals.each do |interval|
|
271
|
-
if !@allocate.
|
282
|
+
if !@allocate.shifts.
|
272
283
|
addAssignment(ShiftAssignment.new(@val[0].scenario(@scenarioIdx),
|
273
284
|
interval))
|
274
285
|
error('shift_assignment_overlap',
|
275
|
-
'Shifts may not overlap each other.',
|
286
|
+
'Shifts may not overlap each other.', @sourceFileInfo[0])
|
276
287
|
end
|
277
288
|
end
|
278
289
|
})
|
@@ -316,16 +327,16 @@ EOT
|
|
316
327
|
if @val[1].parent
|
317
328
|
error('cost_acct_no_top',
|
318
329
|
"The cost account #{@val[1].fullId} is not a top-level account.",
|
319
|
-
|
330
|
+
@sourceFileInfo[1])
|
320
331
|
end
|
321
332
|
if @val[2].parent
|
322
333
|
error('rev_acct_no_top',
|
323
334
|
"The revenue account #{@val[2].fullId} is not a top-level " +
|
324
|
-
"account.",
|
335
|
+
"account.", @sourceFileInfo[2])
|
325
336
|
end
|
326
337
|
if @val[1] == @val[2]
|
327
338
|
error('cost_rev_same',
|
328
|
-
'The cost and revenue accounts may not be the same.',
|
339
|
+
'The cost and revenue accounts may not be the same.',
|
329
340
|
@sourceFileInfo[1])
|
330
341
|
end
|
331
342
|
[ @val[1], @val[2] ]
|
@@ -351,8 +362,8 @@ EOT
|
|
351
362
|
pattern(%w( _overtime $INTEGER ), lambda {
|
352
363
|
if @val[1] < 0 || @val[1] > 2
|
353
364
|
error('overtime_range',
|
354
|
-
"Overtime value #{@val[1]} out of range (0 - 2).",
|
355
|
-
@sourceFileInfo[1])
|
365
|
+
"Overtime value #{@val[1]} out of range (0 - 2).",
|
366
|
+
@sourceFileInfo[1], @property)
|
356
367
|
end
|
357
368
|
@booking.overtime = @val[1]
|
358
369
|
})
|
@@ -373,8 +384,8 @@ EOT
|
|
373
384
|
pattern(%w( _sloppy $INTEGER ), lambda {
|
374
385
|
if @val[1] < 0 || @val[1] > 2
|
375
386
|
error('sloppy_range',
|
376
|
-
"Sloppyness value #{@val[1]} out of range (0 - 2).",
|
377
|
-
@sourceFileInfo[1])
|
387
|
+
"Sloppyness value #{@val[1]} out of range (0 - 2).",
|
388
|
+
@sourceFileInfo[1], @property)
|
378
389
|
end
|
379
390
|
@booking.sloppy = @val[1]
|
380
391
|
})
|
@@ -428,7 +439,7 @@ EOT
|
|
428
439
|
end
|
429
440
|
chargeSet.complete
|
430
441
|
rescue TjException
|
431
|
-
error('chargeset', $!.message, @
|
442
|
+
error('chargeset', $!.message, @sourceFileInfo[0], @property)
|
432
443
|
end
|
433
444
|
masterAccounts = []
|
434
445
|
@property['chargeset', @scenarioIdx].each do |set|
|
@@ -437,7 +448,7 @@ EOT
|
|
437
448
|
if masterAccounts.include?(chargeSet.master)
|
438
449
|
error('chargeset_master',
|
439
450
|
"All charge sets for this task must have different top-level " +
|
440
|
-
"accounts.", @
|
451
|
+
"accounts.", @sourceFileInfo[0], @property)
|
441
452
|
end
|
442
453
|
@property['chargeset', @scenarioIdx] =
|
443
454
|
@property['chargeset', @scenarioIdx] + [ chargeSet ]
|
@@ -506,7 +517,7 @@ EOT
|
|
506
517
|
unless /#[0-9A-Fa-f]{3}/ =~ col || /#[0-9A-Fa-f]{3}/ =~ col
|
507
518
|
error('bad_color',
|
508
519
|
"Color values must be specified as '#RGB' or '#RRGGBB' values",
|
509
|
-
|
520
|
+
@sourceFileInfo[0])
|
510
521
|
end
|
511
522
|
col
|
512
523
|
})
|
@@ -685,7 +696,7 @@ EOT
|
|
685
696
|
if @val[0] % resolution != 0
|
686
697
|
error('misaligned_date',
|
687
698
|
"The date must be aligned to the timing resolution (" +
|
688
|
-
"#{resolution / 60} min) of the project.",
|
699
|
+
"#{resolution / 60} min) of the project.",
|
689
700
|
@sourceFileInfo[0])
|
690
701
|
end
|
691
702
|
@val[0]
|
@@ -736,7 +747,7 @@ EOT
|
|
736
747
|
BULLET1 BULLET2 BULLET3 BULLET4 NUMBER1 NUMBER2 NUMBER3 NUMBER4 )
|
737
748
|
if @val[1] == "Some more details\n"
|
738
749
|
error('ts_default_details',
|
739
|
-
"'Some more details' is not a valid value",
|
750
|
+
"'Some more details' is not a valid value",
|
740
751
|
@sourceFileInfo[1])
|
741
752
|
end
|
742
753
|
@journalEntry.details = newRichText(@val[1], rtTokenSetMore)
|
@@ -966,7 +977,7 @@ EOT
|
|
966
977
|
unless (?A..?Z) === @val[0][0]
|
967
978
|
error('extend_id_cap',
|
968
979
|
"User defined attributes IDs must start with a capital letter",
|
969
|
-
|
980
|
+
@sourceFileInfo[0])
|
970
981
|
end
|
971
982
|
@val[0]
|
972
983
|
})
|
@@ -1033,7 +1044,7 @@ EOT
|
|
1033
1044
|
def rule_flag
|
1034
1045
|
pattern(%w( $ID ), lambda {
|
1035
1046
|
unless @project['flags'].include?(@val[0])
|
1036
|
-
error('undecl_flag', "Undeclared flag '#{@val[0]}'",
|
1047
|
+
error('undecl_flag', "Undeclared flag '#{@val[0]}'",
|
1037
1048
|
@sourceFileInfo[0])
|
1038
1049
|
end
|
1039
1050
|
@val[0]
|
@@ -1305,7 +1316,7 @@ EOT
|
|
1305
1316
|
|
1306
1317
|
def rule_includeFile
|
1307
1318
|
pattern(%w( !includeFileName ), lambda {
|
1308
|
-
@scanner.include(@val[0], @sourceFileInfo[0])
|
1319
|
+
@project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
|
1309
1320
|
})
|
1310
1321
|
end
|
1311
1322
|
|
@@ -1314,8 +1325,9 @@ EOT
|
|
1314
1325
|
unless @val[0][-4, 4] == '.tji'
|
1315
1326
|
error('bad_include_suffix', "Included files must have a '.tji'" +
|
1316
1327
|
"extension: '#{@val[0]}'",
|
1317
|
-
|
1328
|
+
@sourceFileInfo[0])
|
1318
1329
|
end
|
1330
|
+
pushFileStack
|
1319
1331
|
@val[0]
|
1320
1332
|
})
|
1321
1333
|
arg(0, 'filename', <<'EOT'
|
@@ -1328,8 +1340,8 @@ EOT
|
|
1328
1340
|
|
1329
1341
|
def rule_includeProperties
|
1330
1342
|
pattern(%w( !includeFileName !includeAttributes ), lambda {
|
1331
|
-
|
1332
|
-
@scanner.include(@val[0], @sourceFileInfo[0])
|
1343
|
+
popFileStack
|
1344
|
+
@project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
|
1333
1345
|
})
|
1334
1346
|
end
|
1335
1347
|
|
@@ -1341,7 +1353,7 @@ EOT
|
|
1341
1353
|
if mode == 0
|
1342
1354
|
unless @val[0] < endSpec
|
1343
1355
|
error('start_before_end', "The end date (#{endSpec}) must be " +
|
1344
|
-
"after the start date (#{@val[0]}).",
|
1356
|
+
"after the start date (#{@val[0]}).", @sourceFileInfo[0])
|
1345
1357
|
end
|
1346
1358
|
Interval.new(@val[0], endSpec)
|
1347
1359
|
else
|
@@ -1372,7 +1384,7 @@ EOT
|
|
1372
1384
|
if mode == 0
|
1373
1385
|
unless @val[0] < endSpec
|
1374
1386
|
error('start_before_end', "The end date (#{endSpec}) must be after " +
|
1375
|
-
"the start date (#{@val[0]}).",
|
1387
|
+
"the start date (#{@val[0]}).", @sourceFileInfo[0])
|
1376
1388
|
end
|
1377
1389
|
Interval.new(@val[0], endSpec)
|
1378
1390
|
else
|
@@ -1402,7 +1414,7 @@ EOT
|
|
1402
1414
|
60 * 60 * 24 * 365 # years
|
1403
1415
|
]
|
1404
1416
|
if @val[0] == 0.0
|
1405
|
-
error('zero_duration', "The interval duration may not be 0.",
|
1417
|
+
error('zero_duration', "The interval duration may not be 0.",
|
1406
1418
|
@sourceFileInfo[1])
|
1407
1419
|
end
|
1408
1420
|
duration = @val[0] * convFactors[@val[1]]
|
@@ -1472,7 +1484,7 @@ EOT
|
|
1472
1484
|
level = @project.alertLevelIndex(@val[1])
|
1473
1485
|
unless level
|
1474
1486
|
error('bad_alert', "Unknown alert level #{@val[1]}. Must be " +
|
1475
|
-
'green, yellow or red',
|
1487
|
+
'green, yellow or red', @sourceFileInfo[0])
|
1476
1488
|
end
|
1477
1489
|
@journalEntry.alertLevel = level
|
1478
1490
|
})
|
@@ -1515,7 +1527,7 @@ EOT
|
|
1515
1527
|
resource = @val[0]
|
1516
1528
|
unless resource.leaf?
|
1517
1529
|
error('leaf_resource_id_expected',
|
1518
|
-
"#{resource.id} is not a leaf resource.",
|
1530
|
+
"#{resource.id} is not a leaf resource.", @sourceFileInfo[0])
|
1519
1531
|
end
|
1520
1532
|
resource
|
1521
1533
|
})
|
@@ -1894,7 +1906,7 @@ EOT
|
|
1894
1906
|
pattern(%w( _navigator $ID ), lambda {
|
1895
1907
|
if @project['navigators'][@val[1]]
|
1896
1908
|
error('navigator_exists',
|
1897
|
-
"The navigator #{@val[1]} has already been defined.",
|
1909
|
+
"The navigator #{@val[1]} has already been defined.",
|
1898
1910
|
@sourceFileInfo[0])
|
1899
1911
|
end
|
1900
1912
|
@navigator = Navigator.new(@val[1], @project)
|
@@ -1954,12 +1966,12 @@ EOT
|
|
1954
1966
|
when :taskreport
|
1955
1967
|
if (p1 = @project.task(@val[0])).nil?
|
1956
1968
|
error('unknown_main_node',
|
1957
|
-
"Unknown task ID #{@val[0]}",
|
1969
|
+
"Unknown task ID #{@val[0]}", @sourceFileInfo[0])
|
1958
1970
|
end
|
1959
1971
|
if @val[1]
|
1960
1972
|
if (p2 = @project.resource(@val[1])).nil?
|
1961
1973
|
error('unknown_sub_node',
|
1962
|
-
"Unknown resource ID #{@val[0]}",
|
1974
|
+
"Unknown resource ID #{@val[0]}", @sourceFileInfo[0])
|
1963
1975
|
end
|
1964
1976
|
return [ p2, p1 ]
|
1965
1977
|
end
|
@@ -1967,12 +1979,12 @@ EOT
|
|
1967
1979
|
when :resourcereport
|
1968
1980
|
if (p1 = @project.task(@val[0])).nil?
|
1969
1981
|
error('unknown_main_node',
|
1970
|
-
"Unknown task ID #{@val[0]}",
|
1982
|
+
"Unknown task ID #{@val[0]}", @sourceFileInfo[0])
|
1971
1983
|
end
|
1972
1984
|
if @val[1]
|
1973
1985
|
if (p2 = @project.resource(@val[1])).nil?
|
1974
1986
|
error('unknown_sub_node',
|
1975
|
-
"Unknown resource ID #{@val[0]}",
|
1987
|
+
"Unknown resource ID #{@val[0]}", @sourceFileInfo[0])
|
1976
1988
|
end
|
1977
1989
|
return [ p2, p1 ]
|
1978
1990
|
end
|
@@ -2009,12 +2021,12 @@ EOT
|
|
2009
2021
|
pattern(%w( $ABSOLUTE_ID ), lambda {
|
2010
2022
|
if @val[0].count('.') > 1
|
2011
2023
|
error('operand_attribute',
|
2012
|
-
'Attributes must be specified as <scenarioID>.<attribute>',
|
2024
|
+
'Attributes must be specified as <scenarioID>.<attribute>',
|
2013
2025
|
@sourceFileInfo[0])
|
2014
2026
|
end
|
2015
2027
|
scenario, attribute = @val[0].split('.')
|
2016
2028
|
if (scenarioIdx = @project.scenarioIdx(scenario)).nil?
|
2017
|
-
error('operand_unkn_scen', "Unknown scenario ID #{scenario}",
|
2029
|
+
error('operand_unkn_scen', "Unknown scenario ID #{scenario}",
|
2018
2030
|
@sourceFileInfo[0])
|
2019
2031
|
end
|
2020
2032
|
LogicalAttribute.new(attribute, scenarioIdx)
|
@@ -2026,7 +2038,7 @@ EOT
|
|
2026
2038
|
if @val[1].nil?
|
2027
2039
|
unless @project['flags'].include?(@val[0])
|
2028
2040
|
error('operand_unkn_flag', "Undeclared flag '#{@val[0]}'",
|
2029
|
-
|
2041
|
+
@sourceFileInfo[0])
|
2030
2042
|
end
|
2031
2043
|
LogicalFlag.new(@val[0])
|
2032
2044
|
else
|
@@ -2310,12 +2322,12 @@ EOT
|
|
2310
2322
|
unless goodValues.include?(@val[1])
|
2311
2323
|
error('bad_timing_res',
|
2312
2324
|
"Timing resolution must be one of #{goodValues.join(', ')} min.",
|
2313
|
-
|
2325
|
+
@sourceFileInfo[1])
|
2314
2326
|
end
|
2315
2327
|
if @val[1] > (Project.maxScheduleGranularity / 60)
|
2316
2328
|
error('too_large_timing_res',
|
2317
2329
|
'The maximum allowed timing resolution for the timezone is ' +
|
2318
|
-
"#{Project.maxScheduleGranularity / 60} minutes.",
|
2330
|
+
"#{Project.maxScheduleGranularity / 60} minutes.",
|
2319
2331
|
@sourceFileInfo[1])
|
2320
2332
|
end
|
2321
2333
|
@project['scheduleGranularity'] = @val[1] * 60
|
@@ -2450,7 +2462,9 @@ EOT
|
|
2450
2462
|
end
|
2451
2463
|
|
2452
2464
|
def rule_projectBodyInclude
|
2453
|
-
pattern(%w( _include !includeFile !projectBodyAttributes . )
|
2465
|
+
pattern(%w( _include !includeFile !projectBodyAttributes . ), lambda {
|
2466
|
+
popFileStack
|
2467
|
+
})
|
2454
2468
|
lastSyntaxToken(1)
|
2455
2469
|
doc('include.project', <<'EOT'
|
2456
2470
|
Includes the specified file name as if its contents would be written
|
@@ -2469,6 +2483,7 @@ EOT
|
|
2469
2483
|
|
2470
2484
|
def rule_prologInclude
|
2471
2485
|
pattern(%w( _include !includeFile !projectProlog . ), lambda {
|
2486
|
+
popFileStack
|
2472
2487
|
})
|
2473
2488
|
lastSyntaxToken(1)
|
2474
2489
|
doc('include.macro', <<'EOT'
|
@@ -2615,7 +2630,6 @@ EOT
|
|
2615
2630
|
|
2616
2631
|
def rule_propertiesInclude
|
2617
2632
|
pattern(%w( _include !includeProperties !properties ), lambda {
|
2618
|
-
popFileStack
|
2619
2633
|
})
|
2620
2634
|
doc('include.properties', <<'EOT'
|
2621
2635
|
Includes the specified file name as if its contents would be written
|
@@ -2637,7 +2651,7 @@ EOT
|
|
2637
2651
|
pattern(%w( _purge $ID ), lambda {
|
2638
2652
|
if (attributeDefinition = @property.attributeDefinition(@val[1])).nil?
|
2639
2653
|
error('purge_unknown_id',
|
2640
|
-
"#{@val[1]} is not a known attribute for this property",
|
2654
|
+
"#{@val[1]} is not a known attribute for this property",
|
2641
2655
|
@sourceFileInfo[1])
|
2642
2656
|
end
|
2643
2657
|
if attributeDefinition.scenarioSpecific
|
@@ -2648,7 +2662,7 @@ EOT
|
|
2648
2662
|
unless attr.is_a?(Array)
|
2649
2663
|
error('purge_no_list',
|
2650
2664
|
"#{@val[1]} is not a list attribute. Only those can be purged.",
|
2651
|
-
|
2665
|
+
@sourceFileInfo[1])
|
2652
2666
|
end
|
2653
2667
|
if attributeDefinition.scenarioSpecific
|
2654
2668
|
@property[@val[1], @scenarioIdx] = attributeDefinition.default.dup
|
@@ -2863,6 +2877,13 @@ EOT
|
|
2863
2877
|
singlePattern('_journal')
|
2864
2878
|
descr(<<'EOT'
|
2865
2879
|
The journal entries for the task or resource for the reported interval.
|
2880
|
+
EOT
|
2881
|
+
)
|
2882
|
+
|
2883
|
+
singlePattern('_journal_sub')
|
2884
|
+
descr(<<'EOT'
|
2885
|
+
The journal entries for the task or resource and all its subtasks or resources
|
2886
|
+
for the reported interval.
|
2866
2887
|
EOT
|
2867
2888
|
)
|
2868
2889
|
|
@@ -2970,7 +2991,12 @@ EOT
|
|
2970
2991
|
)
|
2971
2992
|
|
2972
2993
|
singlePattern('_targets')
|
2973
|
-
descr('
|
2994
|
+
descr(<<'EOT'
|
2995
|
+
A list of milestones that depend on the current task. For container tasks it
|
2996
|
+
will also include the targets of the child tasks. Usually the task name, the
|
2997
|
+
task ID and the start date will be listed.
|
2998
|
+
EOT
|
2999
|
+
)
|
2974
3000
|
|
2975
3001
|
singlePattern('_wbs')
|
2976
3002
|
descr('The hierarchical or work breakdown structure index')
|
@@ -3105,7 +3131,7 @@ EOT
|
|
3105
3131
|
pattern(%w( _opennodes !nodeIdList ), lambda {
|
3106
3132
|
@property.set('openNodes', @val[1])
|
3107
3133
|
})
|
3108
|
-
doc('
|
3134
|
+
doc('opennodes', 'For internal use only!')
|
3109
3135
|
|
3110
3136
|
pattern(%w( !report ))
|
3111
3137
|
|
@@ -3175,7 +3201,7 @@ EOT
|
|
3175
3201
|
if @val[1] < @property.get('start')
|
3176
3202
|
error('report_end',
|
3177
3203
|
"End date must be before start date #{@property.get('start')}",
|
3178
|
-
|
3204
|
+
@sourceFileInfo[1])
|
3179
3205
|
end
|
3180
3206
|
@property.set('end', @val[1])
|
3181
3207
|
})
|
@@ -3196,7 +3222,7 @@ EOT
|
|
3196
3222
|
end
|
3197
3223
|
# In case we have a nested supplement, we need to prepend the parent ID.
|
3198
3224
|
if (report = @project.report(id)).nil?
|
3199
|
-
error('report_id_expected', "#{id} is not a defined report.",
|
3225
|
+
error('report_id_expected', "#{id} is not a defined report.",
|
3200
3226
|
@sourceFileInfo[0])
|
3201
3227
|
end
|
3202
3228
|
report
|
@@ -3226,7 +3252,7 @@ EOT
|
|
3226
3252
|
if @val[1] > @property.get('end')
|
3227
3253
|
error('report_start',
|
3228
3254
|
"Start date must be before end date #{@property.get('end')}",
|
3229
|
-
|
3255
|
+
@sourceFileInfo[1])
|
3230
3256
|
end
|
3231
3257
|
@property.set('start', @val[1])
|
3232
3258
|
})
|
@@ -3250,7 +3276,7 @@ EOT
|
|
3250
3276
|
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
3251
3277
|
if @project.report(id)
|
3252
3278
|
error('report_exists', "report #{id} has already been defined.",
|
3253
|
-
@
|
3279
|
+
@sourceFileInfo[1], @property)
|
3254
3280
|
end
|
3255
3281
|
end
|
3256
3282
|
@property = Report.new(@project, @val[1], @val[2], @property)
|
@@ -3446,7 +3472,7 @@ EOT
|
|
3446
3472
|
id = (@resourceprefix.empty? ? '' : @resourceprefix + '.') + @val[0]
|
3447
3473
|
if (resource = @project.resource(id)).nil?
|
3448
3474
|
error('resource_id_expected', "#{id} is not a defined resource.",
|
3449
|
-
|
3475
|
+
@sourceFileInfo[0])
|
3450
3476
|
end
|
3451
3477
|
resource
|
3452
3478
|
})
|
@@ -3460,8 +3486,8 @@ EOT
|
|
3460
3486
|
end
|
3461
3487
|
if @val[1] && @project.resource(@val[1])
|
3462
3488
|
error('resource_exists',
|
3463
|
-
"Resource #{@val[1]} has already been defined.",
|
3464
|
-
@sourceFileInfo[1])
|
3489
|
+
"Resource #{@val[1]} has already been defined.",
|
3490
|
+
@sourceFileInfo[1], @property)
|
3465
3491
|
end
|
3466
3492
|
@property = Resource.new(@project, @val[1], @val[2], @property)
|
3467
3493
|
@property.sourceFileInfo = @sourceFileInfo[0]
|
@@ -3691,7 +3717,7 @@ EOT
|
|
3691
3717
|
@project.scenarios.clearProperties if @property.nil?
|
3692
3718
|
if @project.scenario(@val[1])
|
3693
3719
|
error('scenario_exists',
|
3694
|
-
"Scenario #{@val[1]} has already been defined.",
|
3720
|
+
"Scenario #{@val[1]} has already been defined.",
|
3695
3721
|
@sourceFileInfo[1])
|
3696
3722
|
end
|
3697
3723
|
@property = Scenario.new(@project, @val[1], @val[2], @property)
|
@@ -3704,7 +3730,7 @@ EOT
|
|
3704
3730
|
def rule_scenarioId
|
3705
3731
|
pattern(%w( $ID ), lambda {
|
3706
3732
|
if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
|
3707
|
-
error('unknown_scenario_id', "Unknown scenario: #{@val[0]}",
|
3733
|
+
error('unknown_scenario_id', "Unknown scenario: #{@val[0]}",
|
3708
3734
|
@sourceFileInfo[0])
|
3709
3735
|
end
|
3710
3736
|
@scenarioIdx
|
@@ -3715,7 +3741,7 @@ EOT
|
|
3715
3741
|
def rule_scenarioIdCol
|
3716
3742
|
pattern(%w( $ID_WITH_COLON ), lambda {
|
3717
3743
|
if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
|
3718
|
-
error('unknown_scenario_id', "Unknown scenario: @val[0]",
|
3744
|
+
error('unknown_scenario_id', "Unknown scenario: @val[0]",
|
3719
3745
|
@sourceFileInfo[0])
|
3720
3746
|
end
|
3721
3747
|
})
|
@@ -3728,7 +3754,7 @@ EOT
|
|
3728
3754
|
def rule_scenarioIdx
|
3729
3755
|
pattern(%w( $ID ), lambda {
|
3730
3756
|
if (scenarioIdx = @project.scenarioIdx(@val[0])).nil?
|
3731
|
-
error('unknown_scenario_idx', "Unknown scenario #{@val[0]}",
|
3757
|
+
error('unknown_scenario_idx', "Unknown scenario #{@val[0]}",
|
3732
3758
|
@sourceFileInfo[0])
|
3733
3759
|
end
|
3734
3760
|
scenarioIdx
|
@@ -3774,8 +3800,8 @@ EOT
|
|
3774
3800
|
addAssignment(ShiftAssignment.new(@val[0].scenario(@scenarioIdx),
|
3775
3801
|
interval))
|
3776
3802
|
error('shift_assignment_overlap',
|
3777
|
-
'Shifts may not overlap each other.',
|
3778
|
-
@sourceFileInfo[0])
|
3803
|
+
'Shifts may not overlap each other.',
|
3804
|
+
@sourceFileInfo[0], @property)
|
3779
3805
|
end
|
3780
3806
|
end
|
3781
3807
|
# Set same value again to set the 'provided' state for the attribute.
|
@@ -3806,7 +3832,7 @@ EOT
|
|
3806
3832
|
pattern(%w( _shift !optionalID $STRING ), lambda {
|
3807
3833
|
if @val[1] && @project.shift(@val[1])
|
3808
3834
|
error('shift_exists', "Shift #{@val[1]} has already been defined.",
|
3809
|
-
|
3835
|
+
@sourceFileInfo[1])
|
3810
3836
|
end
|
3811
3837
|
@property = Shift.new(@project, @val[1], @val[2], @property)
|
3812
3838
|
@property.sourceFileInfo = @sourceFileInfo[0]
|
@@ -3819,7 +3845,7 @@ EOT
|
|
3819
3845
|
def rule_shiftId
|
3820
3846
|
pattern(%w( $ID ), lambda {
|
3821
3847
|
if (shift = @project.shift(@val[0])).nil?
|
3822
|
-
error('shift_id_expected', "#{@val[0]} is not a defined shift.",
|
3848
|
+
error('shift_id_expected', "#{@val[0]} is not a defined shift.",
|
3823
3849
|
@sourceFileInfo[0])
|
3824
3850
|
end
|
3825
3851
|
shift
|
@@ -3898,24 +3924,24 @@ EOT
|
|
3898
3924
|
# <scenario>.<attribute>.<up|down>
|
3899
3925
|
if (scenario = @project.scenarioIdx(args[0])).nil?
|
3900
3926
|
error('sort_unknown_scen',
|
3901
|
-
"Unknown scenario #{args[0]} in sorting criterium",
|
3927
|
+
"Unknown scenario #{args[0]} in sorting criterium",
|
3902
3928
|
@sourceFileInfo[0])
|
3903
3929
|
end
|
3904
3930
|
attribute = args[1]
|
3905
3931
|
if args[2] != 'up' && args[2] != 'down'
|
3906
3932
|
error('sort_direction', "Sorting direction must be 'up' or 'down'",
|
3907
|
-
|
3933
|
+
@sourceFileInfo[0])
|
3908
3934
|
end
|
3909
3935
|
direction = args[2] == 'up'
|
3910
3936
|
else
|
3911
3937
|
error('sorting_crit_exptd1',
|
3912
3938
|
"Sorting criterium expected (e.g. tree, start.up or " +
|
3913
|
-
"plan.end.down).",
|
3939
|
+
"plan.end.down).", @sourceFileInfo[0])
|
3914
3940
|
end
|
3915
3941
|
if attribute == 'wbs'
|
3916
3942
|
error('sorting_wbs',
|
3917
3943
|
"Sorting by wbs is not supported. Please use 'tree' " +
|
3918
|
-
'(without appended .up or .down) instead.',
|
3944
|
+
'(without appended .up or .down) instead.',
|
3919
3945
|
@sourceFileInfo[0])
|
3920
3946
|
end
|
3921
3947
|
[ attribute, direction, scenario ]
|
@@ -3961,7 +3987,7 @@ EOT
|
|
3961
3987
|
if @val[0] != 'tree'
|
3962
3988
|
error('sorting_crit_exptd2',
|
3963
3989
|
"Sorting criterium expected (e.g. tree, start.up or " +
|
3964
|
-
"plan.end.down).",
|
3990
|
+
"plan.end.down).", @sourceFileInfo[0])
|
3965
3991
|
end
|
3966
3992
|
[ 'tree', true, -1 ]
|
3967
3993
|
})
|
@@ -3974,7 +4000,7 @@ EOT
|
|
3974
4000
|
if @project.reports[fileName]
|
3975
4001
|
error('report_redefinition',
|
3976
4002
|
"A report with the name '#{fileName}' has already been " +
|
3977
|
-
"defined.",
|
4003
|
+
"defined.", @sourceFileInfo[2])
|
3978
4004
|
end
|
3979
4005
|
else
|
3980
4006
|
fileName = "statusSheet#{@project.reports.length + 1}"
|
@@ -4158,11 +4184,11 @@ EOT
|
|
4158
4184
|
error('ts_summary_too_long',
|
4159
4185
|
"The summary text must be 480 characters long or shorter. " +
|
4160
4186
|
"This text has #{@val[1].length} characters.",
|
4161
|
-
|
4187
|
+
@sourceFileInfo[1])
|
4162
4188
|
end
|
4163
4189
|
if @val[1] == "A summary text\n"
|
4164
4190
|
error('ts_default_summary',
|
4165
|
-
"'A summary text' is not a valid summary",
|
4191
|
+
"'A summary text' is not a valid summary",
|
4166
4192
|
@sourceFileInfo[1])
|
4167
4193
|
end
|
4168
4194
|
rtTokenSetIntro =
|
@@ -4382,7 +4408,7 @@ EOT
|
|
4382
4408
|
end
|
4383
4409
|
error('too_many_bangs',
|
4384
4410
|
"Too many '!' for relative task in this context.",
|
4385
|
-
@
|
4411
|
+
@sourceFileInfo[0], @property) if id[0] == ?!
|
4386
4412
|
if task
|
4387
4413
|
task.fullId + '.' + id
|
4388
4414
|
else
|
@@ -4412,7 +4438,7 @@ EOT
|
|
4412
4438
|
if @val[1]
|
4413
4439
|
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
4414
4440
|
if @project.task(id)
|
4415
|
-
error('task_exists', "Task #{id} has already been defined.",
|
4441
|
+
error('task_exists', "Task #{id} has already been defined.",
|
4416
4442
|
@sourceFileInfo[1])
|
4417
4443
|
end
|
4418
4444
|
end
|
@@ -4435,7 +4461,7 @@ EOT
|
|
4435
4461
|
id = @taskprefix + '.' + id unless @taskprefix.empty?
|
4436
4462
|
end
|
4437
4463
|
if (task = @project.task(id)).nil?
|
4438
|
-
error('unknown_task', "Unknown task #{id}",
|
4464
|
+
error('unknown_task', "Unknown task #{id}", @sourceFileInfo[0])
|
4439
4465
|
end
|
4440
4466
|
task
|
4441
4467
|
})
|
@@ -4500,8 +4526,8 @@ EOT
|
|
4500
4526
|
|
4501
4527
|
if @property['chargeset', @scenarioIdx].empty?
|
4502
4528
|
error('task_without_chargeset',
|
4503
|
-
'The task does not have a chargeset defined.',
|
4504
|
-
@sourceFileInfo[0])
|
4529
|
+
'The task does not have a chargeset defined.',
|
4530
|
+
@sourceFileInfo[0], @property)
|
4505
4531
|
end
|
4506
4532
|
case @val[2]
|
4507
4533
|
when 'onstart'
|
@@ -4538,7 +4564,7 @@ EOT
|
|
4538
4564
|
pattern(%w( _complete !number), lambda {
|
4539
4565
|
if @val[1] < 0.0 || @val[1] > 100.0
|
4540
4566
|
error('task_complete', "Complete value must be between 0 and 100",
|
4541
|
-
@
|
4567
|
+
@sourceFileInfo[1], @property)
|
4542
4568
|
end
|
4543
4569
|
@property['complete', @scenarioIdx] = @val[1]
|
4544
4570
|
})
|
@@ -4588,8 +4614,8 @@ EOT
|
|
4588
4614
|
pattern(%w( _effort !workingDuration ), lambda {
|
4589
4615
|
checkContainer('effort')
|
4590
4616
|
if @val[1] <= 0.0
|
4591
|
-
error('effort_zero', "Effort value must be larger than 0",
|
4592
|
-
@sourceFileInfo[1])
|
4617
|
+
error('effort_zero', "Effort value must be larger than 0",
|
4618
|
+
@sourceFileInfo[1], @property)
|
4593
4619
|
end
|
4594
4620
|
@property['effort', @scenarioIdx] = @val[1]
|
4595
4621
|
})
|
@@ -4766,7 +4792,7 @@ EOT
|
|
4766
4792
|
pattern(%w( _priority $INTEGER ), lambda {
|
4767
4793
|
if @val[1] < 0 || @val[1] > 1000
|
4768
4794
|
error('task_priority', "Priority must have a value between 0 and 1000",
|
4769
|
-
@
|
4795
|
+
@sourceFileInfo[1], @property)
|
4770
4796
|
end
|
4771
4797
|
@property['priority', @scenarioIdx] = @val[1]
|
4772
4798
|
})
|
@@ -4791,7 +4817,7 @@ EOT
|
|
4791
4817
|
|
4792
4818
|
pattern(%w( _projectid $ID ), lambda {
|
4793
4819
|
unless @project['projectids'].include?(@val[1])
|
4794
|
-
error('unknown_projectid', "Unknown project ID #{@val[1]}",
|
4820
|
+
error('unknown_projectid', "Unknown project ID #{@val[1]}",
|
4795
4821
|
@sourceFileInfo[1])
|
4796
4822
|
end
|
4797
4823
|
@property['projectid', @scenarioIdx] = @val[1]
|
@@ -4822,8 +4848,8 @@ EOT
|
|
4822
4848
|
@property['end', @scenarioIdx].nil?))
|
4823
4849
|
error('not_scheduled',
|
4824
4850
|
"Task #{@property.fullId} is marked as scheduled but does not " +
|
4825
|
-
'have a fixed start and end date.',
|
4826
|
-
@sourceFileInfo[0])
|
4851
|
+
'have a fixed start and end date.',
|
4852
|
+
@sourceFileInfo[0], @property)
|
4827
4853
|
end
|
4828
4854
|
@property['scheduled', @scenarioIdx] = true
|
4829
4855
|
})
|
@@ -4876,8 +4902,8 @@ EOT
|
|
4876
4902
|
checkContainer('shift')
|
4877
4903
|
})
|
4878
4904
|
doc('shift.task', <<'EOT'
|
4879
|
-
This keyword has been deprecated. Please use [shifts.task
|
4880
|
-
(task)] instead.
|
4905
|
+
This keyword has been deprecated. Please use [[shifts.task|shifts
|
4906
|
+
(task)]] instead.
|
4881
4907
|
EOT
|
4882
4908
|
)
|
4883
4909
|
|
@@ -4887,10 +4913,11 @@ EOT
|
|
4887
4913
|
doc('shifts.task', <<'EOT'
|
4888
4914
|
Limits the working time for this task during the during the specified interval
|
4889
4915
|
to the working hours of the given shift. Multiple shifts can be defined, but
|
4890
|
-
shift intervals may not overlap. This is an additional working time
|
4891
|
-
the working hours of the allocated resources. It does not
|
4892
|
-
working hour restrictions. For a resource to be assigned
|
4893
|
-
the task
|
4916
|
+
shift intervals may not overlap. This is an additional working time
|
4917
|
+
restriction ontop of the working hours of the allocated resources. It does not
|
4918
|
+
replace the resource working hour restrictions. For a resource to be assigned
|
4919
|
+
to a time slot, both the respective task shift as well as the resource working
|
4920
|
+
hours must declare the time slot as duty slot.
|
4894
4921
|
EOT
|
4895
4922
|
)
|
4896
4923
|
|
@@ -5061,7 +5088,7 @@ EOT
|
|
5061
5088
|
pattern([ '$TIME', '_-', '$TIME' ], lambda {
|
5062
5089
|
if @val[0] >= @val[2]
|
5063
5090
|
error('time_interval',
|
5064
|
-
"End time of interval must be larger than start time",
|
5091
|
+
"End time of interval must be larger than start time",
|
5065
5092
|
@sourceFileInfo[0])
|
5066
5093
|
end
|
5067
5094
|
[ @val[0], @val[2] ]
|
@@ -5174,7 +5201,7 @@ EOT
|
|
5174
5201
|
@property = nil
|
5175
5202
|
unless @sheetAuthor.leaf?
|
5176
5203
|
error('ts_group_author',
|
5177
|
-
'A resource group cannot file a time sheet',
|
5204
|
+
'A resource group cannot file a time sheet',
|
5178
5205
|
@sourceFileInfo[1])
|
5179
5206
|
end
|
5180
5207
|
# Currently time sheets are hardcoded for scenario 0.
|
@@ -5290,11 +5317,11 @@ EOT
|
|
5290
5317
|
if @val[2].length > 120
|
5291
5318
|
error('ts_headline_too_long',
|
5292
5319
|
"The headline must be 120 or less characters long. This one " +
|
5293
|
-
"has #{@val[2].length} characters.",
|
5320
|
+
"has #{@val[2].length} characters.", @sourceFileInfo[2])
|
5294
5321
|
end
|
5295
5322
|
if @val[2] == 'Your headline here!'
|
5296
5323
|
error('ts_no_headline',
|
5297
|
-
"'Your headline here!' is not a valid headline",
|
5324
|
+
"'Your headline here!' is not a valid headline",
|
5298
5325
|
@sourceFileInfo[2])
|
5299
5326
|
end
|
5300
5327
|
@journalEntry = JournalEntry.new(@project['journal'],
|
@@ -5331,7 +5358,7 @@ EOT
|
|
5331
5358
|
if @val[1] < @timeSheet.interval.start
|
5332
5359
|
error('ts_end_too_early',
|
5333
5360
|
"The expected task end date must be after the start date of " +
|
5334
|
-
"this time sheet report.",
|
5361
|
+
"this time sheet report.", @sourceFileInfo[1])
|
5335
5362
|
end
|
5336
5363
|
@timeSheetRecord.expectedEnd = @val[1]
|
5337
5364
|
})
|
@@ -5346,7 +5373,7 @@ EOT
|
|
5346
5373
|
priority = @val[1]
|
5347
5374
|
if priority < 1 || priority > 1000
|
5348
5375
|
error('ts_bad_priority',
|
5349
|
-
"Priority value #{priority} must be between 1 and 1000.",
|
5376
|
+
"Priority value #{priority} must be between 1 and 1000.",
|
5350
5377
|
@sourceFileInfo[1])
|
5351
5378
|
end
|
5352
5379
|
@timeSheetRecord.priority = priority
|
@@ -5411,11 +5438,8 @@ EOT
|
|
5411
5438
|
unless @property.leaf?
|
5412
5439
|
error('ts_task_not_leaf',
|
5413
5440
|
'You cannot specify a task that has sub tasks here.',
|
5414
|
-
@
|
5441
|
+
@sourceFileInfo[1], @property)
|
5415
5442
|
end
|
5416
|
-
scenarioIdx = @timeSheet.scenarioIdx
|
5417
|
-
taskStart = @property['start', scenarioIdx] || @project['start']
|
5418
|
-
taskEnd = @property['end', scenarioIdx] || @project['end']
|
5419
5443
|
|
5420
5444
|
@timeSheetRecord = TimeSheetRecord.new(@timeSheet, @property)
|
5421
5445
|
@timeSheetRecord.sourceFileInfo = @sourceFileInfo[0]
|
@@ -5433,7 +5457,7 @@ EOT
|
|
5433
5457
|
pattern(%w( !date ), lambda {
|
5434
5458
|
if @val[0] < @project['start'] || @val[0] > @project['end']
|
5435
5459
|
error('date_in_range', "Date must be within the project time frame " +
|
5436
|
-
"#{@project['start']} - #{@project['end']}",
|
5460
|
+
"#{@project['start']} - #{@project['end']}",
|
5437
5461
|
@sourceFileInfo[0])
|
5438
5462
|
end
|
5439
5463
|
@val[0]
|
@@ -5443,7 +5467,7 @@ EOT
|
|
5443
5467
|
def rule_validTimeZone
|
5444
5468
|
pattern(%w( $STRING ), lambda {
|
5445
5469
|
unless TjTime.checkTimeZone(@val[0])
|
5446
|
-
error('bad_time_zone', "#{@val[0]} is not a known time zone",
|
5470
|
+
error('bad_time_zone', "#{@val[0]} is not a known time zone",
|
5447
5471
|
@sourceFileInfo[0])
|
5448
5472
|
end
|
5449
5473
|
@val[0]
|
@@ -5458,7 +5482,7 @@ EOT
|
|
5458
5482
|
if mode == 0
|
5459
5483
|
unless @val[0] < endSpec
|
5460
5484
|
error('start_before_end', "The end date (#{endSpec}) must be " +
|
5461
|
-
"after the start date (#{@val[0]}).",
|
5485
|
+
"after the start date (#{@val[0]}).",
|
5462
5486
|
@sourceFileInfo[1])
|
5463
5487
|
end
|
5464
5488
|
iv = Interval.new(@val[0], endSpec)
|
@@ -5495,7 +5519,7 @@ EOT
|
|
5495
5519
|
if mode == 0
|
5496
5520
|
unless @val[0] < endSpec
|
5497
5521
|
error('start_before_end', "The end date (#{endSpec}) must be after " +
|
5498
|
-
"the start date (#{@val[0]}).",
|
5522
|
+
"the start date (#{@val[0]}).", @sourceFileInfo[1])
|
5499
5523
|
end
|
5500
5524
|
iv = Interval.new(@val[0], endSpec)
|
5501
5525
|
else
|
@@ -5610,7 +5634,7 @@ EOT
|
|
5610
5634
|
# 1.0.
|
5611
5635
|
if @val[0] < 0.0 || @val[0] > 100.0
|
5612
5636
|
error('illegal_percentage',
|
5613
|
-
"Percentage values must be between 0 and 100%.",
|
5637
|
+
"Percentage values must be between 0 and 100%.",
|
5614
5638
|
@sourceFileInfo[1])
|
5615
5639
|
end
|
5616
5640
|
@val[0] / 100.0
|