taskjuggler 0.0.5 → 0.0.6
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 +2086 -0
- data/benchmarks/666tasks.tjp +3183 -0
- data/benchmarks/booking.tjp +14 -10
- data/doc/AppConfig.html +95 -73
- data/doc/Arguments.html +22 -2
- data/doc/CHANGELOG.html +2587 -0
- data/doc/COPYING.html +21 -1
- data/doc/Object.html +161 -122
- data/doc/README.html +21 -1
- data/doc/RuntimeConfig.html +26 -6
- data/doc/String.html +38 -18
- data/doc/StringIO.html +579 -0
- data/doc/TaskJuggler.html +251 -143
- data/doc/TaskJuggler/Account.html +26 -6
- data/doc/TaskJuggler/AccountAttribute.html +28 -8
- data/doc/TaskJuggler/AccountScenario.html +24 -4
- data/doc/TaskJuggler/Allocation.html +30 -10
- data/doc/TaskJuggler/AllocationAttribute.html +28 -8
- data/doc/TaskJuggler/AttributeBase.html +46 -26
- data/doc/TaskJuggler/AttributeDefinition.html +22 -2
- data/doc/TaskJuggler/BatchProcessor.html +40 -20
- data/doc/TaskJuggler/Booking.html +26 -6
- data/doc/TaskJuggler/BookingListAttribute.html +28 -8
- data/doc/TaskJuggler/BooleanAttribute.html +28 -8
- data/doc/TaskJuggler/CSVFile.html +308 -146
- data/doc/TaskJuggler/CellSettingPattern.html +22 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
- data/doc/TaskJuggler/Charge.html +26 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
- data/doc/TaskJuggler/ChargeSet.html +33 -13
- data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
- data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
- data/doc/TaskJuggler/ColumnTable.html +24 -4
- data/doc/TaskJuggler/Daemon.html +26 -6
- data/doc/TaskJuggler/DateAttribute.html +26 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
- data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
- data/doc/TaskJuggler/DurationAttribute.html +28 -8
- data/doc/TaskJuggler/FixnumAttribute.html +24 -4
- data/doc/TaskJuggler/FlagListAttribute.html +28 -8
- data/doc/TaskJuggler/FloatAttribute.html +26 -6
- data/doc/TaskJuggler/FormatListAttribute.html +24 -4
- data/doc/TaskJuggler/GanttChart.html +147 -126
- data/doc/TaskJuggler/GanttContainer.html +34 -14
- data/doc/TaskJuggler/GanttHeader.html +28 -8
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
- data/doc/TaskJuggler/GanttLine.html +38 -18
- data/doc/TaskJuggler/GanttLoadStack.html +26 -6
- data/doc/TaskJuggler/GanttMilestone.html +34 -14
- data/doc/TaskJuggler/GanttRouter.html +50 -30
- data/doc/TaskJuggler/GanttTaskBar.html +34 -14
- data/doc/TaskJuggler/HTMLDocument.html +26 -6
- data/doc/TaskJuggler/HTMLGraphics.html +30 -10
- data/doc/TaskJuggler/Interval.html +40 -22
- data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
- data/doc/TaskJuggler/JobInfo.html +24 -4
- data/doc/TaskJuggler/Journal.html +226 -147
- data/doc/TaskJuggler/JournalEntry.html +22 -2
- data/doc/TaskJuggler/JournalEntryList.html +129 -112
- data/doc/TaskJuggler/KeywordArray.html +26 -6
- data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
- data/doc/TaskJuggler/Limits.html +152 -123
- data/doc/TaskJuggler/Limits/Limit.html +149 -70
- data/doc/TaskJuggler/LimitsAttribute.html +36 -51
- data/doc/TaskJuggler/ListAttributeBase.html +24 -4
- data/doc/TaskJuggler/Log.html +50 -32
- data/doc/TaskJuggler/LogFile.html +37 -17
- data/doc/TaskJuggler/LogicalAttribute.html +53 -33
- data/doc/TaskJuggler/LogicalExpression.html +26 -6
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
- data/doc/TaskJuggler/LogicalFlag.html +42 -22
- data/doc/TaskJuggler/LogicalFunction.html +204 -140
- data/doc/TaskJuggler/LogicalOperation.html +135 -111
- data/doc/TaskJuggler/Macro.html +22 -2
- data/doc/TaskJuggler/MacroParser.html +32 -12
- data/doc/TaskJuggler/MacroTable.html +32 -12
- data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
- data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
- data/doc/TaskJuggler/Message.html +24 -4
- data/doc/TaskJuggler/MessageHandler.html +24 -4
- data/doc/TaskJuggler/Navigator.html +104 -71
- data/doc/TaskJuggler/NavigatorElement.html +32 -12
- data/doc/TaskJuggler/NikuProject.html +22 -2
- data/doc/TaskJuggler/NikuReport.html +310 -228
- data/doc/TaskJuggler/NikuResource.html +22 -2
- data/doc/TaskJuggler/NodeListAttribute.html +615 -0
- data/doc/TaskJuggler/OnShiftCache.html +32 -12
- data/doc/TaskJuggler/ProcessIntercom.html +205 -78
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
- data/doc/TaskJuggler/Project.html +708 -660
- data/doc/TaskJuggler/ProjectBroker.html +506 -304
- data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
- data/doc/TaskJuggler/ProjectFileParser.html +429 -373
- data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
- data/doc/TaskJuggler/ProjectRecord.html +80 -60
- data/doc/TaskJuggler/ProjectServer.html +312 -237
- data/doc/TaskJuggler/ProjectServerIface.html +101 -43
- data/doc/TaskJuggler/PropertyAttribute.html +32 -12
- data/doc/TaskJuggler/PropertyList.html +166 -145
- data/doc/TaskJuggler/PropertySet.html +254 -224
- data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
- data/doc/TaskJuggler/Query.html +169 -148
- data/doc/TaskJuggler/RTFHandlers.html +622 -0
- data/doc/TaskJuggler/RTFNavigator.html +28 -8
- data/doc/TaskJuggler/RTFQuery.html +40 -20
- data/doc/TaskJuggler/RTFReport.html +62 -25
- data/doc/TaskJuggler/RTFReportLink.html +765 -0
- data/doc/TaskJuggler/RealFormat.html +26 -6
- data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
- data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
- data/doc/TaskJuggler/Report.html +402 -251
- data/doc/TaskJuggler/ReportBase.html +162 -137
- data/doc/TaskJuggler/ReportContext.html +112 -29
- data/doc/TaskJuggler/ReportServer.html +89 -64
- data/doc/TaskJuggler/ReportServerIface.html +75 -55
- data/doc/TaskJuggler/ReportServerRecord.html +54 -31
- data/doc/TaskJuggler/ReportServlet.html +980 -0
- data/doc/TaskJuggler/ReportTable.html +41 -21
- data/doc/TaskJuggler/ReportTableCell.html +214 -170
- data/doc/TaskJuggler/ReportTableColumn.html +30 -10
- data/doc/TaskJuggler/ReportTableLegend.html +36 -16
- data/doc/TaskJuggler/ReportTableLine.html +32 -12
- data/doc/TaskJuggler/Resource.html +99 -87
- data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
- data/doc/TaskJuggler/ResourceListRE.html +47 -26
- data/doc/TaskJuggler/ResourceScenario.html +403 -437
- data/doc/TaskJuggler/RichText.html +26 -6
- data/doc/TaskJuggler/RichTextAttribute.html +50 -30
- data/doc/TaskJuggler/RichTextDocument.html +37 -17
- data/doc/TaskJuggler/RichTextElement.html +475 -413
- data/doc/TaskJuggler/RichTextException.html +22 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
- data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
- data/doc/TaskJuggler/RichTextImage.html +22 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
- data/doc/TaskJuggler/RichTextParser.html +56 -34
- data/doc/TaskJuggler/RichTextScanner.html +82 -61
- data/doc/TaskJuggler/RichTextSnip.html +34 -14
- data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
- data/doc/TaskJuggler/Scenario.html +22 -2
- data/doc/TaskJuggler/ScenarioData.html +30 -46
- data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
- data/doc/TaskJuggler/Scoreboard.html +42 -22
- data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
- data/doc/TaskJuggler/SheetReceiver.html +333 -295
- data/doc/TaskJuggler/SheetSender.html +253 -230
- data/doc/TaskJuggler/Shift.html +26 -6
- data/doc/TaskJuggler/ShiftAssignment.html +89 -73
- data/doc/TaskJuggler/ShiftAssignments.html +226 -234
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
- data/doc/TaskJuggler/ShiftScenario.html +28 -8
- data/doc/TaskJuggler/SortListAttribute.html +34 -14
- data/doc/TaskJuggler/SourceFileInfo.html +24 -4
- data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
- data/doc/TaskJuggler/StatusSheetReport.html +168 -153
- data/doc/TaskJuggler/StatusSheetSender.html +24 -3
- data/doc/TaskJuggler/StringAttribute.html +38 -18
- data/doc/TaskJuggler/SymbolAttribute.html +32 -12
- data/doc/TaskJuggler/SyntaxReference.html +40 -20
- data/doc/TaskJuggler/TOCEntry.html +26 -6
- data/doc/TaskJuggler/TSResourceRecord.html +22 -2
- data/doc/TaskJuggler/TSTaskRecord.html +22 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
- data/doc/TaskJuggler/TableOfContents.html +26 -6
- data/doc/TaskJuggler/TableReport.html +937 -904
- data/doc/TaskJuggler/Task.html +55 -36
- data/doc/TaskJuggler/TaskDependency.html +24 -4
- data/doc/TaskJuggler/TaskListAttribute.html +50 -30
- data/doc/TaskJuggler/TaskListRE.html +27 -7
- data/doc/TaskJuggler/TaskScenario.html +1273 -1153
- data/doc/TaskJuggler/TextFormatter.html +28 -8
- data/doc/TaskJuggler/TextParser.html +585 -338
- data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
- data/doc/TaskJuggler/TextParser/Rule.html +95 -73
- data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
- data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
- data/doc/TaskJuggler/TextReport.html +28 -8
- data/doc/TaskJuggler/TextScanner.html +400 -1404
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
- data/doc/TaskJuggler/TimeSheet.html +48 -28
- data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
- data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
- data/doc/TaskJuggler/TimeSheetReport.html +154 -133
- data/doc/TaskJuggler/TimeSheetSender.html +24 -3
- data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
- data/doc/TaskJuggler/TimeSheets.html +26 -6
- data/doc/TaskJuggler/Tj3AppBase.html +85 -58
- data/doc/TaskJuggler/Tj3Client.html +292 -238
- data/doc/TaskJuggler/Tj3Daemon.html +159 -74
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
- data/doc/TaskJuggler/Tj3SsSender.html +53 -26
- data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
- data/doc/TaskJuggler/Tj3TsSender.html +26 -6
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
- data/doc/TaskJuggler/TjException.html +22 -2
- data/doc/TaskJuggler/TjTime.html +216 -160
- data/doc/TaskJuggler/TjpExample.html +34 -14
- data/doc/TaskJuggler/TjpExportRE.html +403 -407
- data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
- data/doc/TaskJuggler/URLParameter.html +649 -0
- data/doc/TaskJuggler/UserManual.html +42 -22
- data/doc/TaskJuggler/WebServer.html +702 -0
- data/doc/TaskJuggler/WorkingHours.html +38 -18
- data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
- data/doc/TaskJuggler/XMLBlob.html +24 -4
- data/doc/TaskJuggler/XMLComment.html +24 -4
- data/doc/TaskJuggler/XMLDocument.html +30 -10
- data/doc/TaskJuggler/XMLElement.html +34 -14
- data/doc/TaskJuggler/XMLNamedText.html +22 -2
- data/doc/TaskJuggler/XMLText.html +24 -4
- data/doc/index.html +1841 -1666
- 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 +2 -2
- data/doc/lib/AttributeBase_rb.html +1 -1
- data/doc/lib/AttributeDefinition_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +2 -2
- 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/HTMLDocument_rb.html +1 -1
- data/doc/lib/Interval_rb.html +1 -1
- data/doc/lib/Journal_rb.html +2 -2
- data/doc/lib/KeywordArray_rb.html +1 -1
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/Limits_rb.html +2 -2
- data/doc/lib/LogFile_rb.html +2 -2
- data/doc/lib/Log_rb.html +1 -1
- data/doc/lib/LogicalExpression_rb.html +1 -1
- data/doc/lib/LogicalFunction_rb.html +2 -2
- data/doc/lib/LogicalOperation_rb.html +2 -2
- data/doc/lib/MacroParser_rb.html +1 -1
- data/doc/lib/MacroTable_rb.html +1 -1
- data/doc/lib/MessageHandler_rb.html +1 -1
- data/doc/lib/Message_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +4 -8
- data/doc/lib/ProjectFileScanner_rb.html +67 -0
- data/doc/lib/Project_rb.html +2 -2
- data/doc/lib/PropertyList_rb.html +2 -2
- data/doc/lib/PropertySet_rb.html +2 -2
- data/doc/lib/PropertyTreeNode_rb.html +2 -2
- data/doc/lib/Query_rb.html +2 -2
- data/doc/lib/RTFHandlers_rb.html +73 -0
- data/doc/lib/RTFNavigator_rb.html +1 -1
- data/doc/lib/RTFQuery_rb.html +1 -1
- data/doc/lib/RTFReportLink_rb.html +71 -0
- data/doc/lib/RTFReport_rb.html +2 -2
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +2 -2
- data/doc/lib/Resource_rb.html +2 -2
- data/doc/lib/RichTextDocument_rb.html +1 -1
- data/doc/lib/RichTextElement_rb.html +2 -2
- data/doc/lib/RichTextFunctionExample_rb.html +1 -1
- data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +2 -2
- data/doc/lib/RichTextScanner_rb.html +2 -2
- data/doc/lib/RichTextSnip_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
- data/doc/lib/RichText_rb.html +1 -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 +1 -1
- data/doc/lib/SheetReceiver_rb.html +2 -2
- data/doc/lib/SheetSender_rb.html +4 -2
- data/doc/lib/ShiftAssignments_rb.html +4 -2
- data/doc/lib/ShiftScenario_rb.html +1 -1
- data/doc/lib/Shift_rb.html +1 -1
- data/doc/lib/SourceFileInfo_rb.html +1 -1
- data/doc/lib/StatusSheetReceiver_rb.html +2 -2
- data/doc/lib/StatusSheetSender_rb.html +2 -2
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TOCEntry_rb.html +1 -1
- data/doc/lib/TableColumnDefinition_rb.html +2 -2
- data/doc/lib/TableOfContents_rb.html +1 -1
- data/doc/lib/TaskDependency_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +2 -2
- data/doc/lib/TaskScenario_rb.html +2 -2
- data/doc/lib/Task_rb.html +2 -2
- data/doc/lib/TextFormatter_rb.html +1 -1
- data/doc/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/TextParser/Rule_rb.html +2 -2
- data/doc/lib/TextParser/StackElement_rb.html +2 -2
- data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/TextParser_rb.html +2 -2
- data/doc/lib/TextScanner_rb.html +6 -2
- data/doc/lib/TimeSheetReceiver_rb.html +2 -2
- data/doc/lib/TimeSheetSender_rb.html +2 -2
- data/doc/lib/TimeSheetSummary_rb.html +2 -2
- data/doc/lib/TimeSheets_rb.html +2 -2
- data/doc/lib/Tj3AppBase_rb.html +2 -2
- data/doc/lib/Tj3Config_rb.html +2 -2
- data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
- data/doc/lib/TjException_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +2 -2
- data/doc/lib/TjpExample_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +2 -2
- data/doc/lib/URLParameter_rb.html +67 -0
- data/doc/lib/UTF8String_rb.html +1 -1
- data/doc/lib/UserManual_rb.html +1 -1
- data/doc/lib/WorkingHours_rb.html +1 -1
- data/doc/lib/XMLDocument_rb.html +2 -2
- data/doc/lib/XMLElement_rb.html +1 -1
- data/doc/lib/daemon/Daemon_rb.html +1 -1
- data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
- data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
- data/doc/lib/daemon/ProjectServer_rb.html +2 -2
- data/doc/lib/daemon/ReportServer_rb.html +2 -2
- data/doc/lib/daemon/WebServer_rb.html +75 -0
- data/doc/lib/deep_copy_rb.html +2 -2
- data/doc/lib/reports/CSVFile_rb.html +2 -2
- data/doc/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/reports/GanttChart_rb.html +2 -2
- 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 +2 -2
- data/doc/lib/reports/NikuReport_rb.html +2 -2
- data/doc/lib/reports/ReportBase_rb.html +2 -2
- data/doc/lib/reports/ReportContext_rb.html +2 -2
- data/doc/lib/reports/ReportTableCell_rb.html +2 -2
- 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 +2 -2
- data/doc/lib/reports/Report_rb.html +2 -2
- data/doc/lib/reports/ResourceListRE_rb.html +2 -2
- data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
- data/doc/lib/reports/TableReport_rb.html +2 -2
- data/doc/lib/reports/TaskListRE_rb.html +2 -2
- data/doc/lib/reports/TextReport_rb.html +1 -1
- data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
- data/doc/lib/reports/TjpExportRE_rb.html +2 -2
- data/doc/lib/ruby-signal-bug_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +2 -2
- data/doc/lib/tj3client_rb.html +2 -2
- data/doc/lib/tj3d_rb.html +2 -2
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +2 -2
- data/doc/lib/tj3ts_receiver_rb.html +2 -2
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/doc/rdoc.css +9 -4
- data/examples/tutorial.tjp +17 -15
- data/gem_spec.rb +3 -0
- data/lib/AppConfig.rb +3 -1
- data/lib/Attributes.rb +10 -8
- data/lib/Journal.rb +55 -20
- data/lib/Limits.rb +72 -46
- data/lib/LogFile.rb +3 -3
- data/lib/LogicalFunction.rb +19 -6
- data/lib/LogicalOperation.rb +5 -1
- data/lib/Project.rb +37 -9
- data/lib/ProjectFileParser.rb +25 -22
- data/lib/ProjectFileScanner.rb +365 -0
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +14 -4
- data/lib/PropertyTreeNode.rb +42 -29
- data/lib/Query.rb +3 -1
- data/lib/RTFHandlers.rb +35 -0
- data/lib/RTFReport.rb +23 -6
- data/lib/RTFReportLink.rb +72 -0
- data/lib/Resource.rb +8 -16
- data/lib/ResourceScenario.rb +1 -22
- data/lib/RichTextElement.rb +42 -0
- data/lib/RichTextParser.rb +6 -4
- data/lib/RichTextScanner.rb +5 -5
- data/lib/RichTextSyntaxRules.rb +48 -10
- data/lib/ScenarioData.rb +5 -3
- data/lib/SheetReceiver.rb +24 -6
- data/lib/SheetSender.rb +17 -13
- data/lib/ShiftAssignments.rb +56 -52
- data/lib/StatusSheetReceiver.rb +1 -0
- data/lib/StatusSheetSender.rb +1 -0
- data/lib/TableColumnDefinition.rb +4 -2
- data/lib/Task.rb +8 -9
- data/lib/TaskJuggler.rb +21 -11
- data/lib/TaskScenario.rb +61 -26
- data/lib/TextParser.rb +268 -106
- data/lib/TextParser/Rule.rb +4 -2
- data/lib/TextParser/StackElement.rb +6 -4
- data/lib/TextScanner.rb +283 -700
- data/lib/TimeSheetReceiver.rb +1 -0
- data/lib/TimeSheetSender.rb +1 -0
- data/lib/TimeSheetSummary.rb +51 -26
- data/lib/TimeSheets.rb +1 -1
- data/lib/Tj3AppBase.rb +8 -1
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +5 -0
- data/lib/TjpSyntaxRules.rb +360 -144
- data/lib/URLParameter.rb +30 -0
- data/lib/XMLDocument.rb +2 -2
- data/lib/daemon/ProcessIntercom.rb +50 -9
- data/lib/daemon/ProjectBroker.rb +63 -10
- data/lib/daemon/ProjectServer.rb +47 -16
- data/lib/daemon/ReportServer.rb +9 -4
- data/lib/daemon/WebServer.rb +204 -0
- data/lib/deep_copy.rb +4 -1
- data/lib/reports/CSVFile.rb +150 -66
- data/lib/reports/GanttChart.rb +2 -1
- data/lib/reports/Navigator.rb +18 -5
- data/lib/reports/NikuReport.rb +32 -2
- data/lib/reports/Report.rb +65 -37
- data/lib/reports/ReportBase.rb +14 -9
- data/lib/reports/ReportContext.rb +19 -4
- data/lib/reports/ReportTable.rb +2 -2
- data/lib/reports/ReportTableCell.rb +54 -30
- data/lib/reports/ResourceListRE.rb +4 -3
- data/lib/reports/StatusSheetReport.rb +8 -13
- data/lib/reports/TableReport.rb +47 -32
- data/lib/reports/TaskListRE.rb +3 -3
- data/lib/reports/TimeSheetReport.rb +14 -5
- data/lib/reports/TjpExportRE.rb +14 -19
- data/lib/taskjuggler3.rb +15 -0
- data/lib/tj3client.rb +9 -7
- data/lib/tj3d.rb +38 -10
- data/lib/tj3ss_sender.rb +7 -0
- data/lib/tj3ts_receiver.rb +1 -0
- data/manual/Day_To_Day_Juggling +1 -1
- data/manual/Rich_Text_Attributes +8 -0
- data/manual/TaskJuggler_2x_Migration +7 -0
- data/manual/The_TaskJuggler_Syntax +20 -6
- data/prj_cfg.rb +3 -2
- data/tasks/changelog.rake +36 -0
- data/tasks/csts.rake +2 -3
- data/tasks/gem.rake +10 -0
- data/tasks/missing.rake +0 -17
- data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
- data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
- data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
- data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
- data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
- data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
- data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
- data/test/TestSuite/StatusSheets/run +3 -2
- data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
- data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
- data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
- data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
- data/test/TestSuite/TimeSheets/run +5 -5
- data/test/test_CSVFile.rb +75 -0
- data/test/test_Limits.rb +63 -5
- data/test/test_ProjectFileScanner.rb +163 -0
- data/test/test_ReportGenerator.rb +81 -0
- data/test/test_RichText.rb +21 -3
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +4 -4
- data/test/test_Syntax.rb +1 -1
- data/test/test_URLParameter.rb +30 -0
- metadata +126 -32
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
- data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
- data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
- data/test/TestSuite/TimeSheets/receiver.log +0 -102
- data/test/TestSuite/TimeSheets/sender.log +0 -794
- data/test/TestSuite/TimeSheets/summary.log +0 -884
- data/test/TestSuite/TimeSheets/timesheets.log +0 -45
- data/test/TestSuite/TimeSheets/tj3d.log +0 -292
- data/test/test_TextScanner.rb +0 -95
data/lib/reports/GanttChart.rb
CHANGED
data/lib/reports/Navigator.rb
CHANGED
|
@@ -127,23 +127,36 @@ class TaskJuggler
|
|
|
127
127
|
# Generate an output format independant version of the navigator. This is
|
|
128
128
|
# a tree of NavigatorElement objects.
|
|
129
129
|
def generate(reports, reportRoot, parentElement)
|
|
130
|
-
|
|
130
|
+
reportDef = @project.reportContexts.last.report
|
|
131
|
+
raise "Report context missing" unless reportDef
|
|
131
132
|
|
|
133
|
+
interactive = false
|
|
132
134
|
reports.each do |report|
|
|
135
|
+
# The outermost (top-level) report determines whether the report
|
|
136
|
+
# should be rendered interactive or not.
|
|
137
|
+
interactive = report.interactive? unless interactive
|
|
138
|
+
|
|
133
139
|
hasURL = report.get('formats').include?(:html)
|
|
140
|
+
# Only generate menu entries for reports that are not the reportRoot,
|
|
141
|
+
# that are leaf reports and have an HTML output format.
|
|
134
142
|
next if (report.parent != reportRoot) ||
|
|
135
143
|
(report.leaf? && !hasURL)
|
|
136
144
|
|
|
137
145
|
label = report.get('title') || report.name
|
|
138
146
|
# Determine the URL for this element.
|
|
139
147
|
if hasURL
|
|
140
|
-
|
|
141
|
-
|
|
148
|
+
if interactive
|
|
149
|
+
url = "/taskjuggler?project=#{report.project['projectid']};" +
|
|
150
|
+
"report=#{report.fullId}"
|
|
151
|
+
else
|
|
152
|
+
url = report.name + '.html'
|
|
153
|
+
url = normalizeURL(url, reportDef.name)
|
|
154
|
+
end
|
|
142
155
|
end
|
|
143
156
|
parentElement.elements <<
|
|
144
157
|
(element = NavigatorElement.new(parentElement, label, url))
|
|
145
158
|
|
|
146
|
-
if report ==
|
|
159
|
+
if report == reportDef
|
|
147
160
|
element.currentUrl = url
|
|
148
161
|
# Mark this element and all its parents as current.
|
|
149
162
|
nEl = element
|
|
@@ -172,7 +185,7 @@ class TaskJuggler
|
|
|
172
185
|
list.setSorting([[ 'seqno', true, -1 ]])
|
|
173
186
|
list.sort!
|
|
174
187
|
# Remove all reports that the user doesn't want to have include.
|
|
175
|
-
query = @project.
|
|
188
|
+
query = @project.reportContexts.last.query.dup
|
|
176
189
|
query.scopeProperty = nil
|
|
177
190
|
list.delete_if do |property|
|
|
178
191
|
query.property = property
|
data/lib/reports/NikuReport.rb
CHANGED
|
@@ -193,6 +193,35 @@ EOT
|
|
|
193
193
|
xml.to_s
|
|
194
194
|
end
|
|
195
195
|
|
|
196
|
+
def to_csv
|
|
197
|
+
table = []
|
|
198
|
+
# Header line with project names
|
|
199
|
+
table << (row = [])
|
|
200
|
+
# First column is the resource name and ID.
|
|
201
|
+
row << ""
|
|
202
|
+
@projects.each_key do |projectId|
|
|
203
|
+
row << @projects[projectId].name
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Header line with project IDs
|
|
207
|
+
table << (row = [])
|
|
208
|
+
row << "Resource"
|
|
209
|
+
@projects.each_key do |projectId|
|
|
210
|
+
row << projectId
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
@resourcesTotalEffort.each_key do |resourceId|
|
|
214
|
+
# Add one line per resource.
|
|
215
|
+
table << (row = [])
|
|
216
|
+
row << "#{@resources[resourceId].name} (#{resourceId})"
|
|
217
|
+
@projects.each_key do |projectId|
|
|
218
|
+
row << sum(projectId, resourceId)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
table
|
|
223
|
+
end
|
|
224
|
+
|
|
196
225
|
private
|
|
197
226
|
|
|
198
227
|
def sum(projectId, resourceId)
|
|
@@ -250,7 +279,8 @@ EOT
|
|
|
250
279
|
resourceList.setSorting(@report.get('sortResources'))
|
|
251
280
|
resourceList = filterResourceList(resourceList, nil,
|
|
252
281
|
@report.get('hideResource'),
|
|
253
|
-
@report.get('rollupResource')
|
|
282
|
+
@report.get('rollupResource'),
|
|
283
|
+
@report.get('openNodes'))
|
|
254
284
|
|
|
255
285
|
resourceList.each do |resource|
|
|
256
286
|
# We only care about leaf resources that have the custom attribute
|
|
@@ -307,7 +337,7 @@ EOT
|
|
|
307
337
|
taskList = PropertyList.new(@project.tasks)
|
|
308
338
|
taskList.setSorting(@report.get('sortTasks'))
|
|
309
339
|
taskList = filterTaskList(taskList, nil, @report.get('hideTask'),
|
|
310
|
-
@report.get('rollupTask'))
|
|
340
|
+
@report.get('rollupTask'), @report.get('openNodes'))
|
|
311
341
|
|
|
312
342
|
|
|
313
343
|
taskList.each do |task|
|
data/lib/reports/Report.rb
CHANGED
|
@@ -47,6 +47,34 @@ class TaskJuggler
|
|
|
47
47
|
# report defined by all the class attributes and report elements is
|
|
48
48
|
# generated according the the requested output format(s).
|
|
49
49
|
def generate
|
|
50
|
+
begin
|
|
51
|
+
generateIntermediateFormat
|
|
52
|
+
|
|
53
|
+
# Then generate the actual output format.
|
|
54
|
+
get('formats').each do |format|
|
|
55
|
+
case format
|
|
56
|
+
when :html
|
|
57
|
+
generateHTML
|
|
58
|
+
copyAuxiliaryFiles
|
|
59
|
+
when :csv
|
|
60
|
+
generateCSV
|
|
61
|
+
when :niku
|
|
62
|
+
generateNiku
|
|
63
|
+
when :tjp
|
|
64
|
+
generateTJP
|
|
65
|
+
else
|
|
66
|
+
raise 'Unknown report output format #{format}.'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
rescue TjException
|
|
70
|
+
error('reporting_failed', $!.message)
|
|
71
|
+
end
|
|
72
|
+
0
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Generate an output format agnostic version that can later be turned into
|
|
76
|
+
# the respective output formats.
|
|
77
|
+
def generateIntermediateFormat
|
|
50
78
|
begin
|
|
51
79
|
@content = nil
|
|
52
80
|
case @typeSpec
|
|
@@ -71,27 +99,9 @@ class TaskJuggler
|
|
|
71
99
|
# Most output format can be generated from a common intermediate
|
|
72
100
|
# representation of the elements. We generate that IR first.
|
|
73
101
|
@content.generateIntermediateFormat if @content
|
|
74
|
-
|
|
75
|
-
# Then generate the actual output format.
|
|
76
|
-
get('formats').each do |format|
|
|
77
|
-
case format
|
|
78
|
-
when :html
|
|
79
|
-
generateHTML
|
|
80
|
-
copyAuxiliaryFiles
|
|
81
|
-
when :csv
|
|
82
|
-
generateCSV
|
|
83
|
-
when :niku
|
|
84
|
-
generateNiku
|
|
85
|
-
when :tjp
|
|
86
|
-
generateTJP
|
|
87
|
-
else
|
|
88
|
-
raise 'Unknown report output format #{format}.'
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
102
|
rescue TjException
|
|
92
|
-
error('
|
|
103
|
+
error('report_IR_generattion_failed', $!.message)
|
|
93
104
|
end
|
|
94
|
-
0
|
|
95
105
|
end
|
|
96
106
|
|
|
97
107
|
# Render the content of the report as HTML (without the framing).
|
|
@@ -99,6 +109,12 @@ class TaskJuggler
|
|
|
99
109
|
@content ? @content.to_html : nil
|
|
100
110
|
end
|
|
101
111
|
|
|
112
|
+
# Return true if the report should be rendered in the interactive version,
|
|
113
|
+
# false if not. The top-level report defines the output format and the
|
|
114
|
+
# interactive setting.
|
|
115
|
+
def interactive?
|
|
116
|
+
@project.reportContexts.first.report.get('interactive')
|
|
117
|
+
end
|
|
102
118
|
|
|
103
119
|
private
|
|
104
120
|
# Convenience function to access a report attribute
|
|
@@ -114,14 +130,10 @@ class TaskJuggler
|
|
|
114
130
|
'keywords' => 'taskjuggler, project, management')
|
|
115
131
|
if a('selfcontained')
|
|
116
132
|
auxSrcDir = AppConfig.dataDirs('data/css')[0]
|
|
117
|
-
cssFileName = auxSrcDir + '/tjreport.css'
|
|
133
|
+
cssFileName = (auxSrcDir ? auxSrcDir + '/tjreport.css' : '')
|
|
134
|
+
# Raise an error if we haven't found the data directory
|
|
118
135
|
if auxSrcDir.nil? || !File.exists?(cssFileName)
|
|
119
|
-
|
|
120
|
-
Cannot find '#{cssFileName}'. This is usually the result of an improper
|
|
121
|
-
TaskJuggler installation. If you know where to find the data directory, you
|
|
122
|
-
can use the TASKJUGGLER_DATA_PATH environment variable to specify the
|
|
123
|
-
location. The variable should be set to the path without the /data at the end.
|
|
124
|
-
EOT
|
|
136
|
+
dataDirError(cssFileName)
|
|
125
137
|
end
|
|
126
138
|
cssFile = IO.read(cssFileName)
|
|
127
139
|
if cssFile.empty?
|
|
@@ -139,6 +151,8 @@ EOT
|
|
|
139
151
|
'type' => 'text/css',
|
|
140
152
|
'href' => 'css/tjreport.css')
|
|
141
153
|
end
|
|
154
|
+
html << XMLComment.new("Dynamic Report ID: " +
|
|
155
|
+
"#{@project.reportContexts.last.dynamicReportId}")
|
|
142
156
|
html << (body = XMLElement.new('body'))
|
|
143
157
|
|
|
144
158
|
unless a('selfcontained')
|
|
@@ -172,8 +186,17 @@ EOT
|
|
|
172
186
|
'href' => "#{AppConfig.contact}")
|
|
173
187
|
div << XMLText.new(" v#{AppConfig.version}")
|
|
174
188
|
|
|
175
|
-
|
|
176
|
-
|
|
189
|
+
fileName =
|
|
190
|
+
if a('interactive') || @name == '.'
|
|
191
|
+
# Interactive HTML reports are always sent to stdout.
|
|
192
|
+
'.'
|
|
193
|
+
else
|
|
194
|
+
# Prepend the specified output directory unless the provided file
|
|
195
|
+
# name is an absolute file name.
|
|
196
|
+
((@name[0] == '/' ? '' : @project.outputDir) +
|
|
197
|
+
@name + '.html').untaint
|
|
198
|
+
end
|
|
199
|
+
html.write(fileName)
|
|
177
200
|
end
|
|
178
201
|
|
|
179
202
|
# Generate a CSV version of the report.
|
|
@@ -253,7 +276,8 @@ EOT
|
|
|
253
276
|
end
|
|
254
277
|
|
|
255
278
|
def copyAuxiliaryFiles
|
|
256
|
-
|
|
279
|
+
# Don't copy files if output is stdout.
|
|
280
|
+
return if @name == '.' || a('interactive')
|
|
257
281
|
|
|
258
282
|
copyDirectory('css')
|
|
259
283
|
copyDirectory('icons')
|
|
@@ -266,14 +290,8 @@ EOT
|
|
|
266
290
|
@name) + '/'
|
|
267
291
|
# Find the data directory that came with the TaskJuggler installation.
|
|
268
292
|
auxSrcDir = AppConfig.dataDirs("data/#{dirName}")[0]
|
|
269
|
-
if
|
|
270
|
-
|
|
271
|
-
Cannot find the #{dirName} directory. This is usually
|
|
272
|
-
the result of an improper TaskJuggler installation. If you know the directory,
|
|
273
|
-
you can use the TASKJUGGLER_DATA_PATH environment variable to specify the
|
|
274
|
-
location.
|
|
275
|
-
EOT
|
|
276
|
-
end
|
|
293
|
+
# Raise an error if we haven't found the data directory
|
|
294
|
+
dataDirError(dirName) if auxSrcDir.nil? || !File.exists?(auxSrcDir)
|
|
277
295
|
# Don't copy directory if all files are up-to-date.
|
|
278
296
|
return if directoryUpToDate?(auxSrcDir, auxDstDir + dirName)
|
|
279
297
|
|
|
@@ -295,6 +313,16 @@ EOT
|
|
|
295
313
|
true
|
|
296
314
|
end
|
|
297
315
|
|
|
316
|
+
def dataDirError(dirName)
|
|
317
|
+
raise TjException.new, <<"EOT"
|
|
318
|
+
Cannot find the #{dirName} directory. This is usually the result of an
|
|
319
|
+
improper TaskJuggler installation. If you know the directory, you can use the
|
|
320
|
+
TASKJUGGLER_DATA_PATH environment variable to specify the location. The
|
|
321
|
+
variable should be set to the path without the /data at the end. Multiple
|
|
322
|
+
directories must be separated by colons.
|
|
323
|
+
EOT
|
|
324
|
+
end
|
|
325
|
+
|
|
298
326
|
def error(id, message)
|
|
299
327
|
@project.messageHandler.send(Message.new(id, 'error', message, nil, nil,
|
|
300
328
|
@sourceFileInfo))
|
data/lib/reports/ReportBase.rb
CHANGED
|
@@ -28,7 +28,7 @@ class TaskJuggler
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def generateIntermediateFormat
|
|
31
|
-
query = @report.project.
|
|
31
|
+
query = @report.project.reportContexts.last.query
|
|
32
32
|
%w( header left center right footer
|
|
33
33
|
prolog headline caption epilog ).each do |name|
|
|
34
34
|
next unless text = a(name)
|
|
@@ -49,7 +49,7 @@ class TaskJuggler
|
|
|
49
49
|
# hide expression, the rollup Expression or are not a descendent of
|
|
50
50
|
# taskRoot. In case resource is not nil, a task is only included if
|
|
51
51
|
# the resource is allocated to it in any of the reported scenarios.
|
|
52
|
-
def filterTaskList(list_, resource, hideExpr, rollupExpr)
|
|
52
|
+
def filterTaskList(list_, resource, hideExpr, rollupExpr, openNodes)
|
|
53
53
|
list = PropertyList.new(list_)
|
|
54
54
|
if (taskRoot = a('taskRoot'))
|
|
55
55
|
# Remove all tasks that are not descendents of the taskRoot.
|
|
@@ -73,14 +73,14 @@ class TaskJuggler
|
|
|
73
73
|
end
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
-
standardFilterOps(list, hideExpr, rollupExpr, resource, taskRoot)
|
|
76
|
+
standardFilterOps(list, hideExpr, rollupExpr, openNodes, resource, taskRoot)
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
# Take the complete resource list and remove all resources that are matching
|
|
80
80
|
# the hide expression, the rollup Expression or are not a descendent of
|
|
81
81
|
# resourceRoot. In case task is not nil, a resource is only included if
|
|
82
82
|
# it is assigned to the task in any of the reported scenarios.
|
|
83
|
-
def filterResourceList(list_, task, hideExpr, rollupExpr)
|
|
83
|
+
def filterResourceList(list_, task, hideExpr, rollupExpr, openNodes)
|
|
84
84
|
list = PropertyList.new(list_)
|
|
85
85
|
if (resourceRoot = a('resourceRoot'))
|
|
86
86
|
# Remove all resources that are not descendents of the resourceRoot.
|
|
@@ -104,7 +104,7 @@ class TaskJuggler
|
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
-
standardFilterOps(list, hideExpr, rollupExpr, task, resourceRoot)
|
|
107
|
+
standardFilterOps(list, hideExpr, rollupExpr, openNodes, task, resourceRoot)
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
private
|
|
@@ -140,9 +140,10 @@ class TaskJuggler
|
|
|
140
140
|
|
|
141
141
|
# This function implements the generic filtering functionality for all kinds
|
|
142
142
|
# of lists.
|
|
143
|
-
def standardFilterOps(list, hideExpr, rollupExpr, scopeProperty,
|
|
143
|
+
def standardFilterOps(list, hideExpr, rollupExpr, openNodes, scopeProperty,
|
|
144
|
+
root)
|
|
144
145
|
# Make a copy of the current Query.
|
|
145
|
-
query = @project.
|
|
146
|
+
query = @project.reportContexts.last.query.dup
|
|
146
147
|
query.scopeProperty = scopeProperty
|
|
147
148
|
|
|
148
149
|
# Remove all properties that the user wants to have hidden.
|
|
@@ -154,13 +155,17 @@ class TaskJuggler
|
|
|
154
155
|
end
|
|
155
156
|
|
|
156
157
|
# Remove all children of properties that the user has rolled-up.
|
|
157
|
-
if rollupExpr
|
|
158
|
+
if rollupExpr || openNodes
|
|
158
159
|
list.delete_if do |property|
|
|
159
160
|
parent = property.parent
|
|
160
161
|
delete = false
|
|
161
162
|
while (parent)
|
|
162
163
|
query.property = parent
|
|
163
|
-
|
|
164
|
+
# If openNodes is not nil, only the listed nodes will be unrolled.
|
|
165
|
+
# If openNodes is nil, only the nodes that match rollupExpr will
|
|
166
|
+
# not be unrolled.
|
|
167
|
+
if (openNodes && !openNodes.include?([ parent, scopeProperty ])) ||
|
|
168
|
+
(!openNodes && rollupExpr.eval(query))
|
|
164
169
|
delete = true
|
|
165
170
|
break
|
|
166
171
|
end
|
|
@@ -15,15 +15,17 @@ class TaskJuggler
|
|
|
15
15
|
# The ReportContext objects provide some settings that are used during the
|
|
16
16
|
# generation of a report. Reports can be nested, so multiple objects can
|
|
17
17
|
# exist at a time. But there is only one current ReportContext that is
|
|
18
|
-
# always accessable via Project.
|
|
18
|
+
# always accessable via Project.reportContexts.last().
|
|
19
19
|
class ReportContext
|
|
20
20
|
|
|
21
|
-
attr_reader :project, :report, :query
|
|
22
|
-
attr_accessor :tasks, :resources
|
|
21
|
+
attr_reader :dynamicReportId, :project, :report, :query
|
|
22
|
+
attr_accessor :childReportCounter, :tasks, :resources, :attributeBackup
|
|
23
23
|
|
|
24
24
|
def initialize(project, report)
|
|
25
25
|
@project = project
|
|
26
26
|
@report = report
|
|
27
|
+
@childReportCounter = 0
|
|
28
|
+
@attributeBackup = nil
|
|
27
29
|
queryAttrs = {
|
|
28
30
|
'project' => @project,
|
|
29
31
|
'loadUnit' => @report.get('loadUnit'),
|
|
@@ -36,13 +38,26 @@ class TaskJuggler
|
|
|
36
38
|
'revenueAccount' => @report.get('revenueAccount')
|
|
37
39
|
}
|
|
38
40
|
@query = Query.new(queryAttrs)
|
|
39
|
-
if (@parent = @project.
|
|
41
|
+
if (@parent = @project.reportContexts.last)
|
|
42
|
+
# For interactive reports we need some ID that uniquely identifies the
|
|
43
|
+
# report within the composed report. Since a project report can be
|
|
44
|
+
# included multiple times in the same report, we need to generate
|
|
45
|
+
# another ID for each instantiated report. We create this report by
|
|
46
|
+
# using a counter for the number of child reports that each report
|
|
47
|
+
# has. The unique ID is then the concatenated list of counters from
|
|
48
|
+
# parent to leaf, separating each value by a '.'.
|
|
49
|
+
@dynamicReportId = @parent.dynamicReportId +
|
|
50
|
+
".#{@parent.childReportCounter}"
|
|
51
|
+
@parent.childReportCounter += 1
|
|
40
52
|
# If the new ReportContext is created from within an existing context,
|
|
41
53
|
# this is used as parent context and the settings are copied as
|
|
42
54
|
# default initial values.
|
|
43
55
|
@tasks = @parent.tasks.dup
|
|
44
56
|
@resources = @parent.resources.dup
|
|
45
57
|
else
|
|
58
|
+
# The ID of the root report is always "0". The first child will then
|
|
59
|
+
# be "0.0", the seconds "0.1" and so on.
|
|
60
|
+
@dynamicReportId = "0"
|
|
46
61
|
# There is no existing ReportContext yet, so we create one based on
|
|
47
62
|
# the settings of the report.
|
|
48
63
|
@tasks = @project.tasks.dup
|
data/lib/reports/ReportTable.rb
CHANGED
|
@@ -131,8 +131,8 @@ class TaskJuggler
|
|
|
131
131
|
|
|
132
132
|
# Convert the intermediate representation into an Array of Arrays. _csv_ is
|
|
133
133
|
# the destination Array of Arrays. It may contain columns already.
|
|
134
|
-
def to_csv()
|
|
135
|
-
csv = [ [ ] ]
|
|
134
|
+
def to_csv(csv = nil)
|
|
135
|
+
csv = [ [ ] ] unless csv
|
|
136
136
|
@columns.each { |col| col.to_csv(csv) }
|
|
137
137
|
|
|
138
138
|
@lines.each do |line|
|
|
@@ -141,16 +141,32 @@ class TaskJuggler
|
|
|
141
141
|
# We only support left indentation in CSV files as the spaces for right
|
|
142
142
|
# indentation will be disregarded by most applications.
|
|
143
143
|
indent = @indent && @alignment == :left ? ' ' * @indent : ''
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
144
|
+
cell =
|
|
145
|
+
if @special
|
|
146
|
+
@special.to_csv
|
|
147
|
+
indent = nil
|
|
148
|
+
elsif @data && @data.is_a?(String)
|
|
149
|
+
@data
|
|
150
|
+
elsif @text
|
|
151
|
+
if @text.respond_to?('functionHandler') &&
|
|
152
|
+
@text.functionHandler('query')
|
|
153
|
+
@text.functionHandler('query').setQuery(@query)
|
|
154
|
+
end
|
|
155
|
+
str = @text.to_s
|
|
156
|
+
# Remove any trailing line breaks. These don't really make much
|
|
157
|
+
# sense in CSV files.
|
|
158
|
+
while str[-1] == ?\n
|
|
159
|
+
str.chomp!
|
|
160
|
+
end
|
|
161
|
+
str
|
|
151
162
|
end
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
|
|
164
|
+
# Try to convert numbers and other types to their native Ruby type if
|
|
165
|
+
# they are supported by CSVFile.
|
|
166
|
+
native = CSVFile.strToNative(cell)
|
|
167
|
+
|
|
168
|
+
# Only for String objects, we add the indentation.
|
|
169
|
+
csv[-1] << (native.is_a?(String) ? indent + native : native)
|
|
154
170
|
end
|
|
155
171
|
|
|
156
172
|
private
|
|
@@ -218,33 +234,41 @@ class TaskJuggler
|
|
|
218
234
|
if @fontColor
|
|
219
235
|
style += "color:#{@fontColor}; "
|
|
220
236
|
end
|
|
237
|
+
|
|
238
|
+
return nil, nil if @text.nil? || @text.empty?
|
|
239
|
+
|
|
221
240
|
td = XMLElement.new('td', 'class' => 'tj_table_cell_label',
|
|
222
241
|
'style' => style)
|
|
223
|
-
|
|
224
242
|
tooltip = nil
|
|
225
|
-
unless @text.nil? || @text.empty?
|
|
226
|
-
if @text.respond_to?('functionHandler') &&
|
|
227
|
-
@text.functionHandler('query')
|
|
228
|
-
@text.functionHandler('query').setQuery(@query)
|
|
229
|
-
end
|
|
230
243
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if @text.is_a?(RichTextIntermediate)
|
|
241
|
-
# Don't put the @text into a <div> but a <span>.
|
|
242
|
-
# @text.blockMode = false # if singleLine
|
|
243
|
-
td << @text.to_html
|
|
244
|
-
else
|
|
245
|
-
td << XMLText.new(@text)
|
|
244
|
+
# @text can be a String or a RichText (with or without embedded
|
|
245
|
+
# queries). To find out if @text has multiple lines, we need to expand
|
|
246
|
+
# it and convert it to a plain text again.
|
|
247
|
+
textAsString =
|
|
248
|
+
if @text.is_a?(RichTextIntermediate)
|
|
249
|
+
# @text is a RichText.
|
|
250
|
+
if @text.respond_to?('functionHandler') &&
|
|
251
|
+
@text.functionHandler('query')
|
|
252
|
+
@text.functionHandler('query').setQuery(@query)
|
|
246
253
|
end
|
|
254
|
+
@text.to_s
|
|
255
|
+
else
|
|
256
|
+
@text
|
|
247
257
|
end
|
|
258
|
+
|
|
259
|
+
return nil, nil if textAsString.empty?
|
|
260
|
+
|
|
261
|
+
shortText, singleLine = shortVersion(textAsString)
|
|
262
|
+
|
|
263
|
+
if (@line && @line.table.equiLines && (!singleLine || @width )) ||
|
|
264
|
+
!@category
|
|
265
|
+
# The cell is size-limited. We only put a shortened plain-text version
|
|
266
|
+
# in the cell and provide the full content via a tooltip.
|
|
267
|
+
tooltip = @text if shortText != textAsString
|
|
268
|
+
td << XMLText.new(shortText)
|
|
269
|
+
else
|
|
270
|
+
td << (@text.is_a?(RichTextIntermediate) ? @text.to_html :
|
|
271
|
+
XMLText.new(@text))
|
|
248
272
|
end
|
|
249
273
|
|
|
250
274
|
return td, tooltip
|