taskjuggler 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +37 -5
- data/README.rdoc +4 -2
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/css/tjmanual.css +0 -1
- data/benchmarks/htmltaskreport-1.html +47702 -0
- data/benchmarks/htmltaskreport-2.html +23345 -0
- data/benchmarks/htmltaskreport-3.html +23265 -0
- data/benchmarks/htmltaskreport-4.html +22135 -0
- data/benchmarks/profile.clt +36082 -0
- data/benchmarks/tj3.profile +0 -0
- data/benchmarks/tj3.profile.grind +6185 -0
- data/benchmarks/tj3.profile.symbols +432 -0
- data/benchmarks/tj3.profile.txt +448 -0
- data/data/tjp.vim +689 -0
- data/doc/AppConfig.html +26 -2
- data/doc/CHANGELOG.html +60 -8
- data/doc/COPYING.html +26 -2
- data/doc/Diff/Hunk.html +26 -2
- data/doc/Diff.html +26 -2
- data/doc/Diffable.html +26 -2
- data/doc/DiffableString.html +26 -2
- data/doc/Object.html +26 -104
- data/doc/README_rdoc.html +39 -7
- data/doc/RuntimeConfig.html +26 -2
- data/doc/String.html +26 -2
- data/doc/TaskJuggler/Account.html +27 -3
- data/doc/TaskJuggler/AccountAttribute.html +30 -6
- data/doc/TaskJuggler/AccountScenario.html +28 -4
- data/doc/TaskJuggler/Allocation.html +33 -9
- data/doc/TaskJuggler/AllocationAttribute.html +31 -7
- data/doc/TaskJuggler/AttributeBase.html +162 -111
- data/doc/TaskJuggler/AttributeDefinition.html +26 -2
- data/doc/TaskJuggler/AttributeOverwrite.html +26 -2
- data/doc/TaskJuggler/BatchProcessor.html +26 -2
- data/doc/TaskJuggler/Booking.html +29 -5
- data/doc/TaskJuggler/BookingListAttribute.html +29 -5
- data/doc/TaskJuggler/BooleanAttribute.html +30 -6
- data/doc/TaskJuggler/CSVFile.html +26 -2
- data/doc/TaskJuggler/CellSettingPattern.html +26 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -2
- data/doc/TaskJuggler/Charge.html +30 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +29 -5
- data/doc/TaskJuggler/ChargeSet.html +26 -2
- data/doc/TaskJuggler/ChargeSetListAttribute.html +30 -6
- data/doc/TaskJuggler/CollisionDetector.html +26 -2
- data/doc/TaskJuggler/ColumnListAttribute.html +28 -4
- data/doc/TaskJuggler/ColumnTable.html +26 -2
- data/doc/TaskJuggler/Daemon.html +26 -2
- data/doc/TaskJuggler/DataCache.html +26 -2
- data/doc/TaskJuggler/DataCacheEntry.html +26 -2
- data/doc/TaskJuggler/DateAttribute.html +30 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +28 -4
- data/doc/TaskJuggler/DependencyListAttribute.html +30 -6
- data/doc/TaskJuggler/DurationAttribute.html +31 -7
- data/doc/TaskJuggler/FileList.html +26 -2
- data/doc/TaskJuggler/FileRecord.html +26 -2
- data/doc/TaskJuggler/FixnumAttribute.html +28 -4
- data/doc/TaskJuggler/FlagListAttribute.html +30 -6
- data/doc/TaskJuggler/FloatAttribute.html +29 -5
- data/doc/TaskJuggler/FormatListAttribute.html +29 -5
- data/doc/TaskJuggler/GanttChart.html +26 -2
- data/doc/TaskJuggler/GanttContainer.html +26 -2
- data/doc/TaskJuggler/GanttHeader.html +26 -2
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -2
- data/doc/TaskJuggler/GanttLine.html +27 -3
- data/doc/TaskJuggler/GanttLoadStack.html +26 -2
- data/doc/TaskJuggler/GanttMilestone.html +26 -2
- data/doc/TaskJuggler/GanttRouter.html +26 -2
- data/doc/TaskJuggler/GanttTaskBar.html +26 -2
- data/doc/TaskJuggler/HTMLDocument.html +26 -2
- data/doc/TaskJuggler/HTMLElements.html +623 -0
- data/doc/TaskJuggler/HTMLGraphics.html +26 -2
- data/doc/TaskJuggler/ICalReport.html +864 -0
- data/doc/TaskJuggler/ICalendar/Component.html +969 -0
- data/doc/TaskJuggler/ICalendar/Event.html +742 -0
- data/doc/TaskJuggler/ICalendar/Journal.html +722 -0
- data/doc/TaskJuggler/ICalendar/Person.html +633 -0
- data/doc/TaskJuggler/ICalendar/Todo.html +789 -0
- data/doc/TaskJuggler/ICalendar.html +1035 -0
- data/doc/TaskJuggler/Interval.html +99 -172
- data/doc/TaskJuggler/IntervalList.html +31 -7
- data/doc/TaskJuggler/JobInfo.html +26 -2
- data/doc/TaskJuggler/Journal.html +26 -2
- data/doc/TaskJuggler/JournalEntry.html +26 -2
- data/doc/TaskJuggler/JournalEntryList.html +26 -2
- data/doc/TaskJuggler/KeywordArray.html +26 -2
- data/doc/TaskJuggler/KeywordDocumentation.html +26 -2
- data/doc/TaskJuggler/Limits/Limit.html +124 -49
- data/doc/TaskJuggler/Limits.html +139 -156
- data/doc/TaskJuggler/LimitsAttribute.html +39 -14
- data/doc/TaskJuggler/ListAttributeBase.html +35 -11
- data/doc/TaskJuggler/Log.html +26 -2
- data/doc/TaskJuggler/LogFile.html +26 -2
- data/doc/TaskJuggler/LogicalAttribute.html +26 -2
- data/doc/TaskJuggler/LogicalExpression.html +26 -2
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalExpressionListAttribute.html +35 -11
- data/doc/TaskJuggler/LogicalFlag.html +26 -2
- data/doc/TaskJuggler/LogicalFunction.html +28 -4
- data/doc/TaskJuggler/LogicalOperation.html +26 -2
- data/doc/TaskJuggler/ManagerResponsibilities.html +26 -2
- data/doc/TaskJuggler/ManagerStatusRecord.html +26 -2
- data/doc/TaskJuggler/Message.html +26 -2
- data/doc/TaskJuggler/MessageHandler.html +108 -62
- data/doc/TaskJuggler/Navigator.html +26 -2
- data/doc/TaskJuggler/NavigatorElement.html +26 -2
- data/doc/TaskJuggler/NikuProject.html +26 -2
- data/doc/TaskJuggler/NikuReport.html +27 -3
- data/doc/TaskJuggler/NikuResource.html +26 -2
- data/doc/TaskJuggler/NodeListAttribute.html +31 -7
- data/doc/TaskJuggler/PlaceHolderCell.html +26 -2
- data/doc/TaskJuggler/ProcessIntercom.html +26 -2
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -2
- data/doc/TaskJuggler/Project.html +1236 -973
- data/doc/TaskJuggler/ProjectBroker.html +26 -2
- data/doc/TaskJuggler/ProjectBrokerIface.html +26 -2
- data/doc/TaskJuggler/ProjectFileParser.html +29 -4
- data/doc/TaskJuggler/ProjectFileScanner.html +56 -31
- data/doc/TaskJuggler/ProjectRecord.html +26 -2
- data/doc/TaskJuggler/ProjectServer.html +26 -2
- data/doc/TaskJuggler/ProjectServerIface.html +26 -2
- data/doc/TaskJuggler/PropertyAttribute.html +35 -11
- data/doc/TaskJuggler/PropertyList.html +26 -2
- data/doc/TaskJuggler/PropertySet.html +126 -106
- data/doc/TaskJuggler/PropertyTreeNode.html +595 -551
- data/doc/TaskJuggler/Query.html +127 -100
- data/doc/TaskJuggler/RTFHandlers.html +26 -2
- data/doc/TaskJuggler/RTFNavigator.html +26 -2
- data/doc/TaskJuggler/RTFQuery.html +28 -4
- data/doc/TaskJuggler/RTFReport.html +26 -2
- data/doc/TaskJuggler/RTFReportLink.html +26 -2
- data/doc/TaskJuggler/RTFWithQuerySupport.html +26 -2
- data/doc/TaskJuggler/RealFormat.html +26 -2
- data/doc/TaskJuggler/RealFormatAttribute.html +31 -7
- data/doc/TaskJuggler/ReferenceAttribute.html +58 -34
- data/doc/TaskJuggler/Report.html +427 -284
- data/doc/TaskJuggler/ReportBase.html +28 -102
- data/doc/TaskJuggler/ReportContext.html +26 -2
- data/doc/TaskJuggler/ReportScenario.html +633 -0
- data/doc/TaskJuggler/ReportServer.html +26 -2
- data/doc/TaskJuggler/ReportServerIface.html +26 -2
- data/doc/TaskJuggler/ReportServerRecord.html +26 -2
- data/doc/TaskJuggler/ReportServlet.html +26 -2
- data/doc/TaskJuggler/ReportTable.html +26 -2
- data/doc/TaskJuggler/ReportTableCell.html +26 -2
- data/doc/TaskJuggler/ReportTableColumn.html +26 -2
- data/doc/TaskJuggler/ReportTableLegend.html +26 -2
- data/doc/TaskJuggler/ReportTableLine.html +26 -2
- data/doc/TaskJuggler/Resource.html +225 -163
- data/doc/TaskJuggler/ResourceListAttribute.html +71 -47
- data/doc/TaskJuggler/ResourceListRE.html +26 -2
- data/doc/TaskJuggler/ResourceScenario.html +645 -603
- data/doc/TaskJuggler/RichText.html +26 -2
- data/doc/TaskJuggler/RichTextAttribute.html +53 -29
- data/doc/TaskJuggler/RichTextDocument.html +26 -2
- data/doc/TaskJuggler/RichTextElement.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +26 -2
- data/doc/TaskJuggler/RichTextFunctionHandler.html +26 -2
- data/doc/TaskJuggler/RichTextImage.html +26 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +29 -5
- data/doc/TaskJuggler/RichTextParser.html +26 -2
- data/doc/TaskJuggler/RichTextScanner.html +26 -2
- data/doc/TaskJuggler/RichTextSnip.html +26 -2
- data/doc/TaskJuggler/RichTextSyntaxRules.html +26 -2
- data/doc/TaskJuggler/Scenario.html +26 -2
- data/doc/TaskJuggler/ScenarioData.html +95 -28
- data/doc/TaskJuggler/ScenarioListAttribute.html +39 -15
- data/doc/TaskJuggler/Scoreboard.html +137 -73
- data/doc/TaskJuggler/ScoreboardInterval.html +1116 -0
- data/doc/TaskJuggler/SheetHandlerBase.html +26 -2
- data/doc/TaskJuggler/SheetReceiver.html +26 -2
- data/doc/TaskJuggler/SheetSender.html +26 -2
- data/doc/TaskJuggler/Shift.html +27 -3
- data/doc/TaskJuggler/ShiftAssignment.html +27 -3
- data/doc/TaskJuggler/ShiftAssignments.html +174 -149
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +41 -16
- data/doc/TaskJuggler/ShiftScenario.html +26 -2
- data/doc/TaskJuggler/SimpleQueryExpander.html +26 -2
- data/doc/TaskJuggler/SortListAttribute.html +35 -11
- data/doc/TaskJuggler/StatusSheetReceiver.html +26 -2
- data/doc/TaskJuggler/StatusSheetReport.html +26 -2
- data/doc/TaskJuggler/StatusSheetSender.html +26 -2
- data/doc/TaskJuggler/StdIoWrapper.html +26 -2
- data/doc/TaskJuggler/StringAttribute.html +39 -15
- data/doc/TaskJuggler/SymbolAttribute.html +35 -11
- data/doc/TaskJuggler/SyntaxReference.html +26 -2
- data/doc/TaskJuggler/TOCEntry.html +26 -2
- data/doc/TaskJuggler/TSResourceRecord.html +26 -2
- data/doc/TaskJuggler/TSTaskRecord.html +26 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +26 -2
- data/doc/TaskJuggler/TableOfContents.html +26 -2
- data/doc/TaskJuggler/TableReport.html +239 -214
- data/doc/TaskJuggler/TagFile/TagFileEntry.html +841 -0
- data/doc/TaskJuggler/TagFile.html +817 -0
- data/doc/TaskJuggler/Task.html +27 -3
- data/doc/TaskJuggler/TaskDepListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskDependency.html +26 -2
- data/doc/TaskJuggler/TaskListAttribute.html +47 -23
- data/doc/TaskJuggler/TaskListRE.html +26 -2
- data/doc/TaskJuggler/TaskScenario.html +2235 -2178
- data/doc/TaskJuggler/TernarySearchTree.html +26 -2
- data/doc/TaskJuggler/TextFormatter.html +26 -2
- data/doc/TaskJuggler/TextParser/Macro.html +26 -2
- data/doc/TaskJuggler/TextParser/MacroTable.html +26 -2
- data/doc/TaskJuggler/TextParser/Pattern.html +26 -2
- data/doc/TaskJuggler/TextParser/Rule.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/BufferStreamHandle.html +32 -8
- data/doc/TaskJuggler/TextParser/Scanner/FileStreamHandle.html +39 -15
- data/doc/TaskJuggler/TextParser/Scanner/MacroStackEntry.html +26 -2
- data/doc/TaskJuggler/TextParser/Scanner/StreamHandle.html +119 -86
- data/doc/TaskJuggler/TextParser/Scanner.html +317 -291
- data/doc/TaskJuggler/TextParser/SourceFileInfo.html +26 -2
- data/doc/TaskJuggler/TextParser/StackElement.html +26 -2
- data/doc/TaskJuggler/TextParser/State.html +26 -2
- data/doc/TaskJuggler/TextParser/StateTransition.html +26 -2
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +26 -2
- data/doc/TaskJuggler/TextParser/TokenDoc.html +26 -2
- data/doc/TaskJuggler/TextParser.html +85 -61
- data/doc/TaskJuggler/TextReport.html +26 -2
- data/doc/TaskJuggler/TimeInterval.html +841 -0
- data/doc/TaskJuggler/{IntervalListAttribute.html → TimeIntervalListAttribute.html} +33 -9
- data/doc/TaskJuggler/TimeSheet.html +26 -2
- data/doc/TaskJuggler/TimeSheetReceiver.html +26 -2
- data/doc/TaskJuggler/TimeSheetRecord.html +27 -3
- data/doc/TaskJuggler/TimeSheetReport.html +29 -5
- data/doc/TaskJuggler/TimeSheetSender.html +26 -2
- data/doc/TaskJuggler/TimeSheetSummary.html +26 -2
- data/doc/TaskJuggler/TimeSheets.html +26 -2
- data/doc/TaskJuggler/Tj3.html +150 -111
- data/doc/TaskJuggler/Tj3AppBase.html +26 -2
- data/doc/TaskJuggler/Tj3Client.html +26 -2
- data/doc/TaskJuggler/Tj3Daemon.html +26 -2
- data/doc/TaskJuggler/Tj3Man.html +26 -2
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -2
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3SsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsReceiver.html +26 -2
- data/doc/TaskJuggler/Tj3TsSender.html +26 -2
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -2
- data/doc/TaskJuggler/TjException.html +26 -2
- data/doc/TaskJuggler/TjRuntimeError.html +26 -2
- data/doc/TaskJuggler/TjTime.html +539 -477
- data/doc/TaskJuggler/TjpExample.html +26 -2
- data/doc/TaskJuggler/TjpExportRE.html +240 -161
- data/doc/TaskJuggler/TjpSyntaxRules.html +4236 -3844
- data/doc/TaskJuggler/URLParameter.html +26 -2
- data/doc/TaskJuggler/UserManual.html +26 -2
- data/doc/TaskJuggler/VimSyntax.html +31 -7
- data/doc/TaskJuggler/WebServer.html +26 -2
- data/doc/TaskJuggler/WelcomePage.html +26 -2
- data/doc/TaskJuggler/WorkingHours.html +227 -152
- data/doc/TaskJuggler/WorkingHoursAttribute.html +62 -38
- data/doc/TaskJuggler/XMLBlob.html +26 -2
- data/doc/TaskJuggler/XMLComment.html +26 -2
- data/doc/TaskJuggler/XMLDocument.html +26 -2
- data/doc/TaskJuggler/XMLElement.html +26 -2
- data/doc/TaskJuggler/XMLNamedText.html +26 -2
- data/doc/TaskJuggler/XMLText.html +26 -2
- data/doc/TaskJuggler.html +486 -427
- data/doc/index.html +801 -659
- data/doc/lib/taskjuggler/AccountScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Account_rb.html +1 -1
- data/doc/lib/taskjuggler/AlgorithmDiff_rb.html +1 -1
- data/doc/lib/taskjuggler/Allocation_rb.html +1 -1
- data/doc/lib/taskjuggler/AppConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeBase_rb.html +1 -1
- data/doc/lib/taskjuggler/AttributeDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/Attributes_rb.html +1 -1
- data/doc/lib/taskjuggler/BatchProcessor_rb.html +1 -1
- data/doc/lib/taskjuggler/Booking_rb.html +1 -1
- data/doc/lib/taskjuggler/ChargeSet_rb.html +1 -1
- data/doc/lib/taskjuggler/Charge_rb.html +1 -1
- data/doc/lib/taskjuggler/DataCache_rb.html +1 -1
- data/doc/lib/taskjuggler/FileList_rb.html +1 -1
- data/doc/lib/taskjuggler/HTMLDocument_rb.html +1 -1
- data/doc/lib/{ruby-signal-bug_rb.html → taskjuggler/HTMLElements_rb.html} +9 -9
- data/doc/lib/{exchangebug_rb.html → taskjuggler/ICalendar_rb.html} +9 -9
- data/doc/lib/taskjuggler/IntervalList_rb.html +1 -1
- data/doc/lib/taskjuggler/Interval_rb.html +1 -1
- data/doc/lib/taskjuggler/Journal_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordArray_rb.html +1 -1
- data/doc/lib/taskjuggler/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/taskjuggler/Limits_rb.html +1 -1
- data/doc/lib/taskjuggler/LogFile_rb.html +1 -1
- data/doc/lib/taskjuggler/Log_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalExpression_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalFunction_rb.html +1 -1
- data/doc/lib/taskjuggler/LogicalOperation_rb.html +1 -1
- data/doc/lib/taskjuggler/MessageHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileParser_rb.html +1 -1
- data/doc/lib/taskjuggler/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/taskjuggler/Project_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyList_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertySet_rb.html +1 -1
- data/doc/lib/taskjuggler/PropertyTreeNode_rb.html +1 -1
- data/doc/lib/taskjuggler/Query_rb.html +1 -1
- data/doc/lib/taskjuggler/RealFormat_rb.html +1 -1
- data/doc/lib/taskjuggler/ResourceScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Resource_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Document_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Element_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionExample_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/FunctionHandler_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Parser_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFHandlers_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFNavigator_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFQuery_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReportLink_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFReport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/RTFWithQuerySupport_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/Snip_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/SyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TOCEntry_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText/TableOfContents_rb.html +1 -1
- data/doc/lib/taskjuggler/RichText_rb.html +1 -1
- data/doc/lib/taskjuggler/RuntimeConfig_rb.html +1 -1
- data/doc/lib/taskjuggler/ScenarioData_rb.html +1 -1
- data/doc/lib/taskjuggler/Scenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Scoreboard_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetHandlerBase_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/SheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftAssignments_rb.html +1 -1
- data/doc/lib/taskjuggler/ShiftScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Shift_rb.html +1 -1
- data/doc/lib/taskjuggler/SimpleQueryExpander_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/StatusSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/StdIoWrapper_rb.html +1 -1
- data/doc/lib/taskjuggler/SyntaxReference_rb.html +1 -1
- data/doc/lib/taskjuggler/TableColumnDefinition_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskDependency_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskJuggler_rb.html +1 -1
- data/doc/lib/taskjuggler/TaskScenario_rb.html +1 -1
- data/doc/lib/taskjuggler/Task_rb.html +1 -1
- data/doc/lib/taskjuggler/TernarySearchTree_rb.html +1 -1
- data/doc/lib/taskjuggler/TextFormatter_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/MacroTable_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Rule_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/Scanner_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/SourceFileInfo_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/StackElement_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/State_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/taskjuggler/TextParser_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSender_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheetSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/TimeSheets_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3AppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3Config_rb.html +1 -1
- data/doc/lib/taskjuggler/Tj3SheetAppBase_rb.html +1 -1
- data/doc/lib/taskjuggler/TjException_rb.html +1 -1
- data/doc/lib/taskjuggler/TjTime_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpExample_rb.html +1 -1
- data/doc/lib/taskjuggler/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/taskjuggler/URLParameter_rb.html +1 -1
- data/doc/lib/taskjuggler/UTF8String_rb.html +1 -1
- data/doc/lib/taskjuggler/UserManual_rb.html +1 -1
- data/doc/lib/taskjuggler/VimSyntax_rb.html +1 -1
- data/doc/lib/taskjuggler/WorkingHours_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLDocument_rb.html +1 -1
- data/doc/lib/taskjuggler/XMLElement_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Client_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3Man_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3SsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsReceiver_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSender_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3TsSummary_rb.html +1 -1
- data/doc/lib/taskjuggler/apps/Tj3_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/Daemon_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProcessIntercom_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectBroker_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ProjectServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/ReportServlet_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WebServer_rb.html +1 -1
- data/doc/lib/taskjuggler/daemon/WelcomePage_rb.html +1 -1
- data/doc/lib/taskjuggler/deep_copy_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CSVFile_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/CollisionDetector_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttChart_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ICalReport_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/Navigator_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/NikuReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportBase_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportContext_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableCell_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/ReportTable_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/Report_rb.html +5 -1
- data/doc/lib/taskjuggler/reports/ResourceListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/StatusSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TableReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TagFile_rb.html +71 -0
- data/doc/lib/taskjuggler/reports/TaskListRE_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TextReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TimeSheetReport_rb.html +1 -1
- data/doc/lib/taskjuggler/reports/TjpExportRE_rb.html +1 -1
- data/doc/lib/tj3_rb.html +1 -1
- data/doc/lib/tj3client_rb.html +1 -1
- data/doc/lib/tj3d_rb.html +1 -1
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +1 -1
- data/doc/lib/tj3ts_receiver_rb.html +1 -1
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/lib/taskjuggler/Account.rb +1 -1
- data/lib/taskjuggler/AccountScenario.rb +1 -1
- data/lib/taskjuggler/Allocation.rb +5 -5
- data/lib/taskjuggler/AttributeBase.rb +30 -22
- data/lib/taskjuggler/Attributes.rb +80 -78
- data/lib/taskjuggler/Booking.rb +2 -2
- data/lib/taskjuggler/Charge.rb +3 -3
- data/lib/taskjuggler/ICalendar.rb +251 -0
- data/lib/taskjuggler/Interval.rb +215 -53
- data/lib/taskjuggler/IntervalList.rb +5 -5
- data/lib/taskjuggler/Limits.rb +79 -69
- data/lib/taskjuggler/LogicalFunction.rb +2 -2
- data/lib/taskjuggler/MessageHandler.rb +11 -6
- data/lib/taskjuggler/Project.rb +208 -95
- data/lib/taskjuggler/ProjectFileParser.rb +2 -2
- data/lib/taskjuggler/ProjectFileScanner.rb +7 -6
- data/lib/taskjuggler/PropertySet.rb +1 -5
- data/lib/taskjuggler/PropertyTreeNode.rb +21 -16
- data/lib/taskjuggler/Query.rb +10 -7
- data/lib/taskjuggler/Resource.rb +6 -1
- data/lib/taskjuggler/ResourceScenario.rb +85 -69
- data/lib/taskjuggler/RichText/RTFQuery.rb +2 -2
- data/lib/taskjuggler/ScenarioData.rb +11 -1
- data/lib/taskjuggler/Scoreboard.rb +8 -1
- data/lib/taskjuggler/Shift.rb +1 -1
- data/lib/taskjuggler/ShiftAssignments.rb +22 -20
- data/lib/taskjuggler/Task.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +65 -51
- data/lib/taskjuggler/TaskScenario.rb +486 -419
- data/lib/taskjuggler/TextParser/Scanner.rb +22 -11
- data/lib/taskjuggler/TimeSheets.rb +1 -1
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjTime.rb +7 -3
- data/lib/taskjuggler/TjpSyntaxRules.rb +157 -23
- data/lib/taskjuggler/VimSyntax.rb +18 -0
- data/lib/taskjuggler/WorkingHours.rb +20 -4
- data/lib/taskjuggler/apps/Tj3.rb +16 -1
- data/lib/taskjuggler/reports/GanttLine.rb +1 -1
- data/lib/taskjuggler/reports/ICalReport.rb +136 -0
- data/lib/taskjuggler/reports/NikuReport.rb +1 -1
- data/lib/taskjuggler/reports/Report.rb +59 -0
- data/lib/taskjuggler/reports/ReportBase.rb +2 -67
- data/lib/taskjuggler/reports/TableReport.rb +9 -8
- data/lib/taskjuggler/reports/TagFile.rb +120 -0
- data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
- data/lib/taskjuggler/reports/TjpExportRE.rb +33 -9
- data/manual/Installation +126 -0
- data/spec/ICalendar_spec.rb +45 -0
- data/spec/IntervalList_spec.rb +11 -11
- data/tasks/changelog.rake +150 -60
- data/tasks/gem.rake +1 -0
- data/tasks/vim.rake +2 -2
- data/test/TestSuite/Export-Reports/refs/Booking.tjp +1 -1
- data/test/TestSuite/Export-Reports/refs/CompletedWork.tji.tjp +40 -0
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +10 -1
- data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +1 -1
- data/test/TestSuite/HTML-Reports/Alerts.html +160 -412
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +0 -20
- data/test/TestSuite/HTML-Reports/css/tjreport.css +6 -7
- data/test/TestSuite/HTML-Reports/depArrows.html +851 -0
- data/test/TestSuite/HTML-Reports/profile.html +37581 -0
- data/test/TestSuite/{Scheduler/Correct → HTML-Reports/scripts}/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +3 -3
- data/test/TestSuite/Scheduler/Errors/R.html +113 -0
- data/test/TestSuite/Scheduler/Errors/allocate_no_assigned.tjp +15 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjmanual.css +0 -1
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/css/tjreport.css +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/details.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-green.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-red.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/flag-yellow.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resource.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/resourcegroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/task.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/taskgroup.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-down.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-flat.png +0 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_effort.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/overbooked_length.tjp +13 -0
- data/test/TestSuite/{ReportGenerator/Correct → Scheduler/Errors}/scripts/wz_tooltip.js +0 -0
- data/test/TestSuite/StatusSheets/dev2.tji +22 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji.tjp +38 -0
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +5 -2
- data/test/TestSuite/Syntax/Errors/scenario_after_tracking.tjp +8 -0
- data/test/TestSuite/TimeSheets/resrep.tji +7 -0
- data/test/TestSuite/TimeSheets/ts.tji +351 -0
- data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
- data/test/test_Limits.rb +38 -30
- data/test/test_Scheduler.rb +2 -2
- data/test/test_ShiftAssignments.rb +8 -8
- data/test/test_WorkingHours.rb +4 -4
- metadata +1015 -1005
- data/lib/exchangebug.rb +0 -42
- data/lib/ruby-signal-bug.rb +0 -55
- data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
- data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
- data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
- data/test/TestSuite/HTML-Reports/reference.html +0 -51
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.csv +0 -412
- data/test/TestSuite/ReportGenerator/Correct/Alerts-1.html +0 -680
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.csv +0 -4
- data/test/TestSuite/ReportGenerator/Correct/DependencyList.tjp +0 -25
- data/test/TestSuite/ReportGenerator/Correct/Journal-1.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-2.csv +0 -8
- data/test/TestSuite/ReportGenerator/Correct/Journal-3.html +0 -28
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
- data/test/TestSuite/ReportGenerator/Correct/opennodes-1.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
- data/test/TestSuite/Scheduler/' +0 -23
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -86
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
- data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
- data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
- data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
- data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
- data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
- data/test/TestSuite/TimeSheets/uu.txt +0 -29
|
@@ -0,0 +1,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
|