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
|
@@ -69,16 +69,25 @@ class TaskJuggler::TextParser
|
|
|
69
69
|
|
|
70
70
|
# Inject the String _text_ into the input stream at the current cursor
|
|
71
71
|
# position.
|
|
72
|
-
def injectText(text)
|
|
72
|
+
def injectText(text, callLength)
|
|
73
|
+
# Current scanner position in _bytes_ form start
|
|
73
74
|
pos = @scanner.pos
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
# Remove the macro call from the end of the already parsed input.
|
|
76
|
+
preCall = @scanner.pre_match[0..-(callLength + 1)]
|
|
77
|
+
# Store the end position of the inserted macro in bytes.
|
|
78
|
+
@nextMacroEnd = preCall.bytesize + text.bytesize
|
|
79
|
+
# Compose the new @line from the cleaned input, the injected text and
|
|
80
|
+
# the remainer of the old @line.
|
|
81
|
+
@line = preCall + text + @scanner.post_match
|
|
82
|
+
# Start the StringScanner again at the first character of the injected
|
|
83
|
+
# text.
|
|
76
84
|
@scanner = StringScanner.new(@line)
|
|
77
|
-
@scanner.pos =
|
|
85
|
+
@scanner.pos = preCall.bytesize
|
|
78
86
|
end
|
|
79
87
|
|
|
80
|
-
def injectMacro(macro, args, text)
|
|
81
|
-
|
|
88
|
+
def injectMacro(macro, args, text, callLength)
|
|
89
|
+
# We add 3 chars more for the ${}.
|
|
90
|
+
injectText(text, callLength)
|
|
82
91
|
|
|
83
92
|
# Simple detection for recursive macro calls.
|
|
84
93
|
return false if @macroStack.length > 20
|
|
@@ -151,7 +160,7 @@ class TaskJuggler::TextParser
|
|
|
151
160
|
def line
|
|
152
161
|
return '' unless @line
|
|
153
162
|
|
|
154
|
-
@
|
|
163
|
+
(@scanner.pre_match || '') + (@scanner.matched || '')
|
|
155
164
|
end
|
|
156
165
|
|
|
157
166
|
end
|
|
@@ -474,8 +483,9 @@ class TaskJuggler::TextParser
|
|
|
474
483
|
# Expand a macro and inject it into the input stream. _prefix_ is any
|
|
475
484
|
# string that was found right before the macro call. We have to inject it
|
|
476
485
|
# before the expanded macro. _args_ is an Array of Strings. The first is
|
|
477
|
-
# the macro name, the rest are the parameters.
|
|
478
|
-
|
|
486
|
+
# the macro name, the rest are the parameters. _callLength_ is the number
|
|
487
|
+
# of characters for the complete macro call "${...}".
|
|
488
|
+
def expandMacro(prefix, args, callLength)
|
|
479
489
|
# Get the expanded macro from the @macroTable.
|
|
480
490
|
macro, text = @macroTable.resolve(args, sourceFileInfo)
|
|
481
491
|
unless macro && text
|
|
@@ -485,7 +495,7 @@ class TaskJuggler::TextParser
|
|
|
485
495
|
# If the expanded macro is empty, we can ignore it.
|
|
486
496
|
return if text == ''
|
|
487
497
|
|
|
488
|
-
unless @cf.injectMacro(macro, args, prefix + text)
|
|
498
|
+
unless @cf.injectMacro(macro, args, prefix + text, callLength)
|
|
489
499
|
error('macro_stack_overflow', "Too many nested macro calls.")
|
|
490
500
|
end
|
|
491
501
|
end
|
|
@@ -514,7 +524,8 @@ class TaskJuggler::TextParser
|
|
|
514
524
|
args = entry.args[1..-1]
|
|
515
525
|
args.collect! { |a| '"' + a + '"' }
|
|
516
526
|
@messageHandler.info('macro_stack',
|
|
517
|
-
" ${#{macro.name}
|
|
527
|
+
" ${#{macro.name}#{args.empty? ? '' : ' '}" +
|
|
528
|
+
"#{args.join(' ')}}",
|
|
518
529
|
macro.sourceFileInfo)
|
|
519
530
|
end
|
|
520
531
|
end
|
|
@@ -102,7 +102,7 @@ class TaskJuggler
|
|
|
102
102
|
if @status.headline.empty?
|
|
103
103
|
error('ts_no_headline',
|
|
104
104
|
"You must provide a headline for the status of " +
|
|
105
|
-
"task #{
|
|
105
|
+
"task #{taskId}")
|
|
106
106
|
end
|
|
107
107
|
if @status.summary &&
|
|
108
108
|
@status.summary.richText.inputText == "A summary text\n"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
require 'taskjuggler/UTF8String'
|
|
15
15
|
require 'taskjuggler/AppConfig'
|
|
16
16
|
|
|
17
|
-
AppConfig.version = '0.
|
|
17
|
+
AppConfig.version = '0.2.0'
|
|
18
18
|
AppConfig.packageName = 'taskjuggler'
|
|
19
19
|
AppConfig.softwareName = 'TaskJuggler III'
|
|
20
20
|
AppConfig.packageInfo = 'A Project Management Software'
|
data/lib/taskjuggler/TjTime.rb
CHANGED
|
@@ -26,9 +26,8 @@ class TaskJuggler
|
|
|
26
26
|
# The number of days per month. Leap years are taken care of separately.
|
|
27
27
|
MON_MAX = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
|
|
28
28
|
|
|
29
|
-
#
|
|
30
|
-
@@tz = '
|
|
31
|
-
ENV['TZ'] = @@tz
|
|
29
|
+
# Initialize @@tz with the current time zone if it is set.
|
|
30
|
+
@@tz = ENV['TZ']
|
|
32
31
|
|
|
33
32
|
# call-seq:
|
|
34
33
|
# TjTime() -> TjTime (now)
|
|
@@ -114,6 +113,11 @@ class TaskJuggler
|
|
|
114
113
|
TjTime.new((localtime.to_i / clock) * clock)
|
|
115
114
|
end
|
|
116
115
|
|
|
116
|
+
# Return the time object in UTC.
|
|
117
|
+
def utc
|
|
118
|
+
TjTime.new(@time.dup.gmtime)
|
|
119
|
+
end
|
|
120
|
+
|
|
117
121
|
# Returns the total number of seconds of the day. The time is assumed to be
|
|
118
122
|
# in the time zone specified by _tz_.
|
|
119
123
|
def secondsOfDay(tz = nil)
|
|
@@ -289,7 +289,7 @@ EOT
|
|
|
289
289
|
end
|
|
290
290
|
|
|
291
291
|
if @val[1].nil?
|
|
292
|
-
intervals = [
|
|
292
|
+
intervals = [ TimeInterval.new(@project['start'], @project['end']) ]
|
|
293
293
|
else
|
|
294
294
|
intervals = @val[1]
|
|
295
295
|
end
|
|
@@ -883,7 +883,7 @@ EOT
|
|
|
883
883
|
|
|
884
884
|
def rule_exportHeader
|
|
885
885
|
pattern(%w( _export !optionalID $STRING ), lambda {
|
|
886
|
-
report = newReport(@val[1], @val[2], :export, sourceFileInfo)
|
|
886
|
+
report = newReport(@val[1], @val[2], :export, @sourceFileInfo[0])
|
|
887
887
|
|
|
888
888
|
# By default, we export all scenarios.
|
|
889
889
|
scenarios = Array.new(@project.scenarios.items) { |i| i }
|
|
@@ -939,7 +939,8 @@ Define a list of resource attributes that should be included in the report.
|
|
|
939
939
|
EOT
|
|
940
940
|
)
|
|
941
941
|
allOrNothingListRule('exportableResourceAttributes',
|
|
942
|
-
{ '
|
|
942
|
+
{ 'booking' => 'Include bookings',
|
|
943
|
+
'vacation' => 'Include vacations',
|
|
943
944
|
'workinghours' => 'Include working hours' })
|
|
944
945
|
|
|
945
946
|
pattern(%w( !rollupresource ))
|
|
@@ -1269,7 +1270,7 @@ EOT
|
|
|
1269
1270
|
|
|
1270
1271
|
# We allow multiple instances of flag definitions.
|
|
1271
1272
|
begin
|
|
1272
|
-
@property['flags', @scenarioIdx]
|
|
1273
|
+
@property['flags', @scenarioIdx] += [ flag ]
|
|
1273
1274
|
rescue AttributeOverwrite
|
|
1274
1275
|
end
|
|
1275
1276
|
end
|
|
@@ -1495,6 +1496,71 @@ EOT
|
|
|
1495
1496
|
)
|
|
1496
1497
|
also(%w( sorttasks ))
|
|
1497
1498
|
end
|
|
1499
|
+
def rule_iCalReport
|
|
1500
|
+
pattern(%w( !iCalReportHeader !iCalReportBody ), lambda {
|
|
1501
|
+
@property = nil
|
|
1502
|
+
})
|
|
1503
|
+
doc('icalreport', <<'EOT'
|
|
1504
|
+
Generates an RFC5545 compliant iCalendar file. This file can be used to export
|
|
1505
|
+
task information to calendar applications or other tools that read iCalendar
|
|
1506
|
+
files.
|
|
1507
|
+
EOT
|
|
1508
|
+
)
|
|
1509
|
+
end
|
|
1510
|
+
def rule_iCalReportBody
|
|
1511
|
+
optionsRule('iCalReportAttributes')
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
def rule_iCalReportAttributes
|
|
1515
|
+
optional
|
|
1516
|
+
repeatable
|
|
1517
|
+
|
|
1518
|
+
pattern(%w( !hideresource ))
|
|
1519
|
+
pattern(%w( !hidejournalentry ))
|
|
1520
|
+
pattern(%w( !hidetask ))
|
|
1521
|
+
pattern(%w( !reportEnd ))
|
|
1522
|
+
pattern(%w( !reportPeriod ))
|
|
1523
|
+
pattern(%w( !reportStart ))
|
|
1524
|
+
pattern(%w( !rollupresource ))
|
|
1525
|
+
pattern(%w( !rolluptask ))
|
|
1526
|
+
|
|
1527
|
+
pattern(%w( _scenario !scenarioId ), lambda {
|
|
1528
|
+
# Don't include disabled scenarios in the report
|
|
1529
|
+
@val[1].delete_if { |sc| !@project.scenario(sc).get('active') }
|
|
1530
|
+
@property.set('scenarios', @val[1])
|
|
1531
|
+
})
|
|
1532
|
+
doc('scenario.ical', <<'EOT'
|
|
1533
|
+
Id of the scenario that should be included in the report. By default, the
|
|
1534
|
+
top-level scenario will be included. This attribute can be used select another
|
|
1535
|
+
scenario.
|
|
1536
|
+
EOT
|
|
1537
|
+
)
|
|
1538
|
+
end
|
|
1539
|
+
|
|
1540
|
+
def rule_iCalReportHeader
|
|
1541
|
+
pattern(%w( _icalreport !optionalID $STRING ), lambda {
|
|
1542
|
+
report = newReport(@val[1], @val[2], :iCal, @sourceFileInfo[0])
|
|
1543
|
+
|
|
1544
|
+
@property.set('formats', [ :iCal ])
|
|
1545
|
+
# By default, we export only the first scenario.
|
|
1546
|
+
report.set('scenarios', [ 0 ])
|
|
1547
|
+
# Show all tasks, sorted by seqno-up.
|
|
1548
|
+
report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
|
1549
|
+
report.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
|
1550
|
+
# Show all resources, sorted by seqno-up.
|
|
1551
|
+
report.set('hideResource',
|
|
1552
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
|
1553
|
+
report.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
|
1554
|
+
# Show all journal entries.
|
|
1555
|
+
report.set('hideJournalEntry',
|
|
1556
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
|
1557
|
+
})
|
|
1558
|
+
arg(1, 'file name', <<'EOT'
|
|
1559
|
+
The name of the report file to generate without an extension. Use . to use
|
|
1560
|
+
the standard output channel.
|
|
1561
|
+
EOT
|
|
1562
|
+
)
|
|
1563
|
+
end
|
|
1498
1564
|
|
|
1499
1565
|
def rule_idOrAbsoluteId
|
|
1500
1566
|
singlePattern('$ID')
|
|
@@ -1602,12 +1668,12 @@ EOT
|
|
|
1602
1668
|
error('start_before_end', "The end date (#{endSpec}) must be " +
|
|
1603
1669
|
"after the start date (#{@val[0]}).", @sourceFileInfo[0])
|
|
1604
1670
|
end
|
|
1605
|
-
|
|
1671
|
+
TimeInterval.new(@val[0], endSpec)
|
|
1606
1672
|
else
|
|
1607
|
-
|
|
1673
|
+
TimeInterval.new(@val[0], @val[0] + endSpec)
|
|
1608
1674
|
end
|
|
1609
1675
|
else
|
|
1610
|
-
|
|
1676
|
+
TimeInterval.new(@val[0], @val[0].sameTimeNextDay)
|
|
1611
1677
|
end
|
|
1612
1678
|
})
|
|
1613
1679
|
doc('interval3', <<'EOT'
|
|
@@ -1633,9 +1699,9 @@ EOT
|
|
|
1633
1699
|
error('start_before_end', "The end date (#{endSpec}) must be after " +
|
|
1634
1700
|
"the start date (#{@val[0]}).", @sourceFileInfo[0])
|
|
1635
1701
|
end
|
|
1636
|
-
|
|
1702
|
+
TimeInterval.new(@val[0], endSpec)
|
|
1637
1703
|
else
|
|
1638
|
-
|
|
1704
|
+
TimeInterval.new(@val[0], @val[0] + endSpec)
|
|
1639
1705
|
end
|
|
1640
1706
|
})
|
|
1641
1707
|
doc('interval2', <<'EOT'
|
|
@@ -1811,7 +1877,9 @@ EOT
|
|
|
1811
1877
|
)
|
|
1812
1878
|
|
|
1813
1879
|
pattern(%w( _period !valInterval ), lambda {
|
|
1814
|
-
@limitInterval = @
|
|
1880
|
+
@limitInterval = ScoreboardInterval.new(@project['start'],
|
|
1881
|
+
@project['scheduleGranularity'],
|
|
1882
|
+
@val[1].start, @val[1].end)
|
|
1815
1883
|
})
|
|
1816
1884
|
doc('period.limit', <<'EOT'
|
|
1817
1885
|
This property is a shortcut for setting the start and end dates of the limit
|
|
@@ -1843,7 +1911,9 @@ EOT
|
|
|
1843
1911
|
|
|
1844
1912
|
def rule_limitValue
|
|
1845
1913
|
pattern([ '!workingDuration' ], lambda {
|
|
1846
|
-
@limitInterval =
|
|
1914
|
+
@limitInterval = ScoreboardInterval.new(@project['start'],
|
|
1915
|
+
@project['scheduleGranularity'],
|
|
1916
|
+
@project['start'], @project['end'])
|
|
1847
1917
|
@limitResources = []
|
|
1848
1918
|
@val[0]
|
|
1849
1919
|
})
|
|
@@ -1987,7 +2057,8 @@ EOT
|
|
|
1987
2057
|
pattern([ '_longauto'] , lambda { :longauto })
|
|
1988
2058
|
descr(<<'EOT'
|
|
1989
2059
|
Automatically select the unit that produces the shortest and most readable
|
|
1990
|
-
value. The unit name will not be abbreviated.
|
|
2060
|
+
value. The unit name will not be abbreviated. It will not use quarters since
|
|
2061
|
+
it is not common.
|
|
1991
2062
|
EOT
|
|
1992
2063
|
)
|
|
1993
2064
|
|
|
@@ -1995,12 +2066,16 @@ EOT
|
|
|
1995
2066
|
descr('Display all load and duration values as minutes.')
|
|
1996
2067
|
|
|
1997
2068
|
pattern([ '_months' ], lambda { :months })
|
|
1998
|
-
descr('Display all load and duration values as
|
|
2069
|
+
descr('Display all load and duration values as months.')
|
|
2070
|
+
|
|
2071
|
+
pattern([ '_quarters' ], lambda { :quarters })
|
|
2072
|
+
descr('Display all load and duration values as quarters.')
|
|
1999
2073
|
|
|
2000
2074
|
pattern([ '_shortauto' ], lambda { :shortauto })
|
|
2001
2075
|
descr(<<'EOT'
|
|
2002
2076
|
Automatically select the unit that produces the shortest and most readable
|
|
2003
|
-
value. The unit name will be abbreviated.
|
|
2077
|
+
value. The unit name will be abbreviated. It will not use quarters since it is
|
|
2078
|
+
not common.
|
|
2004
2079
|
EOT
|
|
2005
2080
|
)
|
|
2006
2081
|
|
|
@@ -2223,7 +2298,7 @@ EOF
|
|
|
2223
2298
|
|
|
2224
2299
|
def rule_nikuReportHeader
|
|
2225
2300
|
pattern(%w( _nikureport !optionalID $STRING ), lambda {
|
|
2226
|
-
newReport(@val[1], @val[2], :niku, sourceFileInfo)
|
|
2301
|
+
newReport(@val[1], @val[2], :niku, @sourceFileInfo[0])
|
|
2227
2302
|
@property.set('numberFormat', RealFormat.new(['-', '', '', '.', 2]))
|
|
2228
2303
|
})
|
|
2229
2304
|
arg(1, 'file name', <<'EOT'
|
|
@@ -2646,6 +2721,8 @@ the project. All sub-scenarios of this scenario inherit the bookings of the
|
|
|
2646
2721
|
tracking scenario and may not have any bookings of their own. The tracking
|
|
2647
2722
|
scenario must also be specified to use time and status sheet reports.
|
|
2648
2723
|
|
|
2724
|
+
The tracking scenario must be defined after all scenario have been defined.
|
|
2725
|
+
|
|
2649
2726
|
The tracking scenario and all scenarios derived from it will be scheduled in
|
|
2650
2727
|
projection mode. This means that the scheduler will only add bookings after
|
|
2651
2728
|
the current date or the date specified by [[now]]. It is assumed that all
|
|
@@ -2852,6 +2929,7 @@ Declare one or more flag for later use. Flags can be used to mark tasks, resourc
|
|
|
2852
2929
|
EOT
|
|
2853
2930
|
)
|
|
2854
2931
|
|
|
2932
|
+
pattern(%w( !iCalReport ))
|
|
2855
2933
|
pattern(%w( !propertiesInclude ))
|
|
2856
2934
|
|
|
2857
2935
|
pattern(%w( !limits ), lambda {
|
|
@@ -2902,6 +2980,7 @@ EOT
|
|
|
2902
2980
|
|
|
2903
2981
|
pattern(%w( !report ))
|
|
2904
2982
|
pattern(%w( !resource ))
|
|
2983
|
+
pattern(%w( !tagfile ))
|
|
2905
2984
|
pattern(%w( !shift ))
|
|
2906
2985
|
pattern(%w( !statusSheet ))
|
|
2907
2986
|
pattern(%w( !statusSheetReport ))
|
|
@@ -4172,6 +4251,12 @@ EOT
|
|
|
4172
4251
|
pattern(%w( _scenario $ID $STRING ), lambda {
|
|
4173
4252
|
# If this is the top-level scenario, we must delete the default scenario
|
|
4174
4253
|
# first.
|
|
4254
|
+
@project.scenarios.each do |scenario|
|
|
4255
|
+
if scenario.get('projection')
|
|
4256
|
+
error('scenario_after_tracking',
|
|
4257
|
+
'Scenarios must be defined before a tracking scenario is set.')
|
|
4258
|
+
end
|
|
4259
|
+
end
|
|
4175
4260
|
@project.scenarios.clearProperties if @property.nil?
|
|
4176
4261
|
if @project.scenario(@val[1])
|
|
4177
4262
|
error('scenario_exists',
|
|
@@ -4247,7 +4332,7 @@ EOT
|
|
|
4247
4332
|
sa.project = @project
|
|
4248
4333
|
|
|
4249
4334
|
if @val[1].nil?
|
|
4250
|
-
intervals = [
|
|
4335
|
+
intervals = [ TimeInterval.new(@project['start'], @project['end']) ]
|
|
4251
4336
|
else
|
|
4252
4337
|
intervals = @val[1]
|
|
4253
4338
|
end
|
|
@@ -4465,7 +4550,7 @@ EOT
|
|
|
4465
4550
|
else
|
|
4466
4551
|
fileName = "statusSheet#{@project.reports.length + 1}"
|
|
4467
4552
|
end
|
|
4468
|
-
report = newReport(@val[1], fileName, :statusSheet, sourceFileInfo)
|
|
4553
|
+
report = newReport(@val[1], fileName, :statusSheet, @sourceFileInfo[0])
|
|
4469
4554
|
report.set('scenarios', [ 0 ])
|
|
4470
4555
|
# Show all tasks, sorted by id-up.
|
|
4471
4556
|
report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
|
@@ -4734,6 +4819,54 @@ EOT
|
|
|
4734
4819
|
arg(1, 'task ID', 'The ID of an already defined task.')
|
|
4735
4820
|
end
|
|
4736
4821
|
|
|
4822
|
+
def rule_tagfile
|
|
4823
|
+
pattern(%w( !tagfileHeader !tagfileBody ), lambda {
|
|
4824
|
+
@property = nil
|
|
4825
|
+
})
|
|
4826
|
+
doc('tagfile', <<'EOT'
|
|
4827
|
+
The tagfile report generates a file that maps properties to source file
|
|
4828
|
+
locations. This can be used by editors to quickly jump to a certain task or
|
|
4829
|
+
resource definition. Currently only the ctags format is supported that is used
|
|
4830
|
+
by editors like [http://www.vim.org|vim].
|
|
4831
|
+
EOT
|
|
4832
|
+
)
|
|
4833
|
+
end
|
|
4834
|
+
|
|
4835
|
+
def rule_tagfileHeader
|
|
4836
|
+
pattern(%w( _tagfile !optionalID $STRING ), lambda {
|
|
4837
|
+
report = newReport(@val[1], @val[2], :tagfile, @sourceFileInfo[0])
|
|
4838
|
+
|
|
4839
|
+
@property.set('formats', [ :ctags ])
|
|
4840
|
+
# Include all tasks.
|
|
4841
|
+
report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
|
4842
|
+
report.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
|
4843
|
+
# Include all resources.
|
|
4844
|
+
report.set('hideResource',
|
|
4845
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
|
4846
|
+
report.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
|
4847
|
+
})
|
|
4848
|
+
arg(1, 'file name', <<'EOT'
|
|
4849
|
+
The name of the tagfile to generate. You can leave it empty and it will
|
|
4850
|
+
default to the commonly used name ''''tags''''.
|
|
4851
|
+
EOT
|
|
4852
|
+
)
|
|
4853
|
+
end
|
|
4854
|
+
|
|
4855
|
+
def rule_tagfileAttributes
|
|
4856
|
+
optional
|
|
4857
|
+
repeatable
|
|
4858
|
+
|
|
4859
|
+
pattern(%w( !hideresource ))
|
|
4860
|
+
pattern(%w( !hidetask ))
|
|
4861
|
+
pattern(%w( !rollupresource ))
|
|
4862
|
+
pattern(%w( !rolluptask ))
|
|
4863
|
+
end
|
|
4864
|
+
|
|
4865
|
+
def rule_tagfileBody
|
|
4866
|
+
optionsRule('tagfileAttributes')
|
|
4867
|
+
end
|
|
4868
|
+
|
|
4869
|
+
|
|
4737
4870
|
def rule_task
|
|
4738
4871
|
pattern(%w( !taskHeader !taskBody ), lambda {
|
|
4739
4872
|
@property = @property.parent
|
|
@@ -5841,7 +5974,8 @@ EOT
|
|
|
5841
5974
|
end
|
|
5842
5975
|
def rule_tsReportHeader
|
|
5843
5976
|
pattern(%w( _timesheetreport !optionalID $STRING ), lambda {
|
|
5844
|
-
report = newReport(@val[1], @val[2], :timeSheet, sourceFileInfo)
|
|
5977
|
+
report = newReport(@val[1], @val[2], :timeSheet, @sourceFileInfo[0])
|
|
5978
|
+
|
|
5845
5979
|
report.set('scenarios', [ 0 ])
|
|
5846
5980
|
# Show all tasks, sorted by seqno-up.
|
|
5847
5981
|
report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
|
@@ -6075,12 +6209,12 @@ EOT
|
|
|
6075
6209
|
"after the start date (#{@val[0]}).",
|
|
6076
6210
|
@sourceFileInfo[1])
|
|
6077
6211
|
end
|
|
6078
|
-
iv =
|
|
6212
|
+
iv = TimeInterval.new(@val[0], endSpec)
|
|
6079
6213
|
else
|
|
6080
|
-
iv =
|
|
6214
|
+
iv = TimeInterval.new(@val[0], @val[0] + endSpec)
|
|
6081
6215
|
end
|
|
6082
6216
|
else
|
|
6083
|
-
iv =
|
|
6217
|
+
iv = TimeInterval.new(@val[0], @val[0].sameTimeNextDay)
|
|
6084
6218
|
end
|
|
6085
6219
|
checkInterval(iv)
|
|
6086
6220
|
iv
|
|
@@ -6111,9 +6245,9 @@ EOT
|
|
|
6111
6245
|
error('start_before_end', "The end date (#{endSpec}) must be after " +
|
|
6112
6246
|
"the start date (#{@val[0]}).", @sourceFileInfo[1])
|
|
6113
6247
|
end
|
|
6114
|
-
iv =
|
|
6248
|
+
iv = TimeInterval.new(@val[0], endSpec)
|
|
6115
6249
|
else
|
|
6116
|
-
iv =
|
|
6250
|
+
iv = TimeInterval.new(@val[0], @val[0] + endSpec)
|
|
6117
6251
|
end
|
|
6118
6252
|
checkInterval(iv)
|
|
6119
6253
|
iv
|
|
@@ -210,6 +210,24 @@ hi def link tjpnumber Number
|
|
|
210
210
|
|
|
211
211
|
let b:current_syntax = "tjp"
|
|
212
212
|
|
|
213
|
+
" Support running tj3 from within vim. Just type ':make your_project.tjp' to
|
|
214
|
+
" activate it.
|
|
215
|
+
set makeprg=tj3
|
|
216
|
+
|
|
217
|
+
" Support browsing the man page by typing Shift-k while having the cursor over
|
|
218
|
+
" any syntax keyword
|
|
219
|
+
set keywordprg=tj3man
|
|
220
|
+
|
|
221
|
+
" Remap Ctrl-] to show full ID of property defined in the current
|
|
222
|
+
" line. This requires a current ctags file (generated by 'tagfile'
|
|
223
|
+
" report') to be present in the directory where vim was started.
|
|
224
|
+
map <C-]> :call ShowFullID()<CR>
|
|
225
|
+
function! ShowFullID()
|
|
226
|
+
let linenumber = line(".")
|
|
227
|
+
let filename = bufname("%")
|
|
228
|
+
execute "!grep '".filename."\t".linenumber.";' tags|cut -f 1"
|
|
229
|
+
endfunction
|
|
230
|
+
|
|
213
231
|
augroup TaskJugglerSource
|
|
214
232
|
" Remove all trailing white spaces from line ends when saving files
|
|
215
233
|
" Note: This overwrites the s mark.
|
|
@@ -48,6 +48,9 @@ class TaskJuggler
|
|
|
48
48
|
@startDate = wh.startDate
|
|
49
49
|
@endDate = wh.endDate
|
|
50
50
|
@slotDuration = wh.slotDuration
|
|
51
|
+
# Make sure the copied scoreboard has been created, so we can share it
|
|
52
|
+
# copy-on-write.
|
|
53
|
+
wh.onShift?(0)
|
|
51
54
|
@scoreboard = wh.scoreboard
|
|
52
55
|
else
|
|
53
56
|
slotDuration = arg1
|
|
@@ -68,6 +71,14 @@ class TaskJuggler
|
|
|
68
71
|
end
|
|
69
72
|
end
|
|
70
73
|
|
|
74
|
+
# Since we want to share the scoreboard among instances with identical
|
|
75
|
+
# working hours, we need to prevent the scoreboard from being deep cloned.
|
|
76
|
+
# Calling the constructor with self in a re-defined deep_clone method will
|
|
77
|
+
# do just that.
|
|
78
|
+
def deep_clone
|
|
79
|
+
WorkingHours.new(self)
|
|
80
|
+
end
|
|
81
|
+
|
|
71
82
|
# Return true of the given WorkingHours object +wh+ is identical to this
|
|
72
83
|
# object.
|
|
73
84
|
def ==(wh)
|
|
@@ -126,11 +137,16 @@ class TaskJuggler
|
|
|
126
137
|
@days[dayOfWeek]
|
|
127
138
|
end
|
|
128
139
|
|
|
129
|
-
# Return true if
|
|
130
|
-
|
|
140
|
+
# Return true if _arg_ is within the defined working hours. _arg_ can be a
|
|
141
|
+
# TjTime object or a global scoreboard index.
|
|
142
|
+
def onShift?(arg)
|
|
131
143
|
initScoreboard unless @scoreboard
|
|
132
144
|
|
|
133
|
-
|
|
145
|
+
if arg.is_a?(TjTime)
|
|
146
|
+
@scoreboard.get(arg)
|
|
147
|
+
else
|
|
148
|
+
@scoreboard[arg]
|
|
149
|
+
end
|
|
134
150
|
end
|
|
135
151
|
|
|
136
152
|
# Return true only if all slots in the _interval_ are offhour slots.
|
|
@@ -209,7 +225,7 @@ class TaskJuggler
|
|
|
209
225
|
end
|
|
210
226
|
|
|
211
227
|
# Restore old time zone setting.
|
|
212
|
-
if @timezone
|
|
228
|
+
if @timezone && oldTimezone
|
|
213
229
|
TjTime.setTimeZone(oldTimezone)
|
|
214
230
|
end
|
|
215
231
|
end
|
data/lib/taskjuggler/apps/Tj3.rb
CHANGED
|
@@ -39,8 +39,12 @@ class TaskJuggler
|
|
|
39
39
|
@freeze = false
|
|
40
40
|
# The cut-off date for the freeze
|
|
41
41
|
@freezeDate = TjTime.new.align(3600)
|
|
42
|
+
# Should bookings be grouped by Task or by Resource (default).
|
|
43
|
+
@freezeByTask = false
|
|
42
44
|
# Don't generate any reports.
|
|
43
45
|
@noReports = false
|
|
46
|
+
# Treat warnings like errors or not.
|
|
47
|
+
@abortOnWarning = false
|
|
44
48
|
# The directory where generated reports should be put in.
|
|
45
49
|
@outputDir = ''
|
|
46
50
|
# The file names of the time sheet files to check.
|
|
@@ -86,6 +90,11 @@ EOT
|
|
|
86
90
|
error("Invalid freeze date: #{msg}")
|
|
87
91
|
end
|
|
88
92
|
end
|
|
93
|
+
@opts.on('--freezebytask',
|
|
94
|
+
format('Group the bookings in the booking file generated ' +
|
|
95
|
+
'during a freeze by task instead of by resource.')) do
|
|
96
|
+
@freezeByTask = true
|
|
97
|
+
end
|
|
89
98
|
@opts.on('--check-time-sheet <tji-file>', String,
|
|
90
99
|
format("Check the given time sheet")) do |arg|
|
|
91
100
|
@timeSheets << arg
|
|
@@ -108,6 +117,10 @@ EOT
|
|
|
108
117
|
'reports.')) do
|
|
109
118
|
@noReports = true
|
|
110
119
|
end
|
|
120
|
+
@opts.on('--abort-on-warnings',
|
|
121
|
+
format('Abort program on warnings like we do on errors.')) do
|
|
122
|
+
@abortOnWarning = true
|
|
123
|
+
end
|
|
111
124
|
@opts.on('-o', '--output-dir <directory>', String,
|
|
112
125
|
format('Directory the reports should go into')) do |arg|
|
|
113
126
|
@outputDir = arg + '/'
|
|
@@ -128,6 +141,7 @@ EOT
|
|
|
128
141
|
tj = TaskJuggler.new(true)
|
|
129
142
|
tj.maxCpuCores = @maxCpuCores
|
|
130
143
|
tj.warnTsDeltas = @warnTsDeltas
|
|
144
|
+
tj.messageHandler.abortOnWarning = @abortOnWarning
|
|
131
145
|
keepParser = !@timeSheets.empty? || !@statusSheets.empty?
|
|
132
146
|
return 1 unless tj.parse(files, keepParser)
|
|
133
147
|
|
|
@@ -147,7 +161,8 @@ EOT
|
|
|
147
161
|
end
|
|
148
162
|
|
|
149
163
|
# Check for freeze mode and generate the booking file if requested.
|
|
150
|
-
tj.freeze(@freezeDate)
|
|
164
|
+
return 1 if @freeze && tj.freeze(@freezeDate, @freezeByTask) &&
|
|
165
|
+
tj.errors > 0
|
|
151
166
|
|
|
152
167
|
return 0 if @noReports
|
|
153
168
|
|
|
@@ -317,7 +317,7 @@ class TaskJuggler
|
|
|
317
317
|
# resource int the chart. Depending on the resolution, the only periods with
|
|
318
318
|
# a duration above the threshold are shown.
|
|
319
319
|
def generateTimeOffZones
|
|
320
|
-
iv =
|
|
320
|
+
iv = TimeInterval.new(@chart.start, @chart.end)
|
|
321
321
|
# Don't show any zones if the threshold for this scale is 0 or smaller.
|
|
322
322
|
return if (minTimeOff = @chart.scale['minTimeOff']) <= 0
|
|
323
323
|
|