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/KeywordArray.rb
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
|
|
13
13
|
class TaskJuggler
|
|
14
14
|
|
|
15
|
+
# This class is a specialized version of Array. It stores a list of
|
|
16
|
+
# keywords as String objects. The entry '*' is special. It means all
|
|
17
|
+
# keywords of a particular set are included. '*' must be the first entry if
|
|
18
|
+
# it is present.
|
|
15
19
|
class KeywordArray < Array
|
|
16
20
|
|
|
17
21
|
alias a_include? include?
|
data/lib/KeywordDocumentation.rb
CHANGED
|
@@ -30,7 +30,7 @@ class TaskJuggler
|
|
|
30
30
|
# specific or not.
|
|
31
31
|
class KeywordDocumentation
|
|
32
32
|
|
|
33
|
-
attr_reader :keyword, :pattern, :references
|
|
33
|
+
attr_reader :keyword, :names, :pattern, :references, :optionalAttributes
|
|
34
34
|
attr_accessor :contexts, :scenarioSpecific, :inheritedFromProject,
|
|
35
35
|
:inheritedFromParent, :predecessor, :successor
|
|
36
36
|
|
|
@@ -41,15 +41,21 @@ class TaskJuggler
|
|
|
41
41
|
# _pattern_. _optAttrPatterns_ is an Array with references to
|
|
42
42
|
# TextParser::Patterns that are optional attributes to this keyword.
|
|
43
43
|
def initialize(rule, pattern, syntax, args, optAttrPatterns, manual)
|
|
44
|
+
@messageHandler = MessageHandler.new(true)
|
|
44
45
|
@rule = rule
|
|
45
46
|
@pattern = pattern
|
|
47
|
+
# The unique identifier. Usually the attribute or property name. To
|
|
48
|
+
# disambiguate a .<scope> can be added.
|
|
46
49
|
@keyword = pattern.keyword
|
|
50
|
+
# Similar to @keyword, but without the scope. Since there could be
|
|
51
|
+
# several, this is an Array of String objects.
|
|
52
|
+
@names = []
|
|
47
53
|
@syntax = syntax
|
|
48
54
|
@args = args
|
|
55
|
+
@manual = manual
|
|
49
56
|
# Hash that maps patterns of optional attributes to a boolean value. It
|
|
50
57
|
# is true if the pattern is a scenario specific attribute.
|
|
51
58
|
@optAttrPatterns = optAttrPatterns
|
|
52
|
-
@manual = manual
|
|
53
59
|
# The above hash is later converted into a list that points to the
|
|
54
60
|
# keyword documentation of the optional attribute.
|
|
55
61
|
@optionalAttributes = []
|
|
@@ -66,9 +72,39 @@ class TaskJuggler
|
|
|
66
72
|
@references = []
|
|
67
73
|
end
|
|
68
74
|
|
|
75
|
+
# Returns true of the KeywordDocumentation is documenting a TJP property
|
|
76
|
+
# (task, resources, etc.). A TJP property can be nested.
|
|
77
|
+
def isProperty?
|
|
78
|
+
# I haven't found a good way to automatically detect all the various
|
|
79
|
+
# report types as properties. The non-nestable ones need to be added
|
|
80
|
+
# manually here.
|
|
81
|
+
return true if %w( export nikureport timesheetreport statussheetreport).
|
|
82
|
+
include?(keyword)
|
|
83
|
+
@optionalAttributes.include?(self)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Returns true of the keyword can be used outside of any other keyword
|
|
87
|
+
# context.
|
|
88
|
+
def globalScope?
|
|
89
|
+
return true if @contexts.empty?
|
|
90
|
+
@contexts.each do |context|
|
|
91
|
+
return true if context.keyword == 'properties'
|
|
92
|
+
end
|
|
93
|
+
false
|
|
94
|
+
end
|
|
95
|
+
|
|
69
96
|
# Post process the class member to set cross references to other
|
|
70
97
|
# KeywordDocumentation items.
|
|
71
98
|
def crossReference(keywords, rules)
|
|
99
|
+
# Get the attribute or property name of the Keyword. This is not unique
|
|
100
|
+
# like @keyword since it's got no scope.
|
|
101
|
+
@pattern.terminalTokens(rules).each do |tok|
|
|
102
|
+
# Ignore patterns that don't have a real name.
|
|
103
|
+
break if tok[0] == '{'
|
|
104
|
+
|
|
105
|
+
@names << tok[0]
|
|
106
|
+
end
|
|
107
|
+
|
|
72
108
|
# Some arguments are references to other patterns. The current keyword
|
|
73
109
|
# is added as context to such patterns.
|
|
74
110
|
@args.each do |arg|
|
|
@@ -498,15 +534,12 @@ class TaskJuggler
|
|
|
498
534
|
# catches all RichTextScanner processing problems and converts the exception
|
|
499
535
|
# data into an error message.
|
|
500
536
|
def newRichText(text)
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
rescue RichTextException => msg
|
|
506
|
-
$stderr.puts "Error in RichText of rule #{@keyword}\n" +
|
|
507
|
-
"Line #{msg.lineNo}: #{msg.text}\n" +
|
|
508
|
-
"#{msg.line}"
|
|
537
|
+
rText = RichText.new(text, [], @messageHandler)
|
|
538
|
+
unless (rti = rText.generateIntermediateFormat)
|
|
539
|
+
@messageHandler.error('rich_text',
|
|
540
|
+
"Error in RichText of rule #{@keyword}")
|
|
509
541
|
end
|
|
542
|
+
@references += rti.internalReferences
|
|
510
543
|
rti
|
|
511
544
|
end
|
|
512
545
|
|
|
@@ -515,7 +548,8 @@ class TaskJuggler
|
|
|
515
548
|
# table cell element. _list_ is the KeywordDocumentation list. _width_ is
|
|
516
549
|
# the percentage width of the cell.
|
|
517
550
|
def listHTMLAttributes(list, width)
|
|
518
|
-
td = XMLElement.new('td', 'class' => 'descr',
|
|
551
|
+
td = XMLElement.new('td', 'class' => 'descr',
|
|
552
|
+
'style' => "width:#{width}%")
|
|
519
553
|
first = true
|
|
520
554
|
list.each do |attr|
|
|
521
555
|
if first
|
data/lib/Limits.rb
CHANGED
data/lib/LogicalExpression.rb
CHANGED
data/lib/LogicalFunction.rb
CHANGED
|
@@ -69,7 +69,6 @@ class TaskJuggler
|
|
|
69
69
|
|
|
70
70
|
# Evaluate the function by calling it with the arguments.
|
|
71
71
|
def eval(expr)
|
|
72
|
-
args = []
|
|
73
72
|
# Call the function and return the result.
|
|
74
73
|
send(name, expr, @arguments)
|
|
75
74
|
end
|
|
@@ -92,10 +91,9 @@ class TaskJuggler
|
|
|
92
91
|
end
|
|
93
92
|
|
|
94
93
|
def hasalert(expr, args)
|
|
95
|
-
property
|
|
94
|
+
property = properties(expr)[0]
|
|
96
95
|
query = expr.query
|
|
97
96
|
project = property.project
|
|
98
|
-
date = project.reportContexts.last.report.get('end')
|
|
99
97
|
!project['journal'].currentEntries(query.end, property,
|
|
100
98
|
args[0], query.start).empty?
|
|
101
99
|
end
|
|
@@ -117,7 +115,7 @@ class TaskJuggler
|
|
|
117
115
|
end
|
|
118
116
|
|
|
119
117
|
def isdependencyof(expr, args)
|
|
120
|
-
property
|
|
118
|
+
property = properties(expr)[0]
|
|
121
119
|
# The result can only be true when called for a Task property.
|
|
122
120
|
return false unless property.is_a?(Task)
|
|
123
121
|
project = property.project
|
|
@@ -132,7 +130,7 @@ class TaskJuggler
|
|
|
132
130
|
end
|
|
133
131
|
|
|
134
132
|
def isdutyof(expr, args)
|
|
135
|
-
property
|
|
133
|
+
property = properties(expr)[0]
|
|
136
134
|
# The result can only be true when called for a Task property.
|
|
137
135
|
return false unless (task = property).is_a?(Task)
|
|
138
136
|
project = task.project
|
|
@@ -145,7 +143,7 @@ class TaskJuggler
|
|
|
145
143
|
end
|
|
146
144
|
|
|
147
145
|
def isfeatureof(expr, args)
|
|
148
|
-
property
|
|
146
|
+
property = properties(expr)[0]
|
|
149
147
|
# The result can only be true when called for a Task property.
|
|
150
148
|
return false unless property.is_a?(Task)
|
|
151
149
|
project = property.project
|
|
@@ -158,19 +156,20 @@ class TaskJuggler
|
|
|
158
156
|
end
|
|
159
157
|
|
|
160
158
|
def isleaf(expr, args)
|
|
161
|
-
property
|
|
159
|
+
property = properties(expr)[0]
|
|
162
160
|
return false unless property
|
|
163
161
|
property.leaf?
|
|
164
162
|
end
|
|
165
163
|
|
|
166
164
|
def isongoing(expr, args)
|
|
167
|
-
property
|
|
165
|
+
property = properties(expr)[0]
|
|
168
166
|
# The result can only be true when called for a Task property.
|
|
169
167
|
return false unless (task = property).is_a?(Task)
|
|
170
168
|
project = task.project
|
|
171
169
|
# 1st arg must be a scenario index.
|
|
172
170
|
if (scenarioIdx = project.scenarioIdx(args[0])).nil?
|
|
173
|
-
expr.error("Unknown scenario '#{args[0]}' used for function
|
|
171
|
+
expr.error("Unknown scenario '#{args[0]}' used for function " +
|
|
172
|
+
"isongoing()")
|
|
174
173
|
end
|
|
175
174
|
|
|
176
175
|
query = expr.query
|
|
@@ -185,17 +184,20 @@ class TaskJuggler
|
|
|
185
184
|
end
|
|
186
185
|
|
|
187
186
|
def isresource(expr, args)
|
|
188
|
-
property
|
|
187
|
+
property = properties(expr)[0]
|
|
188
|
+
return false unless property
|
|
189
189
|
property.is_a?(Resource)
|
|
190
190
|
end
|
|
191
191
|
|
|
192
192
|
def istask(expr, args)
|
|
193
|
-
property
|
|
193
|
+
property = properties(expr)[0]
|
|
194
|
+
return false unless property
|
|
194
195
|
property.is_a?(Task)
|
|
195
196
|
end
|
|
196
197
|
|
|
197
198
|
def treelevel(expr, args)
|
|
198
|
-
property
|
|
199
|
+
property = properties(expr)[0]
|
|
200
|
+
return 0 unless property
|
|
199
201
|
property.level + 1
|
|
200
202
|
end
|
|
201
203
|
|
data/lib/MacroTable.rb
CHANGED
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
|
|
13
13
|
require 'SourceFileInfo'
|
|
14
14
|
require 'MessageHandler'
|
|
15
|
-
require 'Message'
|
|
16
15
|
require 'TjException'
|
|
17
16
|
|
|
18
17
|
class TaskJuggler
|
|
@@ -62,6 +61,8 @@ class TaskJuggler
|
|
|
62
61
|
# unchanged. No error is generated.
|
|
63
62
|
def resolve(args, sourceFileInfo)
|
|
64
63
|
name = args[0]
|
|
64
|
+
return nil unless @macros[name]
|
|
65
|
+
|
|
65
66
|
resolved = @macros[name].value.dup
|
|
66
67
|
i = 0
|
|
67
68
|
args.each do |arg|
|
|
@@ -73,9 +74,7 @@ class TaskJuggler
|
|
|
73
74
|
|
|
74
75
|
# This function sends an error message to the message handler.
|
|
75
76
|
def error(id, text, sourceFileInfo)
|
|
76
|
-
|
|
77
|
-
@messageHandler.send(message)
|
|
78
|
-
raise TjException.new, 'Macro expasion error'
|
|
77
|
+
@messageHandler.error(id, text, sourceFileInfo)
|
|
79
78
|
end
|
|
80
79
|
|
|
81
80
|
end
|
data/lib/MessageHandler.rb
CHANGED
|
@@ -12,26 +12,155 @@
|
|
|
12
12
|
|
|
13
13
|
class TaskJuggler
|
|
14
14
|
|
|
15
|
+
# The Message object can store several classes of messages that the
|
|
16
|
+
# application can send out.
|
|
17
|
+
class Message
|
|
18
|
+
|
|
19
|
+
attr_reader :type, :id, :message, :sourceFileInfo, :line
|
|
20
|
+
|
|
21
|
+
# Create a new Message object. The _type_ specifies what tpye of message
|
|
22
|
+
# this is. The following types are supported: fatal, error, warning, info
|
|
23
|
+
# and debug. _id_ is a String that must uniquely identify the source of
|
|
24
|
+
# the Message. _message_ is a String with the actual message.
|
|
25
|
+
# _sourceLineInfo_ is a SourceLineInfo object that can reference a
|
|
26
|
+
# location in a specific file. _line_ is a String of that file. _data_ can
|
|
27
|
+
# be any context sensitive data. _sceneario_ specifies the Scenario in
|
|
28
|
+
# which the message originated.
|
|
29
|
+
def initialize(type, id, message, sourceFileInfo, line, data, scenario)
|
|
30
|
+
unless [ :fatal, :error, :warning, :info, :debug ].
|
|
31
|
+
include?(type)
|
|
32
|
+
raise "Unknown message type: #{type}"
|
|
33
|
+
end
|
|
34
|
+
@type = type
|
|
35
|
+
|
|
36
|
+
@id = id
|
|
37
|
+
|
|
38
|
+
if message && !message.is_a?(String)
|
|
39
|
+
raise "String object expected as message but got #{message.class}"
|
|
40
|
+
end
|
|
41
|
+
@message = message
|
|
42
|
+
|
|
43
|
+
if sourceFileInfo && !sourceFileInfo.is_a?(SourceFileInfo)
|
|
44
|
+
raise "SourceFileInfo object expected but got #{sourceFileInfo.class}"
|
|
45
|
+
end
|
|
46
|
+
@sourceFileInfo = sourceFileInfo
|
|
47
|
+
|
|
48
|
+
if line && !line.is_a?(String)
|
|
49
|
+
raise "String object expected as line but got #{line.class}"
|
|
50
|
+
end
|
|
51
|
+
@line = line
|
|
52
|
+
|
|
53
|
+
@data = data
|
|
54
|
+
|
|
55
|
+
if scenario && !scenario.is_a?(Scenario)
|
|
56
|
+
raise "Scenario object expected by got #{scenario.class}"
|
|
57
|
+
end
|
|
58
|
+
@scenario = scenario
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Convert the Message into a String.
|
|
62
|
+
def to_s
|
|
63
|
+
str = ""
|
|
64
|
+
# The SourceFileInfo is printed as <fileName>:line:
|
|
65
|
+
if @sourceFileInfo
|
|
66
|
+
str += "#{@sourceFileInfo.fileName}:#{sourceFileInfo.lineNo}: "
|
|
67
|
+
end
|
|
68
|
+
if @scenario
|
|
69
|
+
str += "#{@type.to_s.capitalize} in scenario #{@scenario.id}: "
|
|
70
|
+
else
|
|
71
|
+
str += "#{@type.to_s.capitalize}: "
|
|
72
|
+
end
|
|
73
|
+
str += @message
|
|
74
|
+
str += "\n" + @line if @line
|
|
75
|
+
str
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# The MessageHandler can display and store application messages. Depending
|
|
81
|
+
# on the type of the message, a TjExeption can be raised (:error), or the
|
|
82
|
+
# program can be immedidately aborted (:fatal). Other types will just
|
|
83
|
+
# continue the program flow.
|
|
15
84
|
class MessageHandler
|
|
16
85
|
|
|
17
86
|
attr_reader :messages, :errors
|
|
87
|
+
attr_accessor :scenario
|
|
18
88
|
|
|
89
|
+
# Initialize the MessageHandler. _console_ specifies if the messages
|
|
90
|
+
# should be printed to $stderr.
|
|
19
91
|
def initialize(console = false)
|
|
20
92
|
@messages = []
|
|
21
93
|
@console = console
|
|
22
|
-
|
|
94
|
+
# We count the errors.
|
|
23
95
|
@errors = 0
|
|
24
96
|
end
|
|
25
97
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
98
|
+
# Generate a fatal message that will abort the application.
|
|
99
|
+
def fatal(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
100
|
+
scenario = nil)
|
|
101
|
+
addMessage(:fatal, id, message, sourceFileInfo, line, data, scenario)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Generate an error message.
|
|
105
|
+
def error(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
106
|
+
scenario = nil)
|
|
107
|
+
addMessage(:error, id, message, sourceFileInfo, line, data, scenario)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Generate an critical message.
|
|
111
|
+
def critical(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
112
|
+
scenario = nil)
|
|
113
|
+
addMessage(:critical, id, message, sourceFileInfo, line, data, scenario)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Generate a warning.
|
|
117
|
+
def warning(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
118
|
+
scenario = nil)
|
|
119
|
+
addMessage(:warning, id, message, sourceFileInfo, line, data, scenario)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Generate an info message.
|
|
123
|
+
def info(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
124
|
+
scenario = nil)
|
|
125
|
+
addMessage(:info, id, message, sourceFileInfo, line, data, scenario)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Generate a debug message.
|
|
129
|
+
def debug(id, message, sourceFileInfo = nil, line = nil, data = nil,
|
|
130
|
+
scenario = nil)
|
|
131
|
+
addMessage(:info, id, message, sourceFileInfo, line, data, scenario)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Generate a message by specifying the _type_.
|
|
135
|
+
def addMessage(type, id, message, sourceFileInfo = nil, line = nil,
|
|
136
|
+
data = nil, scenario = nil)
|
|
137
|
+
abortOnError = type == :error
|
|
138
|
+
# Treat criticals like errors but without generating another
|
|
139
|
+
# exception.
|
|
140
|
+
type = :error if type == :critical
|
|
141
|
+
|
|
142
|
+
msg = Message.new(type, id, message, sourceFileInfo, line, data, scenario)
|
|
143
|
+
@messages << msg
|
|
144
|
+
# Print the message to $stderr if requested by the user.
|
|
145
|
+
$stderr.puts msg.to_s if @console
|
|
146
|
+
|
|
147
|
+
case type
|
|
148
|
+
when :error
|
|
149
|
+
# Increase the error counter.
|
|
150
|
+
@errors += 1
|
|
151
|
+
raise TjException.new, '' if abortOnError
|
|
152
|
+
when :fatal
|
|
153
|
+
raise RuntimeError
|
|
32
154
|
end
|
|
33
155
|
end
|
|
34
156
|
|
|
157
|
+
# Convert all messages into a single String.
|
|
158
|
+
def to_s
|
|
159
|
+
text = ''
|
|
160
|
+
@messages.each { |msg| text += msg.to_s }
|
|
161
|
+
text
|
|
162
|
+
end
|
|
163
|
+
|
|
35
164
|
end
|
|
36
165
|
|
|
37
166
|
end
|
data/lib/Project.rb
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
#
|
|
12
12
|
|
|
13
13
|
require 'TjException'
|
|
14
|
-
require '
|
|
14
|
+
require 'MessageHandler'
|
|
15
|
+
require 'FileList'
|
|
15
16
|
require 'TjTime'
|
|
16
17
|
require 'Booking'
|
|
17
18
|
require 'PropertySet'
|
|
@@ -49,7 +50,7 @@ class TaskJuggler
|
|
|
49
50
|
class Project
|
|
50
51
|
|
|
51
52
|
attr_reader :accounts, :shifts, :tasks, :resources, :scenarios,
|
|
52
|
-
:timeSheets, :reports, :messageHandler
|
|
53
|
+
:timeSheets, :reports, :messageHandler, :inputFiles
|
|
53
54
|
attr_accessor :reportContexts, :outputDir, :warnTsDeltas
|
|
54
55
|
|
|
55
56
|
# Create a project with the specified +id+, +name+ and +version+.
|
|
@@ -394,6 +395,9 @@ class TaskJuggler
|
|
|
394
395
|
|
|
395
396
|
Scenario.new(self, 'plan', 'Plan Scenario', nil)
|
|
396
397
|
|
|
398
|
+
# A list of files that contained the project data.
|
|
399
|
+
@inputFiles = FileList.new
|
|
400
|
+
|
|
397
401
|
@timeSheets = TimeSheets.new
|
|
398
402
|
|
|
399
403
|
# The ReportContext provides additional settings to the report that can
|
|
@@ -412,12 +416,6 @@ class TaskJuggler
|
|
|
412
416
|
self
|
|
413
417
|
end
|
|
414
418
|
|
|
415
|
-
# Pass a message (error or warning) to the message handler. _message_ is a
|
|
416
|
-
# String that contains the message.
|
|
417
|
-
def sendMessage(message)
|
|
418
|
-
@messageHandler.send(message)
|
|
419
|
-
end
|
|
420
|
-
|
|
421
419
|
# Query the value of a Project attribute. _name_ is the ID of the attribute.
|
|
422
420
|
def [](name)
|
|
423
421
|
if !@attributes.has_key?(name)
|
|
@@ -574,36 +572,30 @@ class TaskJuggler
|
|
|
574
572
|
end
|
|
575
573
|
|
|
576
574
|
if @tasks.empty?
|
|
577
|
-
|
|
578
|
-
sendMessage(message)
|
|
579
|
-
return false
|
|
575
|
+
@messageHandler.error('no_tasks', "No tasks defined")
|
|
580
576
|
end
|
|
581
577
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
finishScenario(scIdx)
|
|
604
|
-
end
|
|
605
|
-
rescue TjException
|
|
606
|
-
return false
|
|
578
|
+
@scenarios.each do |sc|
|
|
579
|
+
# Skip disabled scenarios
|
|
580
|
+
next unless sc.get('enabled')
|
|
581
|
+
|
|
582
|
+
scIdx = scenarioIdx(sc)
|
|
583
|
+
|
|
584
|
+
# All user provided values are set now. The next step is to
|
|
585
|
+
# propagate inherited values. These values must be marked as
|
|
586
|
+
# inherited by setting the mode to 1. As we always call
|
|
587
|
+
# PropertyTreeNode#inherit this is just a safeguard.
|
|
588
|
+
AttributeBase.setMode(1)
|
|
589
|
+
prepareScenario(scIdx)
|
|
590
|
+
|
|
591
|
+
# Now change to mode 2 so all values that are modified are marked
|
|
592
|
+
# as computed.
|
|
593
|
+
AttributeBase.setMode(2)
|
|
594
|
+
# Schedule the scenario.
|
|
595
|
+
scheduleScenario(scIdx)
|
|
596
|
+
|
|
597
|
+
# Complete the data sets, and check the result.
|
|
598
|
+
finishScenario(scIdx)
|
|
607
599
|
end
|
|
608
600
|
|
|
609
601
|
@timeSheets.warnOnDelta if @warnTsDeltas
|
|
@@ -613,47 +605,43 @@ class TaskJuggler
|
|
|
613
605
|
# Call this function to generate the reports based on the scheduling result.
|
|
614
606
|
# This function may only be called after Project#schedule has been called.
|
|
615
607
|
def generateReports(maxCpuCores)
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
608
|
+
@reports.index
|
|
609
|
+
if maxCpuCores == 1
|
|
610
|
+
@reports.each do |report|
|
|
611
|
+
next if report.get('formats').empty?
|
|
612
|
+
Log.startProgressMeter("Report #{report.name}")
|
|
613
|
+
@reportContexts.push(ReportContext.new(self, report))
|
|
614
|
+
report.generate
|
|
615
|
+
@reportContexts.pop
|
|
616
|
+
Log.stopProgressMeter
|
|
617
|
+
end
|
|
618
|
+
else
|
|
619
|
+
# Kickoff the generation of all reports by pushing the jobs into the
|
|
620
|
+
# BatchProcessor queue.
|
|
621
|
+
bp = BatchProcessor.new(maxCpuCores)
|
|
622
|
+
@reports.each do |report|
|
|
623
|
+
next if report.get('formats').empty?
|
|
624
|
+
bp.queue(report) {
|
|
622
625
|
@reportContexts.push(ReportContext.new(self, report))
|
|
623
|
-
report.generate
|
|
626
|
+
res = report.generate
|
|
624
627
|
@reportContexts.pop
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
res
|
|
636
|
-
}
|
|
628
|
+
res
|
|
629
|
+
}
|
|
630
|
+
end
|
|
631
|
+
# Now wait for all the jobs to finish.
|
|
632
|
+
bp.wait do |report|
|
|
633
|
+
Log.startProgressMeter("Report #{report.tag.name}")
|
|
634
|
+
$stdout.print(report.stdout)
|
|
635
|
+
$stderr.print(report.stderr)
|
|
636
|
+
if report.retVal.signaled?
|
|
637
|
+
@messageHandler.error('rg_signal', "Signal raised")
|
|
637
638
|
end
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
$stdout.print(report.stdout)
|
|
641
|
-
$stderr.print(report.stderr)
|
|
642
|
-
if report.retVal.signaled?
|
|
643
|
-
raise TjException.new, "Signal raised"
|
|
644
|
-
end
|
|
645
|
-
unless report.retVal.success?
|
|
646
|
-
raise TjException.new, "Process aborted"
|
|
647
|
-
end
|
|
648
|
-
Log.stopProgressMeter
|
|
639
|
+
unless report.retVal.success?
|
|
640
|
+
@messageHandler.error('rg_abort', "Process aborted")
|
|
649
641
|
end
|
|
642
|
+
Log.stopProgressMeter
|
|
650
643
|
end
|
|
651
|
-
rescue TjException
|
|
652
|
-
$stderr.puts "Report Generation Error: #{$!}"
|
|
653
|
-
return false
|
|
654
644
|
end
|
|
655
|
-
|
|
656
|
-
true
|
|
657
645
|
end
|
|
658
646
|
|
|
659
647
|
def generateReport(reportId, regExpMode, dynamicAttributes = nil)
|
|
@@ -667,7 +655,6 @@ class TaskJuggler
|
|
|
667
655
|
Log.startProgressMeter("Report #{report.name}")
|
|
668
656
|
@reportContexts.push(context = ReportContext.new(self, report))
|
|
669
657
|
|
|
670
|
-
name = nil
|
|
671
658
|
# If we have dynamic attributes we need to backup the old attributes
|
|
672
659
|
# first, then parse the dynamicAttributes String replacing the
|
|
673
660
|
# original values.
|
|
@@ -848,25 +835,26 @@ class TaskJuggler
|
|
|
848
835
|
# Print the attribute values. It's used for debugging only.
|
|
849
836
|
def to_s
|
|
850
837
|
raise "STOP!"
|
|
838
|
+
str = ''
|
|
851
839
|
@attributes.each do |attribute, value|
|
|
852
840
|
if value
|
|
853
|
-
|
|
854
|
-
|
|
841
|
+
str += "#{attribute}: " +
|
|
842
|
+
"#{value.is_a?(PropertyTreeNode) ? value.fullId : value}"
|
|
855
843
|
end
|
|
856
844
|
end
|
|
845
|
+
str
|
|
857
846
|
end
|
|
858
847
|
|
|
859
848
|
# This function sends an error message to the message handler.
|
|
860
849
|
def error(id, text)
|
|
861
|
-
|
|
862
|
-
@messageHandler.send(message)
|
|
863
|
-
raise TjException
|
|
850
|
+
@messageHandler.error(id, text)
|
|
864
851
|
end
|
|
865
852
|
|
|
866
853
|
protected
|
|
867
854
|
|
|
868
855
|
def prepareScenario(scIdx)
|
|
869
|
-
Log.startProgressMeter("Preparing scenario
|
|
856
|
+
Log.startProgressMeter("Preparing scenario " +
|
|
857
|
+
"#{scenario(scIdx).get('name')}")
|
|
870
858
|
resources = PropertyList.new(@resources)
|
|
871
859
|
tasks = PropertyList.new(@tasks)
|
|
872
860
|
|
|
@@ -1012,19 +1000,17 @@ class TaskJuggler
|
|
|
1012
1000
|
# Check for unscheduled tasks and report the first 10 of them as
|
|
1013
1001
|
# warnings.
|
|
1014
1002
|
unless unscheduledTasks.empty?
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
sendMessage(message)
|
|
1003
|
+
@messageHandler.warning(
|
|
1004
|
+
'unscheduled_tasks',
|
|
1005
|
+
"#{unscheduledTasks.length} tasks could not be scheduled")
|
|
1019
1006
|
i = 0
|
|
1020
1007
|
unscheduledTasks.each do |t|
|
|
1021
|
-
|
|
1022
|
-
'unscheduled_task',
|
|
1008
|
+
@messageHandler.warning(
|
|
1009
|
+
'unscheduled_task',
|
|
1023
1010
|
"Task #{t.fullId}: " +
|
|
1024
1011
|
"#{t['start', scIdx] ? t['start', scIdx] : '<?>'} -> " +
|
|
1025
|
-
"#{t['end', scIdx] ? t['end', scIdx] : '<?>'}", t,
|
|
1012
|
+
"#{t['end', scIdx] ? t['end', scIdx] : '<?>'}", nil, nil, t,
|
|
1026
1013
|
scenario(scIdx))
|
|
1027
|
-
sendMessage(message)
|
|
1028
1014
|
|
|
1029
1015
|
i += 1
|
|
1030
1016
|
break if i >= 10
|