taskjuggler 0.0.10 → 0.0.11
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 +115 -0
- data/README.rdoc +105 -0
- data/examples/tutorial.tjp +21 -16
- data/gem_spec.rb +1 -1
- data/lib/{Account.rb → taskjuggler/Account.rb} +2 -3
- data/lib/{AccountScenario.rb → taskjuggler/AccountScenario.rb} +1 -1
- data/lib/taskjuggler/AlgorithmDiff.rb +311 -0
- data/lib/{Allocation.rb → taskjuggler/Allocation.rb} +3 -3
- data/lib/{AppConfig.rb → taskjuggler/AppConfig.rb} +0 -1
- data/lib/{AttributeBase.rb → taskjuggler/AttributeBase.rb} +1 -1
- data/lib/{AttributeDefinition.rb → taskjuggler/AttributeDefinition.rb} +0 -0
- data/lib/{Attributes.rb → taskjuggler/Attributes.rb} +19 -9
- data/lib/{BatchProcessor.rb → taskjuggler/BatchProcessor.rb} +0 -0
- data/lib/{Booking.rb → taskjuggler/Booking.rb} +0 -0
- data/lib/{Charge.rb → taskjuggler/Charge.rb} +1 -1
- data/lib/{ChargeSet.rb → taskjuggler/ChargeSet.rb} +1 -1
- data/lib/{DataCache.rb → taskjuggler/DataCache.rb} +0 -0
- data/lib/{FileList.rb → taskjuggler/FileList.rb} +0 -0
- data/lib/{HTMLDocument.rb → taskjuggler/HTMLDocument.rb} +1 -1
- data/lib/{Interval.rb → taskjuggler/Interval.rb} +1 -1
- data/lib/{IntervalList.rb → taskjuggler/IntervalList.rb} +1 -1
- data/lib/{Journal.rb → taskjuggler/Journal.rb} +2 -2
- data/lib/{KeywordArray.rb → taskjuggler/KeywordArray.rb} +0 -0
- data/lib/{KeywordDocumentation.rb → taskjuggler/KeywordDocumentation.rb} +5 -5
- data/lib/{Limits.rb → taskjuggler/Limits.rb} +1 -1
- data/lib/{Log.rb → taskjuggler/Log.rb} +0 -0
- data/lib/{LogFile.rb → taskjuggler/LogFile.rb} +0 -0
- data/lib/{LogicalExpression.rb → taskjuggler/LogicalExpression.rb} +3 -3
- data/lib/{LogicalFunction.rb → taskjuggler/LogicalFunction.rb} +1 -1
- data/lib/{LogicalOperation.rb → taskjuggler/LogicalOperation.rb} +1 -1
- data/lib/{MessageHandler.rb → taskjuggler/MessageHandler.rb} +3 -1
- data/lib/{Project.rb → taskjuggler/Project.rb} +51 -48
- data/lib/{ProjectFileParser.rb → taskjuggler/ProjectFileParser.rb} +25 -9
- data/lib/{ProjectFileScanner.rb → taskjuggler/ProjectFileScanner.rb} +5 -5
- data/lib/{PropertyList.rb → taskjuggler/PropertyList.rb} +0 -0
- data/lib/{PropertySet.rb → taskjuggler/PropertySet.rb} +3 -4
- data/lib/{PropertyTreeNode.rb → taskjuggler/PropertyTreeNode.rb} +157 -11
- data/lib/{Query.rb → taskjuggler/Query.rb} +17 -7
- data/lib/{RealFormat.rb → taskjuggler/RealFormat.rb} +0 -0
- data/lib/{Resource.rb → taskjuggler/Resource.rb} +8 -6
- data/lib/{ResourceScenario.rb → taskjuggler/ResourceScenario.rb} +26 -65
- data/lib/{RichText.rb → taskjuggler/RichText.rb} +3 -3
- data/lib/{RichTextDocument.rb → taskjuggler/RichText/Document.rb} +3 -3
- data/lib/{RichTextElement.rb → taskjuggler/RichText/Element.rb} +10 -4
- data/lib/{RichTextFunctionExample.rb → taskjuggler/RichText/FunctionExample.rb} +3 -3
- data/lib/{RichTextFunctionHandler.rb → taskjuggler/RichText/FunctionHandler.rb} +0 -0
- data/lib/{RichTextParser.rb → taskjuggler/RichText/Parser.rb} +6 -4
- data/lib/{RTFHandlers.rb → taskjuggler/RichText/RTFHandlers.rb} +4 -4
- data/lib/{RTFNavigator.rb → taskjuggler/RichText/RTFNavigator.rb} +3 -3
- data/lib/{RTFQuery.rb → taskjuggler/RichText/RTFQuery.rb} +62 -39
- data/lib/{RTFReport.rb → taskjuggler/RichText/RTFReport.rb} +2 -2
- data/lib/{RTFReportLink.rb → taskjuggler/RichText/RTFReportLink.rb} +4 -4
- data/lib/{RTFWithQuerySupport.rb → taskjuggler/RichText/RTFWithQuerySupport.rb} +1 -1
- data/lib/{RichTextScanner.rb → taskjuggler/RichText/Scanner.rb} +18 -5
- data/lib/{RichTextSnip.rb → taskjuggler/RichText/Snip.rb} +2 -2
- data/lib/{RichTextSyntaxRules.rb → taskjuggler/RichText/SyntaxRules.rb} +14 -0
- data/lib/{TOCEntry.rb → taskjuggler/RichText/TOCEntry.rb} +2 -2
- data/lib/{TableOfContents.rb → taskjuggler/RichText/TableOfContents.rb} +2 -2
- data/lib/{RuntimeConfig.rb → taskjuggler/RuntimeConfig.rb} +18 -18
- data/lib/{Scenario.rb → taskjuggler/Scenario.rb} +1 -1
- data/lib/{ScenarioData.rb → taskjuggler/ScenarioData.rb} +2 -3
- data/lib/{Scoreboard.rb → taskjuggler/Scoreboard.rb} +4 -4
- data/lib/{SheetHandlerBase.rb → taskjuggler/SheetHandlerBase.rb} +3 -3
- data/lib/{SheetReceiver.rb → taskjuggler/SheetReceiver.rb} +2 -2
- data/lib/{SheetSender.rb → taskjuggler/SheetSender.rb} +5 -5
- data/lib/{Shift.rb → taskjuggler/Shift.rb} +2 -3
- data/lib/{ShiftAssignments.rb → taskjuggler/ShiftAssignments.rb} +1 -1
- data/lib/{ShiftScenario.rb → taskjuggler/ShiftScenario.rb} +1 -1
- data/lib/{SimpleQueryExpander.rb → taskjuggler/SimpleQueryExpander.rb} +0 -0
- data/lib/{StatusSheetReceiver.rb → taskjuggler/StatusSheetReceiver.rb} +1 -1
- data/lib/{StatusSheetSender.rb → taskjuggler/StatusSheetSender.rb} +1 -1
- data/lib/{SyntaxReference.rb → taskjuggler/SyntaxReference.rb} +4 -4
- data/lib/{TableColumnDefinition.rb → taskjuggler/TableColumnDefinition.rb} +0 -0
- data/lib/{Task.rb → taskjuggler/Task.rb} +2 -2
- data/lib/{TaskDependency.rb → taskjuggler/TaskDependency.rb} +8 -0
- data/lib/{TaskJuggler.rb → taskjuggler/TaskJuggler.rb} +6 -4
- data/lib/{TaskScenario.rb → taskjuggler/TaskScenario.rb} +211 -150
- data/lib/taskjuggler/TernarySearchTree.rb +203 -0
- data/lib/{TextFormatter.rb → taskjuggler/TextFormatter.rb} +1 -1
- data/lib/{TextParser.rb → taskjuggler/TextParser.rb} +6 -6
- data/lib/{MacroTable.rb → taskjuggler/TextParser/MacroTable.rb} +2 -12
- data/lib/{TextParser → taskjuggler/TextParser}/Pattern.rb +5 -2
- data/lib/{TextParser → taskjuggler/TextParser}/Rule.rb +1 -1
- data/lib/{TextScanner.rb → taskjuggler/TextParser/Scanner.rb} +34 -32
- data/lib/{SourceFileInfo.rb → taskjuggler/TextParser/SourceFileInfo.rb} +1 -1
- data/lib/{TextParser → taskjuggler/TextParser}/StackElement.rb +0 -2
- data/lib/{TextParser → taskjuggler/TextParser}/State.rb +0 -0
- data/lib/{TextParser → taskjuggler/TextParser}/TokenDoc.rb +0 -0
- data/lib/{TimeSheetReceiver.rb → taskjuggler/TimeSheetReceiver.rb} +1 -1
- data/lib/{TimeSheetSender.rb → taskjuggler/TimeSheetSender.rb} +1 -1
- data/lib/{TimeSheetSummary.rb → taskjuggler/TimeSheetSummary.rb} +1 -1
- data/lib/{TimeSheets.rb → taskjuggler/TimeSheets.rb} +23 -16
- data/lib/{Tj3AppBase.rb → taskjuggler/Tj3AppBase.rb} +19 -12
- data/lib/{Tj3Config.rb → taskjuggler/Tj3Config.rb} +3 -3
- data/lib/taskjuggler/Tj3Man.rb +78 -0
- data/lib/{Tj3SheetAppBase.rb → taskjuggler/Tj3SheetAppBase.rb} +2 -2
- data/lib/{TjException.rb → taskjuggler/TjException.rb} +0 -0
- data/lib/{TjTime.rb → taskjuggler/TjTime.rb} +279 -234
- data/lib/{TjpExample.rb → taskjuggler/TjpExample.rb} +0 -0
- data/lib/{TjpSyntaxRules.rb → taskjuggler/TjpSyntaxRules.rb} +253 -95
- data/lib/{URLParameter.rb → taskjuggler/URLParameter.rb} +0 -0
- data/lib/{UTF8String.rb → taskjuggler/UTF8String.rb} +0 -0
- data/lib/{UserManual.rb → taskjuggler/UserManual.rb} +6 -6
- data/lib/{VimSyntax.rb → taskjuggler/VimSyntax.rb} +6 -2
- data/lib/{WorkingHours.rb → taskjuggler/WorkingHours.rb} +14 -22
- data/lib/{XMLDocument.rb → taskjuggler/XMLDocument.rb} +1 -1
- data/lib/{XMLElement.rb → taskjuggler/XMLElement.rb} +1 -1
- data/lib/taskjuggler/apps/Tj3.rb +134 -0
- data/lib/taskjuggler/apps/Tj3Client.rb +467 -0
- data/lib/taskjuggler/apps/Tj3Daemon.rb +142 -0
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +56 -0
- data/lib/taskjuggler/apps/Tj3SsSender.rb +90 -0
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +59 -0
- data/lib/taskjuggler/apps/Tj3TsSender.rb +77 -0
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +86 -0
- data/lib/{daemon → taskjuggler/daemon}/Daemon.rb +4 -3
- data/lib/{daemon → taskjuggler/daemon}/ProcessIntercom.rb +2 -2
- data/lib/{daemon → taskjuggler/daemon}/ProjectBroker.rb +5 -5
- data/lib/{daemon → taskjuggler/daemon}/ProjectServer.rb +16 -16
- data/lib/{daemon → taskjuggler/daemon}/ReportServer.rb +6 -6
- data/lib/{daemon → taskjuggler/daemon}/ReportServlet.rb +2 -2
- data/lib/{daemon → taskjuggler/daemon}/WebServer.rb +4 -4
- data/lib/{daemon → taskjuggler/daemon}/WelcomePage.rb +2 -1
- data/lib/{deep_copy.rb → taskjuggler/deep_copy.rb} +0 -0
- data/lib/{reports → taskjuggler/reports}/CSVFile.rb +2 -2
- data/lib/{reports → taskjuggler/reports}/CollisionDetector.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/ColumnTable.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttChart.rb +4 -4
- data/lib/{reports → taskjuggler/reports}/GanttContainer.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttHeader.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttHeaderScaleItem.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/GanttLine.rb +6 -6
- data/lib/{reports → taskjuggler/reports}/GanttLoadStack.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttMilestone.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttRouter.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/GanttTaskBar.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/HTMLGraphics.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/Navigator.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/NikuReport.rb +3 -6
- data/lib/{reports → taskjuggler/reports}/Report.rb +19 -14
- data/lib/{reports → taskjuggler/reports}/ReportBase.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/ReportContext.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/ReportTable.rb +2 -2
- data/lib/{reports → taskjuggler/reports}/ReportTableCell.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/ReportTableColumn.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/ReportTableLegend.rb +0 -0
- data/lib/{reports → taskjuggler/reports}/ReportTableLine.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/ResourceListRE.rb +4 -4
- data/lib/{reports → taskjuggler/reports}/StatusSheetReport.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/TableReport.rb +8 -7
- data/lib/{reports → taskjuggler/reports}/TaskListRE.rb +4 -4
- data/lib/{reports → taskjuggler/reports}/TextReport.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/TimeSheetReport.rb +1 -1
- data/lib/{reports → taskjuggler/reports}/TjpExportRE.rb +87 -29
- data/lib/tj3.rb +2 -144
- data/lib/tj3client.rb +2 -442
- data/lib/tj3d.rb +1 -133
- data/lib/tj3man.rb +2 -75
- data/lib/tj3ss_receiver.rb +2 -42
- data/lib/tj3ss_sender.rb +1 -76
- data/lib/tj3ts_receiver.rb +1 -45
- data/lib/tj3ts_sender.rb +1 -63
- data/lib/tj3ts_summary.rb +1 -72
- data/manual/How_To_Contribute +19 -49
- data/manual/Installation +65 -6
- data/manual/Reporting_Bugs +6 -20
- data/manual/TaskJuggler_Internals +8 -1
- data/manual/Tutorial +16 -0
- data/prj_cfg.rb +2 -3
- data/spec/IntervalList_spec.rb +2 -1
- data/spec/ProjectBroker_spec.rb +1 -1
- data/spec/TernarySearchTree_spec.rb +131 -0
- data/spec/TimeSheets_spec.rb +129 -0
- data/spec/Tj3Daemon_spec.rb +51 -0
- data/spec/Tj3_spec.rb +36 -0
- data/spec/support/DaemonControl.rb +78 -0
- data/spec/support/StdIoWrapper.rb +43 -0
- data/spec/tj3client.log +23 -0
- data/tasks/changelog.rake +17 -2
- data/tasks/csts.rake +2 -2
- data/tasks/manual.rake +9 -5
- data/tasks/missing.rake +0 -4
- data/tasks/rdoc.rake +2 -2
- data/tasks/vim.rake +9 -0
- data/test/TestSuite/CSV-Reports/alert.tjp +9 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +1 -0
- data/test/TestSuite/CSV-Reports/inputs.tjp +19 -0
- data/test/TestSuite/CSV-Reports/project-1.tji +9 -0
- data/test/TestSuite/CSV-Reports/refs/alert.csv +15 -0
- data/test/TestSuite/CSV-Reports/refs/celltext.csv +1 -0
- data/test/TestSuite/CSV-Reports/refs/inputs.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/resourcereport.csv +4 -4
- data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +22 -22
- data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +1 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +1 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +1 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +14 -13
- data/test/TestSuite/CSV-Reports/refs/targets.csv +5 -0
- data/test/TestSuite/CSV-Reports/refs/taskreport.csv +15 -14
- data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +33 -32
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +1 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +1 -0
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +1 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +1 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +1 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +2 -1
- data/test/TestSuite/CSV-Reports/targets.tjp +20 -0
- data/test/TestSuite/CSV-Reports/taskreport.tjp +2 -1
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +2 -1
- data/test/TestSuite/CSV-Reports/weekly.tjp +5 -2
- data/test/TestSuite/Export-Reports/export.tji +6 -0
- data/test/TestSuite/Export-Reports/refs/Account.tjp +92 -0
- data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +38 -0
- data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +124 -0
- data/test/TestSuite/Export-Reports/refs/Alternative.tjp +50 -0
- data/test/TestSuite/Export-Reports/refs/AutoID.tjp +45 -0
- data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/Booking.tjp +48 -0
- data/test/TestSuite/Export-Reports/refs/Caption.tjp +65 -0
- data/test/TestSuite/Export-Reports/refs/Celltext.tjp +45 -0
- data/test/TestSuite/Export-Reports/refs/Comments.tjp +67 -0
- data/test/TestSuite/Export-Reports/refs/Complete.tjp +50 -0
- data/test/TestSuite/Export-Reports/refs/CriticalPath.tjp +41 -0
- data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +24 -0
- data/test/TestSuite/Export-Reports/refs/DST.tjp +89 -0
- data/test/TestSuite/Export-Reports/refs/Depends1.tjp +57 -0
- data/test/TestSuite/Export-Reports/refs/Durations.tjp +84 -0
- data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +58 -0
- data/test/TestSuite/Export-Reports/refs/Flags.tjp +51 -0
- data/test/TestSuite/Export-Reports/refs/Gap.tjp +38 -0
- data/test/TestSuite/Export-Reports/refs/HtmlTaskReport.tjp +67 -0
- data/test/TestSuite/Export-Reports/refs/Include.tjp +58 -0
- data/test/TestSuite/Export-Reports/refs/Journal.tjp +28 -0
- data/test/TestSuite/Export-Reports/refs/Limits-1.tjp +283 -0
- data/test/TestSuite/Export-Reports/refs/LoadUnits.tjp +617 -0
- data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/LogicalFunction.tjp +57 -0
- data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +91 -0
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/Manager.tjp +121 -0
- data/test/TestSuite/Export-Reports/refs/Mandatory.tjp +59 -0
- data/test/TestSuite/Export-Reports/refs/Milestone.tjp +27 -0
- data/test/TestSuite/Export-Reports/refs/MinMax.tjp +30 -0
- data/test/TestSuite/Export-Reports/refs/Niku.tjp +218 -0
- data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/Period.tjp +25 -0
- data/test/TestSuite/Export-Reports/refs/Persistent.tjp +49 -0
- data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +46 -0
- data/test/TestSuite/Export-Reports/refs/Priority.tjp +141 -0
- data/test/TestSuite/Export-Reports/refs/Project.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +36 -0
- data/test/TestSuite/Export-Reports/refs/Query.tjp +49 -0
- data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +79 -0
- data/test/TestSuite/Export-Reports/refs/Reports.tjp +130 -0
- data/test/TestSuite/Export-Reports/refs/Resource.tjp +59 -0
- data/test/TestSuite/Export-Reports/refs/ResourcePrefix.tjp +67 -0
- data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +90 -0
- data/test/TestSuite/Export-Reports/refs/Responsible.tjp +50 -0
- data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +90 -0
- data/test/TestSuite/Export-Reports/refs/Scenario.tjp +25 -0
- data/test/TestSuite/Export-Reports/refs/Scheduling.tjp +55 -0
- data/test/TestSuite/Export-Reports/refs/Select.tjp +89 -0
- data/test/TestSuite/Export-Reports/refs/Shift.tjp +39 -0
- data/test/TestSuite/Export-Reports/refs/Simple.tjp +67 -0
- data/test/TestSuite/Export-Reports/refs/StatusSheet.tjp +95 -0
- data/test/TestSuite/Export-Reports/refs/String.tjp +33 -0
- data/test/TestSuite/Export-Reports/refs/Supplement.tjp +41 -0
- data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +49 -0
- data/test/TestSuite/Export-Reports/refs/TaskRoot.tjp +75 -0
- data/test/TestSuite/Export-Reports/refs/TimeFrame.tjp +51 -0
- data/test/TestSuite/Export-Reports/refs/TimeSheet1.tjp +81 -0
- data/test/TestSuite/Export-Reports/refs/Timezone.tjp +18 -0
- data/test/TestSuite/Export-Reports/refs/Vacation.tjp +69 -0
- data/test/TestSuite/Export-Reports/refs/tutorial.tjp +1061 -0
- data/test/TestSuite/Scheduler/Correct/Container-2.tjp +3 -1
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +5 -3
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +19 -19
- data/test/TestSuite/Scheduler/Correct/PriorityInversion.tjp +32 -0
- data/test/TestSuite/Scheduler/Correct/Scenarios.tjp +19 -0
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +11 -0
- data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +14 -14
- data/test/TestSuite/Scheduler/Correct/checks.tji +5 -0
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +20 -0
- data/test/TestSuite/StatusSheets/boss_mail +1 -1
- data/test/TestSuite/StatusSheets/dev2_mail +1 -1
- data/test/TestSuite/StatusSheets/run +2 -3
- data/test/TestSuite/Syntax/Correct/Account.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/AdoptedTasks.tjp +9 -0
- data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Alternative.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/AutoID.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/Caption.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Comments.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Complete.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +3 -2
- data/test/TestSuite/Syntax/Correct/DST.tjp +11 -0
- data/test/TestSuite/Syntax/Correct/Depends1.tjp +6 -4
- data/test/TestSuite/Syntax/Correct/Durations.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Efficiency.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Export.tjp +6 -4
- data/test/TestSuite/Syntax/Correct/Flags.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Freeze.tjp +2 -2
- data/test/TestSuite/Syntax/Correct/Gap.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Include.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Journal.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Limits-1.tjp +13 -9
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/LogicalFunction.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Macro-3.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/Manager.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Mandatory.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Milestone.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/MinMax.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Niku.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/Numberformat.tjp +3 -2
- data/test/TestSuite/Syntax/Correct/Period.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/Persistent.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Precedes1.tjp +6 -4
- data/test/TestSuite/Syntax/Correct/Priority.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Project.tjp +5 -4
- data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +3 -2
- data/test/TestSuite/Syntax/Correct/Query.tjp +1 -0
- data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Reports.tjp +7 -5
- data/test/TestSuite/Syntax/Correct/Resource.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/ResourceRoot.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/RollupResource.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Scenario.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Scheduling.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Select.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Shift.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Simple.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/StatusSheet.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/String.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Supplement.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +3 -2
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/TimeSheet1.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Vacation.tjp +5 -3
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +23 -16
- data/test/TestSuite/Syntax/Errors/adopt_common_root.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/adopt_duplicate_child.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/adopt_duplicate_parent.tjp +10 -0
- data/test/TestSuite/{Scheduler/Errors/milestone_duration.tjp → Syntax/Errors/multiple_durations.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +6 -4
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +5 -3
- data/test/TestSuite/TimeSheets/dev2_mail1 +1 -1
- data/test/TestSuite/TimeSheets/dev2_mail2 +1 -1
- data/test/TestSuite/TimeSheets/run +2 -2
- data/test/TestSuite/TimeSheets/uu.txt +29 -0
- data/test/test_AlgorithmDiff.rb +139 -0
- data/test/test_BatchProcessor.rb +2 -1
- data/test/test_CSV-Reports.rb +30 -19
- data/test/test_CSVFile.rb +2 -1
- data/test/test_CollisionDetector.rb +2 -1
- data/test/test_Export-Reports.rb +128 -0
- data/test/test_Journal.rb +2 -1
- data/test/test_Limits.rb +4 -3
- data/test/test_LogicalExpression.rb +2 -1
- data/test/test_MacroTable.rb +8 -6
- data/test/test_Project.rb +2 -1
- data/test/test_ProjectFileScanner.rb +4 -3
- data/test/test_PropertySet.rb +2 -1
- data/test/test_Query.rb +3 -2
- data/test/test_RealFormat.rb +2 -1
- data/test/test_ReportGenerator.rb +3 -2
- data/test/test_RichText.rb +14 -3
- data/test/test_Scheduler.rb +2 -1
- data/test/test_ShiftAssignments.rb +3 -1
- data/test/test_SimpleQueryExpander.rb +3 -2
- data/test/test_Syntax.rb +2 -1
- data/test/test_TextFormatter.rb +2 -1
- data/test/test_TjTime.rb +15 -14
- data/test/test_TjpExample.rb +2 -1
- data/test/test_URLParameter.rb +2 -1
- data/test/test_UTF8String.rb +2 -1
- data/test/test_WorkingHours.rb +3 -2
- data/test/test_deep_copy.rb +2 -1
- metadata +250 -541
- data/README +0 -31
- data/benchmarks/allocatedSlots.csv +0 -334
- data/benchmarks/profile.clt +0 -42974
- data/benchmarks/profile.html +0 -61128
- data/doc/AppConfig.html +0 -1471
- data/doc/Arguments.html +0 -720
- data/doc/CHANGELOG.html +0 -1987
- data/doc/COPYING.html +0 -879
- data/doc/Object.html +0 -1056
- data/doc/README.html +0 -565
- data/doc/RuntimeConfig.html +0 -804
- data/doc/String.html +0 -913
- data/doc/TaskJuggler.html +0 -2512
- data/doc/TaskJuggler/Account.html +0 -733
- data/doc/TaskJuggler/AccountAttribute.html +0 -749
- data/doc/TaskJuggler/AccountScenario.html +0 -692
- data/doc/TaskJuggler/Allocation.html +0 -943
- data/doc/TaskJuggler/AllocationAttribute.html +0 -779
- data/doc/TaskJuggler/AttributeBase.html +0 -1308
- data/doc/TaskJuggler/AttributeDefinition.html +0 -795
- data/doc/TaskJuggler/AttributeOverwrite.html +0 -586
- data/doc/TaskJuggler/BatchProcessor.html +0 -1158
- data/doc/TaskJuggler/Booking.html +0 -839
- data/doc/TaskJuggler/BookingListAttribute.html +0 -749
- data/doc/TaskJuggler/BooleanAttribute.html +0 -749
- data/doc/TaskJuggler/CSVFile.html +0 -1108
- data/doc/TaskJuggler/CellSettingPattern.html +0 -680
- data/doc/TaskJuggler/CellSettingPatternList.html +0 -729
- data/doc/TaskJuggler/Charge.html +0 -757
- data/doc/TaskJuggler/ChargeListAttribute.html +0 -713
- data/doc/TaskJuggler/ChargeSet.html +0 -929
- data/doc/TaskJuggler/ChargeSetListAttribute.html +0 -758
- data/doc/TaskJuggler/CollisionDetector.html +0 -1069
- data/doc/TaskJuggler/ColumnListAttribute.html +0 -713
- data/doc/TaskJuggler/ColumnTable.html +0 -743
- data/doc/TaskJuggler/Daemon.html +0 -798
- data/doc/TaskJuggler/DataCache.html +0 -930
- data/doc/TaskJuggler/DataCacheEntry.html +0 -717
- data/doc/TaskJuggler/DateAttribute.html +0 -717
- data/doc/TaskJuggler/DefinitionListAttribute.html +0 -635
- data/doc/TaskJuggler/DependencyListAttribute.html +0 -753
- data/doc/TaskJuggler/DurationAttribute.html +0 -750
- data/doc/TaskJuggler/FileList.html +0 -731
- data/doc/TaskJuggler/FileRecord.html +0 -682
- data/doc/TaskJuggler/FixnumAttribute.html +0 -671
- data/doc/TaskJuggler/FlagListAttribute.html +0 -749
- data/doc/TaskJuggler/FloatAttribute.html +0 -713
- data/doc/TaskJuggler/FormatListAttribute.html +0 -677
- data/doc/TaskJuggler/GanttChart.html +0 -1467
- data/doc/TaskJuggler/GanttContainer.html +0 -925
- data/doc/TaskJuggler/GanttHeader.html +0 -928
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +0 -742
- data/doc/TaskJuggler/GanttLine.html +0 -1305
- data/doc/TaskJuggler/GanttLoadStack.html +0 -808
- data/doc/TaskJuggler/GanttMilestone.html +0 -906
- data/doc/TaskJuggler/GanttRouter.html +0 -1118
- data/doc/TaskJuggler/GanttTaskBar.html +0 -927
- data/doc/TaskJuggler/HTMLDocument.html +0 -761
- data/doc/TaskJuggler/HTMLGraphics.html +0 -817
- data/doc/TaskJuggler/Interval.html +0 -1056
- data/doc/TaskJuggler/IntervalList.html +0 -777
- data/doc/TaskJuggler/IntervalListAttribute.html +0 -753
- data/doc/TaskJuggler/JobInfo.html +0 -923
- data/doc/TaskJuggler/Journal.html +0 -1158
- data/doc/TaskJuggler/JournalEntry.html +0 -821
- data/doc/TaskJuggler/JournalEntryList.html +0 -1071
- data/doc/TaskJuggler/KeywordArray.html +0 -676
- data/doc/TaskJuggler/KeywordDocumentation.html +0 -1838
- data/doc/TaskJuggler/Limits.html +0 -1016
- data/doc/TaskJuggler/Limits/Limit.html +0 -927
- data/doc/TaskJuggler/LimitsAttribute.html +0 -714
- data/doc/TaskJuggler/ListAttributeBase.html +0 -683
- data/doc/TaskJuggler/Log.html +0 -1143
- data/doc/TaskJuggler/LogFile.html +0 -960
- data/doc/TaskJuggler/LogicalAttribute.html +0 -740
- data/doc/TaskJuggler/LogicalExpression.html +0 -781
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +0 -671
- data/doc/TaskJuggler/LogicalExpressionListAttribute.html +0 -671
- data/doc/TaskJuggler/LogicalFlag.html +0 -723
- data/doc/TaskJuggler/LogicalFunction.html +0 -1306
- data/doc/TaskJuggler/LogicalOperation.html +0 -1124
- data/doc/TaskJuggler/Macro.html +0 -688
- data/doc/TaskJuggler/MacroTable.html +0 -852
- data/doc/TaskJuggler/ManagerResponsibilities.html +0 -716
- data/doc/TaskJuggler/ManagerStatusRecord.html +0 -720
- data/doc/TaskJuggler/Message.html +0 -817
- data/doc/TaskJuggler/MessageHandler.html +0 -1036
- data/doc/TaskJuggler/Navigator.html +0 -922
- data/doc/TaskJuggler/NavigatorElement.html +0 -974
- data/doc/TaskJuggler/NikuProject.html +0 -704
- data/doc/TaskJuggler/NikuReport.html +0 -1449
- data/doc/TaskJuggler/NikuResource.html +0 -674
- data/doc/TaskJuggler/NodeListAttribute.html +0 -635
- data/doc/TaskJuggler/PlaceHolderCell.html +0 -728
- data/doc/TaskJuggler/ProcessIntercom.html +0 -997
- data/doc/TaskJuggler/ProcessIntercomIface.html +0 -753
- data/doc/TaskJuggler/Project.html +0 -3333
- data/doc/TaskJuggler/ProjectBroker.html +0 -1656
- data/doc/TaskJuggler/ProjectBrokerIface.html +0 -831
- data/doc/TaskJuggler/ProjectFileParser.html +0 -2033
- data/doc/TaskJuggler/ProjectFileScanner.html +0 -1816
- data/doc/TaskJuggler/ProjectRecord.html +0 -958
- data/doc/TaskJuggler/ProjectServer.html +0 -1229
- data/doc/TaskJuggler/ProjectServerIface.html +0 -848
- data/doc/TaskJuggler/PropertyAttribute.html +0 -671
- data/doc/TaskJuggler/PropertyList.html +0 -1379
- data/doc/TaskJuggler/PropertySet.html +0 -1799
- data/doc/TaskJuggler/PropertyTreeNode.html +0 -2579
- data/doc/TaskJuggler/Query.html +0 -1663
- data/doc/TaskJuggler/RTFHandlers.html +0 -644
- data/doc/TaskJuggler/RTFNavigator.html +0 -772
- data/doc/TaskJuggler/RTFQuery.html +0 -1040
- data/doc/TaskJuggler/RTFReport.html +0 -800
- data/doc/TaskJuggler/RTFReportLink.html +0 -792
- data/doc/TaskJuggler/RTFWithQuerySupport.html +0 -682
- data/doc/TaskJuggler/RealFormat.html +0 -785
- data/doc/TaskJuggler/RealFormatAttribute.html +0 -635
- data/doc/TaskJuggler/ReferenceAttribute.html +0 -824
- data/doc/TaskJuggler/Report.html +0 -1477
- data/doc/TaskJuggler/ReportBase.html +0 -1246
- data/doc/TaskJuggler/ReportContext.html +0 -816
- data/doc/TaskJuggler/ReportServer.html +0 -1048
- data/doc/TaskJuggler/ReportServerIface.html +0 -882
- data/doc/TaskJuggler/ReportServerRecord.html +0 -761
- data/doc/TaskJuggler/ReportServlet.html +0 -1024
- data/doc/TaskJuggler/ReportTable.html +0 -1159
- data/doc/TaskJuggler/ReportTableCell.html +0 -1646
- data/doc/TaskJuggler/ReportTableColumn.html +0 -870
- data/doc/TaskJuggler/ReportTableLegend.html +0 -1040
- data/doc/TaskJuggler/ReportTableLine.html +0 -1047
- data/doc/TaskJuggler/Resource.html +0 -972
- data/doc/TaskJuggler/ResourceListAttribute.html +0 -810
- data/doc/TaskJuggler/ResourceListRE.html +0 -717
- data/doc/TaskJuggler/ResourceScenario.html +0 -2599
- data/doc/TaskJuggler/RichText.html +0 -859
- data/doc/TaskJuggler/RichTextAttribute.html +0 -785
- data/doc/TaskJuggler/RichTextDocument.html +0 -1018
- data/doc/TaskJuggler/RichTextElement.html +0 -1754
- data/doc/TaskJuggler/RichTextFunctionExample.html +0 -779
- data/doc/TaskJuggler/RichTextFunctionHandler.html +0 -730
- data/doc/TaskJuggler/RichTextImage.html +0 -692
- data/doc/TaskJuggler/RichTextIntermediate.html +0 -1265
- data/doc/TaskJuggler/RichTextParser.html +0 -847
- data/doc/TaskJuggler/RichTextScanner.html +0 -1469
- data/doc/TaskJuggler/RichTextSnip.html +0 -980
- data/doc/TaskJuggler/RichTextSyntaxRules.html +0 -2018
- data/doc/TaskJuggler/Scenario.html +0 -636
- data/doc/TaskJuggler/ScenarioData.html +0 -818
- data/doc/TaskJuggler/ScenarioListAttribute.html +0 -713
- data/doc/TaskJuggler/Scoreboard.html +0 -1181
- data/doc/TaskJuggler/SheetHandlerBase.html +0 -1275
- data/doc/TaskJuggler/SheetReceiver.html +0 -1368
- data/doc/TaskJuggler/SheetSender.html +0 -1134
- data/doc/TaskJuggler/Shift.html +0 -731
- data/doc/TaskJuggler/ShiftAssignment.html +0 -988
- data/doc/TaskJuggler/ShiftAssignments.html +0 -1393
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +0 -714
- data/doc/TaskJuggler/ShiftScenario.html +0 -762
- data/doc/TaskJuggler/SimpleQueryExpander.html +0 -713
- data/doc/TaskJuggler/SortListAttribute.html +0 -671
- data/doc/TaskJuggler/SourceFileInfo.html +0 -740
- data/doc/TaskJuggler/StatusSheetReceiver.html +0 -658
- data/doc/TaskJuggler/StatusSheetReport.html +0 -910
- data/doc/TaskJuggler/StatusSheetSender.html +0 -788
- data/doc/TaskJuggler/StringAttribute.html +0 -713
- data/doc/TaskJuggler/SymbolAttribute.html +0 -671
- data/doc/TaskJuggler/SyntaxReference.html +0 -1220
- data/doc/TaskJuggler/TOCEntry.html +0 -816
- data/doc/TaskJuggler/TSResourceRecord.html +0 -712
- data/doc/TaskJuggler/TSTaskRecord.html +0 -724
- data/doc/TaskJuggler/TableColumnDefinition.html +0 -928
- data/doc/TaskJuggler/TableOfContents.html +0 -770
- data/doc/TaskJuggler/TableReport.html +0 -2533
- data/doc/TaskJuggler/Task.html +0 -865
- data/doc/TaskJuggler/TaskDependency.html +0 -772
- data/doc/TaskJuggler/TaskListAttribute.html +0 -753
- data/doc/TaskJuggler/TaskListRE.html +0 -716
- data/doc/TaskJuggler/TaskScenario.html +0 -4959
- data/doc/TaskJuggler/TextFormatter.html +0 -953
- data/doc/TaskJuggler/TextParser.html +0 -1773
- data/doc/TaskJuggler/TextParser/Pattern.html +0 -1717
- data/doc/TaskJuggler/TextParser/Rule.html +0 -1399
- data/doc/TaskJuggler/TextParser/StackElement.html +0 -922
- data/doc/TaskJuggler/TextParser/State.html +0 -995
- data/doc/TaskJuggler/TextParser/StateTransition.html +0 -788
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +0 -691
- data/doc/TaskJuggler/TextParser/TokenDoc.html +0 -722
- data/doc/TaskJuggler/TextReport.html +0 -901
- data/doc/TaskJuggler/TextScanner.html +0 -1482
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +0 -641
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +0 -707
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +0 -704
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +0 -1036
- data/doc/TaskJuggler/TimeSheet.html +0 -1232
- data/doc/TaskJuggler/TimeSheetReceiver.html +0 -655
- data/doc/TaskJuggler/TimeSheetRecord.html +0 -1395
- data/doc/TaskJuggler/TimeSheetReport.html +0 -991
- data/doc/TaskJuggler/TimeSheetSender.html +0 -680
- data/doc/TaskJuggler/TimeSheetSummary.html +0 -935
- data/doc/TaskJuggler/TimeSheets.html +0 -716
- data/doc/TaskJuggler/Tj3AppBase.html +0 -831
- data/doc/TaskJuggler/Tj3Client.html +0 -1477
- data/doc/TaskJuggler/Tj3Daemon.html +0 -884
- data/doc/TaskJuggler/Tj3SheetAppBase.html +0 -738
- data/doc/TaskJuggler/Tj3SsReceiver.html +0 -724
- data/doc/TaskJuggler/Tj3SsSender.html +0 -757
- data/doc/TaskJuggler/Tj3TsReceiver.html +0 -724
- data/doc/TaskJuggler/Tj3TsSender.html +0 -744
- data/doc/TaskJuggler/Tj3TsSummary.html +0 -752
- data/doc/TaskJuggler/TjException.html +0 -672
- data/doc/TaskJuggler/TjTime.html +0 -2807
- data/doc/TaskJuggler/TjpExample.html +0 -877
- data/doc/TaskJuggler/TjpExportRE.html +0 -1598
- data/doc/TaskJuggler/TjpSyntaxRules.html +0 -13611
- data/doc/TaskJuggler/URLParameter.html +0 -671
- data/doc/TaskJuggler/UserManual.html +0 -1188
- data/doc/TaskJuggler/VimSyntax.html +0 -1044
- data/doc/TaskJuggler/WebServer.html +0 -737
- data/doc/TaskJuggler/WelcomePage.html +0 -769
- data/doc/TaskJuggler/WorkingHours.html +0 -1207
- data/doc/TaskJuggler/WorkingHoursAttribute.html +0 -736
- data/doc/TaskJuggler/XMLBlob.html +0 -687
- data/doc/TaskJuggler/XMLComment.html +0 -682
- data/doc/TaskJuggler/XMLDocument.html +0 -774
- data/doc/TaskJuggler/XMLElement.html +0 -942
- data/doc/TaskJuggler/XMLNamedText.html +0 -643
- data/doc/TaskJuggler/XMLText.html +0 -697
- data/doc/index.html +0 -4127
- data/doc/lib/AccountScenario_rb.html +0 -69
- data/doc/lib/Account_rb.html +0 -71
- data/doc/lib/Allocation_rb.html +0 -71
- data/doc/lib/AppConfig_rb.html +0 -71
- data/doc/lib/AttributeBase_rb.html +0 -69
- data/doc/lib/AttributeDefinition_rb.html +0 -67
- data/doc/lib/Attributes_rb.html +0 -83
- data/doc/lib/BatchProcessor_rb.html +0 -71
- data/doc/lib/Booking_rb.html +0 -67
- data/doc/lib/ChargeSet_rb.html +0 -69
- data/doc/lib/Charge_rb.html +0 -69
- data/doc/lib/DataCache_rb.html +0 -71
- data/doc/lib/FileList_rb.html +0 -67
- data/doc/lib/HTMLDocument_rb.html +0 -69
- data/doc/lib/IntervalList_rb.html +0 -69
- data/doc/lib/Interval_rb.html +0 -69
- data/doc/lib/Journal_rb.html +0 -67
- data/doc/lib/KeywordArray_rb.html +0 -67
- data/doc/lib/KeywordDocumentation_rb.html +0 -77
- data/doc/lib/Limits_rb.html +0 -69
- data/doc/lib/LogFile_rb.html +0 -69
- data/doc/lib/Log_rb.html +0 -71
- data/doc/lib/LogicalExpression_rb.html +0 -73
- data/doc/lib/LogicalFunction_rb.html +0 -69
- data/doc/lib/LogicalOperation_rb.html +0 -69
- data/doc/lib/MacroTable_rb.html +0 -73
- data/doc/lib/MessageHandler_rb.html +0 -67
- data/doc/lib/ProjectFileParser_rb.html +0 -77
- data/doc/lib/ProjectFileScanner_rb.html +0 -69
- data/doc/lib/Project_rb.html +0 -113
- data/doc/lib/PropertyList_rb.html +0 -67
- data/doc/lib/PropertySet_rb.html +0 -71
- data/doc/lib/PropertyTreeNode_rb.html +0 -67
- data/doc/lib/Query_rb.html +0 -69
- data/doc/lib/RTFHandlers_rb.html +0 -75
- data/doc/lib/RTFNavigator_rb.html +0 -73
- data/doc/lib/RTFQuery_rb.html +0 -73
- data/doc/lib/RTFReportLink_rb.html +0 -75
- data/doc/lib/RTFReport_rb.html +0 -71
- data/doc/lib/RTFWithQuerySupport_rb.html +0 -69
- data/doc/lib/RealFormat_rb.html +0 -67
- data/doc/lib/ResourceScenario_rb.html +0 -69
- data/doc/lib/Resource_rb.html +0 -71
- data/doc/lib/RichTextDocument_rb.html +0 -73
- data/doc/lib/RichTextElement_rb.html +0 -75
- data/doc/lib/RichTextFunctionExample_rb.html +0 -73
- data/doc/lib/RichTextFunctionHandler_rb.html +0 -67
- data/doc/lib/RichTextParser_rb.html +0 -73
- data/doc/lib/RichTextScanner_rb.html +0 -71
- data/doc/lib/RichTextSnip_rb.html +0 -71
- data/doc/lib/RichTextSyntaxRules_rb.html +0 -67
- data/doc/lib/RichText_rb.html +0 -73
- data/doc/lib/RuntimeConfig_rb.html +0 -69
- data/doc/lib/ScenarioData_rb.html +0 -71
- data/doc/lib/Scenario_rb.html +0 -69
- data/doc/lib/Scoreboard_rb.html +0 -69
- data/doc/lib/SheetHandlerBase_rb.html +0 -75
- data/doc/lib/SheetReceiver_rb.html +0 -79
- data/doc/lib/SheetSender_rb.html +0 -77
- data/doc/lib/ShiftAssignments_rb.html +0 -71
- data/doc/lib/ShiftScenario_rb.html +0 -69
- data/doc/lib/Shift_rb.html +0 -71
- data/doc/lib/SimpleQueryExpander_rb.html +0 -69
- data/doc/lib/SourceFileInfo_rb.html +0 -67
- data/doc/lib/StatusSheetReceiver_rb.html +0 -69
- data/doc/lib/StatusSheetSender_rb.html +0 -69
- data/doc/lib/SyntaxReference_rb.html +0 -75
- data/doc/lib/TOCEntry_rb.html +0 -71
- data/doc/lib/TableColumnDefinition_rb.html +0 -67
- data/doc/lib/TableOfContents_rb.html +0 -71
- data/doc/lib/TaskDependency_rb.html +0 -67
- data/doc/lib/TaskJuggler_rb.html +0 -75
- data/doc/lib/TaskScenario_rb.html +0 -71
- data/doc/lib/Task_rb.html +0 -71
- data/doc/lib/TextFormatter_rb.html +0 -69
- data/doc/lib/TextParser/Pattern_rb.html +0 -71
- data/doc/lib/TextParser/Rule_rb.html +0 -69
- data/doc/lib/TextParser/StackElement_rb.html +0 -69
- data/doc/lib/TextParser/State_rb.html +0 -67
- data/doc/lib/TextParser/TokenDoc_rb.html +0 -67
- data/doc/lib/TextParser_rb.html +0 -79
- data/doc/lib/TextScanner_rb.html +0 -83
- data/doc/lib/TimeSheetReceiver_rb.html +0 -69
- data/doc/lib/TimeSheetSender_rb.html +0 -69
- data/doc/lib/TimeSheetSummary_rb.html +0 -69
- data/doc/lib/TimeSheets_rb.html +0 -67
- data/doc/lib/Tj3AppBase_rb.html +0 -79
- data/doc/lib/Tj3Config_rb.html +0 -71
- data/doc/lib/Tj3SheetAppBase_rb.html +0 -69
- data/doc/lib/TjException_rb.html +0 -67
- data/doc/lib/TjTime_rb.html +0 -71
- data/doc/lib/TjpExample_rb.html +0 -69
- data/doc/lib/TjpSyntaxRules_rb.html +0 -67
- data/doc/lib/URLParameter_rb.html +0 -69
- data/doc/lib/UTF8String_rb.html +0 -67
- data/doc/lib/UserManual_rb.html +0 -79
- data/doc/lib/VimSyntax_rb.html +0 -69
- data/doc/lib/WorkingHours_rb.html +0 -71
- data/doc/lib/XMLDocument_rb.html +0 -69
- data/doc/lib/XMLElement_rb.html +0 -69
- data/doc/lib/daemon/Daemon_rb.html +0 -69
- data/doc/lib/daemon/ProcessIntercom_rb.html +0 -71
- data/doc/lib/daemon/ProjectBroker_rb.html +0 -83
- data/doc/lib/daemon/ProjectServer_rb.html +0 -85
- data/doc/lib/daemon/ReportServer_rb.html +0 -73
- data/doc/lib/daemon/ReportServlet_rb.html +0 -69
- data/doc/lib/daemon/WebServer_rb.html +0 -81
- data/doc/lib/daemon/WelcomePage_rb.html +0 -71
- data/doc/lib/deep_copy_rb.html +0 -67
- data/doc/lib/exchangebug_rb.html +0 -69
- data/doc/lib/reports/CSVFile_rb.html +0 -69
- data/doc/lib/reports/CollisionDetector_rb.html +0 -69
- data/doc/lib/reports/ColumnTable_rb.html +0 -69
- data/doc/lib/reports/GanttChart_rb.html +0 -75
- data/doc/lib/reports/GanttContainer_rb.html +0 -69
- data/doc/lib/reports/GanttHeaderScaleItem_rb.html +0 -67
- data/doc/lib/reports/GanttHeader_rb.html +0 -69
- data/doc/lib/reports/GanttLine_rb.html +0 -79
- data/doc/lib/reports/GanttLoadStack_rb.html +0 -69
- data/doc/lib/reports/GanttMilestone_rb.html +0 -69
- data/doc/lib/reports/GanttRouter_rb.html +0 -69
- data/doc/lib/reports/GanttTaskBar_rb.html +0 -69
- data/doc/lib/reports/HTMLGraphics_rb.html +0 -67
- data/doc/lib/reports/Navigator_rb.html +0 -69
- data/doc/lib/reports/NikuReport_rb.html +0 -71
- data/doc/lib/reports/ReportBase_rb.html +0 -67
- data/doc/lib/reports/ReportContext_rb.html +0 -67
- data/doc/lib/reports/ReportTableCell_rb.html +0 -67
- data/doc/lib/reports/ReportTableColumn_rb.html +0 -67
- data/doc/lib/reports/ReportTableLegend_rb.html +0 -67
- data/doc/lib/reports/ReportTableLine_rb.html +0 -69
- data/doc/lib/reports/ReportTable_rb.html +0 -71
- data/doc/lib/reports/Report_rb.html +0 -93
- data/doc/lib/reports/ResourceListRE_rb.html +0 -75
- data/doc/lib/reports/StatusSheetReport_rb.html +0 -69
- data/doc/lib/reports/TableReport_rb.html +0 -77
- data/doc/lib/reports/TaskListRE_rb.html +0 -75
- data/doc/lib/reports/TextReport_rb.html +0 -69
- data/doc/lib/reports/TimeSheetReport_rb.html +0 -69
- data/doc/lib/reports/TjpExportRE_rb.html +0 -69
- data/doc/lib/ruby-signal-bug_rb.html +0 -69
- data/doc/lib/test_rb.html +0 -73
- data/doc/lib/tj3_rb.html +0 -75
- data/doc/lib/tj3client_rb.html +0 -75
- data/doc/lib/tj3d_rb.html +0 -75
- data/doc/lib/tj3man_rb.html +0 -75
- data/doc/lib/tj3ss_receiver_rb.html +0 -71
- data/doc/lib/tj3ss_sender_rb.html +0 -71
- data/doc/lib/tj3ts_receiver_rb.html +0 -71
- data/doc/lib/tj3ts_sender_rb.html +0 -71
- data/doc/lib/tj3ts_summary_rb.html +0 -71
- data/doc/rdoc.css +0 -706
- data/lib/test.rb +0 -19
- data/setup.rb +0 -1585
- data/test/TestSuite/CSV-Reports/genrefs +0 -6
- data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -2922
- data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
- data/test/TestSuite/Scheduler/Correct/Container.html +0 -513
- data/test/TestSuite/Scheduler/Correct/Precedes.html +0 -834
- data/test/TestSuite/Scheduler/Correct/Shift.html +0 -429
- data/test/TestSuite/Scheduler/Correct/Shift2.html +0 -476
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
- data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +0 -8
- data/test/TestSuite/Syntax/Correct/ReleasePlan.html +0 -160
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
- data/test/TestSuite/Syntax/Correct/ResourceRoot.html +0 -108
- data/test/TestSuite/Syntax/Correct/niku.html +0 -67
|
File without changes
|
|
File without changes
|
|
@@ -215,7 +215,7 @@ class TaskJuggler
|
|
|
215
215
|
resource = @timeSheet.resource
|
|
216
216
|
project = resource.project
|
|
217
217
|
scenarioIdx = @timeSheet.scenarioIdx
|
|
218
|
-
startIdx = project.dateToIdx(project['now']
|
|
218
|
+
startIdx = project.dateToIdx(project['now'])
|
|
219
219
|
endIdx = project.dateToIdx(@task['end', scenarioIdx])
|
|
220
220
|
@task.getEffectiveWork(scenarioIdx, startIdx, endIdx, resource)
|
|
221
221
|
end
|
|
@@ -284,21 +284,28 @@ class TaskJuggler
|
|
|
284
284
|
totalSlots += record.work
|
|
285
285
|
end
|
|
286
286
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
287
|
+
if @resource['efficiency', @resource.project['trackingScenarioIdx']] > 0.0
|
|
288
|
+
targetSlots = totalNetWorkingSlots
|
|
289
|
+
# This is acceptable rounding error when checking the total reported
|
|
290
|
+
# work.
|
|
291
|
+
delta = 1
|
|
292
|
+
if totalSlots < (targetSlots - delta)
|
|
293
|
+
error('ts_work_too_low',
|
|
294
|
+
"The total work to be reported for this time sheet " +
|
|
295
|
+
"is #{workWithUnit(targetSlots)} but only " +
|
|
296
|
+
"#{workWithUnit(totalSlots)} were reported.")
|
|
297
|
+
end
|
|
298
|
+
if totalSlots > (targetSlots + delta)
|
|
299
|
+
error('ts_work_too_high',
|
|
300
|
+
"The total work to be reported for this time sheet " +
|
|
301
|
+
"is #{workWithUnit(targetSlots)} but " +
|
|
302
|
+
"#{workWithUnit(totalSlots)} were reported.")
|
|
303
|
+
end
|
|
304
|
+
else
|
|
305
|
+
if totalSlots > 0
|
|
306
|
+
error('ts_work_not_null',
|
|
307
|
+
"The reported work for non-working resources must be 0.")
|
|
308
|
+
end
|
|
302
309
|
end
|
|
303
310
|
end
|
|
304
311
|
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
require 'rubygems'
|
|
15
15
|
require 'optparse'
|
|
16
|
-
require 'Tj3Config'
|
|
17
|
-
require 'RuntimeConfig'
|
|
18
|
-
require 'TjTime'
|
|
19
|
-
require 'TextFormatter'
|
|
16
|
+
require 'taskjuggler/Tj3Config'
|
|
17
|
+
require 'taskjuggler/RuntimeConfig'
|
|
18
|
+
require 'taskjuggler/TjTime'
|
|
19
|
+
require 'taskjuggler/TextFormatter'
|
|
20
20
|
|
|
21
21
|
class TaskJuggler
|
|
22
22
|
|
|
@@ -64,33 +64,31 @@ class TaskJuggler
|
|
|
64
64
|
|
|
65
65
|
@opts.on_tail('-h', '--help', format('Show this message')) do
|
|
66
66
|
puts @opts.to_s
|
|
67
|
-
|
|
67
|
+
quit
|
|
68
68
|
end
|
|
69
69
|
@opts.on_tail('--version', format('Show version info')) do
|
|
70
70
|
puts "#{AppConfig.softwareName} v#{AppConfig.version} - " +
|
|
71
71
|
"#{AppConfig.packageInfo}"
|
|
72
|
-
|
|
72
|
+
quit
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
begin
|
|
76
76
|
files = @opts.parse(argv)
|
|
77
77
|
rescue OptionParser::ParseError => msg
|
|
78
78
|
puts @opts.to_s + "\n"
|
|
79
|
-
|
|
80
|
-
exit 2
|
|
79
|
+
error(msg, 2)
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
files
|
|
84
83
|
end
|
|
85
84
|
|
|
86
|
-
def main
|
|
85
|
+
def main(argv = ARGV)
|
|
87
86
|
# Install signal handler to exit gracefully on CTRL-C.
|
|
88
87
|
intHandler = Kernel.trap('INT') do
|
|
89
|
-
|
|
90
|
-
exit 1
|
|
88
|
+
error("\nAborting on user request!")
|
|
91
89
|
end
|
|
92
90
|
|
|
93
|
-
args = processArguments(
|
|
91
|
+
args = processArguments(argv)
|
|
94
92
|
|
|
95
93
|
# If DEBUG mode has been enabled, we restore the INT trap handler again
|
|
96
94
|
# to get Ruby backtrackes.
|
|
@@ -111,6 +109,15 @@ class TaskJuggler
|
|
|
111
109
|
|
|
112
110
|
private
|
|
113
111
|
|
|
112
|
+
def quit
|
|
113
|
+
exit 0
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def error(message, exitVal = 1)
|
|
117
|
+
$stderr.puts "ERROR: #{message}"
|
|
118
|
+
exit exitVal
|
|
119
|
+
end
|
|
120
|
+
|
|
114
121
|
def format(str, indent = nil)
|
|
115
122
|
indent = @optsSummaryWidth + @optsSummaryIndent + 1 unless indent
|
|
116
123
|
TextFormatter.new(79, indent).format(str)[indent..-1]
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require 'UTF8String'
|
|
15
|
-
require 'AppConfig'
|
|
14
|
+
require 'taskjuggler/UTF8String'
|
|
15
|
+
require 'taskjuggler/AppConfig'
|
|
16
16
|
|
|
17
|
-
AppConfig.version = '0.0.
|
|
17
|
+
AppConfig.version = '0.0.11'
|
|
18
18
|
AppConfig.packageName = 'taskjuggler'
|
|
19
19
|
AppConfig.softwareName = 'TaskJuggler III'
|
|
20
20
|
AppConfig.packageInfo = 'A Project Management Software'
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = Tj3Man.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/Tj3AppBase'
|
|
15
|
+
require 'taskjuggler/TernarySearchTree'
|
|
16
|
+
require 'taskjuggler/SyntaxReference'
|
|
17
|
+
require 'taskjuggler/UserManual'
|
|
18
|
+
|
|
19
|
+
AppConfig.appName = 'tj3man'
|
|
20
|
+
|
|
21
|
+
class TaskJuggler
|
|
22
|
+
|
|
23
|
+
class Tj3Man < Tj3AppBase
|
|
24
|
+
|
|
25
|
+
def initialize
|
|
26
|
+
super
|
|
27
|
+
|
|
28
|
+
@man = SyntaxReference.new
|
|
29
|
+
@keywords = TernarySearchTree.new(@man.all)
|
|
30
|
+
@manual = false
|
|
31
|
+
@directory = nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def processArguments(argv)
|
|
35
|
+
super do
|
|
36
|
+
@opts.banner += <<'EOT'
|
|
37
|
+
This program can be used to generate the user manual in HTML format or to get
|
|
38
|
+
a textual help for individual keywords.
|
|
39
|
+
EOT
|
|
40
|
+
@opts.on('-d', '--dir <directory>', String,
|
|
41
|
+
format('directory to put the manual')) do |dir|
|
|
42
|
+
@directory = dir
|
|
43
|
+
end
|
|
44
|
+
@opts.on('-m', '--manual',
|
|
45
|
+
format('Generate the user manual into the current directory ' +
|
|
46
|
+
'or the directory specified with the -d option.')) do
|
|
47
|
+
@manual = true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def main(argv = ARGV)
|
|
53
|
+
requestedKeywords = super
|
|
54
|
+
if @manual
|
|
55
|
+
UserManual.new.generate(@directory)
|
|
56
|
+
elsif requestedKeywords.empty?
|
|
57
|
+
puts @man.all.join("\n")
|
|
58
|
+
else
|
|
59
|
+
requestedKeywords.each do |keyword|
|
|
60
|
+
if (kws = @keywords[keyword, true]).nil?
|
|
61
|
+
$stderr.puts "No matches found for '#{keyword}'"
|
|
62
|
+
exit 1
|
|
63
|
+
elsif kws.length == 1 || kws.include?(keyword)
|
|
64
|
+
puts @man.to_s(keyword)
|
|
65
|
+
else
|
|
66
|
+
$stderr.puts "Multiple matches found for '#{keyword}':\n" +
|
|
67
|
+
"#{kws.join(', ')}"
|
|
68
|
+
return 1
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
0
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require 'Tj3AppBase'
|
|
14
|
+
require 'taskjuggler/Tj3AppBase'
|
|
15
15
|
|
|
16
16
|
class TaskJuggler
|
|
17
17
|
|
|
@@ -48,7 +48,7 @@ class TaskJuggler
|
|
|
48
48
|
if ymdFilter.match(arg)
|
|
49
49
|
@date = Time.mktime(*(ymdFilter.match(arg)[1..3]))
|
|
50
50
|
else
|
|
51
|
-
@date = TjTime.
|
|
51
|
+
@date = TjTime.new.nextDayOfWeek(arg.to_i % 7)
|
|
52
52
|
end
|
|
53
53
|
@date = @date.strftime('%Y-%m-%d')
|
|
54
54
|
end
|
|
File without changes
|
|
@@ -16,155 +16,51 @@ require 'date'
|
|
|
16
16
|
|
|
17
17
|
class TaskJuggler
|
|
18
18
|
|
|
19
|
-
# The TjTime class
|
|
20
|
-
#
|
|
19
|
+
# The TjTime class extends the original Ruby class Time with lots of
|
|
20
|
+
# TaskJuggler specific additional functionality. This is mostly for handling
|
|
21
|
+
# time zones.
|
|
21
22
|
class TjTime
|
|
22
23
|
|
|
23
|
-
attr_reader :time
|
|
24
|
+
attr_reader :time, :timeZone
|
|
24
25
|
|
|
25
26
|
# The number of days per month. Leap years are taken care of separately.
|
|
26
27
|
MON_MAX = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
|
|
27
28
|
|
|
29
|
+
# The current time zone name.
|
|
30
|
+
@@tz = 'UTC'
|
|
31
|
+
ENV['TZ'] = @@tz
|
|
32
|
+
|
|
28
33
|
# call-seq:
|
|
29
|
-
# TjTime(
|
|
30
|
-
# TjTime(
|
|
31
|
-
# TjTime(
|
|
34
|
+
# TjTime() -> TjTime (now)
|
|
35
|
+
# TjTime(tjtime) -> TjTime
|
|
36
|
+
# TjTime(time, timezone) -> TjTime
|
|
37
|
+
# TjTime(str) -> TjTime
|
|
38
|
+
# TjTime(secs) -> TjTime
|
|
32
39
|
#
|
|
33
|
-
# The constructor is overloaded and accepts
|
|
34
|
-
# a Time object
|
|
35
|
-
#
|
|
36
|
-
def initialize(t)
|
|
37
|
-
|
|
40
|
+
# The constructor is overloaded and accepts 4 kinds of arguments. If _t_
|
|
41
|
+
# is a Time object it's assumed to be in local time. If it's a string, it
|
|
42
|
+
# is parsed as a date. Or else it is interpreted as seconds after Epoch.
|
|
43
|
+
def initialize(t = nil)
|
|
44
|
+
@timeZone = @@tz
|
|
45
|
+
|
|
46
|
+
case t
|
|
47
|
+
when nil
|
|
48
|
+
@time = Time.now
|
|
49
|
+
when Time
|
|
38
50
|
@time = t
|
|
39
|
-
|
|
40
|
-
|
|
51
|
+
@timeZone = nil
|
|
52
|
+
when TjTime
|
|
53
|
+
@time = t.time
|
|
54
|
+
@timeZone = nil
|
|
55
|
+
when String
|
|
56
|
+
parse(t)
|
|
57
|
+
when Array
|
|
58
|
+
@time = Time.mktime(*t)
|
|
41
59
|
else
|
|
42
60
|
@time = Time.at(t)
|
|
43
61
|
end
|
|
44
62
|
end
|
|
45
63
|
|
|
46
|
-
# Returns the current UTC time as Time object.
|
|
47
|
-
def TjTime.now
|
|
48
|
-
TjTime.new(Time.now.gmtime)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Creates a time based on given values, interpreted as UTC. See Time.gm()
|
|
52
|
-
# for details.
|
|
53
|
-
def TjTime.gm(*args)
|
|
54
|
-
TjTime.new(Time.gm(*args))
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Creates a time based on given values, interpreted as local time. The
|
|
58
|
-
# result is stored as UTC time, though. See Time.local() for details.
|
|
59
|
-
def TjTime.local(*args)
|
|
60
|
-
TjTime.new(Time.local(*args).gmtime)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def TjTime.parse(t)
|
|
64
|
-
year, month, day, time, zone = t.split('-', 5)
|
|
65
|
-
|
|
66
|
-
# Check the year
|
|
67
|
-
if year
|
|
68
|
-
year = year.to_i
|
|
69
|
-
if year < 1970 || year > 2035
|
|
70
|
-
raise TjException.new, "Year #{year} out of range (1970 - 2035)"
|
|
71
|
-
end
|
|
72
|
-
else
|
|
73
|
-
raise TjException.new, "Year not specified"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Check the month
|
|
77
|
-
if month
|
|
78
|
-
month = month.to_i
|
|
79
|
-
if month < 1 || month > 12
|
|
80
|
-
raise TjException.new, "Month #{month} out of range (1 - 12)"
|
|
81
|
-
end
|
|
82
|
-
else
|
|
83
|
-
raise TjException.new, "Month not specified"
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Check the day
|
|
87
|
-
if day
|
|
88
|
-
day = day.to_i
|
|
89
|
-
maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
|
|
90
|
-
30, 31, 31, 30, 31, 30, 31 ]
|
|
91
|
-
if month < 1 || month > maxDay[month]
|
|
92
|
-
raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
|
|
93
|
-
end
|
|
94
|
-
else
|
|
95
|
-
raise TjException.new, "Day not specified"
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# The time is optional. Will be expanded to 00:00:00.
|
|
99
|
-
if time
|
|
100
|
-
hour, minute, second = time.split(':')
|
|
101
|
-
|
|
102
|
-
# Check hour
|
|
103
|
-
if hour
|
|
104
|
-
hour = hour.to_i
|
|
105
|
-
if hour < 0 || hour > 23
|
|
106
|
-
raise TjException.new, "Hour #{hour} out of range (0 - 23)"
|
|
107
|
-
end
|
|
108
|
-
else
|
|
109
|
-
raise TjException.new, "Hour not specified"
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
if minute
|
|
113
|
-
minute = minute.to_i
|
|
114
|
-
if minute < 0 || minute > 59
|
|
115
|
-
raise TjException.new, "Minute #{minute} out of range (0 - 59)"
|
|
116
|
-
end
|
|
117
|
-
else
|
|
118
|
-
raise TjException.new, "Minute not specified"
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Check sencond. This value is optional and defaults to 0.
|
|
122
|
-
if second
|
|
123
|
-
second = second.to_i
|
|
124
|
-
if second < 0 || second > 59
|
|
125
|
-
raise TjException.new, "Second #{second} out of range (0 - 59)"
|
|
126
|
-
end
|
|
127
|
-
else
|
|
128
|
-
second = 0
|
|
129
|
-
end
|
|
130
|
-
else
|
|
131
|
-
hour = minute = second = 0
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
# The zone is optional and defaults to the current time zone.
|
|
135
|
-
if zone
|
|
136
|
-
if zone[0] != ?- && zone[0] != ?+
|
|
137
|
-
raise TjException.new, "Time zone adjustment must be prefixed by " +
|
|
138
|
-
"+ or -, not #{zone[0]}"
|
|
139
|
-
end
|
|
140
|
-
if zone.length != 5
|
|
141
|
-
raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
date = Time.utc(year, month, day, hour, minute, second)
|
|
145
|
-
sign = zone[0] == ?- ? 1 : -1
|
|
146
|
-
tzHour = zone[1..2].to_i
|
|
147
|
-
if tzHour < 0 || tzHour > 12
|
|
148
|
-
raise TjException.new, "Time zone adjustment hour out of range " +
|
|
149
|
-
"(0 - 12) but is #{tzHour}"
|
|
150
|
-
end
|
|
151
|
-
tzMinute = zone[3..4].to_i
|
|
152
|
-
if tzMinute < 0 || tzMinute > 59
|
|
153
|
-
raise TjException.new, "Time zone adjustment minute out of range " +
|
|
154
|
-
"(0 - 59) but is #{tzMinute}"
|
|
155
|
-
end
|
|
156
|
-
date += sign * (tzHour * 3600 + tzMinute * 60)
|
|
157
|
-
else
|
|
158
|
-
date = Time.mktime(year, month, day, hour, minute, second)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
#puts "--> #{t}"
|
|
162
|
-
#puts(">>> #{year}-#{month}-#{day}-#{hour}:#{minute}:#{second}" +
|
|
163
|
-
# "#{zone ? "-#{tzHour}:#{tzMinute}" : ""}")
|
|
164
|
-
#puts "=== #{date}"
|
|
165
|
-
TjTime.new(date)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
64
|
# Check if +zone+ is a valid time zone.
|
|
169
65
|
def TjTime.checkTimeZone(zone)
|
|
170
66
|
return true if zone == 'UTC'
|
|
@@ -193,21 +89,41 @@ class TaskJuggler
|
|
|
193
89
|
res
|
|
194
90
|
end
|
|
195
91
|
|
|
92
|
+
# Set a new active time zone. _zone_ must be a valid String known to the
|
|
93
|
+
# underlying operating system.
|
|
94
|
+
def TjTime.setTimeZone(zone)
|
|
95
|
+
unless zone && TjTime.checkTimeZone(zone)
|
|
96
|
+
raise "Illegal time zone #{zone}"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
oldTimeZone = @@tz
|
|
100
|
+
|
|
101
|
+
@@tz = zone
|
|
102
|
+
ENV['TZ'] = zone
|
|
103
|
+
|
|
104
|
+
oldTimeZone
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Return the name of the currently active time zone.
|
|
108
|
+
def TjTime.timeZone
|
|
109
|
+
@@tz
|
|
110
|
+
end
|
|
111
|
+
|
|
196
112
|
# Align the date to a time grid. The grid distance is determined by _clock_.
|
|
197
113
|
def align(clock)
|
|
198
|
-
TjTime.new((
|
|
114
|
+
TjTime.new((localtime.to_i / clock) * clock)
|
|
199
115
|
end
|
|
200
116
|
|
|
201
117
|
# Returns the total number of seconds of the day. The time is assumed to be
|
|
202
118
|
# in the time zone specified by _tz_.
|
|
203
119
|
def secondsOfDay(tz = nil)
|
|
204
|
-
|
|
205
|
-
(
|
|
120
|
+
lt = localtime
|
|
121
|
+
(lt.to_i + lt.gmt_offset) % (60 * 60 * 24)
|
|
206
122
|
end
|
|
207
123
|
|
|
208
124
|
# Add _secs_ number of seconds to the time.
|
|
209
125
|
def +(secs)
|
|
210
|
-
TjTime.new(@time + secs)
|
|
126
|
+
TjTime.new(@time.to_i + secs)
|
|
211
127
|
end
|
|
212
128
|
|
|
213
129
|
# Substract _arg_ number of seconds or return the number of seconds between
|
|
@@ -216,7 +132,7 @@ class TaskJuggler
|
|
|
216
132
|
if arg.is_a?(TjTime)
|
|
217
133
|
@time - arg.time
|
|
218
134
|
else
|
|
219
|
-
TjTime.new(@time - arg)
|
|
135
|
+
TjTime.new(@time.to_i - arg)
|
|
220
136
|
end
|
|
221
137
|
end
|
|
222
138
|
|
|
@@ -268,26 +184,22 @@ class TaskJuggler
|
|
|
268
184
|
|
|
269
185
|
# Normalize time to the beginning of the current hour.
|
|
270
186
|
def beginOfHour
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
t.reverse!
|
|
275
|
-
TjTime.new(Time.local(*t))
|
|
187
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
188
|
+
sec = min = 0
|
|
189
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
276
190
|
end
|
|
277
191
|
|
|
278
192
|
# Normalize time to the beginning of the current day.
|
|
279
193
|
def midnight
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
t.reverse!
|
|
284
|
-
TjTime.new(Time.local(*t))
|
|
194
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
195
|
+
sec = min = hour = 0
|
|
196
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
285
197
|
end
|
|
286
198
|
|
|
287
199
|
# Normalize time to the beginning of the current week. _startMonday_
|
|
288
200
|
# determines whether the week should start on Monday or Sunday.
|
|
289
201
|
def beginOfWeek(startMonday)
|
|
290
|
-
t =
|
|
202
|
+
t = localtime.to_a
|
|
291
203
|
# Set time to noon, 12:00:00
|
|
292
204
|
t[0, 3] = [ 0, 0, 12 ]
|
|
293
205
|
weekday = t[6]
|
|
@@ -301,33 +213,27 @@ class TaskJuggler
|
|
|
301
213
|
|
|
302
214
|
# Normalize time to the beginning of the current month.
|
|
303
215
|
def beginOfMonth
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
t.reverse!
|
|
309
|
-
TjTime.new(Time.local(*t))
|
|
216
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
217
|
+
sec = min = hour = 0
|
|
218
|
+
day = 1
|
|
219
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
310
220
|
end
|
|
311
221
|
|
|
312
222
|
# Normalize time to the beginning of the current quarter.
|
|
313
223
|
def beginOfQuarter
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
t.reverse!
|
|
320
|
-
TjTime.new(Time.local(*t))
|
|
224
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
225
|
+
sec = min = hour = 0
|
|
226
|
+
day = 1
|
|
227
|
+
month = ((month - 1) % 3 ) + 1
|
|
228
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
321
229
|
end
|
|
322
230
|
|
|
323
231
|
# Normalize time to the beginning of the current year.
|
|
324
232
|
def beginOfYear
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
t.reverse!
|
|
330
|
-
TjTime.new(Time.local(*t))
|
|
233
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
234
|
+
sec = min = hour = 0
|
|
235
|
+
day = month = 1
|
|
236
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
331
237
|
end
|
|
332
238
|
|
|
333
239
|
# Return a new time that is _hours_ later than time.
|
|
@@ -343,64 +249,74 @@ class TaskJuggler
|
|
|
343
249
|
# Return a new time that is 1 day later than time but at the same time of
|
|
344
250
|
# day.
|
|
345
251
|
def sameTimeNextDay
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
252
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
253
|
+
if (day += 1) > lastDayOfMonth(month, year)
|
|
254
|
+
day = 1
|
|
255
|
+
if (month += 1) > 12
|
|
256
|
+
month = 1
|
|
257
|
+
year += 1
|
|
258
|
+
end
|
|
352
259
|
end
|
|
353
|
-
|
|
260
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
354
261
|
end
|
|
355
262
|
|
|
356
263
|
# Return a new time that is 1 week later than time but at the same time of
|
|
357
264
|
# day.
|
|
358
265
|
def sameTimeNextWeek
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
266
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
267
|
+
if (day += 7) > lastDayOfMonth(month, year)
|
|
268
|
+
day -= lastDayOfMonth(month, year)
|
|
269
|
+
if (month += 1) > 12
|
|
270
|
+
month = 1
|
|
271
|
+
year += 1
|
|
272
|
+
end
|
|
365
273
|
end
|
|
366
|
-
|
|
274
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
367
275
|
end
|
|
368
276
|
|
|
369
277
|
# Return a new time that is 1 month later than time but at the same time of
|
|
370
278
|
# day.
|
|
371
279
|
def sameTimeNextMonth
|
|
372
|
-
sec, min, hour, day, month, year =
|
|
280
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
373
281
|
monMax = month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
|
|
374
|
-
month += 1
|
|
375
|
-
if month > 12
|
|
282
|
+
if (month += 1) > 12
|
|
376
283
|
month = 1
|
|
377
284
|
year += 1
|
|
378
285
|
end
|
|
379
|
-
day = monMax if day >=
|
|
380
|
-
TjTime.new(
|
|
286
|
+
day = monMax if day >= lastDayOfMonth(month, year)
|
|
287
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
381
288
|
end
|
|
382
289
|
|
|
383
290
|
# Return a new time that is 1 quarter later than time but at the same time of
|
|
384
291
|
# day.
|
|
385
292
|
def sameTimeNextQuarter
|
|
386
|
-
|
|
387
|
-
if (
|
|
388
|
-
|
|
389
|
-
|
|
293
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
294
|
+
if (month += 3) > 12
|
|
295
|
+
month -= 12
|
|
296
|
+
year += 1
|
|
390
297
|
end
|
|
391
|
-
|
|
392
|
-
t.reverse!
|
|
393
|
-
TjTime.new(Time.local(*t))
|
|
298
|
+
TjTime.new([ year, month, day, hour, min, sec, 0 ])
|
|
394
299
|
end
|
|
395
300
|
|
|
396
301
|
# Return a new time that is 1 year later than time but at the same time of
|
|
397
302
|
# day.
|
|
398
303
|
def sameTimeNextYear
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
304
|
+
sec, min, hour, day, month, year = localtime.to_a
|
|
305
|
+
year += 1
|
|
306
|
+
TjTime.new([ year, month, day, hour, min, sec, 0])
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# Return the start of the next _dow_ day of week after _date_. _dow_ must
|
|
310
|
+
# be 0 for Sundays, 1 for Mondays and 6 for Saturdays. If _date_ is a
|
|
311
|
+
# Tuesday and _dow_ is 5 (Friday) the date of next Friday 0:00 will be
|
|
312
|
+
# returned. If _date_ is a Tuesday and _dow_ is 2 (Tuesday) the date of
|
|
313
|
+
# the next Tuesday will be returned.
|
|
314
|
+
def nextDayOfWeek(dow)
|
|
315
|
+
raise "Day of week must be 0 - 6." unless dow >= 0 && dow <= 6
|
|
316
|
+
d = midnight.sameTimeNextDay
|
|
317
|
+
currentDoW = d.strftime('%w').to_i
|
|
318
|
+
1.upto((dow + 7 - currentDoW) % 7) { |i| d = d.sameTimeNextDay }
|
|
319
|
+
d
|
|
404
320
|
end
|
|
405
321
|
|
|
406
322
|
# Return the number of hours between this time and _date_. The result is
|
|
@@ -448,74 +364,179 @@ class TaskJuggler
|
|
|
448
364
|
format = '%Y-%m-%d-%H:%M' + (@time.sec == 0 ? '' : ':%S') + '-%z'
|
|
449
365
|
end
|
|
450
366
|
# Always report values in local timezone
|
|
451
|
-
|
|
367
|
+
localtime.strftime(format)
|
|
452
368
|
end
|
|
453
369
|
|
|
454
370
|
# Return the seconds since Epoch.
|
|
455
371
|
def to_i
|
|
456
|
-
|
|
372
|
+
localtime.to_i
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def to_a
|
|
376
|
+
localtime.to_a
|
|
457
377
|
end
|
|
458
378
|
|
|
459
|
-
def
|
|
460
|
-
|
|
379
|
+
def strftime(format)
|
|
380
|
+
localtime.strftime(format)
|
|
461
381
|
end
|
|
462
382
|
|
|
383
|
+
# Return the day of the week. 0 for Sunday, 1 for Monday and so on.
|
|
384
|
+
def wday
|
|
385
|
+
localtime.wday
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
# Return the hours of the day (0..23)
|
|
389
|
+
def hour
|
|
390
|
+
localtime.hour
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
# Return the day of the month (1..n).
|
|
394
|
+
def day
|
|
395
|
+
localtime.day
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Return the month of the year (1..12)
|
|
399
|
+
def month
|
|
400
|
+
localtime.month
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
alias mon month
|
|
404
|
+
|
|
405
|
+
# Return the year.
|
|
406
|
+
def year
|
|
407
|
+
localtime.year
|
|
408
|
+
end
|
|
463
409
|
|
|
464
410
|
# Return the abbreviated month name.
|
|
465
411
|
def shortMonthName
|
|
466
|
-
|
|
412
|
+
localtime.strftime('%b')
|
|
467
413
|
end
|
|
468
414
|
|
|
469
415
|
# Return the number of the quarter prefixed by a 'Q'.
|
|
470
416
|
def quarterName
|
|
471
|
-
"Q#{(
|
|
417
|
+
"Q#{(localtime.mon / 3) + 1}"
|
|
472
418
|
end
|
|
473
419
|
|
|
474
420
|
# Return the week number. _weekStartsMonday_ specifies wheter the counting
|
|
475
421
|
# should be for weeks starting Mondays or Sundays.
|
|
476
422
|
def week(weekStartsMonday)
|
|
477
|
-
|
|
423
|
+
localtime.strftime(weekStartsMonday ? '%W' : '%U')
|
|
478
424
|
end
|
|
479
425
|
|
|
480
426
|
# Return the abbreviated month name and the full year. E. g. 'Feb 1972'.
|
|
481
427
|
def monthAndYear
|
|
482
|
-
|
|
428
|
+
localtime.strftime('%b %Y')
|
|
483
429
|
end
|
|
484
430
|
|
|
485
431
|
# Return the abbreviated weekday and the full date. E. g. 'Sat 2007-11-03'.
|
|
486
432
|
def weekdayAndDate
|
|
487
|
-
|
|
433
|
+
localtime.strftime('%A %Y-%m-%d')
|
|
488
434
|
end
|
|
489
435
|
|
|
490
|
-
|
|
491
|
-
# be 0 for Sundays, 1 for Mondays and 6 for Saturdays. If _date_ is a
|
|
492
|
-
# Tuesday and _dow_ is 5 (Friday) the date of next Friday 0:00 will be
|
|
493
|
-
# returned. If _date_ is a Tuesday and _dow_ is 2 (Tuesday) the date of
|
|
494
|
-
# the next Tuesday will be returned.
|
|
495
|
-
def nextDayOfWeek(dow)
|
|
496
|
-
raise "Day of week must be 0 - 6." unless dow >= 0 && dow <= 6
|
|
497
|
-
d = midnight.sameTimeNextDay
|
|
498
|
-
currentDoW = d.strftime('%w').to_i
|
|
499
|
-
1.upto((dow + 7 - currentDoW) % 7) { |i| d = d.sameTimeNextDay }
|
|
500
|
-
d
|
|
501
|
-
end
|
|
436
|
+
private
|
|
502
437
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
@time.method(func).call(*args)
|
|
506
|
-
end
|
|
438
|
+
def parse(t)
|
|
439
|
+
year, month, day, time, zone = t.split('-', 5)
|
|
507
440
|
|
|
508
|
-
|
|
441
|
+
# Check the year
|
|
442
|
+
if year
|
|
443
|
+
year = year.to_i
|
|
444
|
+
if year < 1970 || year > 2035
|
|
445
|
+
raise TjException.new, "Year #{year} out of range (1970 - 2035)"
|
|
446
|
+
end
|
|
447
|
+
else
|
|
448
|
+
raise TjException.new, "Year not specified"
|
|
449
|
+
end
|
|
509
450
|
|
|
510
|
-
|
|
511
|
-
if
|
|
512
|
-
|
|
513
|
-
|
|
451
|
+
# Check the month
|
|
452
|
+
if month
|
|
453
|
+
month = month.to_i
|
|
454
|
+
if month < 1 || month > 12
|
|
455
|
+
raise TjException.new, "Month #{month} out of range (1 - 12)"
|
|
456
|
+
end
|
|
457
|
+
else
|
|
458
|
+
raise TjException.new, "Month not specified"
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
# Check the day
|
|
462
|
+
if day
|
|
463
|
+
day = day.to_i
|
|
464
|
+
maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
|
|
465
|
+
30, 31, 31, 30, 31, 30, 31 ]
|
|
466
|
+
if month < 1 || month > maxDay[month]
|
|
467
|
+
raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
|
|
468
|
+
end
|
|
514
469
|
else
|
|
515
|
-
|
|
516
|
-
|
|
470
|
+
raise TjException.new, "Day not specified"
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
# The time is optional. Will be expanded to 00:00:00.
|
|
474
|
+
if time
|
|
475
|
+
hour, minute, second = time.split(':')
|
|
476
|
+
|
|
477
|
+
# Check hour
|
|
478
|
+
if hour
|
|
479
|
+
hour = hour.to_i
|
|
480
|
+
if hour < 0 || hour > 23
|
|
481
|
+
raise TjException.new, "Hour #{hour} out of range (0 - 23)"
|
|
482
|
+
end
|
|
483
|
+
else
|
|
484
|
+
raise TjException.new, "Hour not specified"
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
if minute
|
|
488
|
+
minute = minute.to_i
|
|
489
|
+
if minute < 0 || minute > 59
|
|
490
|
+
raise TjException.new, "Minute #{minute} out of range (0 - 59)"
|
|
491
|
+
end
|
|
492
|
+
else
|
|
493
|
+
raise TjException.new, "Minute not specified"
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
# Check sencond. This value is optional and defaults to 0.
|
|
497
|
+
if second
|
|
498
|
+
second = second.to_i
|
|
499
|
+
if second < 0 || second > 59
|
|
500
|
+
raise TjException.new, "Second #{second} out of range (0 - 59)"
|
|
501
|
+
end
|
|
502
|
+
else
|
|
503
|
+
second = 0
|
|
504
|
+
end
|
|
505
|
+
else
|
|
506
|
+
hour = minute = second = 0
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
# The zone is optional and defaults to the current time zone.
|
|
510
|
+
if zone
|
|
511
|
+
if zone[0] != ?- && zone[0] != ?+
|
|
512
|
+
raise TjException.new, "Time zone adjustment must be prefixed by " +
|
|
513
|
+
"+ or -, not #{zone[0]}"
|
|
514
|
+
end
|
|
515
|
+
if zone.length != 5
|
|
516
|
+
raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
@time = Time.utc(year, month, day, hour, minute, second)
|
|
520
|
+
sign = zone[0] == ?- ? 1 : -1
|
|
521
|
+
tzHour = zone[1..2].to_i
|
|
522
|
+
if tzHour < 0 || tzHour > 12
|
|
523
|
+
raise TjException.new, "Time zone adjustment hour out of range " +
|
|
524
|
+
"(0 - 12) but is #{tzHour}"
|
|
525
|
+
end
|
|
526
|
+
tzMinute = zone[3..4].to_i
|
|
527
|
+
if tzMinute < 0 || tzMinute > 59
|
|
528
|
+
raise TjException.new, "Time zone adjustment minute out of range " +
|
|
529
|
+
"(0 - 59) but is #{tzMinute}"
|
|
530
|
+
end
|
|
531
|
+
@time += sign * (tzHour * 3600 + tzMinute * 60)
|
|
532
|
+
@timeZone = 'UTC'
|
|
533
|
+
else
|
|
534
|
+
@time = Time.mktime(year, month, day, hour, minute, second)
|
|
517
535
|
end
|
|
518
|
-
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
def order(date)
|
|
539
|
+
self < date ? [ self, date ] : [ date, self ]
|
|
519
540
|
end
|
|
520
541
|
|
|
521
542
|
def countIntervals(date, stepFunc)
|
|
@@ -528,6 +549,10 @@ class TaskJuggler
|
|
|
528
549
|
i
|
|
529
550
|
end
|
|
530
551
|
|
|
552
|
+
def lastDayOfMonth(month, year)
|
|
553
|
+
month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
|
|
554
|
+
end
|
|
555
|
+
|
|
531
556
|
def leapYear?(year)
|
|
532
557
|
case
|
|
533
558
|
when year % 400 == 0
|
|
@@ -539,6 +564,26 @@ class TaskJuggler
|
|
|
539
564
|
end
|
|
540
565
|
end
|
|
541
566
|
|
|
567
|
+
def localtime
|
|
568
|
+
return @time if @timeZone == @@tz
|
|
569
|
+
|
|
570
|
+
if @time.utc?
|
|
571
|
+
if @@tz == 'UTC'
|
|
572
|
+
# @time is already in the right zone (UTC)
|
|
573
|
+
@time
|
|
574
|
+
else
|
|
575
|
+
@time.dup.localtime
|
|
576
|
+
end
|
|
577
|
+
elsif @@tz == 'UTC'
|
|
578
|
+
# @time is not in UTC, so convert it to local time.
|
|
579
|
+
@time.dup.gmtime
|
|
580
|
+
else
|
|
581
|
+
# To convert a Time object from one local time to another, we need to
|
|
582
|
+
# conver to UTC first and then to the new local time.
|
|
583
|
+
@time.dup.gmtime.localtime
|
|
584
|
+
end
|
|
585
|
+
end
|
|
586
|
+
|
|
542
587
|
end
|
|
543
588
|
|
|
544
589
|
end
|