taskjuggler 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +37 -5
- data/README.rdoc +4 -2
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/css/tjmanual.css +0 -1
- data/benchmarks/htmltaskreport-1.html +47702 -0
- data/benchmarks/htmltaskreport-2.html +23345 -0
- data/benchmarks/htmltaskreport-3.html +23265 -0
- data/benchmarks/htmltaskreport-4.html +22135 -0
- data/benchmarks/profile.clt +36082 -0
- data/benchmarks/tj3.profile +0 -0
- data/benchmarks/tj3.profile.grind +6185 -0
- data/benchmarks/tj3.profile.symbols +432 -0
- data/benchmarks/tj3.profile.txt +448 -0
- data/data/tjp.vim +689 -0
- data/doc/AppConfig.html +26 -2
- data/doc/CHANGELOG.html +60 -8
- data/doc/COPYING.html +26 -2
- data/doc/Diff/Hunk.html +26 -2
- data/doc/Diff.html +26 -2
- data/doc/Diffable.html +26 -2
- data/doc/DiffableString.html +26 -2
- data/doc/Object.html +26 -104
- data/doc/README_rdoc.html +39 -7
- data/doc/RuntimeConfig.html +26 -2
- data/doc/String.html +26 -2
- data/doc/TaskJuggler/Account.html +27 -3
- data/doc/TaskJuggler/AccountAttribute.html +30 -6
- data/doc/TaskJuggler/AccountScenario.html +28 -4
- data/doc/TaskJuggler/Allocation.html +33 -9
- data/doc/TaskJuggler/AllocationAttribute.html +31 -7
- data/doc/TaskJuggler/AttributeBase.html +162 -111
- data/doc/TaskJuggler/AttributeDefinition.html +26 -2
- data/doc/TaskJuggler/AttributeOverwrite.html +26 -2
- data/doc/TaskJuggler/BatchProcessor.html +26 -2
- data/doc/TaskJuggler/Booking.html +29 -5
- data/doc/TaskJuggler/BookingListAttribute.html +29 -5
- data/doc/TaskJuggler/BooleanAttribute.html +30 -6
- data/doc/TaskJuggler/CSVFile.html +26 -2
- data/doc/TaskJuggler/CellSettingPattern.html +26 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -2
- data/doc/TaskJuggler/Charge.html +30 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +29 -5
- data/doc/TaskJuggler/ChargeSet.html +26 -2
- data/doc/TaskJuggler/ChargeSetListAttribute.html +30 -6
- data/doc/TaskJuggler/CollisionDetector.html +26 -2
- data/doc/TaskJuggler/ColumnListAttribute.html +28 -4
- data/doc/TaskJuggler/ColumnTable.html +26 -2
- data/doc/TaskJuggler/Daemon.html +26 -2
- data/doc/TaskJuggler/DataCache.html +26 -2
- data/doc/TaskJuggler/DataCacheEntry.html +26 -2
- data/doc/TaskJuggler/DateAttribute.html +30 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +28 -4
- data/doc/TaskJuggler/DependencyListAttribute.html +30 -6
- data/doc/TaskJuggler/DurationAttribute.html +31 -7
- data/doc/TaskJuggler/FileList.html +26 -2
- data/doc/TaskJuggler/FileRecord.html +26 -2
- data/doc/TaskJuggler/FixnumAttribute.html +28 -4
- data/doc/TaskJuggler/FlagListAttribute.html +30 -6
- data/doc/TaskJuggler/FloatAttribute.html +29 -5
- data/doc/TaskJuggler/FormatListAttribute.html +29 -5
- data/doc/TaskJuggler/GanttChart.html +26 -2
- data/doc/TaskJuggler/GanttContainer.html +26 -2
- data/doc/TaskJuggler/GanttHeader.html +26 -2
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -2
- data/doc/TaskJuggler/GanttLine.html +27 -3
- data/doc/TaskJuggler/GanttLoadStack.html +26 -2
- data/doc/TaskJuggler/GanttMilestone.html +26 -2
- data/doc/TaskJuggler/GanttRouter.html +26 -2
- data/doc/TaskJuggler/GanttTaskBar.html +26 -2
- data/doc/TaskJuggler/HTMLDocument.html +26 -2
- data/doc/TaskJuggler/HTMLElements.html +623 -0
- data/doc/TaskJuggler/HTMLGraphics.html +26 -2
- data/doc/TaskJuggler/ICalReport.html +864 -0
- data/doc/TaskJuggler/ICalendar/Component.html +969 -0
- data/doc/TaskJuggler/ICalendar/Event.html +742 -0
- data/doc/TaskJuggler/ICalendar/Journal.html +722 -0
- data/doc/TaskJuggler/ICalendar/Person.html +633 -0
- data/doc/TaskJuggler/ICalendar/Todo.html +789 -0
- data/doc/TaskJuggler/ICalendar.html +1035 -0
- data/doc/TaskJuggler/Interval.html +99 -172
- data/doc/TaskJuggler/IntervalList.html +31 -7
- data/doc/TaskJuggler/JobInfo.html +26 -2
- data/doc/TaskJuggler/Journal.html +26 -2
- data/doc/TaskJuggler/JournalEntry.html +26 -2
- data/doc/TaskJuggler/JournalEntryList.html +26 -2
- data/doc/TaskJuggler/KeywordArray.html +26 -2
- data/doc/TaskJuggler/KeywordDocumentation.html +26 -2
- data/doc/TaskJuggler/Limits/Limit.html +124 -49
- data/doc/TaskJuggler/Limits.html +139 -156
- data/doc/TaskJuggler/LimitsAttribute.html +39 -14
- data/doc/TaskJuggler/ListAttributeBase.html +35 -11
- data/doc/TaskJuggler/Log.html +26 -2
- data/doc/TaskJuggler/LogFile.html +26 -2
- data/doc/TaskJuggler/LogicalAttribute.html +26 -2
- data/doc/TaskJuggler/LogicalExpression.html +26 -2
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalExpressionListAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalFlag.html +26 -2
- data/doc/TaskJuggler/LogicalFunction.html +28 -4
- data/doc/TaskJuggler/LogicalOperation.html +26 -2
- data/doc/TaskJuggler/ManagerResponsibilities.html +26 -2
- data/doc/TaskJuggler/ManagerStatusRecord.html +26 -2
- data/doc/TaskJuggler/Message.html +26 -2
- data/doc/TaskJuggler/MessageHandler.html +108 -62
- data/doc/TaskJuggler/Navigator.html +26 -2
- data/doc/TaskJuggler/NavigatorElement.html +26 -2
- data/doc/TaskJuggler/NikuProject.html +26 -2
- data/doc/TaskJuggler/NikuReport.html +27 -3
- data/doc/TaskJuggler/NikuResource.html +26 -2
- data/doc/TaskJuggler/NodeListAttribute.html +31 -7
- data/doc/TaskJuggler/PlaceHolderCell.html +26 -2
- data/doc/TaskJuggler/ProcessIntercom.html +26 -2
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -2
- data/doc/TaskJuggler/Project.html +1236 -973
- data/doc/TaskJuggler/ProjectBroker.html +26 -2
- data/doc/TaskJuggler/ProjectBrokerIface.html +26 -2
- data/doc/TaskJuggler/ProjectFileParser.html +29 -4
- data/doc/TaskJuggler/ProjectFileScanner.html +56 -31
- data/doc/TaskJuggler/ProjectRecord.html +26 -2
- data/doc/TaskJuggler/ProjectServer.html +26 -2
- data/doc/TaskJuggler/ProjectServerIface.html +26 -2
- data/doc/TaskJuggler/PropertyAttribute.html +35 -11
- data/doc/TaskJuggler/PropertyList.html +26 -2
- data/doc/TaskJuggler/PropertySet.html +126 -106
- data/doc/TaskJuggler/PropertyTreeNode.html +595 -551
- data/doc/TaskJuggler/Query.html +127 -100
- data/doc/TaskJuggler/RTFHandlers.html +26 -2
- data/doc/TaskJuggler/RTFNavigator.html +26 -2
- data/doc/TaskJuggler/RTFQuery.html +28 -4
- data/doc/TaskJuggler/RTFReport.html +26 -2
- data/doc/TaskJuggler/RTFReportLink.html +26 -2
- data/doc/TaskJuggler/RTFWithQuerySupport.html +26 -2
- data/doc/TaskJuggler/RealFormat.html +26 -2
- data/doc/TaskJuggler/RealFormatAttribute.html +31 -7
- data/doc/TaskJuggler/ReferenceAttribute.html +58 -34
- data/doc/TaskJuggler/Report.html +427 -284
- data/doc/TaskJuggler/ReportBase.html +28 -102
- data/doc/TaskJuggler/ReportContext.html +26 -2
- data/doc/TaskJuggler/ReportScenario.html +633 -0
- data/doc/TaskJuggler/ReportServer.html +26 -2
- data/doc/TaskJuggler/ReportServerIface.html +26 -2
- data/doc/TaskJuggler/ReportServerRecord.html +26 -2
- data/doc/TaskJuggler/ReportServlet.html +26 -2
- data/doc/TaskJuggler/ReportTable.html +26 -2
- data/doc/TaskJuggler/ReportTableCell.html +26 -2
- data/doc/TaskJuggler/ReportTableColumn.html +26 -2
- data/doc/TaskJuggler/ReportTableLegend.html +26 -2
- data/doc/TaskJuggler/ReportTableLine.html +26 -2
- data/doc/TaskJuggler/Resource.html +225 -163
- data/doc/TaskJuggler/ResourceListAttribute.html +71 -47
- data/doc/TaskJuggler/ResourceListRE.html +26 -2
- data/doc/TaskJuggler/ResourceScenario.html +645 -603
- data/doc/TaskJuggler/RichText.html +26 -2
- data/doc/TaskJuggler/RichTextAttribute.html +53 -29
- data/doc/TaskJuggler/RichTextDocument.html +26 -2
- data/doc/TaskJuggler/RichTextElement.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionHandler.html +26 -2
- data/doc/TaskJuggler/RichTextImage.html +26 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +29 -5
- data/doc/TaskJuggler/RichTextParser.html +26 -2
- data/doc/TaskJuggler/RichTextScanner.html +26 -2
- data/doc/TaskJuggler/RichTextSnip.html +26 -2
- data/doc/TaskJuggler/RichTextSyntaxRules.html +26 -2
- data/doc/TaskJuggler/Scenario.html +26 -2
- data/doc/TaskJuggler/ScenarioData.html +95 -28
- data/doc/TaskJuggler/ScenarioListAttribute.html +39 -15
- data/doc/TaskJuggler/Scoreboard.html +137 -73
- data/doc/TaskJuggler/ScoreboardInterval.html +1116 -0
- data/doc/TaskJuggler/SheetHandlerBase.html +26 -2
- data/doc/TaskJuggler/SheetReceiver.html +26 -2
- data/doc/TaskJuggler/SheetSender.html +26 -2
- data/doc/TaskJuggler/Shift.html +27 -3
- data/doc/TaskJuggler/ShiftAssignment.html +27 -3
- data/doc/TaskJuggler/ShiftAssignments.html +174 -149
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +41 -16
- data/doc/TaskJuggler/ShiftScenario.html +26 -2
- data/doc/TaskJuggler/SimpleQueryExpander.html +26 -2
- data/doc/TaskJuggler/SortListAttribute.html +35 -11
- data/doc/TaskJuggler/StatusSheetReceiver.html +26 -2
- data/doc/TaskJuggler/StatusSheetReport.html +26 -2
- data/doc/TaskJuggler/StatusSheetSender.html +26 -2
- data/doc/TaskJuggler/StdIoWrapper.html +26 -2
- data/doc/TaskJuggler/StringAttribute.html +39 -15
- data/doc/TaskJuggler/SymbolAttribute.html +35 -11
- data/doc/TaskJuggler/SyntaxReference.html +26 -2
- data/doc/TaskJuggler/TOCEntry.html +26 -2
- data/doc/TaskJuggler/TSResourceRecord.html +26 -2
- data/doc/TaskJuggler/TSTaskRecord.html +26 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +26 -2
- data/doc/TaskJuggler/TableOfContents.html +26 -2
- data/doc/TaskJuggler/TableReport.html +239 -214
- data/doc/TaskJuggler/TagFile/TagFileEntry.html +841 -0
- data/doc/TaskJuggler/TagFile.html +817 -0
- data/doc/TaskJuggler/Task.html +27 -3
- data/doc/TaskJuggler/TaskDepListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskDependency.html +26 -2
- data/doc/TaskJuggler/TaskListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskListRE.html +26 -2
- data/doc/TaskJuggler/TaskScenario.html +2235 -2178
- data/doc/TaskJuggler/TernarySearchTree.html +26 -2
- data/doc/TaskJuggler/TextFormatter.html +26 -2
- data/doc/TaskJuggler/TextParser/Macro.html +26 -2
- data/doc/TaskJuggler/TextParser/MacroTable.html +26 -2
- data/doc/TaskJuggler/TextParser/Pattern.html +26 -2
- data/doc/TaskJuggler/TextParser/Rule.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/BufferStreamHandle.html +32 -8
- data/doc/TaskJuggler/TextParser/Scanner/FileStreamHandle.html +39 -15
- data/doc/TaskJuggler/TextParser/Scanner/MacroStackEntry.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/StreamHandle.html +119 -86
- data/doc/TaskJuggler/TextParser/Scanner.html +317 -291
- data/doc/TaskJuggler/TextParser/SourceFileInfo.html +26 -2
- data/doc/TaskJuggler/TextParser/StackElement.html +26 -2
- data/doc/TaskJuggler/TextParser/State.html +26 -2
- data/doc/TaskJuggler/TextParser/StateTransition.html +26 -2
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +26 -2
- data/doc/TaskJuggler/TextParser/TokenDoc.html +26 -2
- data/doc/TaskJuggler/TextParser.html +85 -61
- data/doc/TaskJuggler/TextReport.html +26 -2
- data/doc/TaskJuggler/TimeInterval.html +841 -0
- data/doc/TaskJuggler/{IntervalListAttribute.html → TimeIntervalListAttribute.html} +33 -9
- data/doc/TaskJuggler/TimeSheet.html +26 -2
- data/doc/TaskJuggler/TimeSheetReceiver.html +26 -2
- data/doc/TaskJuggler/TimeSheetRecord.html +27 -3
- data/doc/TaskJuggler/TimeSheetReport.html +29 -5
- data/doc/TaskJuggler/TimeSheetSender.html +26 -2
- data/doc/TaskJuggler/TimeSheetSummary.html +26 -2
- data/doc/TaskJuggler/TimeSheets.html +26 -2
- data/doc/TaskJuggler/Tj3.html +150 -111
- data/doc/TaskJuggler/Tj3AppBase.html +26 -2
- data/doc/TaskJuggler/Tj3Client.html +26 -2
- data/doc/TaskJuggler/Tj3Daemon.html +26 -2
- data/doc/TaskJuggler/Tj3Man.html +26 -2
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -2
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3SsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3TsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -2
- data/doc/TaskJuggler/TjException.html +26 -2
- data/doc/TaskJuggler/TjRuntimeError.html +26 -2
- data/doc/TaskJuggler/TjTime.html +539 -477
- data/doc/TaskJuggler/TjpExample.html +26 -2
- data/doc/TaskJuggler/TjpExportRE.html +240 -161
- data/doc/TaskJuggler/TjpSyntaxRules.html +4236 -3844
- data/doc/TaskJuggler/URLParameter.html +26 -2
- data/doc/TaskJuggler/UserManual.html +26 -2
- data/doc/TaskJuggler/VimSyntax.html +31 -7
- data/doc/TaskJuggler/WebServer.html +26 -2
- data/doc/TaskJuggler/WelcomePage.html +26 -2
- data/doc/TaskJuggler/WorkingHours.html +227 -152
- data/doc/TaskJuggler/WorkingHoursAttribute.html +62 -38
- data/doc/TaskJuggler/XMLBlob.html +26 -2
- data/doc/TaskJuggler/XMLComment.html +26 -2
- data/doc/TaskJuggler/XMLDocument.html +26 -2
- data/doc/TaskJuggler/XMLElement.html +26 -2
- data/doc/TaskJuggler/XMLNamedText.html +26 -2
- data/doc/TaskJuggler/XMLText.html +26 -2
- data/doc/TaskJuggler.html +486 -427
- data/doc/index.html +801 -659
- data/doc/lib/taskjuggler/AccountScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Account_rb.html +1 -1
- data/doc/lib/taskjuggler/AlgorithmDiff_rb.html +1 -1
- data/doc/lib/taskjuggler/Allocation_rb.html +1 -1
- data/doc/lib/taskjuggler/AppConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeBase_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/Attributes_rb.html +1 -1
- data/doc/lib/taskjuggler/BatchProcessor_rb.html +1 -1
- data/doc/lib/taskjuggler/Booking_rb.html +1 -1
- data/doc/lib/taskjuggler/ChargeSet_rb.html +1 -1
- data/doc/lib/taskjuggler/Charge_rb.html +1 -1
- data/doc/lib/taskjuggler/DataCache_rb.html +1 -1
- data/doc/lib/taskjuggler/FileList_rb.html +1 -1
- data/doc/lib/taskjuggler/HTMLDocument_rb.html +1 -1
- data/doc/lib/{ruby-signal-bug_rb.html → taskjuggler/HTMLElements_rb.html} +9 -9
- data/doc/lib/{exchangebug_rb.html → taskjuggler/ICalendar_rb.html} +9 -9
- data/doc/lib/taskjuggler/IntervalList_rb.html +1 -1
- data/doc/lib/taskjuggler/Interval_rb.html +1 -1
- data/doc/lib/taskjuggler/Journal_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordArray_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/taskjuggler/Limits_rb.html +1 -1
- data/doc/lib/taskjuggler/LogFile_rb.html +1 -1
- data/doc/lib/taskjuggler/Log_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalExpression_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalFunction_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalOperation_rb.html +1 -1
- data/doc/lib/taskjuggler/MessageHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileParser_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/taskjuggler/Project_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyList_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertySet_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyTreeNode_rb.html +1 -1
- data/doc/lib/taskjuggler/Query_rb.html +1 -1
- data/doc/lib/taskjuggler/RealFormat_rb.html +1 -1
- data/doc/lib/taskjuggler/ResourceScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Resource_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Document_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Element_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionExample_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Parser_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFHandlers_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFNavigator_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFQuery_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReportLink_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFWithQuerySupport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Snip_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/SyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TOCEntry_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TableOfContents_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText_rb.html +1 -1
- data/doc/lib/taskjuggler/RuntimeConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/ScenarioData_rb.html +1 -1
- data/doc/lib/taskjuggler/Scenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Scoreboard_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetHandlerBase_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftAssignments_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Shift_rb.html +1 -1
- data/doc/lib/taskjuggler/SimpleQueryExpander_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/StdIoWrapper_rb.html +1 -1
- data/doc/lib/taskjuggler/SyntaxReference_rb.html +1 -1
- data/doc/lib/taskjuggler/TableColumnDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskDependency_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskJuggler_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Task_rb.html +1 -1
- data/doc/lib/taskjuggler/TernarySearchTree_rb.html +1 -1
- data/doc/lib/taskjuggler/TextFormatter_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/MacroTable_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Rule_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/SourceFileInfo_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/StackElement_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/State_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheets_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3AppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3Config_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3SheetAppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/TjException_rb.html +1 -1
- data/doc/lib/taskjuggler/TjTime_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpExample_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/URLParameter_rb.html +1 -1
- data/doc/lib/taskjuggler/UTF8String_rb.html +1 -1
- data/doc/lib/taskjuggler/UserManual_rb.html +1 -1
- data/doc/lib/taskjuggler/VimSyntax_rb.html +1 -1
- data/doc/lib/taskjuggler/WorkingHours_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLDocument_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLElement_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Client_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Man_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProcessIntercom_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectBroker_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServlet_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WebServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WelcomePage_rb.html +1 -1
- data/doc/lib/taskjuggler/deep_copy_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CSVFile_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CollisionDetector_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttChart_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ICalReport_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/Navigator_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/NikuReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportBase_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportContext_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableCell_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/Report_rb.html +5 -1
- data/doc/lib/taskjuggler/reports/ResourceListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/StatusSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TableReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TagFile_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/TaskListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TextReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TimeSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TjpExportRE_rb.html +1 -1
- data/doc/lib/tj3_rb.html +1 -1
- data/doc/lib/tj3client_rb.html +1 -1
- data/doc/lib/tj3d_rb.html +1 -1
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +1 -1
- data/doc/lib/tj3ts_receiver_rb.html +1 -1
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/lib/taskjuggler/Account.rb +1 -1
- data/lib/taskjuggler/AccountScenario.rb +1 -1
- data/lib/taskjuggler/Allocation.rb +5 -5
- data/lib/taskjuggler/AttributeBase.rb +30 -22
- data/lib/taskjuggler/Attributes.rb +80 -78
- data/lib/taskjuggler/Booking.rb +2 -2
- data/lib/taskjuggler/Charge.rb +3 -3
- data/lib/taskjuggler/ICalendar.rb +251 -0
- data/lib/taskjuggler/Interval.rb +215 -53
- data/lib/taskjuggler/IntervalList.rb +5 -5
- data/lib/taskjuggler/Limits.rb +79 -69
- data/lib/taskjuggler/LogicalFunction.rb +2 -2
- data/lib/taskjuggler/MessageHandler.rb +11 -6
- data/lib/taskjuggler/Project.rb +208 -95
- data/lib/taskjuggler/ProjectFileParser.rb +2 -2
- data/lib/taskjuggler/ProjectFileScanner.rb +7 -6
- data/lib/taskjuggler/PropertySet.rb +1 -5
- data/lib/taskjuggler/PropertyTreeNode.rb +21 -16
- data/lib/taskjuggler/Query.rb +10 -7
- data/lib/taskjuggler/Resource.rb +6 -1
- data/lib/taskjuggler/ResourceScenario.rb +85 -69
- data/lib/taskjuggler/RichText/RTFQuery.rb +2 -2
- data/lib/taskjuggler/ScenarioData.rb +11 -1
- data/lib/taskjuggler/Scoreboard.rb +8 -1
- data/lib/taskjuggler/Shift.rb +1 -1
- data/lib/taskjuggler/ShiftAssignments.rb +22 -20
- data/lib/taskjuggler/Task.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +65 -51
- data/lib/taskjuggler/TaskScenario.rb +486 -419
- data/lib/taskjuggler/TextParser/Scanner.rb +22 -11
- data/lib/taskjuggler/TimeSheets.rb +1 -1
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjTime.rb +7 -3
- data/lib/taskjuggler/TjpSyntaxRules.rb +157 -23
- data/lib/taskjuggler/VimSyntax.rb +18 -0
- data/lib/taskjuggler/WorkingHours.rb +20 -4
- data/lib/taskjuggler/apps/Tj3.rb +16 -1
- data/lib/taskjuggler/reports/GanttLine.rb +1 -1
- data/lib/taskjuggler/reports/ICalReport.rb +136 -0
- data/lib/taskjuggler/reports/NikuReport.rb +1 -1
- data/lib/taskjuggler/reports/Report.rb +59 -0
- data/lib/taskjuggler/reports/ReportBase.rb +2 -67
- data/lib/taskjuggler/reports/TableReport.rb +9 -8
- data/lib/taskjuggler/reports/TagFile.rb +120 -0
- data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
- data/lib/taskjuggler/reports/TjpExportRE.rb +33 -9
- data/manual/Installation +126 -0
- data/spec/ICalendar_spec.rb +45 -0
- data/spec/IntervalList_spec.rb +11 -11
- data/tasks/changelog.rake +150 -60
- data/tasks/gem.rake +1 -0
- data/tasks/vim.rake +2 -2
- data/test/TestSuite/Export-Reports/refs/Booking.tjp +1 -1
- data/test/TestSuite/Export-Reports/refs/CompletedWork.tji.tjp +40 -0
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +10 -1
- data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +1 -1
- data/test/TestSuite/HTML-Reports/Alerts.html +160 -412
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +0 -20
- data/test/TestSuite/HTML-Reports/css/tjreport.css +6 -7
- data/test/TestSuite/HTML-Reports/depArrows.html +851 -0
- data/test/TestSuite/HTML-Reports/profile.html +37581 -0
- data/test/TestSuite/{Scheduler/Correct → HTML-Reports/scripts}/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +3 -3
- data/test/TestSuite/Scheduler/Errors/R.html +113 -0
- data/test/TestSuite/Scheduler/Errors/allocate_no_assigned.tjp +15 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjmanual.css +0 -1
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjreport.css +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/details.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-green.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-red.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-yellow.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resource.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resourcegroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/task.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/taskgroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-down.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-flat.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_effort.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_length.tjp +13 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/scripts/wz_tooltip.js +0 -0
- data/test/TestSuite/StatusSheets/dev2.tji +22 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji.tjp +38 -0
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +5 -2
- data/test/TestSuite/Syntax/Errors/scenario_after_tracking.tjp +8 -0
- data/test/TestSuite/TimeSheets/resrep.tji +7 -0
- data/test/TestSuite/TimeSheets/ts.tji +351 -0
- data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
- data/test/test_Limits.rb +38 -30
- data/test/test_Scheduler.rb +2 -2
- data/test/test_ShiftAssignments.rb +8 -8
- data/test/test_WorkingHours.rb +4 -4
- metadata +1015 -1005
- data/lib/exchangebug.rb +0 -42
- data/lib/ruby-signal-bug.rb +0 -55
- data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
- data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.csv +0 -412
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.html +0 -680
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.csv +0 -4
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.tjp +0 -25
- data/test/TestSuite/ReportGenerator/Correct/Journal-1.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-2.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-3.html +0 -28
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
- data/test/TestSuite/ReportGenerator/Correct/opennodes-1.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
- data/test/TestSuite/Scheduler/' +0 -23
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -86
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
- data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
- data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
- data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
- data/test/TestSuite/TimeSheets/uu.txt +0 -29
@@ -0,0 +1,251 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# = ICalendar.rb -- The TaskJuggler III Project Management Software
|
5
|
+
#
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
8
|
+
#
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
11
|
+
# published by the Free Software Foundation.
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'taskjuggler/Tj3Config'
|
15
|
+
|
16
|
+
class TaskJuggler
|
17
|
+
|
18
|
+
# This class implements a very basic RFC5545 compliant iCalendar file
|
19
|
+
# generator. It currently only supports a very small subset of the tags that
|
20
|
+
# are needed for TaskJuggler.
|
21
|
+
class ICalendar
|
22
|
+
|
23
|
+
# The maximum allowed length of a content line without line end character.
|
24
|
+
LINELENGTH = 75
|
25
|
+
|
26
|
+
# Utility class to store name and email of a person.
|
27
|
+
class Person < Struct.new(:name, :email)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Base class for all ICalendar components.
|
31
|
+
class Component
|
32
|
+
|
33
|
+
attr_accessor :description, :relatedTo, :organizer
|
34
|
+
attr_reader :uid
|
35
|
+
|
36
|
+
def initialize(ical, uid, summary, startDate)
|
37
|
+
@ical = ical
|
38
|
+
@type = self.class.to_s.split('::').last.upcase
|
39
|
+
@uid = uid + "-#{@type}"
|
40
|
+
@summary = summary
|
41
|
+
@startDate = startDate
|
42
|
+
|
43
|
+
# Optional attributes
|
44
|
+
@description = nil
|
45
|
+
@relatedTo = nil
|
46
|
+
@organizer = nil
|
47
|
+
@attendees = []
|
48
|
+
end
|
49
|
+
|
50
|
+
def setOrganizer(name, email)
|
51
|
+
@organizer = Person.new(name, email)
|
52
|
+
end
|
53
|
+
|
54
|
+
def addAttendee(name, email)
|
55
|
+
@attendees << Person.new(name, email)
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
str = <<"EOT"
|
60
|
+
BEGIN:V#{@type}
|
61
|
+
DTSTAMP:#{dateTime(TjTime.new.utc)}
|
62
|
+
CREATED:#{dateTime(@ical.creationDate)}
|
63
|
+
UID:#{@uid}
|
64
|
+
LAST-MODIFIED:#{dateTime(@ical.lastModified)}
|
65
|
+
SUMMARY:#{quoted(@summary)}
|
66
|
+
DTSTART:#{dateTime(@startDate)}
|
67
|
+
EOT
|
68
|
+
str += "DESCRIPTION:#{quoted(@description)}\n" if @description
|
69
|
+
str += "RELATED-TO:#{@relatedTo}\n" if @relatedTo
|
70
|
+
|
71
|
+
if @organizer
|
72
|
+
str += "ORGANIZER;CN=#{@organizer.name}:mailto:#{@organizer.email}\n"
|
73
|
+
end
|
74
|
+
@attendees.each do |attendee|
|
75
|
+
str += "ATTENDEE;CN=#{attendee.name}:mailto:#{attendee.email}\n"
|
76
|
+
end
|
77
|
+
|
78
|
+
str += yield if block_given?
|
79
|
+
|
80
|
+
str += "END:V#{@type}\n\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def dateTime(date)
|
86
|
+
@ical.dateTime(date)
|
87
|
+
end
|
88
|
+
|
89
|
+
def quoted(str)
|
90
|
+
str.gsub(/([;,"\\])/, '\\\\\1').gsub(/\n/, '\n')
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
# Stores the data of an VTODO component and can generate one.
|
96
|
+
class Todo < Component
|
97
|
+
|
98
|
+
attr_accessor :priority, :percentComplete
|
99
|
+
|
100
|
+
# Create the Todo object with some mandatory data. _ical_ is a reference
|
101
|
+
# to the parent ICalendar object. _uid_ is a unique pattern used to
|
102
|
+
# generate the UID tag. _summary_ is a String for SUMMARY. _startDate_
|
103
|
+
# is used to generate DTSTART. _endDate_ is used to either generate
|
104
|
+
# the COMPLETED or DUE tag.
|
105
|
+
def initialize(ical, uid, summary, startDate, endDate)
|
106
|
+
super(ical, uid, summary, startDate)
|
107
|
+
|
108
|
+
# Mandatory attributes
|
109
|
+
@ical.addTodo(self)
|
110
|
+
@endDate = endDate
|
111
|
+
# Priority value (0 - 9)
|
112
|
+
@priority = 0
|
113
|
+
@percentComplete = -1
|
114
|
+
end
|
115
|
+
|
116
|
+
# Generate the VTODO record as String.
|
117
|
+
def to_s
|
118
|
+
super do
|
119
|
+
str = ''
|
120
|
+
if @percentComplete < 100.0
|
121
|
+
str += "DUE:#{dateTime(@endDate)}\n"
|
122
|
+
else
|
123
|
+
str += "COMPLETED:#{dateTime(@endDate)}\n"
|
124
|
+
end
|
125
|
+
str += "PERCENT-COMPLETE:#{@percentComplete}\n"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
# Stores the data of an VTODO component and can generate one.
|
132
|
+
class Event < Component
|
133
|
+
|
134
|
+
# Create the Event object with some mandatory data. _ical_ is a
|
135
|
+
# reference to the parent ICalendar object. _uid_ is a unique pattern
|
136
|
+
# used to generate the UID tag. _summary_ is a String for SUMMARY.
|
137
|
+
# _startDate_ is used to generate DTSTART. _endDate_ is used to either
|
138
|
+
# generate the COMPLETED or DUE tag.
|
139
|
+
def initialize(ical, uid, summary, startDate, endDate)
|
140
|
+
super(ical, uid, summary, startDate)
|
141
|
+
@ical.addEvent(self)
|
142
|
+
|
143
|
+
# Mandatory attributes
|
144
|
+
@endDate = endDate
|
145
|
+
# Optional attributes
|
146
|
+
@priority = 1
|
147
|
+
end
|
148
|
+
|
149
|
+
# Generate the VEVENT record as String.
|
150
|
+
def to_s
|
151
|
+
super do
|
152
|
+
<<"EOT"
|
153
|
+
PRIORITY:#{@priority}
|
154
|
+
DTEND:#{dateTime(@endDate)}
|
155
|
+
TRANSP:TRANSPARENT
|
156
|
+
EOT
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
class Journal < Component
|
163
|
+
|
164
|
+
def initialize(ical, uid, summary, startDate)
|
165
|
+
super
|
166
|
+
@ical.addJournal(self)
|
167
|
+
end
|
168
|
+
|
169
|
+
def to_s
|
170
|
+
super
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
attr_reader :uid
|
176
|
+
attr_accessor :creationDate, :lastModified
|
177
|
+
|
178
|
+
def initialize(uid)
|
179
|
+
@uid = "#{AppConfig.packageName}-#{uid}"
|
180
|
+
@creationDate = @lastModified = TjTime.new.utc
|
181
|
+
|
182
|
+
@todos = []
|
183
|
+
@events = []
|
184
|
+
@journals = []
|
185
|
+
end
|
186
|
+
|
187
|
+
# Add a new VTODO component. For internal use only!
|
188
|
+
def addTodo(todo)
|
189
|
+
@todos << todo
|
190
|
+
end
|
191
|
+
|
192
|
+
# Add a new VEVENT component. For internal use only!
|
193
|
+
def addEvent(event)
|
194
|
+
@events << event
|
195
|
+
end
|
196
|
+
|
197
|
+
# Add a new VJOURNAL component. For internal user only!
|
198
|
+
def addJournal(journal)
|
199
|
+
@journals << journal
|
200
|
+
end
|
201
|
+
|
202
|
+
def to_s
|
203
|
+
str = <<"EOT"
|
204
|
+
BEGIN:VCALENDAR
|
205
|
+
PRODID:-//The #{AppConfig.softwareName} Project/NONSGML #{AppConfig.softwareName} #{AppConfig.version}//EN
|
206
|
+
VERSION:2.0
|
207
|
+
|
208
|
+
EOT
|
209
|
+
@todos.each { |todo| str += todo.to_s }
|
210
|
+
@events.each { |event| str += event.to_s }
|
211
|
+
@journals.each { |journal| str += journal.to_s }
|
212
|
+
|
213
|
+
str << <<"EOT"
|
214
|
+
END:VCALENDAR
|
215
|
+
EOT
|
216
|
+
|
217
|
+
foldLines(str)
|
218
|
+
end
|
219
|
+
|
220
|
+
def dateTime(date)
|
221
|
+
date.to_s("%Y%m%dT%H%M%SZ")
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
|
226
|
+
# Make sure that no line is longer than LINELENTH octets (excl. the
|
227
|
+
# newline character)
|
228
|
+
def foldLines(str)
|
229
|
+
newStr = ''
|
230
|
+
str.each_line do |line|
|
231
|
+
bytes = 0
|
232
|
+
line.each_utf8_char do |c|
|
233
|
+
# Make sure we support Ruby 1.8 and 1.9 String handling.
|
234
|
+
cBytes = c.bytesize
|
235
|
+
if bytes + cBytes > LINELENGTH && c != "\n"
|
236
|
+
newStr += "\n "
|
237
|
+
bytes = 0
|
238
|
+
else
|
239
|
+
bytes += cBytes
|
240
|
+
end
|
241
|
+
newStr << c
|
242
|
+
end
|
243
|
+
end
|
244
|
+
# Convert line ends to CR+LF
|
245
|
+
newStr.gsub(/\n/, "\r\n")
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
|
data/lib/taskjuggler/Interval.rb
CHANGED
@@ -15,89 +15,66 @@ require 'taskjuggler/TjTime'
|
|
15
15
|
|
16
16
|
class TaskJuggler
|
17
17
|
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# of the interval, the end is not.
|
18
|
+
# This is the based class used to store several kinds of intervals in
|
19
|
+
# derived classes.
|
21
20
|
class Interval
|
22
21
|
|
23
|
-
|
22
|
+
attr_reader :start, :end
|
24
23
|
|
25
|
-
# Create a new Interval.
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def initialize(*args)
|
34
|
-
if args.length == 1
|
35
|
-
if args[0].is_a?(TjTime)
|
36
|
-
# Just one argument, a date
|
37
|
-
@start = @end = args[0]
|
38
|
-
elsif args[0].is_a?(Interval)
|
39
|
-
# Just one argument, an Interval
|
40
|
-
@start = args[0].start
|
41
|
-
@end = args[0].end
|
42
|
-
else
|
43
|
-
raise "Illegal argument"
|
44
|
-
end
|
45
|
-
elsif args.length == 2
|
46
|
-
# Two arguments, a start and end date
|
47
|
-
@start = args[0]
|
48
|
-
@end = args[1]
|
49
|
-
raise "Interval start must be a date" unless @start.is_a?(TjTime)
|
50
|
-
raise "Interval end must be a date" unless @end.is_a?(TjTime)
|
51
|
-
if @end < @start
|
52
|
-
raise "Invalid interval"
|
53
|
-
end
|
54
|
-
else
|
55
|
-
raise "Illegal arguments"
|
24
|
+
# Create a new Interval object. _s_ is the interval start, _e_ the
|
25
|
+
# interval end (not included).
|
26
|
+
def initialize(s, e)
|
27
|
+
@start = s
|
28
|
+
@end = e
|
29
|
+
# The end must not be before the start.
|
30
|
+
if @end < @start
|
31
|
+
raise ArgumentError, "Invalid interval (#{s} - #{e})"
|
56
32
|
end
|
57
33
|
end
|
58
34
|
|
59
|
-
# Return
|
60
|
-
|
61
|
-
@end - @start
|
62
|
-
end
|
63
|
-
|
64
|
-
# Return true if _arg_ is contained within the Interval. It can either be a
|
65
|
-
# single TjTime or another Interval.
|
35
|
+
# Return true if _arg_ is contained within the Interval. It can either
|
36
|
+
# be a single TjTime or another Interval.
|
66
37
|
def contains?(arg)
|
67
|
-
if arg.is_a?(
|
68
|
-
|
69
|
-
else
|
38
|
+
if arg.is_a?(Interval)
|
39
|
+
raise ArgumentError, "Class mismatch" if self.class != arg.class
|
70
40
|
return @start <= arg.start && arg.end <= @end
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Class mismatch" if @start.class != arg.class
|
43
|
+
return @start <= arg && arg < @end
|
71
44
|
end
|
72
45
|
end
|
73
46
|
|
74
|
-
# Check whether the Interval _arg_ overlaps with this
|
47
|
+
# Check whether the Interval _arg_ overlaps with this Interval.
|
75
48
|
def overlaps?(arg)
|
76
|
-
if arg.is_a?(
|
77
|
-
|
78
|
-
else
|
49
|
+
if arg.is_a?(Interval)
|
50
|
+
raise ArgumentError, "Class mismatch" if self.class != arg.class
|
79
51
|
return (@start <= arg.start && arg.start < @end) ||
|
80
52
|
(arg.start <= @start && @start < arg.end)
|
53
|
+
else
|
54
|
+
raise ArgumentError, "Class mismatch" if @start.class != arg.class
|
55
|
+
return @start <= arg && arg < @end
|
81
56
|
end
|
82
57
|
end
|
83
58
|
|
84
59
|
# Return a new Interval that contains the overlap of self and the Interval
|
85
60
|
# _iv_. In case there is no overlap, nil is returned.
|
86
61
|
def intersection(iv)
|
62
|
+
raise ArgumentError, "Class mismatch" if self.class != iv.class
|
87
63
|
newStart = @start > iv.start ? @start : iv.start
|
88
64
|
newEnd = @end < iv.end ? @end : iv.end
|
89
|
-
newStart < newEnd ?
|
65
|
+
newStart < newEnd ? self.class.new(newStart, newEnd) : nil
|
90
66
|
end
|
91
67
|
|
92
68
|
# Append or prepend the Interval _iv_ to self. If _iv_ does not directly
|
93
69
|
# attach to self, just return self.
|
94
70
|
def combine(iv)
|
71
|
+
raise ArgumentError, "Class mismatch" if self.class != iv.class
|
95
72
|
if iv.end == @start
|
96
73
|
# Prepend iv
|
97
|
-
Array.new
|
74
|
+
Array.new self.class.new(iv.start, @end)
|
98
75
|
elsif @end == iv.start
|
99
76
|
# Append iv
|
100
|
-
Array.new
|
77
|
+
Array.new self.class.new(@start, iv.end)
|
101
78
|
else
|
102
79
|
self
|
103
80
|
end
|
@@ -106,6 +83,7 @@ class TaskJuggler
|
|
106
83
|
# Compare self with Interval _iv_. This function only works for
|
107
84
|
# non-overlapping Interval objects.
|
108
85
|
def <=>(iv)
|
86
|
+
raise ArgumentError, "Class mismatch" if self.class != iv.class
|
109
87
|
if @end < iv.start
|
110
88
|
-1
|
111
89
|
elsif iv.end < @start
|
@@ -116,15 +94,199 @@ class TaskJuggler
|
|
116
94
|
|
117
95
|
# Return true if the Interval _iv_ describes an identical time period.
|
118
96
|
def ==(iv)
|
97
|
+
raise ArgumentError, "Class mismatch" if self.class != iv.class
|
119
98
|
@start == iv.start && @end == iv.end
|
120
99
|
end
|
121
100
|
|
122
|
-
|
101
|
+
end
|
102
|
+
|
103
|
+
# The TimeInterval class provides objects that model a time interval. The
|
104
|
+
# start end end time are represented as seconds after Jan 1, 1970. The start
|
105
|
+
# is part of the interval, the end is not.
|
106
|
+
class TimeInterval < Interval
|
107
|
+
|
108
|
+
attr_accessor :start, :end
|
109
|
+
|
110
|
+
# Create a new TimeInterval. _args_ can be three different kind of arguments.
|
111
|
+
#
|
112
|
+
# a and b should be TjTime objects.
|
113
|
+
#
|
114
|
+
# TimeInterval.new(a, b) | -> Interval(a, b)
|
115
|
+
# TimeInterval.new(a) | -> Interval(a, a)
|
116
|
+
# TimeInterval.new(iv) | -> Interval(iv.start, iv.end)
|
117
|
+
#
|
118
|
+
def initialize(*args)
|
119
|
+
if args.length == 1
|
120
|
+
if args[0].is_a?(TjTime)
|
121
|
+
# Just one argument, a date
|
122
|
+
super(args[0], args[0])
|
123
|
+
elsif args[0].is_a?(TimeInterval)
|
124
|
+
# Just one argument, a TimeInterval
|
125
|
+
super(args[0].start, args[0].end)
|
126
|
+
else
|
127
|
+
raise ArgumentError, "Illegal argument 1: #{args[0].class}"
|
128
|
+
end
|
129
|
+
elsif args.length == 2
|
130
|
+
# Two arguments, a start and end date
|
131
|
+
unless args[0].is_a?(TjTime)
|
132
|
+
raise ArgumentError, "Interval start must be a date, not a " +
|
133
|
+
"#{args[0].class}"
|
134
|
+
end
|
135
|
+
unless args[1].is_a?(TjTime)
|
136
|
+
raise ArgumentError, "Interval end must be a date, not a" +
|
137
|
+
"#{args[1].class}"
|
138
|
+
end
|
139
|
+
super(args[0], args[1])
|
140
|
+
else
|
141
|
+
raise ArgumentError, "Too many arguments: #{args.length}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Return the duration of the TimeInterval.
|
146
|
+
def duration
|
147
|
+
@end - @start
|
148
|
+
end
|
149
|
+
|
150
|
+
# Turn the TimeInterval into a human readable form.
|
123
151
|
def to_s
|
124
152
|
@start.to_s + ' - ' + @end.to_s
|
125
153
|
end
|
126
154
|
|
127
155
|
end
|
128
156
|
|
157
|
+
# This class describes an interval of a scoreboard. The start and end of the
|
158
|
+
# interval are stored as indexes but can always be converted back to TjTime
|
159
|
+
# objects if needed.
|
160
|
+
class ScoreboardInterval < Interval
|
161
|
+
|
162
|
+
attr_reader :sbStart, :slotDuration
|
163
|
+
|
164
|
+
# Create a new ScoreboardInterval. _args_ can be three different kind of
|
165
|
+
# arguments.
|
166
|
+
#
|
167
|
+
# sbStart must be a TjTime of the scoreboard start
|
168
|
+
# slotDuration must be the duration of the scoreboard slots in seconds
|
169
|
+
# a and b should be TjTime or Fixnum objects that describe the start and
|
170
|
+
# end time or index of the interval.
|
171
|
+
#
|
172
|
+
# TimeInterval.new(iv)
|
173
|
+
# TimeInterval.new(sbStart, slotDuration, a)
|
174
|
+
# TimeInterval.new(sbStart, slotDuration, a, b)
|
175
|
+
#
|
176
|
+
def initialize(*args)
|
177
|
+
case args.length
|
178
|
+
when 1
|
179
|
+
# If there is only one argument, it must be a ScoreboardInterval.
|
180
|
+
if args[0].is_a?(ScoreboardInterval)
|
181
|
+
@sbStart = args[0].sbStart
|
182
|
+
@slotDuration = args[0].slotDuration
|
183
|
+
# Just one argument, a TimeInterval
|
184
|
+
super(args[0].start, args[0].end)
|
185
|
+
else
|
186
|
+
raise ArgumentError, "Illegal argument 1: #{args[0].class}"
|
187
|
+
end
|
188
|
+
when 3
|
189
|
+
@sbStart = args[0]
|
190
|
+
@slotDuration = args[1]
|
191
|
+
# If the third argument is a date we convert it to a scoreboard index.
|
192
|
+
args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
|
193
|
+
|
194
|
+
if args[2].is_a?(Fixnum) || args[2].is_a?(Bignum)
|
195
|
+
super(args[2], args[2])
|
196
|
+
else
|
197
|
+
raise ArgumentError, "Illegal argument 3: #{args[0].class}"
|
198
|
+
end
|
199
|
+
when 4
|
200
|
+
@sbStart = args[0]
|
201
|
+
@slotDuration = args[1]
|
202
|
+
# If the third and forth arguments are a date we convert them to a
|
203
|
+
# scoreboard index.
|
204
|
+
args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
|
205
|
+
args[3] = dateToIndex(args[3]) if args[3].is_a?(TjTime)
|
206
|
+
|
207
|
+
if !(args[2].is_a?(Fixnum) || args[2].is_a?(Bignum))
|
208
|
+
raise ArgumentError, "Interval start must be an index or TjTime, " +
|
209
|
+
"not a #{args[2].class}"
|
210
|
+
end
|
211
|
+
if !(args[3].is_a?(Fixnum) || args[3].is_a?(Bignum))
|
212
|
+
raise ArgumentError, "Interval end must be an index or TjTime, " +
|
213
|
+
"not a #{args[3].class}"
|
214
|
+
end
|
215
|
+
super(args[2], args[3])
|
216
|
+
else
|
217
|
+
raise ArgumentError, "Wrong number of arguments: #{args.length}"
|
218
|
+
end
|
219
|
+
|
220
|
+
unless @sbStart.is_a?(TjTime)
|
221
|
+
raise ArgumentError, "sbStart must be a TjTime object, not a" +
|
222
|
+
"#{@sbStart.class}"
|
223
|
+
end
|
224
|
+
unless @slotDuration.is_a?(Fixnum)
|
225
|
+
raise ArgumentError, "slotDuration must be a Fixnum, not a " +
|
226
|
+
"#{@slotDuration.class}"
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
# Assign the start of the interval. +arg+ can be a Fixnum, Bignum or
|
232
|
+
# TjTime object.
|
233
|
+
def start=(arg)
|
234
|
+
case arg
|
235
|
+
when Fixnum
|
236
|
+
when Bignum
|
237
|
+
@start = arg
|
238
|
+
when TjTime
|
239
|
+
@start = dateToIndex(arg)
|
240
|
+
else
|
241
|
+
raise ArgumentError, "Unsupported class #{arg.class}"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# Assign the start of the interval. +arg+ can be a Fixnum, Bignum or
|
246
|
+
# TjTime object.
|
247
|
+
def end=(arg)
|
248
|
+
case arg
|
249
|
+
when Fixnum
|
250
|
+
when Bignum
|
251
|
+
@end = arg
|
252
|
+
when TjTime
|
253
|
+
@end = dateToIndex(arg)
|
254
|
+
else
|
255
|
+
raise ArgumentError, "Unsupported class #{arg.class}"
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# Return the interval start as TjTime object.
|
260
|
+
def startDate
|
261
|
+
indexToDate(@start)
|
262
|
+
end
|
263
|
+
|
264
|
+
# Return the interval end as TjTime object.
|
265
|
+
def endDate
|
266
|
+
indexToDate(@end)
|
267
|
+
end
|
268
|
+
|
269
|
+
# Return the duration of the ScoreboardInterval.
|
270
|
+
def duration
|
271
|
+
indexToDate(@end) - indexToDate(@start)
|
272
|
+
end
|
273
|
+
|
274
|
+
# Turn the ScoreboardInterval into a human readable form.
|
275
|
+
def to_s
|
276
|
+
indexToDate(@start).to_s + ' - ' + indexToDate(@end).to_s
|
277
|
+
end
|
278
|
+
|
279
|
+
private
|
280
|
+
|
281
|
+
def dateToIndex(date)
|
282
|
+
(date - @sbStart).to_i / @slotDuration
|
283
|
+
end
|
284
|
+
|
285
|
+
def indexToDate(index)
|
286
|
+
@sbStart + (index * @slotDuration)
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
129
291
|
end
|
130
292
|
|
@@ -33,11 +33,11 @@ class TaskJuggler
|
|
33
33
|
si += 1
|
34
34
|
elsif self[si].end < list[li].end
|
35
35
|
# self[si] does overlap with list[li] but list[li] goes further
|
36
|
-
res <<
|
36
|
+
res << self[si].class.new(list[li].start, self[si].end)
|
37
37
|
si += 1
|
38
38
|
else
|
39
39
|
# self[si] does overlap with list[li] but self[si] goes further
|
40
|
-
res <<
|
40
|
+
res << self[si].class.new(list[li].start, list[li].end)
|
41
41
|
li += 1
|
42
42
|
end
|
43
43
|
elsif list[li].start < self[si].start
|
@@ -48,11 +48,11 @@ class TaskJuggler
|
|
48
48
|
li += 1
|
49
49
|
elsif list[li].end < self[si].end
|
50
50
|
# list[li] does overlap with self[si] but self[si] goes further
|
51
|
-
res <<
|
51
|
+
res << self[si].class.new(self[si].start, list[li].end)
|
52
52
|
li += 1
|
53
53
|
else
|
54
54
|
# list[li] does overlap with self[si] but list[li] goes further
|
55
|
-
res <<
|
55
|
+
res << self[si].class.new(self[si].start, self[si].end)
|
56
56
|
si += 1
|
57
57
|
end
|
58
58
|
else
|
@@ -86,7 +86,7 @@ class TaskJuggler
|
|
86
86
|
raise "Intervals may not overlap and must be added in " +
|
87
87
|
"ascending order."
|
88
88
|
elsif last.end == iv.start
|
89
|
-
self[-1] =
|
89
|
+
self[-1] = last.class.new(last.start, iv.end)
|
90
90
|
return self
|
91
91
|
end
|
92
92
|
end
|