taskjuggler 0.0.6 → 0.0.7
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/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
|