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/UTF8String.rb
CHANGED
data/lib/UserManual.rb
CHANGED
|
@@ -37,8 +37,8 @@ class TaskJuggler
|
|
|
37
37
|
# Directory where to find the manual RichText sources. Must be relative
|
|
38
38
|
# to lib directory.
|
|
39
39
|
srcDir = AppConfig.dataDirs('manual')[0]
|
|
40
|
-
# Directory where to put the generated HTML files. Must be relative to
|
|
41
|
-
# directory.
|
|
40
|
+
# Directory where to put the generated HTML files. Must be relative to
|
|
41
|
+
# lib directory.
|
|
42
42
|
destDir = directory + (directory[-1] == '/' ? '' : '/')
|
|
43
43
|
# A list of all source files. The order is important.
|
|
44
44
|
%w(
|
|
@@ -51,6 +51,7 @@ class TaskJuggler
|
|
|
51
51
|
Tutorial
|
|
52
52
|
The_TaskJuggler_Syntax
|
|
53
53
|
Rich_Text_Attributes
|
|
54
|
+
Software
|
|
54
55
|
Day_To_Day_Juggling
|
|
55
56
|
TaskJuggler_Internals
|
|
56
57
|
fdl
|
|
@@ -58,7 +59,7 @@ class TaskJuggler
|
|
|
58
59
|
snip = addSnip(srcDir + file)
|
|
59
60
|
snip.cssClass = 'manual'
|
|
60
61
|
end
|
|
61
|
-
# Generate the table of
|
|
62
|
+
# Generate the table of contents
|
|
62
63
|
tableOfContents
|
|
63
64
|
# Generate the HTML files.
|
|
64
65
|
generateHTML(destDir)
|
|
@@ -210,7 +211,7 @@ class TaskJuggler
|
|
|
210
211
|
super
|
|
211
212
|
# Let's call the reference 'Appendix A'
|
|
212
213
|
@reference.tableOfContents(@toc, 'A')
|
|
213
|
-
@
|
|
214
|
+
@anchors += @reference.all
|
|
214
215
|
end
|
|
215
216
|
|
|
216
217
|
# Generate the HTML pages for the syntax reference and a navigation page
|
data/lib/VimSyntax.rb
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = KeywordDocumentation.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'SyntaxReference'
|
|
14
|
+
|
|
15
|
+
class TaskJuggler
|
|
16
|
+
|
|
17
|
+
# This class is a generator for vim (http://www.vim.org) TaskJuggler syntax
|
|
18
|
+
# highlighting files.
|
|
19
|
+
class VimSyntax
|
|
20
|
+
|
|
21
|
+
# Create a generator object.
|
|
22
|
+
def initialize
|
|
23
|
+
@reference = SyntaxReference.new
|
|
24
|
+
|
|
25
|
+
@properties = []
|
|
26
|
+
@attributes = []
|
|
27
|
+
@optionBlocks = []
|
|
28
|
+
|
|
29
|
+
@reference.keywords.each_value do |kw|
|
|
30
|
+
if kw.isProperty?
|
|
31
|
+
@properties << kw
|
|
32
|
+
else
|
|
33
|
+
@attributes << kw
|
|
34
|
+
end
|
|
35
|
+
if !kw.optionalAttributes.empty?
|
|
36
|
+
@optionBlocks << kw
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
@file = nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Generate the vim syntax file into _file_.
|
|
44
|
+
def generate(file)
|
|
45
|
+
@file = File.open(file, 'w')
|
|
46
|
+
|
|
47
|
+
header
|
|
48
|
+
setLocal
|
|
49
|
+
keywords
|
|
50
|
+
matches
|
|
51
|
+
regions
|
|
52
|
+
highlights
|
|
53
|
+
|
|
54
|
+
@file.close
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def header
|
|
60
|
+
@file.write <<"EOT"
|
|
61
|
+
" Vim syntax file
|
|
62
|
+
" Language: TaskJuggler
|
|
63
|
+
" Maintainer: TaskJuggler Developers <taskjuggler-devel@googlegroups.com>
|
|
64
|
+
" Last Change: #{Time.now}
|
|
65
|
+
" This file was automatically generated by VimSyntax.rb
|
|
66
|
+
|
|
67
|
+
if exists("b:current_syntax")
|
|
68
|
+
finish
|
|
69
|
+
endif
|
|
70
|
+
|
|
71
|
+
EOT
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def setLocal
|
|
75
|
+
cinwords = []
|
|
76
|
+
@optionBlocks.each { |kw| cinwords += kw.names }
|
|
77
|
+
cinwords.uniq!.sort!
|
|
78
|
+
@file.write <<'EOT'
|
|
79
|
+
setlocal softtabstop=2
|
|
80
|
+
setlocal cindent shiftwidth=2
|
|
81
|
+
setlocal tabstop=2
|
|
82
|
+
setlocal expandtab
|
|
83
|
+
setlocal cinoptions=g0,t0,+0,(0,c0,C1
|
|
84
|
+
EOT
|
|
85
|
+
@file.write "setlocal cinwords=#{cinwords.join(',')}\n"
|
|
86
|
+
@file.write <<'EOT'
|
|
87
|
+
setlocal cinkeys=0{,0},!^F,o,O
|
|
88
|
+
setlocal cindent
|
|
89
|
+
|
|
90
|
+
EOT
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def regions
|
|
94
|
+
@optionBlocks.each do |kw|
|
|
95
|
+
single = kw.names.length == 1
|
|
96
|
+
kw.names.each do |name|
|
|
97
|
+
normalizedName = "#{normalize(kw.keyword)}" +
|
|
98
|
+
"#{single ? '' : "_#{name}"}"
|
|
99
|
+
tag = name == 'supplement' ?
|
|
100
|
+
kw.keyword.gsub(/\./, ' ') : name
|
|
101
|
+
@file.write "syn region tjpblk_#{normalizedName}" +
|
|
102
|
+
" start=/^\\s*#{tag}\\s.*{/ end=/^\\s*}/ transparent"
|
|
103
|
+
# We allow properties and special attributes to be folded.
|
|
104
|
+
foldable = %w( task.timesheet project )
|
|
105
|
+
@file.write " fold" if @properties.include?(kw) ||
|
|
106
|
+
foldable.include?(kw.keyword)
|
|
107
|
+
# The header is part of the region. So we must make sure that common
|
|
108
|
+
# parameters and the property/attribute name are contained as well.
|
|
109
|
+
@file.write " contains=@tjpcommon,tjp_#{normalizedName}"
|
|
110
|
+
kw.optionalAttributes.each do |oa|
|
|
111
|
+
tag = normalize(oa.keyword)
|
|
112
|
+
@file.write ",tjp_#{tag}"
|
|
113
|
+
if !oa.optionalAttributes.empty?
|
|
114
|
+
# Option blocks may be contained as block or non-block.
|
|
115
|
+
@file.write ",tjpblk_#{tag}"
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
if name == 'supplement'
|
|
119
|
+
@file.write(',tjp_supplement')
|
|
120
|
+
end
|
|
121
|
+
if !kw.globalScope?
|
|
122
|
+
# Every region but a property and 'project' is contained.
|
|
123
|
+
@file.write " contained"
|
|
124
|
+
end
|
|
125
|
+
@file.puts
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
@file.write <<'EOT'
|
|
130
|
+
syn region tjpblk_macro start=/macro\s\+\h\w*\s*\[/ end=/\]$/ transparent fold contains=ALL
|
|
131
|
+
syn region tjpstring start=/"/ skip=/\\"/ end=/"/
|
|
132
|
+
syn region tjpstring start=/'/ skip=/\\'/ end=/'/
|
|
133
|
+
syn region tjpstring start=/\s-8<-$/ end=/^\s*->8-/
|
|
134
|
+
syn region tjpmlcomment start=+/\*+ end=+\*/+
|
|
135
|
+
|
|
136
|
+
syn sync fromstart
|
|
137
|
+
set foldmethod=syntax
|
|
138
|
+
|
|
139
|
+
EOT
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def keywords
|
|
143
|
+
%w( macro project supplement ).each do |kw|
|
|
144
|
+
@file.puts "syn keyword tjp_#{kw} #{kw} contained"
|
|
145
|
+
end
|
|
146
|
+
@file.puts
|
|
147
|
+
|
|
148
|
+
# Property keywords
|
|
149
|
+
@properties.each do |kw|
|
|
150
|
+
single = kw.names.length == 1
|
|
151
|
+
kw.names.each do |name|
|
|
152
|
+
# Ignore the 'supplement' entries. They are not real properties.
|
|
153
|
+
next if name == 'supplement'
|
|
154
|
+
@file.puts "syn keyword tjp_#{normalize(kw.keyword)}" +
|
|
155
|
+
"#{single ? '' : "_#{name}"} #{name} contained"
|
|
156
|
+
@file.puts "hi def link tjp_#{normalize(kw.keyword)}" +
|
|
157
|
+
"#{single ? '' : "_#{name}"} Function"
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
@file.puts
|
|
161
|
+
|
|
162
|
+
# Attribute keywords
|
|
163
|
+
@attributes.each do |kw|
|
|
164
|
+
next if %w( resourcereport taskreport textreport ).include?(kw.keyword)
|
|
165
|
+
single = kw.names.length == 1
|
|
166
|
+
kw.names.each do |name|
|
|
167
|
+
break if [ '%', '(', '~', 'include', 'macro', 'project',
|
|
168
|
+
'supplement' ].include?(name)
|
|
169
|
+
@file.puts "syn keyword tjp_#{normalize(kw.keyword)}" +
|
|
170
|
+
"#{single ? '' : "_#{name}"} #{name}" +
|
|
171
|
+
"#{kw.globalScope? && !@optionBlocks.include?(kw) ?
|
|
172
|
+
'' : ' contained'}"
|
|
173
|
+
@file.puts "hi def link tjp_#{normalize(kw.keyword)}" +
|
|
174
|
+
"#{single ? '' : "_#{name}"} Type"
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
@file.puts
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def matches
|
|
181
|
+
@file.write <<'EOT'
|
|
182
|
+
syn match tjparg contained /\${.*}/
|
|
183
|
+
syn match tjpcomment /#.*$/
|
|
184
|
+
syn match tjpcomment "//.*$"
|
|
185
|
+
syn match tjpinclude /include.*$/
|
|
186
|
+
syn match tjpnumber /\s[-+]\?\d\+\(\.\d\+\)\?\([hdwmy]\|min\)\?/
|
|
187
|
+
syn match tjpdate /\s\d\{4}-\d\{1,2}-\d\{1,2}\(-\d\{1,2}:\d\{1,2}\(:\d\{1,2}\)\?\(-[-+]\?\d\{4}\)\?\)\?/
|
|
188
|
+
syn match tjptime /\s\d\{1,2}:\d\d\(:\d\d\)\?/
|
|
189
|
+
|
|
190
|
+
syn cluster tjpcommon contains=tjpcomment,tjpdate,tjptime,tjpstring,tjpnumber
|
|
191
|
+
EOT
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def highlights
|
|
195
|
+
@file.write <<'EOT'
|
|
196
|
+
hi def link tjp_macro PreProc
|
|
197
|
+
hi def link tjp_supplement Function
|
|
198
|
+
hi def link tjp_project Function
|
|
199
|
+
hi def link tjpproperty Function
|
|
200
|
+
hi def link tjpattribute Type
|
|
201
|
+
hi def link tjparg Special
|
|
202
|
+
hi def link tjpstring String
|
|
203
|
+
hi def link tjpcomment Comment
|
|
204
|
+
hi def link tjpmlcomment Comment
|
|
205
|
+
hi def link tjpinclude Include
|
|
206
|
+
hi def link tjpdate Constant
|
|
207
|
+
hi def link tjptime Constant
|
|
208
|
+
hi def link tjpnumber Number
|
|
209
|
+
|
|
210
|
+
let b:current_syntax = "tjp"
|
|
211
|
+
|
|
212
|
+
EOT
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def normalize(str)
|
|
216
|
+
str.gsub(/\./, '_')
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
TaskJuggler::VimSyntax.new.generate('tjp.vim')
|
data/lib/daemon/Daemon.rb
CHANGED
|
@@ -14,15 +14,22 @@ require 'LogFile'
|
|
|
14
14
|
|
|
15
15
|
class TaskJuggler
|
|
16
16
|
|
|
17
|
+
# This class provides the basic functionality to turn the current process
|
|
18
|
+
# into a background process (daemon). To use it, derive you main class from
|
|
19
|
+
# this class and call the start() method.
|
|
17
20
|
class Daemon
|
|
18
21
|
|
|
19
22
|
attr_accessor :daemonize
|
|
20
23
|
|
|
21
24
|
def initialize
|
|
25
|
+
# You can set this flag to false to prevent the program from
|
|
26
|
+
# disconnecting from the current terminal. This is useful for debugging
|
|
27
|
+
# purposes.
|
|
22
28
|
@daemonize = true
|
|
23
29
|
@log = LogFile.instance
|
|
24
30
|
end
|
|
25
31
|
|
|
32
|
+
# Call this method to turn the process into a background process.
|
|
26
33
|
def start
|
|
27
34
|
return unless @daemonize
|
|
28
35
|
|
|
@@ -61,6 +68,8 @@ class TaskJuggler
|
|
|
61
68
|
@log.info("The process is running as daemon now with PID #{@pid}")
|
|
62
69
|
end
|
|
63
70
|
|
|
71
|
+
# This method may provide some cleanup functionality in the future. You
|
|
72
|
+
# better call it before you exit.
|
|
64
73
|
def stop
|
|
65
74
|
end
|
|
66
75
|
|
|
@@ -16,22 +16,36 @@ class TaskJuggler
|
|
|
16
16
|
|
|
17
17
|
module ProcessIntercomIface
|
|
18
18
|
|
|
19
|
+
# This function catches all unhandled exceptions in the passed block.
|
|
20
|
+
def trap
|
|
21
|
+
log = LogFile.instance
|
|
22
|
+
|
|
23
|
+
begin
|
|
24
|
+
yield
|
|
25
|
+
rescue
|
|
26
|
+
$stderr.print $!.to_s
|
|
27
|
+
$stderr.print $!.backtrace.join("\n")
|
|
28
|
+
log.debug($!.backtrace.join("\n"))
|
|
29
|
+
log.fatal("Unexpected exception: #{$!}")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
19
33
|
def terminate(authKey)
|
|
20
34
|
return false unless @server.checkKey(authKey, 'terminate')
|
|
21
35
|
|
|
22
|
-
@server.terminate
|
|
36
|
+
trap { @server.terminate }
|
|
23
37
|
end
|
|
24
38
|
|
|
25
39
|
def connect(authKey, stdout, stderr, stdin, silent)
|
|
26
40
|
return false unless @server.checkKey(authKey, 'connect')
|
|
27
41
|
|
|
28
|
-
@server.connect(stdout, stderr, stdin, silent)
|
|
42
|
+
trap { @server.connect(stdout, stderr, stdin, silent) }
|
|
29
43
|
end
|
|
30
44
|
|
|
31
45
|
def disconnect(authKey)
|
|
32
46
|
return false unless @server.checkKey(authKey, 'disconnect')
|
|
33
47
|
|
|
34
|
-
@server.disconnect
|
|
48
|
+
trap { @server.disconnect }
|
|
35
49
|
end
|
|
36
50
|
|
|
37
51
|
end
|
|
@@ -119,7 +133,8 @@ class TaskJuggler
|
|
|
119
133
|
def timerExpired?
|
|
120
134
|
res = nil
|
|
121
135
|
@timeLock.synchronize do
|
|
122
|
-
|
|
136
|
+
# We should see client interaction every 2 minutes.
|
|
137
|
+
res = (Time.new > @timerStart + 2 * 60)
|
|
123
138
|
end
|
|
124
139
|
res
|
|
125
140
|
end
|
data/lib/daemon/ProjectBroker.rb
CHANGED
|
@@ -36,7 +36,8 @@ class TaskJuggler
|
|
|
36
36
|
# daemon.
|
|
37
37
|
class ProjectBroker < Daemon
|
|
38
38
|
|
|
39
|
-
attr_accessor :port, :enableWebServer, :webServerPort,
|
|
39
|
+
attr_accessor :port, :uriFile, :enableWebServer, :webServerPort,
|
|
40
|
+
:projectFiles
|
|
40
41
|
attr_reader :authKey
|
|
41
42
|
|
|
42
43
|
def initialize
|
|
@@ -46,6 +47,8 @@ class TaskJuggler
|
|
|
46
47
|
@authKey = nil
|
|
47
48
|
# The default TCP/IP port. ASCII code decimals for 'T' and 'J'.
|
|
48
49
|
@port = 8474
|
|
50
|
+
# The name of the URI file.
|
|
51
|
+
@uriFile = nil
|
|
49
52
|
# A list of loaded projects as Array of ProjectRecord objects.
|
|
50
53
|
@projects = []
|
|
51
54
|
# We operate with multiple threads so we need a Monitor to synchronize
|
|
@@ -112,6 +115,16 @@ EOT
|
|
|
112
115
|
@log.fatal("Cannot listen on port #{@port}: #{$!}")
|
|
113
116
|
end
|
|
114
117
|
|
|
118
|
+
if @port == 0
|
|
119
|
+
# If the port is set to 0 (any port) we save the ProjectBroker URI in
|
|
120
|
+
# the file .tj3d.uri. tj3client will look for it.
|
|
121
|
+
begin
|
|
122
|
+
File.open(@uriFile, 'w') { |f| f.write @uri }
|
|
123
|
+
rescue
|
|
124
|
+
@log.fatal("Cannot write URI file #{@uriFile}: #{$!}")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
115
128
|
# If project files were specified on the command line, we add them here.
|
|
116
129
|
i = 0
|
|
117
130
|
@projectFiles.each do |project|
|
|
@@ -124,6 +137,16 @@ EOT
|
|
|
124
137
|
|
|
125
138
|
# Cleanup the DRb threads
|
|
126
139
|
DRb.thread.join
|
|
140
|
+
|
|
141
|
+
# If we have created a URI file, we need to delete it again.
|
|
142
|
+
if @port == 0
|
|
143
|
+
begin
|
|
144
|
+
File.delete(@uriFile)
|
|
145
|
+
rescue
|
|
146
|
+
@log.fatal("Cannot delete URI file .tj3d.uri: #{$!}")
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
127
150
|
@log.info('TaskJuggler daemon terminated')
|
|
128
151
|
end
|
|
129
152
|
|
|
@@ -166,10 +189,10 @@ EOT
|
|
|
166
189
|
if @projects.empty?
|
|
167
190
|
"No projects registered\n"
|
|
168
191
|
else
|
|
169
|
-
format = " %3s | %-25s | %-14s | %-20s\n"
|
|
170
|
-
out = sprintf(format, 'No.', 'Project ID', 'Status', '
|
|
171
|
-
|
|
172
|
-
|
|
192
|
+
format = " %3s | %-25s | %-14s | %s | %-20s\n"
|
|
193
|
+
out = sprintf(format, 'No.', 'Project ID', 'Status', 'M',
|
|
194
|
+
'Loaded since')
|
|
195
|
+
out += " #{'-' * 4}+#{'-' * 27}+#{'-' * 16}+#{'-' * 3}+#{'-' * 20}\n"
|
|
173
196
|
@projects.synchronize do
|
|
174
197
|
i = 0
|
|
175
198
|
@projects.each do |project|
|
|
@@ -252,6 +275,19 @@ EOT
|
|
|
252
275
|
[ project.uri, project.authKey ]
|
|
253
276
|
end
|
|
254
277
|
|
|
278
|
+
# Reload all projects that have modified files and are not already being
|
|
279
|
+
# reloaded.
|
|
280
|
+
def update
|
|
281
|
+
@projects.synchronize do
|
|
282
|
+
@projects.each do |project|
|
|
283
|
+
if project.modified && !project.reloading
|
|
284
|
+
project.reloading = true
|
|
285
|
+
@projectsToLoad.push(project.files)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
255
291
|
# Return a list of IDs of projects that are in state :ready.
|
|
256
292
|
def getProjectList
|
|
257
293
|
list = []
|
|
@@ -269,8 +305,19 @@ EOT
|
|
|
269
305
|
|
|
270
306
|
# This is a callback from the ProjectServer process. It's used to update
|
|
271
307
|
# the current state of the ProjectServer in the ProjectRecord list.
|
|
272
|
-
def updateState(authKey,
|
|
308
|
+
def updateState(authKey, filesOrId, state, modified)
|
|
273
309
|
result = false
|
|
310
|
+
if filesOrId.is_a?(Array)
|
|
311
|
+
files = filesOrId
|
|
312
|
+
# Use the name of the master files for now.
|
|
313
|
+
id = files[1]
|
|
314
|
+
elsif filesOrId.is_a?(String)
|
|
315
|
+
id = filesOrId
|
|
316
|
+
files = nil
|
|
317
|
+
else
|
|
318
|
+
id = files = nil
|
|
319
|
+
end
|
|
320
|
+
|
|
274
321
|
@projects.synchronize do
|
|
275
322
|
@projects.each do |project|
|
|
276
323
|
# Don't accept updates for already obsolete entries.
|
|
@@ -279,7 +326,9 @@ EOT
|
|
|
279
326
|
@log.debug("Updating state for #{id} to #{state}")
|
|
280
327
|
# Only update the record that has the matching authKey
|
|
281
328
|
if project.authKey == authKey
|
|
282
|
-
project.id = id
|
|
329
|
+
project.id = id if id
|
|
330
|
+
# An Array of [ workingDir, tjpFile, ... other tji files ]
|
|
331
|
+
project.files = files if files
|
|
283
332
|
|
|
284
333
|
# If the state is being changed from something to :ready, this is
|
|
285
334
|
# now the current project for the project ID.
|
|
@@ -299,6 +348,7 @@ EOT
|
|
|
299
348
|
project.uri = nil if state == :failed
|
|
300
349
|
|
|
301
350
|
project.state = state
|
|
351
|
+
project.modified = modified
|
|
302
352
|
result = true
|
|
303
353
|
break
|
|
304
354
|
end
|
|
@@ -312,56 +362,62 @@ EOT
|
|
|
312
362
|
|
|
313
363
|
def startHousekeeping
|
|
314
364
|
Thread.new do
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
@projects.each do |p|
|
|
332
|
-
if p.state == :obsolete
|
|
333
|
-
termList << p
|
|
334
|
-
elsif p.state == :failed
|
|
335
|
-
# Start removal of entries that didn't parse.
|
|
336
|
-
p.state = :obsolete
|
|
337
|
-
end
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
# And then send them a termination command.
|
|
341
|
-
termList.each { |p| p.terminateServer }
|
|
342
|
-
|
|
343
|
-
# Check every 30 seconds that the ProjectServer processes are
|
|
344
|
-
# still alive. If not, remove them from the list.
|
|
345
|
-
if (cntr += 1) > 30
|
|
365
|
+
begin
|
|
366
|
+
cntr = 0
|
|
367
|
+
loop do
|
|
368
|
+
if @terminate
|
|
369
|
+
# Give the caller a chance to properly terminate the connection.
|
|
370
|
+
sleep 0.5
|
|
371
|
+
@log.debug('Shutting down DRb server')
|
|
372
|
+
DRb.stop_service
|
|
373
|
+
break
|
|
374
|
+
elsif !@projectsToLoad.empty?
|
|
375
|
+
loadProject(@projectsToLoad.pop)
|
|
376
|
+
else
|
|
377
|
+
# Send termination command to all obsolute ProjectServer
|
|
378
|
+
# objects. To minimize the locking of @projects we collect the
|
|
379
|
+
# obsolete items first.
|
|
380
|
+
termList = []
|
|
346
381
|
@projects.synchronize do
|
|
347
382
|
@projects.each do |p|
|
|
348
|
-
|
|
349
|
-
termList << p
|
|
383
|
+
if p.state == :obsolete
|
|
384
|
+
termList << p
|
|
385
|
+
elsif p.state == :failed
|
|
386
|
+
# Start removal of entries that didn't parse.
|
|
387
|
+
p.state = :obsolete
|
|
350
388
|
end
|
|
351
389
|
end
|
|
352
390
|
end
|
|
353
|
-
|
|
354
|
-
|
|
391
|
+
# And then send them a termination command.
|
|
392
|
+
termList.each { |p| p.terminateServer }
|
|
393
|
+
|
|
394
|
+
# Check every 10 seconds that the ProjectServer processes are
|
|
395
|
+
# still alive. If not, remove them from the list.
|
|
396
|
+
if (cntr += 1) > 10
|
|
397
|
+
@projects.synchronize do
|
|
398
|
+
@projects.each do |p|
|
|
399
|
+
unless p.ping
|
|
400
|
+
termList << p unless termList.include?(p)
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
cntr = 0
|
|
405
|
+
end
|
|
355
406
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
407
|
+
# The housekeeping thread rarely needs to so something. Make
|
|
408
|
+
# sure it's sleeping most of the time.
|
|
409
|
+
sleep 1
|
|
359
410
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
411
|
+
# Remove the obsolete records from the @projects list.
|
|
412
|
+
@projects.synchronize do
|
|
413
|
+
@projects.delete_if { |p| termList.include?(p) }
|
|
414
|
+
end
|
|
363
415
|
end
|
|
364
416
|
end
|
|
417
|
+
rescue
|
|
418
|
+
$stderr.print $!.to_s
|
|
419
|
+
$stderr.print $!.backtrace.join("\n")
|
|
420
|
+
@log.fatal("ProjectBroker housekeeping error: #{$!}")
|
|
365
421
|
end
|
|
366
422
|
end
|
|
367
423
|
end
|
|
@@ -378,7 +434,7 @@ EOT
|
|
|
378
434
|
@log.debug("Loading project for tag #{tag}")
|
|
379
435
|
end
|
|
380
436
|
pr = ProjectRecord.new(tag)
|
|
381
|
-
ps = ProjectServer.new(project)
|
|
437
|
+
ps = ProjectServer.new(project, !@daemonize)
|
|
382
438
|
# The ProjectServer can be reached via this DRb URI
|
|
383
439
|
pr.uri = ps.uri
|
|
384
440
|
# Method calls must be authenticated with this key
|
|
@@ -411,27 +467,45 @@ EOT
|
|
|
411
467
|
version == 1 ? 1 : -1
|
|
412
468
|
end
|
|
413
469
|
|
|
470
|
+
# This function catches all unhandled exceptions in the passed block.
|
|
471
|
+
def trap
|
|
472
|
+
log = LogFile.instance
|
|
473
|
+
|
|
474
|
+
begin
|
|
475
|
+
yield
|
|
476
|
+
rescue
|
|
477
|
+
$stderr.print $!.to_s
|
|
478
|
+
$stderr.print $!.backtrace.join("\n")
|
|
479
|
+
log.debug($!.backtrace.join("\n"))
|
|
480
|
+
log.fatal("Unexpected exception: #{$!}")
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
414
484
|
def command(authKey, cmd, args)
|
|
415
485
|
return false unless @broker.checkKey(authKey, cmd)
|
|
416
486
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
487
|
+
trap do
|
|
488
|
+
case cmd
|
|
489
|
+
when :status
|
|
490
|
+
@broker.status
|
|
491
|
+
when :stop
|
|
492
|
+
@broker.stop
|
|
493
|
+
when :addProject
|
|
494
|
+
@broker.addProject
|
|
495
|
+
when :removeProject
|
|
496
|
+
@broker.removeProject(args)
|
|
497
|
+
when :getProject
|
|
498
|
+
@broker.getProject(args)
|
|
499
|
+
when :update
|
|
500
|
+
@broker.update
|
|
501
|
+
else
|
|
502
|
+
LogFile.instance.fatal('Unknown command #{cmd} called')
|
|
503
|
+
end
|
|
430
504
|
end
|
|
431
505
|
end
|
|
432
506
|
|
|
433
|
-
def updateState(authKey, id, status)
|
|
434
|
-
@broker.updateState(authKey, id, status)
|
|
507
|
+
def updateState(authKey, id, status, modified)
|
|
508
|
+
trap { @broker.updateState(authKey, id, status, modified) }
|
|
435
509
|
end
|
|
436
510
|
|
|
437
511
|
end
|
|
@@ -440,13 +514,16 @@ EOT
|
|
|
440
514
|
# one entry for each project in the @projects list.
|
|
441
515
|
class ProjectRecord < Monitor
|
|
442
516
|
|
|
443
|
-
attr_accessor :authKey, :uri, :id, :state, :readySince
|
|
517
|
+
attr_accessor :authKey, :uri, :files, :id, :state, :readySince, :modified,
|
|
518
|
+
:reloading
|
|
444
519
|
attr_reader :tag
|
|
445
520
|
|
|
446
521
|
def initialize(tag)
|
|
447
522
|
# Before we know the project ID we use this tag to uniquely identify the
|
|
448
523
|
# project.
|
|
449
524
|
@tag = tag
|
|
525
|
+
# Array of [ workingDir, tjp file, ... tji files ]
|
|
526
|
+
@files = nil
|
|
450
527
|
# The authentication key for the ProjectServer process.
|
|
451
528
|
@authKey = nil
|
|
452
529
|
# The DRb URI where the ProjectServer process is listening.
|
|
@@ -458,6 +535,10 @@ EOT
|
|
|
458
535
|
@state = :new
|
|
459
536
|
# A time stamp when the project became ready for service.
|
|
460
537
|
@readySince = nil
|
|
538
|
+
# True if any of the input files have been modified after the load.
|
|
539
|
+
@modified = false
|
|
540
|
+
# True if the reload has already been triggered.
|
|
541
|
+
@reloading = false
|
|
461
542
|
|
|
462
543
|
@log = LogFile.instance
|
|
463
544
|
@projectServer = nil
|
|
@@ -466,7 +547,7 @@ EOT
|
|
|
466
547
|
def ping
|
|
467
548
|
return true unless @uri
|
|
468
549
|
|
|
469
|
-
@log.debug("Sending ping to
|
|
550
|
+
@log.debug("Sending ping to ProjectServer #{@uri}")
|
|
470
551
|
begin
|
|
471
552
|
@projectServer = DRbObject.new(nil, @uri) unless @projectServer
|
|
472
553
|
@projectServer.ping(@authKey)
|
|
@@ -482,7 +563,7 @@ EOT
|
|
|
482
563
|
return unless @uri
|
|
483
564
|
|
|
484
565
|
begin
|
|
485
|
-
@log.debug("Sending termination request to
|
|
566
|
+
@log.debug("Sending termination request to ProjectServer #{@uri}")
|
|
486
567
|
@projectServer = DRbObject.new(nil, @uri) unless @projectServer
|
|
487
568
|
@projectServer.terminate(@authKey)
|
|
488
569
|
rescue
|
|
@@ -493,7 +574,7 @@ EOT
|
|
|
493
574
|
|
|
494
575
|
# This is used to generate the status table.
|
|
495
576
|
def to_s(format, index)
|
|
496
|
-
sprintf(format, index, @id, @state,
|
|
577
|
+
sprintf(format, index, @id, @state, @modified ? '*' : ' ',
|
|
497
578
|
@readySince ? @readySince.to_s('%Y-%m-%d %H:%M:%S') : '')
|
|
498
579
|
end
|
|
499
580
|
|