taskjuggler 0.1.1 → 0.2.0
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 +37 -5
- data/README.rdoc +4 -2
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/css/tjmanual.css +0 -1
- data/benchmarks/htmltaskreport-1.html +47702 -0
- data/benchmarks/htmltaskreport-2.html +23345 -0
- data/benchmarks/htmltaskreport-3.html +23265 -0
- data/benchmarks/htmltaskreport-4.html +22135 -0
- data/benchmarks/profile.clt +36082 -0
- data/benchmarks/tj3.profile +0 -0
- data/benchmarks/tj3.profile.grind +6185 -0
- data/benchmarks/tj3.profile.symbols +432 -0
- data/benchmarks/tj3.profile.txt +448 -0
- data/data/tjp.vim +689 -0
- data/doc/AppConfig.html +26 -2
- data/doc/CHANGELOG.html +60 -8
- data/doc/COPYING.html +26 -2
- data/doc/Diff/Hunk.html +26 -2
- data/doc/Diff.html +26 -2
- data/doc/Diffable.html +26 -2
- data/doc/DiffableString.html +26 -2
- data/doc/Object.html +26 -104
- data/doc/README_rdoc.html +39 -7
- data/doc/RuntimeConfig.html +26 -2
- data/doc/String.html +26 -2
- data/doc/TaskJuggler/Account.html +27 -3
- data/doc/TaskJuggler/AccountAttribute.html +30 -6
- data/doc/TaskJuggler/AccountScenario.html +28 -4
- data/doc/TaskJuggler/Allocation.html +33 -9
- data/doc/TaskJuggler/AllocationAttribute.html +31 -7
- data/doc/TaskJuggler/AttributeBase.html +162 -111
- data/doc/TaskJuggler/AttributeDefinition.html +26 -2
- data/doc/TaskJuggler/AttributeOverwrite.html +26 -2
- data/doc/TaskJuggler/BatchProcessor.html +26 -2
- data/doc/TaskJuggler/Booking.html +29 -5
- data/doc/TaskJuggler/BookingListAttribute.html +29 -5
- data/doc/TaskJuggler/BooleanAttribute.html +30 -6
- data/doc/TaskJuggler/CSVFile.html +26 -2
- data/doc/TaskJuggler/CellSettingPattern.html +26 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -2
- data/doc/TaskJuggler/Charge.html +30 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +29 -5
- data/doc/TaskJuggler/ChargeSet.html +26 -2
- data/doc/TaskJuggler/ChargeSetListAttribute.html +30 -6
- data/doc/TaskJuggler/CollisionDetector.html +26 -2
- data/doc/TaskJuggler/ColumnListAttribute.html +28 -4
- data/doc/TaskJuggler/ColumnTable.html +26 -2
- data/doc/TaskJuggler/Daemon.html +26 -2
- data/doc/TaskJuggler/DataCache.html +26 -2
- data/doc/TaskJuggler/DataCacheEntry.html +26 -2
- data/doc/TaskJuggler/DateAttribute.html +30 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +28 -4
- data/doc/TaskJuggler/DependencyListAttribute.html +30 -6
- data/doc/TaskJuggler/DurationAttribute.html +31 -7
- data/doc/TaskJuggler/FileList.html +26 -2
- data/doc/TaskJuggler/FileRecord.html +26 -2
- data/doc/TaskJuggler/FixnumAttribute.html +28 -4
- data/doc/TaskJuggler/FlagListAttribute.html +30 -6
- data/doc/TaskJuggler/FloatAttribute.html +29 -5
- data/doc/TaskJuggler/FormatListAttribute.html +29 -5
- data/doc/TaskJuggler/GanttChart.html +26 -2
- data/doc/TaskJuggler/GanttContainer.html +26 -2
- data/doc/TaskJuggler/GanttHeader.html +26 -2
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -2
- data/doc/TaskJuggler/GanttLine.html +27 -3
- data/doc/TaskJuggler/GanttLoadStack.html +26 -2
- data/doc/TaskJuggler/GanttMilestone.html +26 -2
- data/doc/TaskJuggler/GanttRouter.html +26 -2
- data/doc/TaskJuggler/GanttTaskBar.html +26 -2
- data/doc/TaskJuggler/HTMLDocument.html +26 -2
- data/doc/TaskJuggler/HTMLElements.html +623 -0
- data/doc/TaskJuggler/HTMLGraphics.html +26 -2
- data/doc/TaskJuggler/ICalReport.html +864 -0
- data/doc/TaskJuggler/ICalendar/Component.html +969 -0
- data/doc/TaskJuggler/ICalendar/Event.html +742 -0
- data/doc/TaskJuggler/ICalendar/Journal.html +722 -0
- data/doc/TaskJuggler/ICalendar/Person.html +633 -0
- data/doc/TaskJuggler/ICalendar/Todo.html +789 -0
- data/doc/TaskJuggler/ICalendar.html +1035 -0
- data/doc/TaskJuggler/Interval.html +99 -172
- data/doc/TaskJuggler/IntervalList.html +31 -7
- data/doc/TaskJuggler/JobInfo.html +26 -2
- data/doc/TaskJuggler/Journal.html +26 -2
- data/doc/TaskJuggler/JournalEntry.html +26 -2
- data/doc/TaskJuggler/JournalEntryList.html +26 -2
- data/doc/TaskJuggler/KeywordArray.html +26 -2
- data/doc/TaskJuggler/KeywordDocumentation.html +26 -2
- data/doc/TaskJuggler/Limits/Limit.html +124 -49
- data/doc/TaskJuggler/Limits.html +139 -156
- data/doc/TaskJuggler/LimitsAttribute.html +39 -14
- data/doc/TaskJuggler/ListAttributeBase.html +35 -11
- data/doc/TaskJuggler/Log.html +26 -2
- data/doc/TaskJuggler/LogFile.html +26 -2
- data/doc/TaskJuggler/LogicalAttribute.html +26 -2
- data/doc/TaskJuggler/LogicalExpression.html +26 -2
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalExpressionListAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalFlag.html +26 -2
- data/doc/TaskJuggler/LogicalFunction.html +28 -4
- data/doc/TaskJuggler/LogicalOperation.html +26 -2
- data/doc/TaskJuggler/ManagerResponsibilities.html +26 -2
- data/doc/TaskJuggler/ManagerStatusRecord.html +26 -2
- data/doc/TaskJuggler/Message.html +26 -2
- data/doc/TaskJuggler/MessageHandler.html +108 -62
- data/doc/TaskJuggler/Navigator.html +26 -2
- data/doc/TaskJuggler/NavigatorElement.html +26 -2
- data/doc/TaskJuggler/NikuProject.html +26 -2
- data/doc/TaskJuggler/NikuReport.html +27 -3
- data/doc/TaskJuggler/NikuResource.html +26 -2
- data/doc/TaskJuggler/NodeListAttribute.html +31 -7
- data/doc/TaskJuggler/PlaceHolderCell.html +26 -2
- data/doc/TaskJuggler/ProcessIntercom.html +26 -2
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -2
- data/doc/TaskJuggler/Project.html +1236 -973
- data/doc/TaskJuggler/ProjectBroker.html +26 -2
- data/doc/TaskJuggler/ProjectBrokerIface.html +26 -2
- data/doc/TaskJuggler/ProjectFileParser.html +29 -4
- data/doc/TaskJuggler/ProjectFileScanner.html +56 -31
- data/doc/TaskJuggler/ProjectRecord.html +26 -2
- data/doc/TaskJuggler/ProjectServer.html +26 -2
- data/doc/TaskJuggler/ProjectServerIface.html +26 -2
- data/doc/TaskJuggler/PropertyAttribute.html +35 -11
- data/doc/TaskJuggler/PropertyList.html +26 -2
- data/doc/TaskJuggler/PropertySet.html +126 -106
- data/doc/TaskJuggler/PropertyTreeNode.html +595 -551
- data/doc/TaskJuggler/Query.html +127 -100
- data/doc/TaskJuggler/RTFHandlers.html +26 -2
- data/doc/TaskJuggler/RTFNavigator.html +26 -2
- data/doc/TaskJuggler/RTFQuery.html +28 -4
- data/doc/TaskJuggler/RTFReport.html +26 -2
- data/doc/TaskJuggler/RTFReportLink.html +26 -2
- data/doc/TaskJuggler/RTFWithQuerySupport.html +26 -2
- data/doc/TaskJuggler/RealFormat.html +26 -2
- data/doc/TaskJuggler/RealFormatAttribute.html +31 -7
- data/doc/TaskJuggler/ReferenceAttribute.html +58 -34
- data/doc/TaskJuggler/Report.html +427 -284
- data/doc/TaskJuggler/ReportBase.html +28 -102
- data/doc/TaskJuggler/ReportContext.html +26 -2
- data/doc/TaskJuggler/ReportScenario.html +633 -0
- data/doc/TaskJuggler/ReportServer.html +26 -2
- data/doc/TaskJuggler/ReportServerIface.html +26 -2
- data/doc/TaskJuggler/ReportServerRecord.html +26 -2
- data/doc/TaskJuggler/ReportServlet.html +26 -2
- data/doc/TaskJuggler/ReportTable.html +26 -2
- data/doc/TaskJuggler/ReportTableCell.html +26 -2
- data/doc/TaskJuggler/ReportTableColumn.html +26 -2
- data/doc/TaskJuggler/ReportTableLegend.html +26 -2
- data/doc/TaskJuggler/ReportTableLine.html +26 -2
- data/doc/TaskJuggler/Resource.html +225 -163
- data/doc/TaskJuggler/ResourceListAttribute.html +71 -47
- data/doc/TaskJuggler/ResourceListRE.html +26 -2
- data/doc/TaskJuggler/ResourceScenario.html +645 -603
- data/doc/TaskJuggler/RichText.html +26 -2
- data/doc/TaskJuggler/RichTextAttribute.html +53 -29
- data/doc/TaskJuggler/RichTextDocument.html +26 -2
- data/doc/TaskJuggler/RichTextElement.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionHandler.html +26 -2
- data/doc/TaskJuggler/RichTextImage.html +26 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +29 -5
- data/doc/TaskJuggler/RichTextParser.html +26 -2
- data/doc/TaskJuggler/RichTextScanner.html +26 -2
- data/doc/TaskJuggler/RichTextSnip.html +26 -2
- data/doc/TaskJuggler/RichTextSyntaxRules.html +26 -2
- data/doc/TaskJuggler/Scenario.html +26 -2
- data/doc/TaskJuggler/ScenarioData.html +95 -28
- data/doc/TaskJuggler/ScenarioListAttribute.html +39 -15
- data/doc/TaskJuggler/Scoreboard.html +137 -73
- data/doc/TaskJuggler/ScoreboardInterval.html +1116 -0
- data/doc/TaskJuggler/SheetHandlerBase.html +26 -2
- data/doc/TaskJuggler/SheetReceiver.html +26 -2
- data/doc/TaskJuggler/SheetSender.html +26 -2
- data/doc/TaskJuggler/Shift.html +27 -3
- data/doc/TaskJuggler/ShiftAssignment.html +27 -3
- data/doc/TaskJuggler/ShiftAssignments.html +174 -149
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +41 -16
- data/doc/TaskJuggler/ShiftScenario.html +26 -2
- data/doc/TaskJuggler/SimpleQueryExpander.html +26 -2
- data/doc/TaskJuggler/SortListAttribute.html +35 -11
- data/doc/TaskJuggler/StatusSheetReceiver.html +26 -2
- data/doc/TaskJuggler/StatusSheetReport.html +26 -2
- data/doc/TaskJuggler/StatusSheetSender.html +26 -2
- data/doc/TaskJuggler/StdIoWrapper.html +26 -2
- data/doc/TaskJuggler/StringAttribute.html +39 -15
- data/doc/TaskJuggler/SymbolAttribute.html +35 -11
- data/doc/TaskJuggler/SyntaxReference.html +26 -2
- data/doc/TaskJuggler/TOCEntry.html +26 -2
- data/doc/TaskJuggler/TSResourceRecord.html +26 -2
- data/doc/TaskJuggler/TSTaskRecord.html +26 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +26 -2
- data/doc/TaskJuggler/TableOfContents.html +26 -2
- data/doc/TaskJuggler/TableReport.html +239 -214
- data/doc/TaskJuggler/TagFile/TagFileEntry.html +841 -0
- data/doc/TaskJuggler/TagFile.html +817 -0
- data/doc/TaskJuggler/Task.html +27 -3
- data/doc/TaskJuggler/TaskDepListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskDependency.html +26 -2
- data/doc/TaskJuggler/TaskListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskListRE.html +26 -2
- data/doc/TaskJuggler/TaskScenario.html +2235 -2178
- data/doc/TaskJuggler/TernarySearchTree.html +26 -2
- data/doc/TaskJuggler/TextFormatter.html +26 -2
- data/doc/TaskJuggler/TextParser/Macro.html +26 -2
- data/doc/TaskJuggler/TextParser/MacroTable.html +26 -2
- data/doc/TaskJuggler/TextParser/Pattern.html +26 -2
- data/doc/TaskJuggler/TextParser/Rule.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/BufferStreamHandle.html +32 -8
- data/doc/TaskJuggler/TextParser/Scanner/FileStreamHandle.html +39 -15
- data/doc/TaskJuggler/TextParser/Scanner/MacroStackEntry.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/StreamHandle.html +119 -86
- data/doc/TaskJuggler/TextParser/Scanner.html +317 -291
- data/doc/TaskJuggler/TextParser/SourceFileInfo.html +26 -2
- data/doc/TaskJuggler/TextParser/StackElement.html +26 -2
- data/doc/TaskJuggler/TextParser/State.html +26 -2
- data/doc/TaskJuggler/TextParser/StateTransition.html +26 -2
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +26 -2
- data/doc/TaskJuggler/TextParser/TokenDoc.html +26 -2
- data/doc/TaskJuggler/TextParser.html +85 -61
- data/doc/TaskJuggler/TextReport.html +26 -2
- data/doc/TaskJuggler/TimeInterval.html +841 -0
- data/doc/TaskJuggler/{IntervalListAttribute.html → TimeIntervalListAttribute.html} +33 -9
- data/doc/TaskJuggler/TimeSheet.html +26 -2
- data/doc/TaskJuggler/TimeSheetReceiver.html +26 -2
- data/doc/TaskJuggler/TimeSheetRecord.html +27 -3
- data/doc/TaskJuggler/TimeSheetReport.html +29 -5
- data/doc/TaskJuggler/TimeSheetSender.html +26 -2
- data/doc/TaskJuggler/TimeSheetSummary.html +26 -2
- data/doc/TaskJuggler/TimeSheets.html +26 -2
- data/doc/TaskJuggler/Tj3.html +150 -111
- data/doc/TaskJuggler/Tj3AppBase.html +26 -2
- data/doc/TaskJuggler/Tj3Client.html +26 -2
- data/doc/TaskJuggler/Tj3Daemon.html +26 -2
- data/doc/TaskJuggler/Tj3Man.html +26 -2
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -2
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3SsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3TsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -2
- data/doc/TaskJuggler/TjException.html +26 -2
- data/doc/TaskJuggler/TjRuntimeError.html +26 -2
- data/doc/TaskJuggler/TjTime.html +539 -477
- data/doc/TaskJuggler/TjpExample.html +26 -2
- data/doc/TaskJuggler/TjpExportRE.html +240 -161
- data/doc/TaskJuggler/TjpSyntaxRules.html +4236 -3844
- data/doc/TaskJuggler/URLParameter.html +26 -2
- data/doc/TaskJuggler/UserManual.html +26 -2
- data/doc/TaskJuggler/VimSyntax.html +31 -7
- data/doc/TaskJuggler/WebServer.html +26 -2
- data/doc/TaskJuggler/WelcomePage.html +26 -2
- data/doc/TaskJuggler/WorkingHours.html +227 -152
- data/doc/TaskJuggler/WorkingHoursAttribute.html +62 -38
- data/doc/TaskJuggler/XMLBlob.html +26 -2
- data/doc/TaskJuggler/XMLComment.html +26 -2
- data/doc/TaskJuggler/XMLDocument.html +26 -2
- data/doc/TaskJuggler/XMLElement.html +26 -2
- data/doc/TaskJuggler/XMLNamedText.html +26 -2
- data/doc/TaskJuggler/XMLText.html +26 -2
- data/doc/TaskJuggler.html +486 -427
- data/doc/index.html +801 -659
- data/doc/lib/taskjuggler/AccountScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Account_rb.html +1 -1
- data/doc/lib/taskjuggler/AlgorithmDiff_rb.html +1 -1
- data/doc/lib/taskjuggler/Allocation_rb.html +1 -1
- data/doc/lib/taskjuggler/AppConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeBase_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/Attributes_rb.html +1 -1
- data/doc/lib/taskjuggler/BatchProcessor_rb.html +1 -1
- data/doc/lib/taskjuggler/Booking_rb.html +1 -1
- data/doc/lib/taskjuggler/ChargeSet_rb.html +1 -1
- data/doc/lib/taskjuggler/Charge_rb.html +1 -1
- data/doc/lib/taskjuggler/DataCache_rb.html +1 -1
- data/doc/lib/taskjuggler/FileList_rb.html +1 -1
- data/doc/lib/taskjuggler/HTMLDocument_rb.html +1 -1
- data/doc/lib/{ruby-signal-bug_rb.html → taskjuggler/HTMLElements_rb.html} +9 -9
- data/doc/lib/{exchangebug_rb.html → taskjuggler/ICalendar_rb.html} +9 -9
- data/doc/lib/taskjuggler/IntervalList_rb.html +1 -1
- data/doc/lib/taskjuggler/Interval_rb.html +1 -1
- data/doc/lib/taskjuggler/Journal_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordArray_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/taskjuggler/Limits_rb.html +1 -1
- data/doc/lib/taskjuggler/LogFile_rb.html +1 -1
- data/doc/lib/taskjuggler/Log_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalExpression_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalFunction_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalOperation_rb.html +1 -1
- data/doc/lib/taskjuggler/MessageHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileParser_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/taskjuggler/Project_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyList_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertySet_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyTreeNode_rb.html +1 -1
- data/doc/lib/taskjuggler/Query_rb.html +1 -1
- data/doc/lib/taskjuggler/RealFormat_rb.html +1 -1
- data/doc/lib/taskjuggler/ResourceScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Resource_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Document_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Element_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionExample_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Parser_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFHandlers_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFNavigator_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFQuery_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReportLink_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFWithQuerySupport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Snip_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/SyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TOCEntry_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TableOfContents_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText_rb.html +1 -1
- data/doc/lib/taskjuggler/RuntimeConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/ScenarioData_rb.html +1 -1
- data/doc/lib/taskjuggler/Scenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Scoreboard_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetHandlerBase_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftAssignments_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Shift_rb.html +1 -1
- data/doc/lib/taskjuggler/SimpleQueryExpander_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/StdIoWrapper_rb.html +1 -1
- data/doc/lib/taskjuggler/SyntaxReference_rb.html +1 -1
- data/doc/lib/taskjuggler/TableColumnDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskDependency_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskJuggler_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Task_rb.html +1 -1
- data/doc/lib/taskjuggler/TernarySearchTree_rb.html +1 -1
- data/doc/lib/taskjuggler/TextFormatter_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/MacroTable_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Rule_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/SourceFileInfo_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/StackElement_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/State_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheets_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3AppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3Config_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3SheetAppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/TjException_rb.html +1 -1
- data/doc/lib/taskjuggler/TjTime_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpExample_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/URLParameter_rb.html +1 -1
- data/doc/lib/taskjuggler/UTF8String_rb.html +1 -1
- data/doc/lib/taskjuggler/UserManual_rb.html +1 -1
- data/doc/lib/taskjuggler/VimSyntax_rb.html +1 -1
- data/doc/lib/taskjuggler/WorkingHours_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLDocument_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLElement_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Client_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Man_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProcessIntercom_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectBroker_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServlet_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WebServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WelcomePage_rb.html +1 -1
- data/doc/lib/taskjuggler/deep_copy_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CSVFile_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CollisionDetector_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttChart_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ICalReport_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/Navigator_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/NikuReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportBase_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportContext_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableCell_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/Report_rb.html +5 -1
- data/doc/lib/taskjuggler/reports/ResourceListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/StatusSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TableReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TagFile_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/TaskListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TextReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TimeSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TjpExportRE_rb.html +1 -1
- data/doc/lib/tj3_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/taskjuggler/Account.rb +1 -1
- data/lib/taskjuggler/AccountScenario.rb +1 -1
- data/lib/taskjuggler/Allocation.rb +5 -5
- data/lib/taskjuggler/AttributeBase.rb +30 -22
- data/lib/taskjuggler/Attributes.rb +80 -78
- data/lib/taskjuggler/Booking.rb +2 -2
- data/lib/taskjuggler/Charge.rb +3 -3
- data/lib/taskjuggler/ICalendar.rb +251 -0
- data/lib/taskjuggler/Interval.rb +215 -53
- data/lib/taskjuggler/IntervalList.rb +5 -5
- data/lib/taskjuggler/Limits.rb +79 -69
- data/lib/taskjuggler/LogicalFunction.rb +2 -2
- data/lib/taskjuggler/MessageHandler.rb +11 -6
- data/lib/taskjuggler/Project.rb +208 -95
- data/lib/taskjuggler/ProjectFileParser.rb +2 -2
- data/lib/taskjuggler/ProjectFileScanner.rb +7 -6
- data/lib/taskjuggler/PropertySet.rb +1 -5
- data/lib/taskjuggler/PropertyTreeNode.rb +21 -16
- data/lib/taskjuggler/Query.rb +10 -7
- data/lib/taskjuggler/Resource.rb +6 -1
- data/lib/taskjuggler/ResourceScenario.rb +85 -69
- data/lib/taskjuggler/RichText/RTFQuery.rb +2 -2
- data/lib/taskjuggler/ScenarioData.rb +11 -1
- data/lib/taskjuggler/Scoreboard.rb +8 -1
- data/lib/taskjuggler/Shift.rb +1 -1
- data/lib/taskjuggler/ShiftAssignments.rb +22 -20
- data/lib/taskjuggler/Task.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +65 -51
- data/lib/taskjuggler/TaskScenario.rb +486 -419
- data/lib/taskjuggler/TextParser/Scanner.rb +22 -11
- data/lib/taskjuggler/TimeSheets.rb +1 -1
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjTime.rb +7 -3
- data/lib/taskjuggler/TjpSyntaxRules.rb +157 -23
- data/lib/taskjuggler/VimSyntax.rb +18 -0
- data/lib/taskjuggler/WorkingHours.rb +20 -4
- data/lib/taskjuggler/apps/Tj3.rb +16 -1
- data/lib/taskjuggler/reports/GanttLine.rb +1 -1
- data/lib/taskjuggler/reports/ICalReport.rb +136 -0
- data/lib/taskjuggler/reports/NikuReport.rb +1 -1
- data/lib/taskjuggler/reports/Report.rb +59 -0
- data/lib/taskjuggler/reports/ReportBase.rb +2 -67
- data/lib/taskjuggler/reports/TableReport.rb +9 -8
- data/lib/taskjuggler/reports/TagFile.rb +120 -0
- data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
- data/lib/taskjuggler/reports/TjpExportRE.rb +33 -9
- data/manual/Installation +126 -0
- data/spec/ICalendar_spec.rb +45 -0
- data/spec/IntervalList_spec.rb +11 -11
- data/tasks/changelog.rake +150 -60
- data/tasks/gem.rake +1 -0
- data/tasks/vim.rake +2 -2
- data/test/TestSuite/Export-Reports/refs/Booking.tjp +1 -1
- data/test/TestSuite/Export-Reports/refs/CompletedWork.tji.tjp +40 -0
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +10 -1
- data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +1 -1
- data/test/TestSuite/HTML-Reports/Alerts.html +160 -412
- 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 +0 -20
- data/test/TestSuite/HTML-Reports/css/tjreport.css +6 -7
- data/test/TestSuite/HTML-Reports/depArrows.html +851 -0
- data/test/TestSuite/HTML-Reports/profile.html +37581 -0
- data/test/TestSuite/{Scheduler/Correct → HTML-Reports/scripts}/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +3 -3
- data/test/TestSuite/Scheduler/Errors/R.html +113 -0
- data/test/TestSuite/Scheduler/Errors/allocate_no_assigned.tjp +15 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjmanual.css +0 -1
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjreport.css +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/details.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-green.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-red.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-yellow.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resource.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resourcegroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/task.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/taskgroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-down.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-flat.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_effort.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_length.tjp +13 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/scripts/wz_tooltip.js +0 -0
- data/test/TestSuite/StatusSheets/dev2.tji +22 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji.tjp +38 -0
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +5 -2
- data/test/TestSuite/Syntax/Errors/scenario_after_tracking.tjp +8 -0
- data/test/TestSuite/TimeSheets/resrep.tji +7 -0
- data/test/TestSuite/TimeSheets/ts.tji +351 -0
- data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
- data/test/test_Limits.rb +38 -30
- data/test/test_Scheduler.rb +2 -2
- data/test/test_ShiftAssignments.rb +8 -8
- data/test/test_WorkingHours.rb +4 -4
- metadata +1015 -1005
- data/lib/exchangebug.rb +0 -42
- data/lib/ruby-signal-bug.rb +0 -55
- data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
- data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.csv +0 -412
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.html +0 -680
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.csv +0 -4
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.tjp +0 -25
- data/test/TestSuite/ReportGenerator/Correct/Journal-1.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-2.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-3.html +0 -28
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
- data/test/TestSuite/ReportGenerator/Correct/opennodes-1.csv +0 -2
- 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/' +0 -23
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -86
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
- data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
- data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
- data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
- data/test/TestSuite/TimeSheets/uu.txt +0 -29
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = ICalReport.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
11
|
+
# published by the Free Software Foundation.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
require 'taskjuggler/reports/ReportBase'
|
|
15
|
+
require 'taskjuggler/ICalendar'
|
|
16
|
+
|
|
17
|
+
class TaskJuggler
|
|
18
|
+
|
|
19
|
+
# This Report derivative generates iCalendar files.
|
|
20
|
+
class ICalReport < ReportBase
|
|
21
|
+
|
|
22
|
+
# Create a new ICalReport with _report_ as description.
|
|
23
|
+
def initialize(report)
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Generate an intermediate version of the report data.
|
|
28
|
+
def generateIntermediateFormat
|
|
29
|
+
super
|
|
30
|
+
# Prepare the task list.
|
|
31
|
+
@taskList = PropertyList.new(@project.tasks)
|
|
32
|
+
@taskList.setSorting(a('sortTasks'))
|
|
33
|
+
@taskList = filterTaskList(@taskList, nil, a('hideTask'), a('rollupTask'),
|
|
34
|
+
a('openNodes'))
|
|
35
|
+
@taskList.sort!
|
|
36
|
+
|
|
37
|
+
# Prepare the resource list. This is not yet used.
|
|
38
|
+
@resourceList = PropertyList.new(@project.resources)
|
|
39
|
+
@resourceList.setSorting(a('sortResources'))
|
|
40
|
+
@resourceList = filterResourceList(@resourceList, nil, a('hideResource'),
|
|
41
|
+
a('rollupResource'), a('openNodes'))
|
|
42
|
+
@resourceList.sort!
|
|
43
|
+
|
|
44
|
+
@query = @report.project.reportContexts.last.query.dup
|
|
45
|
+
|
|
46
|
+
@ical = ICalendar.new("#{AppConfig.packageName}-#{@project['projectid']}")
|
|
47
|
+
# Use the project start date of the current date (whichever is earlier)
|
|
48
|
+
# for the calendar creation date.
|
|
49
|
+
@ical.creationDate = [ @report.project['start'], TjTime.new ].min
|
|
50
|
+
# Use the project 'now' date a last modification date.
|
|
51
|
+
@ical.lastModified = @report.project['now']
|
|
52
|
+
|
|
53
|
+
# We only care about the first requested scenario.
|
|
54
|
+
scenarioIdx = a('scenarios').first
|
|
55
|
+
uidMap = {}
|
|
56
|
+
@taskList.each do |task|
|
|
57
|
+
todo = ICalendar::Todo.new(
|
|
58
|
+
@ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
|
|
59
|
+
task.name, task['start', scenarioIdx], task['end', scenarioIdx])
|
|
60
|
+
# Save the ical UID of this TODO.
|
|
61
|
+
uidMap[task] = todo.uid
|
|
62
|
+
@query.property = task
|
|
63
|
+
@query.attributeId = 'complete'
|
|
64
|
+
@query.scenarioIdx = scenarioIdx
|
|
65
|
+
@query.process
|
|
66
|
+
todo.percentComplete = @query.to_num.to_i
|
|
67
|
+
# We must convert the TJ priority range (1 - 1000) to iCalendar range
|
|
68
|
+
# (0 - 9).
|
|
69
|
+
todo.priority = (task['priority', scenarioIdx] - 1) / 100
|
|
70
|
+
# If there is a parent task and it's known already, we set the
|
|
71
|
+
# relation in the TODO component.
|
|
72
|
+
if task.parent && uidMap[task.parent]
|
|
73
|
+
todo.relatedTo = uidMap[task.parent]
|
|
74
|
+
end
|
|
75
|
+
# If we have a task note, use this for the DESCRIPTION property.
|
|
76
|
+
if (note = task.get('note'))
|
|
77
|
+
note = note.to_s
|
|
78
|
+
todo.description = note
|
|
79
|
+
end
|
|
80
|
+
# Check if we have a responsible resource with an email address. Since
|
|
81
|
+
# ICalendar only knows one organizer we ignore all but the first.
|
|
82
|
+
organizer = nil
|
|
83
|
+
unless (responsible = task['responsible', scenarioIdx]).empty? &&
|
|
84
|
+
@resourceList.include?(organizer = responsible[0]) &&
|
|
85
|
+
organizer.get('email')
|
|
86
|
+
todo.setOrganizer(responsible[0].name, responsible[0].get('email'))
|
|
87
|
+
end
|
|
88
|
+
# Set the assigned resources as attendees.
|
|
89
|
+
attendees = []
|
|
90
|
+
task['assignedresources', scenarioIdx].each do |resource|
|
|
91
|
+
next unless @resourceList.include?(resource) &&
|
|
92
|
+
resource.get('email')
|
|
93
|
+
attendees << resource
|
|
94
|
+
todo.addAttendee(resource.name, resource.get('email'))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Generate an additional VEVENT entry for all leaf tasks that aren't
|
|
98
|
+
# milestones.
|
|
99
|
+
if task.leaf? && !task['milestone', scenarioIdx]
|
|
100
|
+
event = ICalendar::Event.new(
|
|
101
|
+
@ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
|
|
102
|
+
task.name, task['start', scenarioIdx], task['end', scenarioIdx])
|
|
103
|
+
event.description = note if note
|
|
104
|
+
event.setOrganizer(organizer.name, organizer.email) if organizer
|
|
105
|
+
attendees.each do |attendee|
|
|
106
|
+
event.addAttendee(attendee.name, attendee.get('email'))
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Generate VJOURNAL entries for all the journal entries of this task.
|
|
111
|
+
@report.project['journal'].
|
|
112
|
+
entriesByTask(task, a('start'), a('end'),
|
|
113
|
+
a('hideJournalEntry')).each do |entry|
|
|
114
|
+
journal = ICalendar::Journal.new(
|
|
115
|
+
@ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
|
|
116
|
+
entry.headline, entry.date)
|
|
117
|
+
journal.relatedTo = uidMap[task]
|
|
118
|
+
journal.description = entry.summary.to_s + entry.details.to_s
|
|
119
|
+
# Set the author of the journal entry as organizer.
|
|
120
|
+
if (author = entry.author) && @resourceList.include?(author) &&
|
|
121
|
+
author.get('email')
|
|
122
|
+
journal.setOrganizer(author.name, author.get('email'))
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Convert the intermediate format into a DOS formated String.
|
|
129
|
+
def to_iCal
|
|
130
|
+
@ical.to_s
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
|
|
@@ -305,7 +305,7 @@ EOT
|
|
|
305
305
|
query = Query.new(queryAttrs)
|
|
306
306
|
|
|
307
307
|
# Calculate the number of working days in the report interval.
|
|
308
|
-
workingDays = @project.workingDays(
|
|
308
|
+
workingDays = @project.workingDays(TimeInterval.new(a('start'), a('end')))
|
|
309
309
|
|
|
310
310
|
resourceList.each do |resource|
|
|
311
311
|
# We only care about leaf resources that have the custom attribute
|
|
@@ -17,10 +17,12 @@ require 'taskjuggler/PropertyTreeNode'
|
|
|
17
17
|
require 'taskjuggler/reports/TextReport'
|
|
18
18
|
require 'taskjuggler/reports/TaskListRE'
|
|
19
19
|
require 'taskjuggler/reports/ResourceListRE'
|
|
20
|
+
require 'taskjuggler/reports/TagFile'
|
|
20
21
|
require 'taskjuggler/reports/TjpExportRE'
|
|
21
22
|
require 'taskjuggler/reports/StatusSheetReport'
|
|
22
23
|
require 'taskjuggler/reports/TimeSheetReport'
|
|
23
24
|
require 'taskjuggler/reports/NikuReport'
|
|
25
|
+
require 'taskjuggler/reports/ICalReport'
|
|
24
26
|
require 'taskjuggler/reports/CSVFile'
|
|
25
27
|
require 'taskjuggler/reports/Navigator'
|
|
26
28
|
require 'taskjuggler/reports/ReportContext'
|
|
@@ -28,6 +30,10 @@ require 'taskjuggler/HTMLDocument'
|
|
|
28
30
|
|
|
29
31
|
class TaskJuggler
|
|
30
32
|
|
|
33
|
+
# Just a dummy class to make the 'flags' attribute work.
|
|
34
|
+
class ReportScenario < ScenarioData
|
|
35
|
+
end
|
|
36
|
+
|
|
31
37
|
# The Report class holds the fundamental description and functionality to
|
|
32
38
|
# turn the scheduled project into a user readable form. A report may contain
|
|
33
39
|
# other reports.
|
|
@@ -43,6 +49,13 @@ class TaskJuggler
|
|
|
43
49
|
# The type specifier must be set for every report. It tells whether this
|
|
44
50
|
# is a task, resource, text or other report.
|
|
45
51
|
@typeSpec = nil
|
|
52
|
+
# Reports don't really have any scenario specific attributes. But the
|
|
53
|
+
# flag handling code assumes they are. To use flags, we need them as
|
|
54
|
+
# well.
|
|
55
|
+
@data = Array.new(@project.scenarioCount, nil)
|
|
56
|
+
@project.scenarioCount.times do |i|
|
|
57
|
+
ReportScenario.new(self, i, @scenarioAttributes[i])
|
|
58
|
+
end
|
|
46
59
|
end
|
|
47
60
|
|
|
48
61
|
# The generate function is where the action happens in this class. The
|
|
@@ -65,11 +78,15 @@ class TaskJuggler
|
|
|
65
78
|
end
|
|
66
79
|
|
|
67
80
|
case format
|
|
81
|
+
when :iCal
|
|
82
|
+
generateICal
|
|
68
83
|
when :html
|
|
69
84
|
generateHTML
|
|
70
85
|
copyAuxiliaryFiles
|
|
71
86
|
when :csv
|
|
72
87
|
generateCSV
|
|
88
|
+
when :ctags
|
|
89
|
+
generateCTags
|
|
73
90
|
when :niku
|
|
74
91
|
generateNiku
|
|
75
92
|
when :tjp
|
|
@@ -90,10 +107,14 @@ class TaskJuggler
|
|
|
90
107
|
case @typeSpec
|
|
91
108
|
when :export
|
|
92
109
|
@content = TjpExportRE.new(self)
|
|
110
|
+
when :iCal
|
|
111
|
+
@content = ICalReport.new(self)
|
|
93
112
|
when :niku
|
|
94
113
|
@content = NikuReport.new(self)
|
|
95
114
|
when :resourcereport
|
|
96
115
|
@content = ResourceListRE.new(self)
|
|
116
|
+
when :tagfile
|
|
117
|
+
@content = TagFile.new(self)
|
|
97
118
|
when :textreport
|
|
98
119
|
@content = TextReport.new(self)
|
|
99
120
|
when :taskreport
|
|
@@ -293,6 +314,44 @@ EOT
|
|
|
293
314
|
end
|
|
294
315
|
end
|
|
295
316
|
|
|
317
|
+
# Generate Niku report
|
|
318
|
+
def generateICal
|
|
319
|
+
unless @content.respond_to?('to_iCal')
|
|
320
|
+
warning('ical_not_supported',
|
|
321
|
+
"iCalendar format is not supported for report #{@id} of " +
|
|
322
|
+
"type #{@typeSpec}.")
|
|
323
|
+
return nil
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
begin
|
|
327
|
+
f = @name == '.' ? $stdout :
|
|
328
|
+
File.new(((@name[0] == '/' ? '' : @project.outputDir) +
|
|
329
|
+
@name + '.ical').untaint, 'w')
|
|
330
|
+
f.puts "#{@content.to_iCal}"
|
|
331
|
+
rescue IOError
|
|
332
|
+
error('write_ical', "Cannot write to file #{@name}.\n#{$!}")
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# Generate ctags file
|
|
337
|
+
def generateCTags
|
|
338
|
+
unless @content.respond_to?('to_ctags')
|
|
339
|
+
warning('ctags_not_supported',
|
|
340
|
+
"ctags format is not supported for report #{@id} of " +
|
|
341
|
+
"type #{@typeSpec}.")
|
|
342
|
+
return nil
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
begin
|
|
346
|
+
f = @name == '.' ? $stdout :
|
|
347
|
+
File.new(((@name[0] == '/' ? '' : @project.outputDir) +
|
|
348
|
+
@name).untaint, 'w')
|
|
349
|
+
f.puts "#{@content.to_ctags}"
|
|
350
|
+
rescue IOError
|
|
351
|
+
error('write_ctags', "Cannot write to file #{@name}.\n#{$!}")
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
296
355
|
def copyAuxiliaryFiles
|
|
297
356
|
# Don't copy files if output is stdout.
|
|
298
357
|
return if @name == '.' || a('interactive')
|
|
@@ -64,7 +64,7 @@ class TaskJuggler
|
|
|
64
64
|
list.delete_if do |task|
|
|
65
65
|
delete = true
|
|
66
66
|
a('scenarios').each do |scenarioIdx|
|
|
67
|
-
iv =
|
|
67
|
+
iv = TimeInterval.new(a('start'), a('end'))
|
|
68
68
|
if task.hasResourceAllocated?(scenarioIdx, iv, resource)
|
|
69
69
|
delete = false
|
|
70
70
|
break;
|
|
@@ -92,7 +92,7 @@ class TaskJuggler
|
|
|
92
92
|
if task
|
|
93
93
|
# If we have a task we need to check that the resources are assigned
|
|
94
94
|
# to the task in any of the reported scenarios.
|
|
95
|
-
iv =
|
|
95
|
+
iv = TimeInterval.new(a('start'), a('end'))
|
|
96
96
|
list.delete_if do |resource|
|
|
97
97
|
delete = true
|
|
98
98
|
a('scenarios').each do |scenarioIdx|
|
|
@@ -194,71 +194,6 @@ class TaskJuggler
|
|
|
194
194
|
list
|
|
195
195
|
end
|
|
196
196
|
|
|
197
|
-
# This function converts number to strings that may include a unit. The
|
|
198
|
-
# unit is determined by @loadUnit. In the automatic modes, the shortest
|
|
199
|
-
# possible result is shown and the unit is always appended. _value_ is the
|
|
200
|
-
# value to convert. _factors_ determines the conversion factors for the
|
|
201
|
-
# different units.
|
|
202
|
-
# TODO: Delete when all users have been migrated to use Query!
|
|
203
|
-
def scaleValue(value, factors)
|
|
204
|
-
loadUnit = a('loadUnit')
|
|
205
|
-
numberFormat = a('numberFormat')
|
|
206
|
-
|
|
207
|
-
if loadUnit == :shortauto || loadUnit == :longauto
|
|
208
|
-
# We try all possible units and store the resulting strings here.
|
|
209
|
-
options = []
|
|
210
|
-
# For each of the units we can define a maximum value that the value
|
|
211
|
-
# should not exceed. A maximum of 0 means no limit.
|
|
212
|
-
max = [ 60, 48, 0, 8, 24, 0 ]
|
|
213
|
-
|
|
214
|
-
i = 0
|
|
215
|
-
shortest = nil
|
|
216
|
-
factors.each do |factor|
|
|
217
|
-
scaledValue = value * factor
|
|
218
|
-
str = numberFormat.format(scaledValue)
|
|
219
|
-
# We ignore results that are 0 or exceed the maximum. To ensure that
|
|
220
|
-
# we have at least one result the unscaled value is always taken.
|
|
221
|
-
if (factor != 1.0 && scaledValue == 0) ||
|
|
222
|
-
(max[i] != 0 && scaledValue > max[i])
|
|
223
|
-
options << nil
|
|
224
|
-
else
|
|
225
|
-
options << str
|
|
226
|
-
end
|
|
227
|
-
i += 1
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
# Default to days in case they are all the same.
|
|
231
|
-
shortest = 2
|
|
232
|
-
# Find the shortest option.
|
|
233
|
-
6.times do |j|
|
|
234
|
-
shortest = j if options[j] &&
|
|
235
|
-
options[j].length < options[shortest].length
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
str = options[shortest]
|
|
239
|
-
if loadUnit == :longauto
|
|
240
|
-
# For the long units we handle singular and plural properly. For
|
|
241
|
-
# English we just need to append an 's', but this code will work for
|
|
242
|
-
# other languages as well.
|
|
243
|
-
units = []
|
|
244
|
-
if str == "1"
|
|
245
|
-
units = %w( minute hour day week month year )
|
|
246
|
-
else
|
|
247
|
-
units = %w( minutes hours days weeks months years )
|
|
248
|
-
end
|
|
249
|
-
str += ' ' + units[shortest]
|
|
250
|
-
else
|
|
251
|
-
str += %w( min h d w m y )[shortest]
|
|
252
|
-
end
|
|
253
|
-
else
|
|
254
|
-
# For fixed units we just need to do the conversion. No unit is
|
|
255
|
-
# included.
|
|
256
|
-
units = [ :minutes, :hours, :days, :weeks, :months, :years ]
|
|
257
|
-
str = numberFormat.format(value * factors[units.index(loadUnit)])
|
|
258
|
-
end
|
|
259
|
-
str
|
|
260
|
-
end
|
|
261
|
-
|
|
262
197
|
end
|
|
263
198
|
|
|
264
199
|
end
|
|
@@ -488,7 +488,7 @@ class TaskJuggler
|
|
|
488
488
|
t.send(name1Func) == currentInterval)
|
|
489
489
|
# call TjTime::sameTimeNext... function to get the end of the column.
|
|
490
490
|
nextT = t.send(sameTimeNextFunc)
|
|
491
|
-
iv =
|
|
491
|
+
iv = TimeInterval.new(t, nextT)
|
|
492
492
|
# Create the new column object.
|
|
493
493
|
column = ReportTableColumn.new(table, nil, '')
|
|
494
494
|
# Store the date of the column in the original form.
|
|
@@ -505,7 +505,7 @@ class TaskJuggler
|
|
|
505
505
|
# TODO: The width should be taken from some data structure.
|
|
506
506
|
column.cell2.width = 20
|
|
507
507
|
# Off-duty cells will have a different color than working time cells.
|
|
508
|
-
unless @project.
|
|
508
|
+
unless @project.hasWorkingTime(iv)
|
|
509
509
|
column.cell2.category = 'tabhead_offduty'
|
|
510
510
|
end
|
|
511
511
|
cellsInInterval += 1
|
|
@@ -736,8 +736,8 @@ class TaskJuggler
|
|
|
736
736
|
# scheduling problem, we use the full project interval.
|
|
737
737
|
taskStart = task['start', origQuery.scenarioIdx]
|
|
738
738
|
taskEnd = task['end', origQuery.scenarioIdx]
|
|
739
|
-
taskIv =
|
|
740
|
-
|
|
739
|
+
taskIv = TimeInterval.new(taskStart.nil? ? @project['start'] : taskStart,
|
|
740
|
+
taskEnd.nil? ? @project['end'] : taskEnd)
|
|
741
741
|
|
|
742
742
|
firstCell = nil
|
|
743
743
|
while t < @end
|
|
@@ -747,7 +747,7 @@ class TaskJuggler
|
|
|
747
747
|
query = origQuery.dup
|
|
748
748
|
# call TjTime::sameTimeNext... function
|
|
749
749
|
nextT = t.send(sameTimeNextFunc)
|
|
750
|
-
cellIv =
|
|
750
|
+
cellIv = TimeInterval.new(t, nextT)
|
|
751
751
|
case columnDef.content
|
|
752
752
|
when 'empty'
|
|
753
753
|
# Create a new cell
|
|
@@ -814,8 +814,9 @@ class TaskJuggler
|
|
|
814
814
|
# scheduling problem, we use the full project interval.
|
|
815
815
|
taskStart = task['start', origQuery.scenarioIdx]
|
|
816
816
|
taskEnd = task['end', origQuery.scenarioIdx]
|
|
817
|
-
taskIv =
|
|
818
|
-
|
|
817
|
+
taskIv = TimeInterval.new(taskStart.nil? ? @project['start'] :
|
|
818
|
+
taskStart,
|
|
819
|
+
taskEnd.nil? ? @project['end'] : taskEnd)
|
|
819
820
|
else
|
|
820
821
|
task = nil
|
|
821
822
|
end
|
|
@@ -832,7 +833,7 @@ class TaskJuggler
|
|
|
832
833
|
|
|
833
834
|
# call TjTime::sameTimeNext... function
|
|
834
835
|
nextT = t.send(sameTimeNextFunc)
|
|
835
|
-
cellIv =
|
|
836
|
+
cellIv = TimeInterval.new(t, nextT)
|
|
836
837
|
# Get work load for all tasks.
|
|
837
838
|
query.scopeProperty = nil
|
|
838
839
|
query.attributeId = 'effort'
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = ProjectFileParser.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
11
|
+
# published by the Free Software Foundation.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
require 'taskjuggler/reports/ReportBase.rb'
|
|
15
|
+
require 'taskjuggler/Tj3Config'
|
|
16
|
+
|
|
17
|
+
class TaskJuggler
|
|
18
|
+
|
|
19
|
+
# This class specializes ReportBase to generate tag files used by editors
|
|
20
|
+
# such as vim.
|
|
21
|
+
class TagFile < ReportBase
|
|
22
|
+
|
|
23
|
+
# The TagFileEntry class is used to store the intermediate representation
|
|
24
|
+
# of the TagFile.
|
|
25
|
+
class TagFileEntry
|
|
26
|
+
|
|
27
|
+
attr_reader :tag, :file, :line, :kind
|
|
28
|
+
|
|
29
|
+
# Create a new TagFileEntry object. _tag_ is the property ID. _file_ is
|
|
30
|
+
# the source file name, _line_ the line number in this file. _kind_
|
|
31
|
+
# specifies the property type. The following types should be used:
|
|
32
|
+
# r : Resource
|
|
33
|
+
# t : Task
|
|
34
|
+
# p : Report
|
|
35
|
+
def initialize(tag, file, line, kind)
|
|
36
|
+
@tag = tag
|
|
37
|
+
@file = file
|
|
38
|
+
@line = line
|
|
39
|
+
@kind = kind
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Used to sort the tag file entries by tag.
|
|
43
|
+
def <=>(e)
|
|
44
|
+
@tag <=> e.tag
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Convert the entry into a ctags compatible line.
|
|
48
|
+
def to_ctags
|
|
49
|
+
"#{@tag}\t#{@file}\t#{@line};\"\t#{@kind}\n"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def initialize(report)
|
|
55
|
+
super
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def generateIntermediateFormat
|
|
59
|
+
super
|
|
60
|
+
|
|
61
|
+
@tags = []
|
|
62
|
+
|
|
63
|
+
# Add the resources.
|
|
64
|
+
@resourceList = PropertyList.new(@project.resources)
|
|
65
|
+
@resourceList.setSorting(a('sortResources'))
|
|
66
|
+
@resourceList = filterResourceList(@resourceList, nil, a('hideResource'),
|
|
67
|
+
a('rollupResource'), a('openNodes'))
|
|
68
|
+
@resourceList.each do |resource|
|
|
69
|
+
next unless resource.sourceFileInfo
|
|
70
|
+
@tags << TagFileEntry.new(resource.fullId,
|
|
71
|
+
resource.sourceFileInfo.fileName,
|
|
72
|
+
resource.sourceFileInfo.lineNo, 'r')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Add the tasks.
|
|
76
|
+
@taskList = PropertyList.new(@project.tasks)
|
|
77
|
+
@taskList.setSorting(a('sortTasks'))
|
|
78
|
+
@taskList = filterTaskList(@taskList, nil, a('hideTask'), a('rollupTask'),
|
|
79
|
+
a('openNodes'))
|
|
80
|
+
@taskList.each do |task|
|
|
81
|
+
next unless task.sourceFileInfo
|
|
82
|
+
@tags << TagFileEntry.new(task.fullId,
|
|
83
|
+
task.sourceFileInfo.fileName,
|
|
84
|
+
task.sourceFileInfo.lineNo, 't')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Add the reports.
|
|
88
|
+
@project.reports.each do |report|
|
|
89
|
+
next unless report.sourceFileInfo
|
|
90
|
+
@tags << TagFileEntry.new(report.fullId,
|
|
91
|
+
report.sourceFileInfo.fileName,
|
|
92
|
+
report.sourceFileInfo.lineNo, 'p')
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Returns a String that contains the content of the ctags file.
|
|
97
|
+
# See http://vimdoc.sourceforge.net/htmldoc/tagsrch.html for the spec.
|
|
98
|
+
def to_ctags
|
|
99
|
+
# The ctags header. Not used if this is really needed.
|
|
100
|
+
s = <<"EOT"
|
|
101
|
+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
|
102
|
+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
|
103
|
+
!_TAG_PROGRAM_AUTHOR #{AppConfig.authors.join(';')} //
|
|
104
|
+
!_TAG_PROGRAM_NAME #{AppConfig.softwareName} //
|
|
105
|
+
!_TAG_PROGRAM_URL #{AppConfig.contact} /official site/
|
|
106
|
+
!_TAG_PROGRAM_VERSION #{AppConfig.version} //
|
|
107
|
+
EOT
|
|
108
|
+
|
|
109
|
+
# Turn the list of Tags into ctags lines.
|
|
110
|
+
@tags.sort.each do |tag|
|
|
111
|
+
s << tag.to_ctags
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
s
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
@@ -241,9 +241,9 @@ EOT
|
|
|
241
241
|
|
|
242
242
|
assignedTaskList.each do |task|
|
|
243
243
|
# Time sheet task records only make sense for leaf tasks.
|
|
244
|
-
reportIv =
|
|
245
|
-
taskIv =
|
|
246
|
-
|
|
244
|
+
reportIv = TimeInterval.new(from, to)
|
|
245
|
+
taskIv = TimeInterval.new(task['start', scenarioIdx],
|
|
246
|
+
task['end', scenarioIdx])
|
|
247
247
|
next if !task.leaf? || !reportIv.overlaps?(taskIv)
|
|
248
248
|
|
|
249
249
|
queryAttrs['property'] = task
|
|
@@ -26,7 +26,7 @@ class TaskJuggler
|
|
|
26
26
|
@supportedTaskAttrs = %w( booking complete depends flags maxend
|
|
27
27
|
maxstart minend minstart note priority
|
|
28
28
|
projectid responsible )
|
|
29
|
-
@supportedResourceAttrs = %w( flags vacation workinghours )
|
|
29
|
+
@supportedResourceAttrs = %w( booking flags vacation workinghours )
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def generateIntermediateFormat
|
|
@@ -193,7 +193,7 @@ class TaskJuggler
|
|
|
193
193
|
def generateTask(task, indent)
|
|
194
194
|
Log.activity if task.sequenceNo % 100 == 0
|
|
195
195
|
|
|
196
|
-
@file << ' ' * indent + "task #{task.
|
|
196
|
+
@file << ' ' * indent + "task #{task.subId} " +
|
|
197
197
|
"#{quotedString(task.name)} {\n"
|
|
198
198
|
|
|
199
199
|
if a('taskAttributes').include?('depends')
|
|
@@ -274,7 +274,6 @@ class TaskJuggler
|
|
|
274
274
|
def generateResourceAttributes
|
|
275
275
|
@resourceList.each do |resource|
|
|
276
276
|
Log.activity if resource.sequenceNo % 100 == 0
|
|
277
|
-
|
|
278
277
|
@file << "supplement resource #{resource.fullId} {\n"
|
|
279
278
|
@project.resources.eachAttributeDefinition do |attrDef|
|
|
280
279
|
id = attrDef.id
|
|
@@ -285,6 +284,7 @@ class TaskJuggler
|
|
|
285
284
|
if attrDef.scenarioSpecific
|
|
286
285
|
a('scenarios').each do |scenarioIdx|
|
|
287
286
|
next if inheritable?(resource, id, scenarioIdx)
|
|
287
|
+
|
|
288
288
|
generateAttribute(resource, id, 2, scenarioIdx)
|
|
289
289
|
end
|
|
290
290
|
else
|
|
@@ -292,6 +292,15 @@ class TaskJuggler
|
|
|
292
292
|
end
|
|
293
293
|
end
|
|
294
294
|
|
|
295
|
+
# Since 'booking' is a task attribute, we need a special handling if
|
|
296
|
+
# we want to list them in the resource context.
|
|
297
|
+
if a('resourceAttributes').include?('booking') &&
|
|
298
|
+
a('resourceAttributes')[0] != '*'
|
|
299
|
+
a('scenarios').each do |scenarioIdx|
|
|
300
|
+
generateBookingsByResource(resource, 2, scenarioIdx)
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
295
304
|
@file << "}\n"
|
|
296
305
|
end
|
|
297
306
|
end
|
|
@@ -326,7 +335,7 @@ class TaskJuggler
|
|
|
326
335
|
when 'depends'
|
|
327
336
|
next # already taken care of
|
|
328
337
|
when 'booking'
|
|
329
|
-
|
|
338
|
+
generateBookingsByTask(task, 2, scenarioIdx)
|
|
330
339
|
else
|
|
331
340
|
generateAttribute(task, id, 2, scenarioIdx)
|
|
332
341
|
end
|
|
@@ -363,13 +372,14 @@ class TaskJuggler
|
|
|
363
372
|
# report.
|
|
364
373
|
def getBookings
|
|
365
374
|
@bookings = {}
|
|
366
|
-
if a('taskAttributes').include?('booking')
|
|
375
|
+
if a('taskAttributes').include?('booking') ||
|
|
376
|
+
a('resourceAttributes').include?('booking')
|
|
367
377
|
a('scenarios').each do |scenarioIdx|
|
|
368
378
|
@bookings[scenarioIdx] = {}
|
|
369
379
|
@resourceList.each do |resource|
|
|
370
380
|
# Get the bookings for this resource hashed by task.
|
|
371
|
-
bookings = resource.getBookings(
|
|
372
|
-
|
|
381
|
+
bookings = resource.getBookings(
|
|
382
|
+
scenarioIdx, TimeInterval.new(a('start'), a('end')))
|
|
373
383
|
next if bookings.nil?
|
|
374
384
|
|
|
375
385
|
# Now convert/add them to a tripple-stage hash by scenarioIdx, task
|
|
@@ -387,7 +397,7 @@ class TaskJuggler
|
|
|
387
397
|
end
|
|
388
398
|
end
|
|
389
399
|
|
|
390
|
-
def
|
|
400
|
+
def generateBookingsByTask(task, indent, scenarioIdx)
|
|
391
401
|
return unless @bookings[scenarioIdx].include?(task)
|
|
392
402
|
|
|
393
403
|
# Convert Hash into an [ Resource, Booking ] Array sorted by Resource
|
|
@@ -397,10 +407,24 @@ class TaskJuggler
|
|
|
397
407
|
end
|
|
398
408
|
|
|
399
409
|
resourceBookings.each do |resourceId, booking|
|
|
400
|
-
generateAttributeText('booking ' + booking.to_tjp, indent,
|
|
410
|
+
generateAttributeText('booking ' + booking.to_tjp(false), indent,
|
|
411
|
+
scenarioIdx)
|
|
401
412
|
end
|
|
402
413
|
end
|
|
403
414
|
|
|
415
|
+
def generateBookingsByResource(resource, indent, scenarioIdx)
|
|
416
|
+
# Get the bookings for this resource hashed by task.
|
|
417
|
+
bookings = resource.getBookings(scenarioIdx,
|
|
418
|
+
TimeInterval.new(a('start'), a('end')),
|
|
419
|
+
false)
|
|
420
|
+
bookings.each do |booking|
|
|
421
|
+
next unless @taskList.include?(booking.task)
|
|
422
|
+
generateAttributeText('booking ' + booking.to_tjp(true), indent,
|
|
423
|
+
scenarioIdx)
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
|
|
404
428
|
# This utility function is used to indent multi-line attributes. All
|
|
405
429
|
# attributes should be filtered through this function. Attributes that
|
|
406
430
|
# contain line breaks will be indented properly. In addition to the
|