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
data/lib/tj3client.rb
CHANGED
|
@@ -11,447 +11,7 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require '
|
|
15
|
-
require 'drb/acl'
|
|
16
|
-
require 'Tj3AppBase'
|
|
17
|
-
require 'LogFile'
|
|
14
|
+
require 'taskjuggler/apps/Tj3Client'
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
AppConfig.appName = 'tj3client'
|
|
21
|
-
|
|
22
|
-
class TaskJuggler
|
|
23
|
-
|
|
24
|
-
# The Tj3Client class provides the primary interface to the TaskJuggler
|
|
25
|
-
# daemon. It exposes a rich commandline interface that supports key
|
|
26
|
-
# operations like add/removing a project, generating a report or checking a
|
|
27
|
-
# time or status sheet. All connections are made via DRb and tj3client
|
|
28
|
-
# requires a properly configured tj3d to work.
|
|
29
|
-
class Tj3Client < Tj3AppBase
|
|
30
|
-
|
|
31
|
-
def initialize
|
|
32
|
-
super
|
|
33
|
-
|
|
34
|
-
# For security reasons, this will probably not change. All DRb
|
|
35
|
-
# operations are limited to localhost only. The client and the sever
|
|
36
|
-
# must have access to the identical file system.
|
|
37
|
-
@host = '127.0.0.1'
|
|
38
|
-
# The default port. 'T' and 'J' in ASCII decimal
|
|
39
|
-
@port = 8474
|
|
40
|
-
# The file with the server URI in case port is 0.
|
|
41
|
-
@uriFile = File.join(Dir.getwd, '.tj3d.uri')
|
|
42
|
-
# This must must be changed for the communication to work.
|
|
43
|
-
@authKey = nil
|
|
44
|
-
# Determines whether report IDs are fix IDs or regular expressions that
|
|
45
|
-
# match a set of reports.
|
|
46
|
-
@regExpMode = false
|
|
47
|
-
# List of requested output formats for reports.
|
|
48
|
-
@formats = nil
|
|
49
|
-
|
|
50
|
-
@mandatoryArgs = '<command> [arg1 arg2 ...]'
|
|
51
|
-
|
|
52
|
-
# This list describes the supported command line commands and their
|
|
53
|
-
# parameter.
|
|
54
|
-
# :label : The command name
|
|
55
|
-
# :args : A list of parameters. If the first character is a '+' the
|
|
56
|
-
# parameter must be provided 1 or more times. If the first character is
|
|
57
|
-
# a '*' the parameter must be provided 0 or more times. Repeatable and
|
|
58
|
-
# optional paramters must follow the mandatory ones.
|
|
59
|
-
# :descr : A short description of the command used for the help text.
|
|
60
|
-
@commands = [
|
|
61
|
-
{ :label => 'status',
|
|
62
|
-
:args => [],
|
|
63
|
-
:descr => 'Display the status of the available projects' },
|
|
64
|
-
{ :label => 'terminate',
|
|
65
|
-
:args => [],
|
|
66
|
-
:descr => 'Terminate the TaskJuggler daemon' },
|
|
67
|
-
{ :label => 'add',
|
|
68
|
-
:args => [ 'tjp file', '*tji file'],
|
|
69
|
-
:descr => 'Add a new project or update and existing one' },
|
|
70
|
-
{ :label => 'update',
|
|
71
|
-
:args => [],
|
|
72
|
-
:descr => 'Reload all projects that have modified files and '+
|
|
73
|
-
'are not being reloaded already' },
|
|
74
|
-
{ :label => 'remove',
|
|
75
|
-
:args => [ '+project ID' ],
|
|
76
|
-
:descr => 'Remove the project with the specified ID from the ' +
|
|
77
|
-
'daemon' },
|
|
78
|
-
{ :label => 'report',
|
|
79
|
-
:args => [ 'project ID', '+report ID', '!=', '*tji file'],
|
|
80
|
-
:descr => 'Generate the report with the provided ID for ' +
|
|
81
|
-
'the project with the given ID'},
|
|
82
|
-
{ :label => 'list-reports',
|
|
83
|
-
:args => [ 'project ID', '!report ID' ],
|
|
84
|
-
:descr => 'List all available reports of the project or those ' +
|
|
85
|
-
'that match the provided report ID' },
|
|
86
|
-
{ :label => 'check-ts',
|
|
87
|
-
:args => [ 'project ID', 'time sheet' ],
|
|
88
|
-
:descr => 'Check the provided time sheet for correctness ' +
|
|
89
|
-
'against the project with the given ID'},
|
|
90
|
-
{ :label => 'check-ss',
|
|
91
|
-
:args => [ 'project ID', 'status sheet' ],
|
|
92
|
-
:descr => 'Check the provided status sheet for correctness ' +
|
|
93
|
-
'against the project with the given ID'}
|
|
94
|
-
]
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def processArguments(argv)
|
|
98
|
-
super do
|
|
99
|
-
@opts.banner += <<'EOT'
|
|
100
|
-
The TaskJuggler client is used to send commands and data to the TaskJuggler
|
|
101
|
-
daemon. The communication is done via TCP/IP.
|
|
102
|
-
|
|
103
|
-
The following commands are supported:
|
|
104
|
-
|
|
105
|
-
EOT
|
|
106
|
-
|
|
107
|
-
# Convert the command list into a help text.
|
|
108
|
-
@commands.each do |cmd|
|
|
109
|
-
tail = ''
|
|
110
|
-
args = cmd[:args].dup
|
|
111
|
-
args.map! do |c|
|
|
112
|
-
if c[0] == '*'
|
|
113
|
-
"[<#{c[1..-1]}> ...]"
|
|
114
|
-
elsif c[0] == '+'
|
|
115
|
-
"<#{c[1..-1]}> [<#{c[1..-1]}> ...]"
|
|
116
|
-
elsif c[0] == '!'
|
|
117
|
-
tail += ']'
|
|
118
|
-
"[#{c[1..-1]} "
|
|
119
|
-
else
|
|
120
|
-
"<#{c}>"
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
args = args.join(' ')
|
|
124
|
-
@opts.banner += " #{cmd[:label] + ' ' + args + tail}" +
|
|
125
|
-
"\n\n#{' ' * 10 + format(cmd[:descr], 10)}\n"
|
|
126
|
-
end
|
|
127
|
-
@opts.on('-p', '--port <NUMBER>', Integer,
|
|
128
|
-
format('Use the specified TCP/IP port')) do |arg|
|
|
129
|
-
@port = arg
|
|
130
|
-
end
|
|
131
|
-
@opts.on('--urifile', String,
|
|
132
|
-
format('If the port is 0, use this file to get the URI ' +
|
|
133
|
-
'of the server.')) do |arg|
|
|
134
|
-
@uriFile = arg
|
|
135
|
-
end
|
|
136
|
-
@opts.on('-r', '--regexp',
|
|
137
|
-
format('The report IDs are not fixed but regular expressions ' +
|
|
138
|
-
'that match a set of reports')) do |arg|
|
|
139
|
-
@regExpMode = true
|
|
140
|
-
end
|
|
141
|
-
@opts.on('--format [FORMAT]', [ :csv, :html, :niku, :tjp ],
|
|
142
|
-
format('Request the report to be generated in the specified' +
|
|
143
|
-
'format. Use multiple options to request multiple ' +
|
|
144
|
-
'formats. Supported formats are csv, html, niku and ' +
|
|
145
|
-
'tjp. By default, the formats specified in the report ' +
|
|
146
|
-
'definition are used.')) do |arg|
|
|
147
|
-
@formats = [] unless @formats
|
|
148
|
-
@formats << arg
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
def main
|
|
154
|
-
args = super
|
|
155
|
-
# Run a first check of the non-option command line arguments.
|
|
156
|
-
checkCommand(args)
|
|
157
|
-
# Read some configuration variables. Except for the authKey, they are
|
|
158
|
-
# all optional.
|
|
159
|
-
@rc.configure(self, 'global')
|
|
160
|
-
|
|
161
|
-
connectDaemon
|
|
162
|
-
retVal = executeCommand(args[0], args[1..-1])
|
|
163
|
-
disconnectDaemon
|
|
164
|
-
|
|
165
|
-
retVal
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
private
|
|
169
|
-
|
|
170
|
-
def checkCommand(args)
|
|
171
|
-
if args.empty?
|
|
172
|
-
errorMessage = 'You must specify a command!'
|
|
173
|
-
else
|
|
174
|
-
errorMessage = "Unknown command #{args[0]}"
|
|
175
|
-
@commands.each do |cmd|
|
|
176
|
-
# The first value of args is the command name.
|
|
177
|
-
if cmd[:label] == args[0]
|
|
178
|
-
# Find out how many arguments we need to have and if that's a
|
|
179
|
-
# lower limit or a fixed value.
|
|
180
|
-
minArgs = 0
|
|
181
|
-
varArgs = false
|
|
182
|
-
cmd[:args].each do |arg|
|
|
183
|
-
# Arguments starting with '+' must have 1 or more showings.
|
|
184
|
-
# Arguments starting with '*' may show up 0 or more times.
|
|
185
|
-
minArgs += 1 unless '!*'.include?(arg[0])
|
|
186
|
-
varArgs = true if '!*+'.include?(arg[0])
|
|
187
|
-
end
|
|
188
|
-
return true if args.length - 1 >= minArgs
|
|
189
|
-
errorMessage = "Command #{args[0]} must have " +
|
|
190
|
-
"#{varArgs ? 'at least ' : ''}#{minArgs} " +
|
|
191
|
-
'arguments'
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
error(errorMessage)
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
def connectDaemon
|
|
200
|
-
unless @authKey
|
|
201
|
-
$stderr.puts <<'EOT'
|
|
202
|
-
You must set an authentication key in the configuration file. Create a file
|
|
203
|
-
named .taskjugglerrc or taskjuggler.rc that contains at least the following
|
|
204
|
-
lines. Replace 'your_secret_key' with some random character sequence.
|
|
205
|
-
|
|
206
|
-
_global:
|
|
207
|
-
authKey: your_secret_key
|
|
208
|
-
EOT
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
uri = "druby://#{@host}:#{@port}"
|
|
212
|
-
if @port == 0
|
|
213
|
-
# If the @port is configured to 0, we need to read the URI to connect
|
|
214
|
-
# to the server from the .tj3d.uri file that has been generated by the
|
|
215
|
-
# server.
|
|
216
|
-
begin
|
|
217
|
-
uri = File.read(@uriFile).chomp
|
|
218
|
-
rescue
|
|
219
|
-
error('The server port is configured to be 0, but no ' +
|
|
220
|
-
".tj3d.uri file can be found: #{$!}")
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# We try to play it safe here. The client also starts a DRb server, so
|
|
225
|
-
# we need to make sure it's constricted to localhost only. We require
|
|
226
|
-
# the DRb server for the standard IO redirection to work.
|
|
227
|
-
$SAFE = 1
|
|
228
|
-
DRb.install_acl(ACL.new(%w[ deny all
|
|
229
|
-
allow 127.0.0.1 ]))
|
|
230
|
-
DRb.start_service('druby://127.0.0.1:0')
|
|
231
|
-
|
|
232
|
-
begin
|
|
233
|
-
# Get the ProjectBroker object from the tj3d.
|
|
234
|
-
@broker = DRbObject.new(nil, uri)
|
|
235
|
-
# Client and server should always come from the same Gem. Since we
|
|
236
|
-
# restict communication to localhost, that's probably not a problem.
|
|
237
|
-
if (check = @broker.apiVersion(@authKey, 1)) < 0
|
|
238
|
-
error('This client is too old for the server. Please ' +
|
|
239
|
-
'upgrade to a more recent version of the software.')
|
|
240
|
-
elsif check == 0
|
|
241
|
-
error('Authentication failed. Please check your authentication ' +
|
|
242
|
-
'key to match the server key.')
|
|
243
|
-
end
|
|
244
|
-
rescue
|
|
245
|
-
error("TaskJuggler server on host '#{@host}' port " +
|
|
246
|
-
"#{@port} is not responding")
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def disconnectDaemon
|
|
251
|
-
@broker = nil
|
|
252
|
-
|
|
253
|
-
DRb.stop_service
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
def executeCommand(command, args)
|
|
257
|
-
case command
|
|
258
|
-
when 'status'
|
|
259
|
-
$stdout.puts callDaemon(:status, [])
|
|
260
|
-
when 'terminate'
|
|
261
|
-
callDaemon(:stop, [])
|
|
262
|
-
info('Daemon terminated')
|
|
263
|
-
when 'add'
|
|
264
|
-
res = callDaemon(:addProject, [ Dir.getwd, args,
|
|
265
|
-
$stdout, $stderr, $stdin, @silent ])
|
|
266
|
-
info("Project(s) #{args.join(', ')} added")
|
|
267
|
-
return res ? 0 : 1
|
|
268
|
-
when 'remove'
|
|
269
|
-
args.each do |arg|
|
|
270
|
-
unless callDaemon(:removeProject, arg)
|
|
271
|
-
error("Project '#{arg}' not found in list")
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
info('Project removed')
|
|
275
|
-
when 'update'
|
|
276
|
-
callDaemon(:update, [])
|
|
277
|
-
info('Reload requested')
|
|
278
|
-
when 'report'
|
|
279
|
-
# The first value of args is the project ID. The following values
|
|
280
|
-
# could be either report IDs or TJI file # names ('.' or '*.tji').
|
|
281
|
-
projectId = args.shift
|
|
282
|
-
# Ask the ProjectServer to launch a new ReportServer process and
|
|
283
|
-
# provide a DRbObject reference to it.
|
|
284
|
-
connectToReportServer(projectId)
|
|
285
|
-
|
|
286
|
-
reportIds, tjiFiles = splitIdsAndFiles(args)
|
|
287
|
-
if reportIds.empty?
|
|
288
|
-
disconnectReportServer
|
|
289
|
-
error('You must provide at least one report ID')
|
|
290
|
-
end
|
|
291
|
-
# Send the provided .tji files to the ReportServer.
|
|
292
|
-
failed = !addFiles(tjiFiles)
|
|
293
|
-
# Ask the ReportServer to generate the reports with the provided IDs.
|
|
294
|
-
unless failed
|
|
295
|
-
reportIds.each do |reportId|
|
|
296
|
-
unless @reportServer.generateReport(@rs_authKey, reportId,
|
|
297
|
-
@regExpMode, @formats, nil)
|
|
298
|
-
failed = true
|
|
299
|
-
break
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
# Terminate the ReportServer
|
|
304
|
-
disconnectReportServer
|
|
305
|
-
return failed ? 1 : 0
|
|
306
|
-
when 'list-reports'
|
|
307
|
-
# The first value of args is the project ID. The following values
|
|
308
|
-
# could be either report IDs or TJI file # names ('.' or '*.tji').
|
|
309
|
-
projectId = args.shift
|
|
310
|
-
# Ask the ProjectServer to launch a new ReportServer process and
|
|
311
|
-
# provide a DRbObject reference to it.
|
|
312
|
-
connectToReportServer(projectId)
|
|
313
|
-
|
|
314
|
-
reportIds, tjiFiles = splitIdsAndFiles(args)
|
|
315
|
-
if reportIds.empty?
|
|
316
|
-
# If the user did not provide a report ID we generate a full list.
|
|
317
|
-
reportIds = [ '.*' ]
|
|
318
|
-
@regExpMode = true
|
|
319
|
-
end
|
|
320
|
-
# Send the provided .tji files to the ReportServer.
|
|
321
|
-
failed = !addFiles(tjiFiles)
|
|
322
|
-
# Ask the ReportServer to generate the reports with the provided IDs.
|
|
323
|
-
unless failed
|
|
324
|
-
reportIds.each do |reportId|
|
|
325
|
-
unless @reportServer.listReports(@rs_authKey, reportId, @regExpMode)
|
|
326
|
-
failed = true
|
|
327
|
-
break
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
end
|
|
331
|
-
# Terminate the ReportServer
|
|
332
|
-
disconnectReportServer
|
|
333
|
-
return failed ? 1 : 0
|
|
334
|
-
when 'check-ts'
|
|
335
|
-
connectToReportServer(args[0])
|
|
336
|
-
begin
|
|
337
|
-
res = @reportServer.checkTimeSheet(@rs_authKey, args[1])
|
|
338
|
-
rescue
|
|
339
|
-
error("Time sheet check failed: #{$!}")
|
|
340
|
-
end
|
|
341
|
-
disconnectReportServer
|
|
342
|
-
return res ? 0 : 1
|
|
343
|
-
when 'check-ss'
|
|
344
|
-
connectToReportServer(args[0])
|
|
345
|
-
begin
|
|
346
|
-
res = @reportServer.checkStatusSheet(@rs_authKey, args[1])
|
|
347
|
-
rescue
|
|
348
|
-
error("Status sheet check failed: #{$!}")
|
|
349
|
-
end
|
|
350
|
-
disconnectReportServer
|
|
351
|
-
return res ? 0 : 1
|
|
352
|
-
else
|
|
353
|
-
raise "Unknown command #{command}"
|
|
354
|
-
end
|
|
355
|
-
0
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
def connectToReportServer(projectId)
|
|
359
|
-
@ps_uri, @ps_authKey = callDaemon(:getProject, projectId)
|
|
360
|
-
if @ps_uri.nil?
|
|
361
|
-
error("No project with ID #{projectId} loaded")
|
|
362
|
-
end
|
|
363
|
-
begin
|
|
364
|
-
@projectServer = DRbObject.new(nil, @ps_uri)
|
|
365
|
-
@rs_uri, @rs_authKey = @projectServer.getReportServer(@ps_authKey)
|
|
366
|
-
@reportServer = DRbObject.new(nil, @rs_uri)
|
|
367
|
-
rescue
|
|
368
|
-
error("Cannot get report server")
|
|
369
|
-
end
|
|
370
|
-
begin
|
|
371
|
-
@reportServer.connect(@rs_authKey, $stdout, $stderr, $stdin, @silent)
|
|
372
|
-
rescue
|
|
373
|
-
error("Can't connect IO: #{$!}")
|
|
374
|
-
end
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
def disconnectReportServer
|
|
378
|
-
begin
|
|
379
|
-
@reportServer.disconnect(@rs_authKey)
|
|
380
|
-
rescue
|
|
381
|
-
error("Can't disconnect IO: #{$!}")
|
|
382
|
-
end
|
|
383
|
-
begin
|
|
384
|
-
@reportServer.terminate(@rs_authKey)
|
|
385
|
-
rescue
|
|
386
|
-
error("Report server termination failed: #{$!}")
|
|
387
|
-
end
|
|
388
|
-
@reportServer = nil
|
|
389
|
-
@rs_uri = nil
|
|
390
|
-
@rs_authKey = nil
|
|
391
|
-
@projectServer = nil
|
|
392
|
-
@ps_uri = nil
|
|
393
|
-
@ps_authKey = nil
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
# Call the TaskJuggler daemon (ProjectBroker) and execute the provided
|
|
397
|
-
# command with the provided arguments.
|
|
398
|
-
def callDaemon(command, args)
|
|
399
|
-
begin
|
|
400
|
-
return @broker.command(@authKey, command, args)
|
|
401
|
-
rescue
|
|
402
|
-
error("Call to TaskJuggler server on host '#{@host}' " +
|
|
403
|
-
"port #{@port} failed: #{$!}")
|
|
404
|
-
end
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
# Sort the remaining arguments into a report ID and a TJI file list.
|
|
408
|
-
# If .tji files are present, they must be separated from the report ID
|
|
409
|
-
# list by a '='.
|
|
410
|
-
def splitIdsAndFiles(args)
|
|
411
|
-
reportIds = []
|
|
412
|
-
tjiFiles = []
|
|
413
|
-
addToReports = true
|
|
414
|
-
args.each do |arg|
|
|
415
|
-
if arg == '='
|
|
416
|
-
# Switch to tji file list.
|
|
417
|
-
addToReports = false
|
|
418
|
-
elsif addToReports
|
|
419
|
-
reportIds << arg
|
|
420
|
-
else
|
|
421
|
-
tjiFiles << arg
|
|
422
|
-
end
|
|
423
|
-
end
|
|
424
|
-
|
|
425
|
-
[ reportIds, tjiFiles ]
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
# Transfer the _tjiFiles_ to the _reportServer_.
|
|
429
|
-
def addFiles(tjiFiles)
|
|
430
|
-
tjiFiles.each do |file|
|
|
431
|
-
begin
|
|
432
|
-
unless @reportServer.addFile(@rs_authKey, file)
|
|
433
|
-
return false
|
|
434
|
-
end
|
|
435
|
-
rescue
|
|
436
|
-
error("Cannot add file #{file} to ReportServer")
|
|
437
|
-
end
|
|
438
|
-
end
|
|
439
|
-
true
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
def info(message)
|
|
443
|
-
return if @silent
|
|
444
|
-
$stdout.puts "#{message}"
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
def error(message)
|
|
448
|
-
$stderr.puts "ERROR: #{message}"
|
|
449
|
-
exit 1
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
exit TaskJuggler::Tj3Client.new.main()
|
|
16
|
+
exit TaskJuggler::Tj3Client.new.main(ARGV)
|
|
457
17
|
|
data/lib/tj3d.rb
CHANGED
|
@@ -11,139 +11,7 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require '
|
|
15
|
-
require 'Tj3AppBase'
|
|
16
|
-
require 'LogFile'
|
|
17
|
-
require 'daemon/ProjectBroker'
|
|
18
|
-
|
|
19
|
-
# Name of the application
|
|
20
|
-
AppConfig.appName = 'tj3d'
|
|
21
|
-
|
|
22
|
-
class TaskJuggler
|
|
23
|
-
|
|
24
|
-
class Tj3Daemon < Tj3AppBase
|
|
25
|
-
|
|
26
|
-
def initialize
|
|
27
|
-
super
|
|
28
|
-
@mandatoryArgs = '[<tjp file> [<tji file> ...] ...]'
|
|
29
|
-
|
|
30
|
-
@log = LogFile.instance
|
|
31
|
-
@log.logFile = File.join(Dir.getwd, "/#{AppConfig.appName}.log")
|
|
32
|
-
@log.appName = AppConfig.appName
|
|
33
|
-
@daemonize = true
|
|
34
|
-
@uriFile = File.join(Dir.getwd, '.tj3d.uri')
|
|
35
|
-
@port = nil
|
|
36
|
-
@webServer = false
|
|
37
|
-
@webServerPort = nil
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def processArguments(argv)
|
|
41
|
-
super do
|
|
42
|
-
@opts.banner += <<'EOT'
|
|
43
|
-
The TaskJuggler daemon can be used to quickly generate reports for a number
|
|
44
|
-
of scheduled projects that are resident in memory. Once the daemon has been
|
|
45
|
-
started tj3client can be used to control it.
|
|
46
|
-
EOT
|
|
47
|
-
@opts.on('-d', '--dont-daemonize',
|
|
48
|
-
format("Don't put program into daemon mode. Keep it " +
|
|
49
|
-
'connected to the terminal and show debug output.')) do
|
|
50
|
-
@daemonize = false
|
|
51
|
-
end
|
|
52
|
-
@opts.on('-p', '--port <NUMBER>', Integer,
|
|
53
|
-
format('Use the specified TCP/IP port to serve tj3client ' +
|
|
54
|
-
'requests (Default: 8474).')) do |arg|
|
|
55
|
-
@port = arg
|
|
56
|
-
end
|
|
57
|
-
@opts.on('--urifile', String,
|
|
58
|
-
format('If the port is 0, use this file to store the URI ' +
|
|
59
|
-
'of the server.')) do |arg|
|
|
60
|
-
@uriFile = arg
|
|
61
|
-
end
|
|
62
|
-
@opts.on('-w', '--webserver',
|
|
63
|
-
format('Start a web server that serves the reports of ' +
|
|
64
|
-
'the loaded projects.')) do
|
|
65
|
-
@webServer = true
|
|
66
|
-
end
|
|
67
|
-
@opts.on('--webserver-port <NUMBER>', Integer,
|
|
68
|
-
format('Use the specified TCP/IP port to serve web browser ' +
|
|
69
|
-
'requests (Default: 8080).')) do |arg|
|
|
70
|
-
@webServerPort = arg
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def main
|
|
76
|
-
files = super
|
|
77
|
-
broker = ProjectBroker.new
|
|
78
|
-
@rc.configure(self, 'global')
|
|
79
|
-
@rc.configure(@log, 'global.log')
|
|
80
|
-
@rc.configure(broker, 'global')
|
|
81
|
-
@rc.configure(broker, 'daemon')
|
|
82
|
-
|
|
83
|
-
# Set some config variables if corresponding data was provided via the
|
|
84
|
-
# command line.
|
|
85
|
-
broker.port = @port if @port
|
|
86
|
-
broker.uriFile = @uriFile.untaint
|
|
87
|
-
broker.enableWebServer = @webServer
|
|
88
|
-
broker.webServerPort = @webServerPort if @webServerPort
|
|
89
|
-
broker.projectFiles = sortInputFiles(files) unless files.empty?
|
|
90
|
-
broker.daemonize = @daemonize
|
|
91
|
-
# Create log files for standard IO for each child process if the daemon
|
|
92
|
-
# is not disconnected from the terminal.
|
|
93
|
-
broker.logStdIO = !@daemonize
|
|
94
|
-
|
|
95
|
-
broker.start
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def error(message)
|
|
99
|
-
$stderr.puts "ERROR: #{message}"
|
|
100
|
-
exit 1
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
private
|
|
104
|
-
|
|
105
|
-
# Sort the provided input files into groups of projects. Each *.tjp file
|
|
106
|
-
# starts a new project. A *.tjp file may be followed by any number of
|
|
107
|
-
# *.tji files. The result is an Array of projects. Each consists of an
|
|
108
|
-
# Array like this: [ <working directory>, <tjp file> (, <tji file> ...) ].
|
|
109
|
-
def sortInputFiles(files)
|
|
110
|
-
projects = []
|
|
111
|
-
project = nil
|
|
112
|
-
files.each do |file|
|
|
113
|
-
if file[-4..-1] == '.tjp'
|
|
114
|
-
# The project master file determines the working directory. If it's
|
|
115
|
-
# an absolute file name, that directory will become the working
|
|
116
|
-
# directory. If it's a relative file name, the current working
|
|
117
|
-
# directory will be kept.
|
|
118
|
-
if file[0] == '/'
|
|
119
|
-
# Absolute file name
|
|
120
|
-
workingDir = File.dirname(file)
|
|
121
|
-
fileName = File.basename(file)
|
|
122
|
-
else
|
|
123
|
-
# Relative file name
|
|
124
|
-
workingDir = Dir.getwd
|
|
125
|
-
fileName = file
|
|
126
|
-
end
|
|
127
|
-
project = [ workingDir, fileName ]
|
|
128
|
-
projects << project
|
|
129
|
-
elsif file[-4..-1] == '.tji'
|
|
130
|
-
# .tji files are optional. But if they are specified, they must
|
|
131
|
-
# always follow the master file in the list.
|
|
132
|
-
if project.nil?
|
|
133
|
-
error("You must specify a '.tjp' file before the '.tji' files")
|
|
134
|
-
end
|
|
135
|
-
project << file
|
|
136
|
-
else
|
|
137
|
-
error("Project files must have a '.tjp' or '.tji' extension")
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
projects
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
end
|
|
14
|
+
require 'taskjuggler/apps/Tj3Daemon'
|
|
147
15
|
|
|
148
16
|
exit TaskJuggler::Tj3Daemon.new.main()
|
|
149
17
|
|