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
|
@@ -27,7 +27,7 @@ class TaskJuggler
|
|
|
27
27
|
# attribute like an URL that contains more details about the task.
|
|
28
28
|
class PropertyTreeNode
|
|
29
29
|
|
|
30
|
-
attr_reader :propertySet, :id, :parent, :project, :sequenceNo,
|
|
30
|
+
attr_reader :propertySet, :id, :subId, :parent, :project, :sequenceNo,
|
|
31
31
|
:children, :adoptees
|
|
32
32
|
attr_accessor :name, :sourceFileInfo
|
|
33
33
|
attr_reader :data
|
|
@@ -44,6 +44,10 @@ class TaskJuggler
|
|
|
44
44
|
@propertySet = propertySet
|
|
45
45
|
@project = propertySet.project
|
|
46
46
|
@parent = parent
|
|
47
|
+
|
|
48
|
+
# Scenario specific data
|
|
49
|
+
@data = nil
|
|
50
|
+
|
|
47
51
|
# Attributes are created on-demand. We need to be careful that a pure
|
|
48
52
|
# check for existance does not create them unecessarily.
|
|
49
53
|
@attributes = Hash.new do |hash, attributeId|
|
|
@@ -53,12 +57,12 @@ class TaskJuggler
|
|
|
53
57
|
"#{self.class.to_s.sub(/TaskJuggler::/, '')} '#{fullId}'"
|
|
54
58
|
end
|
|
55
59
|
unless aType.scenarioSpecific
|
|
56
|
-
hash[attributeId] = aType.objClass.new(@propertySet, aType)
|
|
60
|
+
hash[attributeId] = aType.objClass.new(@propertySet, aType, self)
|
|
57
61
|
else
|
|
58
62
|
raise ArgumentError, "Attribute '#{attributeId}' is scenario specific"
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
|
-
@scenarioAttributes = Array.new(@project.scenarioCount) do
|
|
65
|
+
@scenarioAttributes = Array.new(@project.scenarioCount) do |scenarioIdx|
|
|
62
66
|
Hash.new do |hash, attributeId|
|
|
63
67
|
unless (aType = attributeDefinition(attributeId))
|
|
64
68
|
raise ArgumentError,
|
|
@@ -66,7 +70,8 @@ class TaskJuggler
|
|
|
66
70
|
"#{self.class.to_s.sub(/TaskJuggler::/, '')} '#{fullId}'"
|
|
67
71
|
end
|
|
68
72
|
if aType.scenarioSpecific
|
|
69
|
-
hash[attributeId] = aType.objClass.new(@propertySet, aType
|
|
73
|
+
hash[attributeId] = aType.objClass.new(@propertySet, aType,
|
|
74
|
+
@data[scenarioIdx])
|
|
70
75
|
else
|
|
71
76
|
raise ArgumentError,
|
|
72
77
|
"Attribute '#{attributeId}' is not scenario specific"
|
|
@@ -93,9 +98,9 @@ class TaskJuggler
|
|
|
93
98
|
"(#{@parentId}) don't match"
|
|
94
99
|
end
|
|
95
100
|
end
|
|
96
|
-
@
|
|
101
|
+
@subId = id[(id.rindex('.') + 1).. -1]
|
|
97
102
|
else
|
|
98
|
-
@
|
|
103
|
+
@subId = id
|
|
99
104
|
end
|
|
100
105
|
# The attribute 'id' is either the short ID or the full hierarchical ID.
|
|
101
106
|
set('id', fullId)
|
|
@@ -121,9 +126,6 @@ class TaskJuggler
|
|
|
121
126
|
# This is a list of the PropertyTreeNode objects that have adopted this
|
|
122
127
|
# node.
|
|
123
128
|
@stepParents = []
|
|
124
|
-
|
|
125
|
-
# Scenario specific data
|
|
126
|
-
@data = nil
|
|
127
129
|
end
|
|
128
130
|
|
|
129
131
|
# We only use deep_clone for attributes, never for properties. Since
|
|
@@ -279,11 +281,11 @@ class TaskJuggler
|
|
|
279
281
|
# namespace, this is just the ID. Otherwise, the full ID is composed of all
|
|
280
282
|
# IDs from the root node to this node, separating the IDs by a dot.
|
|
281
283
|
def fullId
|
|
282
|
-
res = @
|
|
284
|
+
res = @subId
|
|
283
285
|
unless @propertySet.flatNamespace
|
|
284
286
|
t = self
|
|
285
287
|
until (t = t.parent).nil?
|
|
286
|
-
res = t.
|
|
288
|
+
res = t.subId + "." + res
|
|
287
289
|
end
|
|
288
290
|
end
|
|
289
291
|
res
|
|
@@ -386,7 +388,9 @@ class TaskJuggler
|
|
|
386
388
|
# _attributeId_. This method works for built-in attributes as well.
|
|
387
389
|
# In case the attribute does not exist, an exception is raised.
|
|
388
390
|
def get(attributeId)
|
|
389
|
-
|
|
391
|
+
# Make sure the attribute gets created if it doesn't exist already.
|
|
392
|
+
@attributes[attributeId]
|
|
393
|
+
instance_variable_get(('@' + attributeId).intern)
|
|
390
394
|
end
|
|
391
395
|
|
|
392
396
|
# Return the value of the attribute with ID _attributeId_. This method
|
|
@@ -450,7 +454,8 @@ class TaskJuggler
|
|
|
450
454
|
# scenario-specific attributes, _scenario_ must indicate the index of the
|
|
451
455
|
# Scenario.
|
|
452
456
|
def [](attributeId, scenario)
|
|
453
|
-
@scenarioAttributes[scenario][attributeId]
|
|
457
|
+
@scenarioAttributes[scenario][attributeId]
|
|
458
|
+
@data[scenario].instance_variable_get(('@' + attributeId).intern)
|
|
454
459
|
end
|
|
455
460
|
|
|
456
461
|
# Returns true if the value of the attribute _attributeId_ (in scenario
|
|
@@ -641,15 +646,15 @@ class TaskJuggler
|
|
|
641
646
|
end
|
|
642
647
|
|
|
643
648
|
def error(id, text)
|
|
644
|
-
@project.messageHandler.error(id, text, sourceFileInfo, nil, self, nil)
|
|
649
|
+
@project.messageHandler.error(id, text, @sourceFileInfo, nil, self, nil)
|
|
645
650
|
end
|
|
646
651
|
|
|
647
652
|
def warning(id, text)
|
|
648
|
-
@project.messageHandler.warning(id, text, sourceFileInfo, nil, self, nil)
|
|
653
|
+
@project.messageHandler.warning(id, text, @sourceFileInfo, nil, self, nil)
|
|
649
654
|
end
|
|
650
655
|
|
|
651
656
|
def info(id, text)
|
|
652
|
-
@project.messageHandler.info(id, text, sourceFileInfo, nil, self, nil)
|
|
657
|
+
@project.messageHandler.info(id, text, @sourceFileInfo, nil, self, nil)
|
|
653
658
|
end
|
|
654
659
|
|
|
655
660
|
|
data/lib/taskjuggler/Query.rb
CHANGED
|
@@ -273,7 +273,8 @@ class TaskJuggler
|
|
|
273
273
|
# duration effort in days. The return value is the converted value with
|
|
274
274
|
# optional unit as a String.
|
|
275
275
|
def scaleDuration(value)
|
|
276
|
-
scaleValue(value, [ 24 * 60, 24, 1, 1.0 / 7, 1.0 / 30.42,
|
|
276
|
+
scaleValue(value, [ 24 * 60, 24, 1, 1.0 / 7, 1.0 / 30.42,
|
|
277
|
+
1.0 / 91.25, 1.0 / 365 ])
|
|
277
278
|
end
|
|
278
279
|
|
|
279
280
|
# Convert a load or effort value to the format specified by @loadUnit.
|
|
@@ -285,6 +286,7 @@ class TaskJuggler
|
|
|
285
286
|
1.0,
|
|
286
287
|
1.0 / @project.weeklyWorkingDays,
|
|
287
288
|
1.0 / @project.monthlyWorkingDays,
|
|
289
|
+
1.0 / (@project.yearlyWorkingDays / 4),
|
|
288
290
|
1.0 / @project.yearlyWorkingDays ])
|
|
289
291
|
end
|
|
290
292
|
|
|
@@ -319,8 +321,9 @@ class TaskJuggler
|
|
|
319
321
|
# the original value.
|
|
320
322
|
delta = []
|
|
321
323
|
# For each of the units we can define a maximum value that the value
|
|
322
|
-
# should not exceed. nil means no limit.
|
|
323
|
-
|
|
324
|
+
# should not exceed. nil means no limit. Never use quarters since it's
|
|
325
|
+
# pretty uncommon to use.
|
|
326
|
+
max = [ 60, 48, nil, 8, 24, 0, nil ]
|
|
324
327
|
|
|
325
328
|
i = 0
|
|
326
329
|
factors.each do |factor|
|
|
@@ -359,18 +362,18 @@ class TaskJuggler
|
|
|
359
362
|
# other languages as well.
|
|
360
363
|
units = []
|
|
361
364
|
if str == "1"
|
|
362
|
-
units = %w( minute hour day week month year )
|
|
365
|
+
units = %w( minute hour day week month quarter year )
|
|
363
366
|
else
|
|
364
|
-
units = %w( minutes hours days weeks months years )
|
|
367
|
+
units = %w( minutes hours days weeks months quarters years )
|
|
365
368
|
end
|
|
366
369
|
str += ' ' + units[shortest]
|
|
367
370
|
else
|
|
368
|
-
str += %w( min h d w m y )[shortest]
|
|
371
|
+
str += %w( min h d w m q y )[shortest]
|
|
369
372
|
end
|
|
370
373
|
else
|
|
371
374
|
# For fixed units we just need to do the conversion. No unit is
|
|
372
375
|
# included.
|
|
373
|
-
units = [ :minutes, :hours, :days, :weeks, :months, :years ]
|
|
376
|
+
units = [ :minutes, :hours, :days, :weeks, :months, :quarters, :years ]
|
|
374
377
|
str = @numberFormat.format(value * factors[units.index(@loadUnit)])
|
|
375
378
|
end
|
|
376
379
|
str
|
data/lib/taskjuggler/Resource.rb
CHANGED
|
@@ -24,10 +24,15 @@ class TaskJuggler
|
|
|
24
24
|
|
|
25
25
|
@data = Array.new(@project.scenarioCount, nil)
|
|
26
26
|
@project.scenarioCount.times do |i|
|
|
27
|
-
|
|
27
|
+
ResourceScenario.new(self, i, @scenarioAttributes[i])
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
# Just a shortcut to avoid the slower calls via method_missing.
|
|
32
|
+
def book(scenarioIdx, sbIdx, task)
|
|
33
|
+
@data[scenarioIdx].book(sbIdx, task)
|
|
34
|
+
end
|
|
35
|
+
|
|
31
36
|
# Many Resource functions are scenario specific. These functions are
|
|
32
37
|
# provided by the class ResourceScenario. In case we can't find a
|
|
33
38
|
# function called for the Resource class we try to find it in
|
|
@@ -46,13 +46,22 @@ class TaskJuggler
|
|
|
46
46
|
# Same but for each assigned resource.
|
|
47
47
|
@lastBookedSlots = {}
|
|
48
48
|
|
|
49
|
+
# Attributed are only really created when they are accessed the first
|
|
50
|
+
# time. So make sure some needed attributes really exist so we don't
|
|
51
|
+
# have to check for existance each time we access them.
|
|
52
|
+
%w( alloctdeffort criticalness directreports duties efficiency
|
|
53
|
+
effort limits managers rate reports shifts
|
|
54
|
+
vacations workinghours ).each do |attr|
|
|
55
|
+
@property[attr, @scenarioIdx]
|
|
56
|
+
end
|
|
57
|
+
|
|
49
58
|
@dCache = DataCache.instance
|
|
50
59
|
end
|
|
51
60
|
|
|
52
61
|
# This method must be called at the beginning of each scheduling run. It
|
|
53
62
|
# initializes variables used during the scheduling process.
|
|
54
63
|
def prepareScheduling
|
|
55
|
-
@
|
|
64
|
+
@effort = 0
|
|
56
65
|
initScoreboard if @property.leaf?
|
|
57
66
|
|
|
58
67
|
setDirectReports
|
|
@@ -66,14 +75,14 @@ class TaskJuggler
|
|
|
66
75
|
def calcCriticalness
|
|
67
76
|
if @scoreboard.nil?
|
|
68
77
|
# Resources that are not allocated are not critical at all.
|
|
69
|
-
@
|
|
78
|
+
@criticalness = 0.0
|
|
70
79
|
else
|
|
71
80
|
freeSlots = 0
|
|
72
81
|
@scoreboard.each do |slot|
|
|
73
82
|
freeSlots += 1 if slot.nil?
|
|
74
83
|
end
|
|
75
|
-
@
|
|
76
|
-
|
|
84
|
+
@criticalness = freeSlots == 0 ? 1.0 :
|
|
85
|
+
@alloctdeffort / freeSlots
|
|
77
86
|
end
|
|
78
87
|
end
|
|
79
88
|
|
|
@@ -84,7 +93,7 @@ class TaskJuggler
|
|
|
84
93
|
# The 'directreports' attribute is the reverse link for the 'managers'
|
|
85
94
|
# attribute. In contrast to the 'managers' attribute, the
|
|
86
95
|
# 'directreports' list has no duplicate entries.
|
|
87
|
-
|
|
96
|
+
@managers.each do |manager|
|
|
88
97
|
unless manager['directreports', @scenarioIdx].include?(@property)
|
|
89
98
|
manager['directreports', @scenarioIdx] << @property
|
|
90
99
|
end
|
|
@@ -92,15 +101,15 @@ class TaskJuggler
|
|
|
92
101
|
end
|
|
93
102
|
|
|
94
103
|
def setReports
|
|
95
|
-
return unless
|
|
104
|
+
return unless @directreports.empty?
|
|
96
105
|
|
|
97
|
-
|
|
106
|
+
@managers.each do |r|
|
|
98
107
|
r.setReports_i(@scenarioIdx, [ @property ])
|
|
99
108
|
end
|
|
100
109
|
end
|
|
101
110
|
|
|
102
111
|
def preScheduleCheck
|
|
103
|
-
|
|
112
|
+
@managers.each do |manager|
|
|
104
113
|
unless manager.leaf?
|
|
105
114
|
error('manager_is_group',
|
|
106
115
|
"Resource #{@property.fullId} has group #{manager.fullId} " +
|
|
@@ -124,7 +133,7 @@ class TaskJuggler
|
|
|
124
133
|
|
|
125
134
|
if (parent = @property.parent)
|
|
126
135
|
# Add the assigned task to the parent duties list.
|
|
127
|
-
|
|
136
|
+
@duties.each do |task|
|
|
128
137
|
unless parent['duties', @scenarioIdx].include?(task)
|
|
129
138
|
parent['duties', @scenarioIdx] << task
|
|
130
139
|
end
|
|
@@ -137,8 +146,8 @@ class TaskJuggler
|
|
|
137
146
|
def available?(sbIdx)
|
|
138
147
|
return false unless @scoreboard[sbIdx].nil?
|
|
139
148
|
|
|
140
|
-
limits =
|
|
141
|
-
return false if limits && !limits.ok?(
|
|
149
|
+
limits = @limits
|
|
150
|
+
return false if limits && !limits.ok?(sbIdx)
|
|
142
151
|
|
|
143
152
|
true
|
|
144
153
|
end
|
|
@@ -156,8 +165,8 @@ class TaskJuggler
|
|
|
156
165
|
return false if !force && !available?(sbIdx)
|
|
157
166
|
|
|
158
167
|
# Make sure the task is in the list of duties.
|
|
159
|
-
unless
|
|
160
|
-
@
|
|
168
|
+
unless @duties.include?(task)
|
|
169
|
+
@duties << task
|
|
161
170
|
end
|
|
162
171
|
|
|
163
172
|
#puts "Booking resource #{@property.fullId} at " +
|
|
@@ -170,7 +179,7 @@ class TaskJuggler
|
|
|
170
179
|
t['effort', @scenarioIdx] += 1
|
|
171
180
|
t = t.parent
|
|
172
181
|
end
|
|
173
|
-
|
|
182
|
+
@limits.inc(sbIdx) if @limits
|
|
174
183
|
|
|
175
184
|
# Scoreboard iterations are fairly expensive but they are very frequent
|
|
176
185
|
# operations in later processing. To limit the interations to the
|
|
@@ -242,7 +251,7 @@ class TaskJuggler
|
|
|
242
251
|
query.scopeProperty)
|
|
243
252
|
query.string = query.currencyFormat.format(cost)
|
|
244
253
|
else
|
|
245
|
-
query.string = 'No
|
|
254
|
+
query.string = 'No \'balance\' defined!'
|
|
246
255
|
end
|
|
247
256
|
end
|
|
248
257
|
|
|
@@ -285,12 +294,12 @@ class TaskJuggler
|
|
|
285
294
|
query.scopeProperty)
|
|
286
295
|
query.string = query.currencyFormat.format(revenue)
|
|
287
296
|
else
|
|
288
|
-
query.string = 'No
|
|
297
|
+
query.string = 'No \'balance\' defined!'
|
|
289
298
|
end
|
|
290
299
|
end
|
|
291
300
|
|
|
292
301
|
# The work time of the Resource that was blocked by a vacation during the
|
|
293
|
-
# specified
|
|
302
|
+
# specified TimeInterval. The result is in working days (effort).
|
|
294
303
|
def query_vacationdays(query)
|
|
295
304
|
query.sortable = query.numerical = time =
|
|
296
305
|
getVacationDays(query.startIdx, query.endIdx)
|
|
@@ -302,7 +311,7 @@ class TaskJuggler
|
|
|
302
311
|
def getEffectiveWork(startIdx, endIdx, task = nil)
|
|
303
312
|
# There can't be any effective work if the start is after the end or the
|
|
304
313
|
# todo list doesn't contain the specified task.
|
|
305
|
-
return 0.0 if startIdx >= endIdx || (task &&
|
|
314
|
+
return 0.0 if startIdx >= endIdx || (task && !@duties.include?(task))
|
|
306
315
|
|
|
307
316
|
# The unique key we use to address the result in the cache.
|
|
308
317
|
key = [ self, :ResourceScenarioEffectiveWork, startIdx, endIdx,
|
|
@@ -324,7 +333,7 @@ class TaskJuggler
|
|
|
324
333
|
|
|
325
334
|
work = @project.convertToDailyLoad(
|
|
326
335
|
getAllocatedSlots(startIdx, endIdx, task) *
|
|
327
|
-
@project['scheduleGranularity']) *
|
|
336
|
+
@project['scheduleGranularity']) * @efficiency
|
|
328
337
|
end
|
|
329
338
|
@dCache.store(work, key)
|
|
330
339
|
end
|
|
@@ -384,7 +393,7 @@ class TaskJuggler
|
|
|
384
393
|
else
|
|
385
394
|
work = @project.convertToDailyLoad(
|
|
386
395
|
getFreeSlots(startIdx, endIdx) *
|
|
387
|
-
@project['scheduleGranularity']) *
|
|
396
|
+
@project['scheduleGranularity']) * @efficiency
|
|
388
397
|
end
|
|
389
398
|
work
|
|
390
399
|
end
|
|
@@ -406,7 +415,7 @@ class TaskJuggler
|
|
|
406
415
|
|
|
407
416
|
vacationDays = @project.convertToDailyLoad(
|
|
408
417
|
getVacationSlots(startIdx, endIdx) *
|
|
409
|
-
@project['scheduleGranularity']) *
|
|
418
|
+
@project['scheduleGranularity']) * @efficiency
|
|
410
419
|
end
|
|
411
420
|
vacationDays
|
|
412
421
|
end
|
|
@@ -418,7 +427,7 @@ class TaskJuggler
|
|
|
418
427
|
amount += child.turnover(@scenarioIdx, startIdx, endIdx, account, task)
|
|
419
428
|
end
|
|
420
429
|
else
|
|
421
|
-
|
|
430
|
+
@duties.each do |duty|
|
|
422
431
|
amount += duty.turnover(@scenarioIdx, startIdx, endIdx, account,
|
|
423
432
|
@property)
|
|
424
433
|
end
|
|
@@ -427,18 +436,18 @@ class TaskJuggler
|
|
|
427
436
|
amount
|
|
428
437
|
end
|
|
429
438
|
|
|
430
|
-
# Returns the cost for using this resource during the specified
|
|
431
|
-
# _period_. If a Task _task_ is provided, only the work on
|
|
432
|
-
# task is considered.
|
|
439
|
+
# Returns the cost for using this resource during the specified
|
|
440
|
+
# TimeInterval _period_. If a Task _task_ is provided, only the work on
|
|
441
|
+
# this particular task is considered.
|
|
433
442
|
def cost(startIdx, endIdx, task = nil)
|
|
434
|
-
getAllocatedTime(startIdx, endIdx, task) *
|
|
443
|
+
getAllocatedTime(startIdx, endIdx, task) * @rate
|
|
435
444
|
end
|
|
436
445
|
|
|
437
446
|
# Returns true if the resource or any of its children is allocated during
|
|
438
|
-
# the period specified with the
|
|
447
|
+
# the period specified with the TimeInterval _iv_. If task is not nil
|
|
439
448
|
# only allocations to this tasks are respected.
|
|
440
449
|
def allocated?(iv, task = nil)
|
|
441
|
-
return false if task &&
|
|
450
|
+
return false if task && !@duties.include?(task)
|
|
442
451
|
|
|
443
452
|
startIdx = @project.dateToIdx(iv.start)
|
|
444
453
|
endIdx = @project.dateToIdx(iv.end)
|
|
@@ -450,26 +459,22 @@ class TaskJuggler
|
|
|
450
459
|
end
|
|
451
460
|
|
|
452
461
|
# Iterate over the scoreboard and turn its content into a set of Bookings.
|
|
453
|
-
# _iv_ can be
|
|
454
|
-
# period.
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
bookings
|
|
460
|
-
|
|
461
|
-
bookingStart = nil
|
|
462
|
+
# _iv_ can be a TimeInterval to limit the bookings within the provided
|
|
463
|
+
# period. if _hashByTask_ is true, the result is a Hash of Arrays with
|
|
464
|
+
# bookings hashed by Task. Otherwise it's just a plain Array with
|
|
465
|
+
# Bookings.
|
|
466
|
+
def getBookings(iv = nil, hashByTask = true)
|
|
467
|
+
bookings = hashByTask ? {} : []
|
|
468
|
+
return bookings if @property.container? || @scoreboard.nil? ||
|
|
469
|
+
@firstBookedSlot.nil? || @lastBookedSlot.nil?
|
|
462
470
|
|
|
463
471
|
# To speedup the collection we start with the first booked slot and end
|
|
464
472
|
# with the last booked slot.
|
|
465
473
|
startIdx = @firstBookedSlot
|
|
466
474
|
endIdx = @lastBookedSlot + 1
|
|
467
475
|
|
|
468
|
-
#
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
# If the user provided an Interval, we only return bookings within this
|
|
472
|
-
# Interval.
|
|
476
|
+
# If the user provided a TimeInterval, we only return bookings within
|
|
477
|
+
# this TimeInterval.
|
|
473
478
|
if iv
|
|
474
479
|
ivStartIdx = @project.dateToIdx(iv.start)
|
|
475
480
|
ivEndIdx = @project.dateToIdx(iv.end)
|
|
@@ -477,21 +482,35 @@ class TaskJuggler
|
|
|
477
482
|
endIdx = ivEndIdx if ivEndIdx < endIdx
|
|
478
483
|
end
|
|
479
484
|
|
|
485
|
+
lastTask = nil
|
|
486
|
+
bookingStart = nil
|
|
487
|
+
|
|
480
488
|
startIdx.upto(endIdx) do |idx|
|
|
481
489
|
task = @scoreboard[idx]
|
|
482
490
|
# Now we watch for task changes.
|
|
483
|
-
if task != lastTask ||
|
|
484
|
-
(task.is_a?(Task) && idx == endIdx)
|
|
485
|
-
|
|
491
|
+
if task != lastTask ||
|
|
492
|
+
(task.is_a?(Task) && (lastTask.nil? || idx == endIdx))
|
|
493
|
+
if lastTask
|
|
494
|
+
# We've found the end of a task booking series.
|
|
486
495
|
# If we don't have a Booking for the task yet, we create one.
|
|
487
|
-
if
|
|
488
|
-
bookings[lastTask]
|
|
496
|
+
if hashByTask
|
|
497
|
+
if bookings[lastTask].nil?
|
|
498
|
+
bookings[lastTask] = Booking.new(@property, lastTask, [])
|
|
499
|
+
end
|
|
500
|
+
# Append the new interval to the Booking.
|
|
501
|
+
bookings[lastTask].intervals <<
|
|
502
|
+
TimeInterval.new(@scoreboard.idxToDate(bookingStart),
|
|
503
|
+
@scoreboard.idxToDate(idx))
|
|
504
|
+
else
|
|
505
|
+
if bookings.empty? || bookings.last.task != lastTask
|
|
506
|
+
bookings << Booking.new(@property, lastTask, [])
|
|
507
|
+
end
|
|
508
|
+
# Append the new interval to the Booking.
|
|
509
|
+
bookings.last.intervals <<
|
|
510
|
+
TimeInterval.new(@scoreboard.idxToDate(bookingStart),
|
|
511
|
+
@scoreboard.idxToDate(idx))
|
|
489
512
|
end
|
|
490
513
|
|
|
491
|
-
# Append the new interval to the Booking.
|
|
492
|
-
bookings[lastTask].intervals <<
|
|
493
|
-
Interval.new(@scoreboard.idxToDate(bookingStart),
|
|
494
|
-
@scoreboard.idxToDate(idx))
|
|
495
514
|
end
|
|
496
515
|
# Get ready for the next task booking interval
|
|
497
516
|
if task.is_a?(Task)
|
|
@@ -578,19 +597,16 @@ class TaskJuggler
|
|
|
578
597
|
@project['scheduleGranularity'], 2)
|
|
579
598
|
|
|
580
599
|
# We'll need this frequently and can savely cache it here.
|
|
581
|
-
@shifts =
|
|
582
|
-
@workinghours =
|
|
600
|
+
@shifts = @shifts
|
|
601
|
+
@workinghours = @workinghours
|
|
583
602
|
|
|
584
603
|
# Change all work time slots to nil (available) again.
|
|
585
|
-
date = @scoreboard.idxToDate(0)
|
|
586
|
-
delta = @project['scheduleGranularity']
|
|
587
604
|
@project.scoreboardSize.times do |i|
|
|
588
|
-
@scoreboard[i] = nil if onShift?(
|
|
589
|
-
date += delta
|
|
605
|
+
@scoreboard[i] = nil if onShift?(i)
|
|
590
606
|
end
|
|
591
607
|
|
|
592
608
|
# Mark all resource specific vacation slots as such
|
|
593
|
-
|
|
609
|
+
@vacations.each do |vacation|
|
|
594
610
|
startIdx = @scoreboard.dateToIdx(vacation.start)
|
|
595
611
|
endIdx = @scoreboard.dateToIdx(vacation.end)
|
|
596
612
|
startIdx.upto(endIdx - 1) do |i|
|
|
@@ -613,7 +629,7 @@ class TaskJuggler
|
|
|
613
629
|
unless @shifts.nil?
|
|
614
630
|
# Mark the vacations from all the shifts the resource is assigned to.
|
|
615
631
|
@project.scoreboardSize.times do |i|
|
|
616
|
-
v = @shifts.getSbSlot(
|
|
632
|
+
v = @shifts.getSbSlot(i)
|
|
617
633
|
# Check if the vacation replacement bit is set. In that case we copy
|
|
618
634
|
# the whole interval over to the resource scoreboard overriding any
|
|
619
635
|
# global vacations.
|
|
@@ -654,21 +670,21 @@ class TaskJuggler
|
|
|
654
670
|
"Management loop detected. #{@property.fullId} has self " +
|
|
655
671
|
"in list of reports")
|
|
656
672
|
end
|
|
657
|
-
@
|
|
673
|
+
@reports += reports
|
|
658
674
|
# Resources can end up multiple times in the list if they have multiple
|
|
659
675
|
# reporting chains. We only need them once in the list.
|
|
660
|
-
|
|
676
|
+
@reports.uniq!
|
|
661
677
|
|
|
662
|
-
|
|
663
|
-
r.setReports_i(@scenarioIdx,
|
|
678
|
+
@managers.each do |r|
|
|
679
|
+
r.setReports_i(@scenarioIdx, @reports)
|
|
664
680
|
end
|
|
665
681
|
end
|
|
666
682
|
|
|
667
|
-
def onShift?(
|
|
668
|
-
if @shifts && @shifts.assigned?(
|
|
669
|
-
return @shifts.onShift?(
|
|
683
|
+
def onShift?(sbIdx)
|
|
684
|
+
if @shifts && @shifts.assigned?(sbIdx)
|
|
685
|
+
return @shifts.onShift?(sbIdx)
|
|
670
686
|
else
|
|
671
|
-
@workinghours.onShift?(
|
|
687
|
+
@workinghours.onShift?(sbIdx)
|
|
672
688
|
end
|
|
673
689
|
end
|
|
674
690
|
|
|
@@ -682,7 +698,7 @@ class TaskJuggler
|
|
|
682
698
|
task)
|
|
683
699
|
end
|
|
684
700
|
else
|
|
685
|
-
return false unless @scoreboard &&
|
|
701
|
+
return false unless @scoreboard && @duties.include?(task)
|
|
686
702
|
|
|
687
703
|
startIdx, endIdx = fitIndicies(startIdx, endIdx, task)
|
|
688
704
|
return false if startIdx >= endIdx
|
|
@@ -703,7 +719,7 @@ class TaskJuggler
|
|
|
703
719
|
end
|
|
704
720
|
dailyRate
|
|
705
721
|
else
|
|
706
|
-
|
|
722
|
+
@rate
|
|
707
723
|
end
|
|
708
724
|
end
|
|
709
725
|
|
|
@@ -159,8 +159,8 @@ class TaskJuggler
|
|
|
159
159
|
def setLoadUnit(query, args)
|
|
160
160
|
units = {
|
|
161
161
|
'days' => :days, 'hours' => :hours, 'longauto' => :longauto,
|
|
162
|
-
'minutes' => :minutes, 'months' => :months, '
|
|
163
|
-
'weeks' => :weeks, 'years' => :years
|
|
162
|
+
'minutes' => :minutes, 'months' => :months, 'quarters' => :quarters,
|
|
163
|
+
'shortauto' => :shortauto, 'weeks' => :weeks, 'years' => :years
|
|
164
164
|
}
|
|
165
165
|
query.loadUnit = units[args['loadunit']] if args['loadunit']
|
|
166
166
|
end
|
|
@@ -25,10 +25,20 @@ class TaskJuggler
|
|
|
25
25
|
@project = property.project
|
|
26
26
|
@scenarioIdx = idx
|
|
27
27
|
@attributes = attributes
|
|
28
|
+
|
|
29
|
+
# Register the scenario with the Task.
|
|
30
|
+
@property.data[idx] = self
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# We only use deep_clone for attributes, never for properties. Since
|
|
34
|
+
# attributes may reference properties these references should remain
|
|
35
|
+
# references.
|
|
36
|
+
def deep_clone
|
|
37
|
+
self
|
|
28
38
|
end
|
|
29
39
|
|
|
30
40
|
def a(attributeName)
|
|
31
|
-
@attributes[attributeName].
|
|
41
|
+
@attributes[attributeName].get
|
|
32
42
|
end
|
|
33
43
|
|
|
34
44
|
def error(id, text, sourceFileInfo = nil, property = nil)
|
|
@@ -81,6 +81,13 @@ class TaskJuggler
|
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
+
# Iterate over all scoreboard entries by index.
|
|
85
|
+
def each_index
|
|
86
|
+
@sb.each_index do |index|
|
|
87
|
+
yield index
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
84
91
|
# Assign result of block to each element.
|
|
85
92
|
def collect!
|
|
86
93
|
@sb.collect! { |x| yield x }
|
|
@@ -154,7 +161,7 @@ class TaskJuggler
|
|
|
154
161
|
start = sIdx if start < sIdx
|
|
155
162
|
idx = eIdx if idx > eIdx
|
|
156
163
|
|
|
157
|
-
intervals <<
|
|
164
|
+
intervals << TimeInterval.new(idxToDate(start), idxToDate(idx))
|
|
158
165
|
end
|
|
159
166
|
duration = start = 0
|
|
160
167
|
end
|
data/lib/taskjuggler/Shift.rb
CHANGED