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
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
#
|
|
13
13
|
|
|
14
14
|
require 'fileutils'
|
|
15
|
-
require 'Tj3Config'
|
|
16
|
-
require '
|
|
17
|
-
require 'SyntaxReference'
|
|
18
|
-
require 'TjTime'
|
|
19
|
-
require '
|
|
15
|
+
require 'taskjuggler/Tj3Config'
|
|
16
|
+
require 'taskjuggler/RichText/Document'
|
|
17
|
+
require 'taskjuggler/SyntaxReference'
|
|
18
|
+
require 'taskjuggler/TjTime'
|
|
19
|
+
require 'taskjuggler/RichText/FunctionExample'
|
|
20
20
|
|
|
21
21
|
class TaskJuggler
|
|
22
22
|
|
|
@@ -102,7 +102,7 @@ class TaskJuggler
|
|
|
102
102
|
"Copyright (c) #{AppConfig.copyright.join(', ')} " +
|
|
103
103
|
"by #{AppConfig.authors.join(', ')}", 'b')
|
|
104
104
|
div << XMLElement.new('br')
|
|
105
|
-
div << XMLText.new("Generated on #{TjTime.
|
|
105
|
+
div << XMLText.new("Generated on #{TjTime.new.strftime('%Y-%m-%d')}")
|
|
106
106
|
div << XMLElement.new('br')
|
|
107
107
|
div << XMLNamedText.new("This manual covers #{AppConfig.softwareName} " +
|
|
108
108
|
"version #{AppConfig.version}.", 'h3')
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require 'SyntaxReference'
|
|
14
|
+
require 'taskjuggler/SyntaxReference'
|
|
15
15
|
|
|
16
16
|
class TaskJuggler
|
|
17
17
|
|
|
@@ -210,6 +210,11 @@ hi def link tjpnumber Number
|
|
|
210
210
|
|
|
211
211
|
let b:current_syntax = "tjp"
|
|
212
212
|
|
|
213
|
+
augroup TaskJugglerSource
|
|
214
|
+
" Remove all trailing white spaces from line ends when saving files
|
|
215
|
+
" Note: This overwrites the s mark.
|
|
216
|
+
autocmd BufWritePre *.tj[ip] mark s | %s/\s\+$//e | normal `s
|
|
217
|
+
augroup END
|
|
213
218
|
EOT
|
|
214
219
|
end
|
|
215
220
|
|
|
@@ -221,4 +226,3 @@ EOT
|
|
|
221
226
|
|
|
222
227
|
end
|
|
223
228
|
|
|
224
|
-
TaskJuggler::VimSyntax.new.generate('tjp.vim')
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
# published by the Free Software Foundation.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
-
require 'Interval'
|
|
15
|
-
require 'Scoreboard'
|
|
14
|
+
require 'taskjuggler/Interval'
|
|
15
|
+
require 'taskjuggler/Scoreboard'
|
|
16
16
|
|
|
17
17
|
class TaskJuggler
|
|
18
18
|
|
|
@@ -29,7 +29,7 @@ class TaskJuggler
|
|
|
29
29
|
# existing WorkingHours object in +wh+. When it's present, the new object
|
|
30
30
|
# will be a deep copy of the given object. The Scoreboard object is _not_
|
|
31
31
|
# deep copied. It will be copied on write.
|
|
32
|
-
def initialize(arg1 = nil, startDate = nil, endDate = nil)
|
|
32
|
+
def initialize(arg1 = nil, startDate = nil, endDate = nil, timeZone = nil)
|
|
33
33
|
# One entry for every day of the week. Sunday === 0.
|
|
34
34
|
@days = Array.new(7, [])
|
|
35
35
|
@scoreboard = nil
|
|
@@ -59,7 +59,7 @@ class TaskJuggler
|
|
|
59
59
|
@slotDuration = slotDuration
|
|
60
60
|
|
|
61
61
|
# Create a new object with default working hours.
|
|
62
|
-
@timezone =
|
|
62
|
+
@timezone = timeZone
|
|
63
63
|
# Set the default working hours. Monday to Friday 9am - 12pm, 1pm - 6pm.
|
|
64
64
|
# Saturday and Sunday are days off.
|
|
65
65
|
1.upto(5) do |day|
|
|
@@ -138,8 +138,8 @@ class TaskJuggler
|
|
|
138
138
|
def timeOff?(interval)
|
|
139
139
|
initScoreboard unless @scoreboard
|
|
140
140
|
|
|
141
|
-
startIdx = @scoreboard.dateToIdx(interval.start
|
|
142
|
-
endIdx = @scoreboard.dateToIdx(interval.end
|
|
141
|
+
startIdx = @scoreboard.dateToIdx(interval.start)
|
|
142
|
+
endIdx = @scoreboard.dateToIdx(interval.end)
|
|
143
143
|
|
|
144
144
|
startIdx.upto(endIdx - 1) do |i|
|
|
145
145
|
return false if @scoreboard[i]
|
|
@@ -182,21 +182,17 @@ class TaskJuggler
|
|
|
182
182
|
@scoreboard = Scoreboard.new(@startDate, @endDate, @slotDuration, false)
|
|
183
183
|
|
|
184
184
|
oldTimezone = nil
|
|
185
|
-
#
|
|
185
|
+
# Active the appropriate time zone for the working hours.
|
|
186
186
|
if @timezone
|
|
187
|
-
oldTimezone =
|
|
188
|
-
ENV['TZ'] = @timezone
|
|
187
|
+
oldTimezone = TjTime.setTimeZone(@timezone)
|
|
189
188
|
end
|
|
190
189
|
|
|
191
190
|
date = @startDate
|
|
192
191
|
@scoreboard.collect! do |slot|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
# the local timezone.
|
|
198
|
-
weekday = localDate.wday
|
|
199
|
-
secondsOfDay = localDate.secondsOfDay
|
|
192
|
+
# The weekday and seconds of the day needs to be calculated according
|
|
193
|
+
# to the local timezone.
|
|
194
|
+
weekday = date.wday
|
|
195
|
+
secondsOfDay = date.secondsOfDay
|
|
200
196
|
|
|
201
197
|
result = false
|
|
202
198
|
@days[weekday].each do |iv|
|
|
@@ -213,13 +209,9 @@ class TaskJuggler
|
|
|
213
209
|
result
|
|
214
210
|
end
|
|
215
211
|
|
|
216
|
-
# Restore
|
|
212
|
+
# Restore old time zone setting.
|
|
217
213
|
if @timezone
|
|
218
|
-
|
|
219
|
-
ENV['TZ'] = oldTimezone
|
|
220
|
-
else
|
|
221
|
-
ENV.delete('TZ')
|
|
222
|
-
end
|
|
214
|
+
TjTime.setTimeZone(oldTimezone)
|
|
223
215
|
end
|
|
224
216
|
end
|
|
225
217
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = Tj3.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/TaskJuggler'
|
|
16
|
+
|
|
17
|
+
# Name of the application suite
|
|
18
|
+
AppConfig.appName = 'tj3'
|
|
19
|
+
|
|
20
|
+
class TaskJuggler
|
|
21
|
+
|
|
22
|
+
class Tj3 < Tj3AppBase
|
|
23
|
+
|
|
24
|
+
def initialize
|
|
25
|
+
super
|
|
26
|
+
|
|
27
|
+
# By default, we're only using 1 CPU core.
|
|
28
|
+
@maxCpuCores = 1
|
|
29
|
+
# Don't generate warnings for differences between time sheet data and
|
|
30
|
+
# the plan.
|
|
31
|
+
@warnTsDeltas = false
|
|
32
|
+
# Don't stop after reading all files.
|
|
33
|
+
@checkSyntax = false
|
|
34
|
+
# Don't generate reports when previous errors have been found.
|
|
35
|
+
@forceReports = false
|
|
36
|
+
# Don't generate any reports.
|
|
37
|
+
@noReports = false
|
|
38
|
+
# The directory where generated reports should be put in.
|
|
39
|
+
@outputDir = ''
|
|
40
|
+
# The file names of the time sheet files to check.
|
|
41
|
+
@timeSheets = []
|
|
42
|
+
# The file names of the status sheet files to check.
|
|
43
|
+
@statusSheets = []
|
|
44
|
+
|
|
45
|
+
# Show some progress information by default
|
|
46
|
+
TaskJuggler::Log.silent = false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def processArguments(argv)
|
|
50
|
+
super do
|
|
51
|
+
@opts.banner += <<'EOT'
|
|
52
|
+
This is the main application. It reads in your project files, schedules the
|
|
53
|
+
project and generates the reports.
|
|
54
|
+
EOT
|
|
55
|
+
@opts.on('--debuglevel N', Integer,
|
|
56
|
+
format("Verbosity of debug output")) do |arg|
|
|
57
|
+
TaskJuggler::Log.level = arg
|
|
58
|
+
end
|
|
59
|
+
@opts.on('--debugmodules x,y,z', Array,
|
|
60
|
+
format('Restrict debug output to a list of modules')) do |arg|
|
|
61
|
+
TaskJuggler::Log.segments = arg.split(',')
|
|
62
|
+
end
|
|
63
|
+
@opts.on('-f', '--force-reports',
|
|
64
|
+
format('Generate reports despite scheduling errors')) do
|
|
65
|
+
@forceReports = true
|
|
66
|
+
end
|
|
67
|
+
@opts.on('--check-time-sheet <tji-file>', String,
|
|
68
|
+
format("Check the given time sheet")) do |arg|
|
|
69
|
+
@timeSheets << arg
|
|
70
|
+
end
|
|
71
|
+
@opts.on('--check-status-sheet <tji-file>', String,
|
|
72
|
+
format("Check the given status sheet")) do |arg|
|
|
73
|
+
@statusSheets << arg
|
|
74
|
+
end
|
|
75
|
+
@opts.on('--warn-ts-deltas',
|
|
76
|
+
format('Turn on warnings for requested changes in time ' +
|
|
77
|
+
'sheets')) do
|
|
78
|
+
@warnTsDeltas = true
|
|
79
|
+
end
|
|
80
|
+
@opts.on('--check-syntax',
|
|
81
|
+
format('Only parse the input files and check the syntax.')) do
|
|
82
|
+
@checkSyntax = true
|
|
83
|
+
end
|
|
84
|
+
@opts.on('--no-reports',
|
|
85
|
+
format('Just schedule the project, but don\'t generate any ' +
|
|
86
|
+
'reports.')) do
|
|
87
|
+
@noReports = true
|
|
88
|
+
end
|
|
89
|
+
@opts.on('-o', '--output-dir <directory>', String,
|
|
90
|
+
format('Directory the reports should go into')) do |arg|
|
|
91
|
+
@outputDir = arg + '/'
|
|
92
|
+
end
|
|
93
|
+
@opts.on('-c N', Integer,
|
|
94
|
+
format('Maximum number of CPU cores to use')) do |arg|
|
|
95
|
+
@maxCpuCores = arg
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def main(argv = ARGV)
|
|
101
|
+
files = super
|
|
102
|
+
|
|
103
|
+
tj = TaskJuggler.new(true)
|
|
104
|
+
tj.maxCpuCores = @maxCpuCores
|
|
105
|
+
tj.warnTsDeltas = @warnTsDeltas
|
|
106
|
+
keepParser = !@timeSheets.empty? || !@statusSheets.empty?
|
|
107
|
+
return 1 unless tj.parse(files, keepParser)
|
|
108
|
+
|
|
109
|
+
return 0 if @checkSyntax
|
|
110
|
+
|
|
111
|
+
if !tj.schedule
|
|
112
|
+
return 1 unless @forceReports
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# The checks of time and status sheets is probably only used for debugging.
|
|
116
|
+
# Normally, this function is provided by tj3client.
|
|
117
|
+
@timeSheets.each do |ts|
|
|
118
|
+
return 1 if !tj.checkTimeSheet(ts, File.read(ts)) || tj.errors > 0
|
|
119
|
+
end
|
|
120
|
+
@statusSheets.each do |ss|
|
|
121
|
+
return 1 if !tj.checkStatusSheet(ss, File.read(ss)) || tj.errors > 0
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
return 0 if @noReports
|
|
125
|
+
|
|
126
|
+
return 1 if !tj.generateReports(@outputDir) || tj.errors > 0
|
|
127
|
+
|
|
128
|
+
0
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = Tj3Client.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 'drb'
|
|
15
|
+
require 'drb/acl'
|
|
16
|
+
require 'taskjuggler/Tj3AppBase'
|
|
17
|
+
require 'taskjuggler/LogFile'
|
|
18
|
+
|
|
19
|
+
# Name of the application
|
|
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
|
+
# Prevents usage of protective sandbox if set to true.
|
|
48
|
+
@unsafeMode = false
|
|
49
|
+
# List of requested output formats for reports.
|
|
50
|
+
@formats = nil
|
|
51
|
+
|
|
52
|
+
@mandatoryArgs = '<command> [arg1 arg2 ...]'
|
|
53
|
+
|
|
54
|
+
# This list describes the supported command line commands and their
|
|
55
|
+
# parameter.
|
|
56
|
+
# :label : The command name
|
|
57
|
+
# :args : A list of parameters. If the first character is a '+' the
|
|
58
|
+
# parameter must be provided 1 or more times. If the first character is
|
|
59
|
+
# a '*' the parameter must be provided 0 or more times. Repeatable and
|
|
60
|
+
# optional paramters must follow the mandatory ones.
|
|
61
|
+
# :descr : A short description of the command used for the help text.
|
|
62
|
+
@commands = [
|
|
63
|
+
{ :label => 'status',
|
|
64
|
+
:args => [],
|
|
65
|
+
:descr => 'Display the status of the available projects' },
|
|
66
|
+
{ :label => 'terminate',
|
|
67
|
+
:args => [],
|
|
68
|
+
:descr => 'Terminate the TaskJuggler daemon' },
|
|
69
|
+
{ :label => 'add',
|
|
70
|
+
:args => [ 'tjp file', '*tji file'],
|
|
71
|
+
:descr => 'Add a new project or update and existing one' },
|
|
72
|
+
{ :label => 'update',
|
|
73
|
+
:args => [],
|
|
74
|
+
:descr => 'Reload all projects that have modified files and '+
|
|
75
|
+
'are not being reloaded already' },
|
|
76
|
+
{ :label => 'remove',
|
|
77
|
+
:args => [ '+project ID' ],
|
|
78
|
+
:descr => 'Remove the project with the specified ID from the ' +
|
|
79
|
+
'daemon' },
|
|
80
|
+
{ :label => 'report',
|
|
81
|
+
:args => [ 'project ID', '+report ID', '!=', '*tji file'],
|
|
82
|
+
:descr => 'Generate the report with the provided ID for ' +
|
|
83
|
+
'the project with the given ID'},
|
|
84
|
+
{ :label => 'list-reports',
|
|
85
|
+
:args => [ 'project ID', '!report ID' ],
|
|
86
|
+
:descr => 'List all available reports of the project or those ' +
|
|
87
|
+
'that match the provided report ID' },
|
|
88
|
+
{ :label => 'check-ts',
|
|
89
|
+
:args => [ 'project ID', 'time sheet' ],
|
|
90
|
+
:descr => 'Check the provided time sheet for correctness ' +
|
|
91
|
+
'against the project with the given ID'},
|
|
92
|
+
{ :label => 'check-ss',
|
|
93
|
+
:args => [ 'project ID', 'status sheet' ],
|
|
94
|
+
:descr => 'Check the provided status sheet for correctness ' +
|
|
95
|
+
'against the project with the given ID'}
|
|
96
|
+
]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def processArguments(argv)
|
|
100
|
+
super do
|
|
101
|
+
@opts.banner += <<'EOT'
|
|
102
|
+
The TaskJuggler client is used to send commands and data to the TaskJuggler
|
|
103
|
+
daemon. The communication is done via TCP/IP.
|
|
104
|
+
|
|
105
|
+
The following commands are supported:
|
|
106
|
+
|
|
107
|
+
EOT
|
|
108
|
+
|
|
109
|
+
# Convert the command list into a help text.
|
|
110
|
+
@commands.each do |cmd|
|
|
111
|
+
tail = ''
|
|
112
|
+
args = cmd[:args].dup
|
|
113
|
+
args.map! do |c|
|
|
114
|
+
if c[0] == '*'
|
|
115
|
+
"[<#{c[1..-1]}> ...]"
|
|
116
|
+
elsif c[0] == '+'
|
|
117
|
+
"<#{c[1..-1]}> [<#{c[1..-1]}> ...]"
|
|
118
|
+
elsif c[0] == '!'
|
|
119
|
+
tail += ']'
|
|
120
|
+
"[#{c[1..-1]} "
|
|
121
|
+
else
|
|
122
|
+
"<#{c}>"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
args = args.join(' ')
|
|
126
|
+
@opts.banner += " #{cmd[:label] + ' ' + args + tail}" +
|
|
127
|
+
"\n\n#{' ' * 10 + format(cmd[:descr], 10)}\n"
|
|
128
|
+
end
|
|
129
|
+
@opts.on('-p', '--port <NUMBER>', Integer,
|
|
130
|
+
format('Use the specified TCP/IP port')) do |arg|
|
|
131
|
+
@port = arg
|
|
132
|
+
end
|
|
133
|
+
@opts.on('--urifile <FILE>', String,
|
|
134
|
+
format('If the port is 0, use this file to get the URI ' +
|
|
135
|
+
'of the server.')) do |arg|
|
|
136
|
+
@uriFile = arg
|
|
137
|
+
end
|
|
138
|
+
@opts.on('-r', '--regexp',
|
|
139
|
+
format('The report IDs are not fixed but regular expressions ' +
|
|
140
|
+
'that match a set of reports')) do |arg|
|
|
141
|
+
@regExpMode = true
|
|
142
|
+
end
|
|
143
|
+
@opts.on('--unsafe',
|
|
144
|
+
format('Run the program without sandbox protection. This ' +
|
|
145
|
+
'is not recommended for normal operation! It may ' +
|
|
146
|
+
'only be used for debugging or testing ' +
|
|
147
|
+
'purposes.')) do |arg|
|
|
148
|
+
@unsafeMode = true
|
|
149
|
+
end
|
|
150
|
+
@opts.on('--format [FORMAT]', [ :csv, :html, :niku, :tjp ],
|
|
151
|
+
format('Request the report to be generated in the specified' +
|
|
152
|
+
'format. Use multiple options to request multiple ' +
|
|
153
|
+
'formats. Supported formats are csv, html, niku and ' +
|
|
154
|
+
'tjp. By default, the formats specified in the report ' +
|
|
155
|
+
'definition are used.')) do |arg|
|
|
156
|
+
@formats = [] unless @formats
|
|
157
|
+
@formats << arg
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def main(argv = ARGV)
|
|
163
|
+
args = super
|
|
164
|
+
# Run a first check of the non-optional command line arguments.
|
|
165
|
+
checkCommand(args)
|
|
166
|
+
# Read some configuration variables. Except for the authKey, they are
|
|
167
|
+
# all optional.
|
|
168
|
+
@rc.configure(self, 'global')
|
|
169
|
+
|
|
170
|
+
connectDaemon
|
|
171
|
+
retVal = executeCommand(args[0], args[1..-1])
|
|
172
|
+
disconnectDaemon
|
|
173
|
+
|
|
174
|
+
retVal
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
private
|
|
178
|
+
|
|
179
|
+
def checkCommand(args)
|
|
180
|
+
if args.empty?
|
|
181
|
+
errorMessage = 'You must specify a command!'
|
|
182
|
+
else
|
|
183
|
+
errorMessage = "Unknown command #{args[0]}"
|
|
184
|
+
@commands.each do |cmd|
|
|
185
|
+
# The first value of args is the command name.
|
|
186
|
+
if cmd[:label] == args[0]
|
|
187
|
+
# Find out how many arguments we need to have and if that's a
|
|
188
|
+
# lower limit or a fixed value.
|
|
189
|
+
minArgs = 0
|
|
190
|
+
varArgs = false
|
|
191
|
+
cmd[:args].each do |arg|
|
|
192
|
+
# Arguments starting with '+' must have 1 or more showings.
|
|
193
|
+
# Arguments starting with '*' may show up 0 or more times.
|
|
194
|
+
minArgs += 1 unless '!*'.include?(arg[0])
|
|
195
|
+
varArgs = true if '!*+'.include?(arg[0])
|
|
196
|
+
end
|
|
197
|
+
return true if args.length - 1 >= minArgs
|
|
198
|
+
errorMessage = "Command #{args[0]} must have " +
|
|
199
|
+
"#{varArgs ? 'at least ' : ''}#{minArgs} " +
|
|
200
|
+
'arguments'
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
error(errorMessage)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def connectDaemon
|
|
209
|
+
unless @authKey
|
|
210
|
+
$stderr.puts <<'EOT'
|
|
211
|
+
You must set an authentication key in the configuration file. Create a file
|
|
212
|
+
named .taskjugglerrc or taskjuggler.rc that contains at least the following
|
|
213
|
+
lines. Replace 'your_secret_key' with some random character sequence.
|
|
214
|
+
|
|
215
|
+
_global:
|
|
216
|
+
authKey: your_secret_key
|
|
217
|
+
EOT
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
uri = "druby://#{@host}:#{@port}"
|
|
221
|
+
if @port == 0
|
|
222
|
+
# If the @port is configured to 0, we need to read the URI to connect
|
|
223
|
+
# to the server from the .tj3d.uri file that has been generated by the
|
|
224
|
+
# server.
|
|
225
|
+
begin
|
|
226
|
+
uri = File.read(@uriFile).chomp
|
|
227
|
+
rescue
|
|
228
|
+
error('The server port is configured to be 0, but no ' +
|
|
229
|
+
".tj3d.uri file can be found: #{$!}")
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# We try to play it safe here. The client also starts a DRb server, so
|
|
234
|
+
# we need to make sure it's constricted to localhost only. We require
|
|
235
|
+
# the DRb server for the standard IO redirection to work.
|
|
236
|
+
$SAFE = 1 unless @unsafeMode
|
|
237
|
+
DRb.install_acl(ACL.new(%w[ deny all
|
|
238
|
+
allow 127.0.0.1 ]))
|
|
239
|
+
DRb.start_service('druby://127.0.0.1:0')
|
|
240
|
+
|
|
241
|
+
begin
|
|
242
|
+
# Get the ProjectBroker object from the tj3d.
|
|
243
|
+
@broker = DRbObject.new(nil, uri)
|
|
244
|
+
# Client and server should always come from the same Gem. Since we
|
|
245
|
+
# restict communication to localhost, that's probably not a problem.
|
|
246
|
+
if (check = @broker.apiVersion(@authKey, 1)) < 0
|
|
247
|
+
error('This client is too old for the server. Please ' +
|
|
248
|
+
'upgrade to a more recent version of the software.')
|
|
249
|
+
elsif check == 0
|
|
250
|
+
error('Authentication failed. Please check your authentication ' +
|
|
251
|
+
'key to match the server key.')
|
|
252
|
+
end
|
|
253
|
+
rescue
|
|
254
|
+
error("TaskJuggler server on host '#{@host}' port " +
|
|
255
|
+
"#{@port} is not responding")
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def disconnectDaemon
|
|
260
|
+
@broker = nil
|
|
261
|
+
|
|
262
|
+
DRb.stop_service
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def executeCommand(command, args)
|
|
266
|
+
case command
|
|
267
|
+
when 'status'
|
|
268
|
+
$stdout.puts callDaemon(:status, [])
|
|
269
|
+
when 'terminate'
|
|
270
|
+
callDaemon(:stop, [])
|
|
271
|
+
info('Daemon terminated')
|
|
272
|
+
when 'add'
|
|
273
|
+
res = callDaemon(:addProject, [ Dir.getwd, args,
|
|
274
|
+
$stdout, $stderr, $stdin, @silent ])
|
|
275
|
+
info("Project(s) #{args.join(', ')} added")
|
|
276
|
+
return res ? 0 : 1
|
|
277
|
+
when 'remove'
|
|
278
|
+
args.each do |arg|
|
|
279
|
+
unless callDaemon(:removeProject, arg)
|
|
280
|
+
error("Project '#{arg}' not found in list")
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
info('Project removed')
|
|
284
|
+
when 'update'
|
|
285
|
+
callDaemon(:update, [])
|
|
286
|
+
info('Reload requested')
|
|
287
|
+
when 'report'
|
|
288
|
+
# The first value of args is the project ID. The following values
|
|
289
|
+
# could be either report IDs or TJI file # names ('.' or '*.tji').
|
|
290
|
+
projectId = args.shift
|
|
291
|
+
# Ask the ProjectServer to launch a new ReportServer process and
|
|
292
|
+
# provide a DRbObject reference to it.
|
|
293
|
+
connectToReportServer(projectId)
|
|
294
|
+
|
|
295
|
+
reportIds, tjiFiles = splitIdsAndFiles(args)
|
|
296
|
+
if reportIds.empty?
|
|
297
|
+
disconnectReportServer
|
|
298
|
+
error('You must provide at least one report ID')
|
|
299
|
+
end
|
|
300
|
+
# Send the provided .tji files to the ReportServer.
|
|
301
|
+
failed = !addFiles(tjiFiles)
|
|
302
|
+
# Ask the ReportServer to generate the reports with the provided IDs.
|
|
303
|
+
unless failed
|
|
304
|
+
reportIds.each do |reportId|
|
|
305
|
+
unless @reportServer.generateReport(@rs_authKey, reportId,
|
|
306
|
+
@regExpMode, @formats, nil)
|
|
307
|
+
failed = true
|
|
308
|
+
break
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
# Terminate the ReportServer
|
|
313
|
+
disconnectReportServer
|
|
314
|
+
return failed ? 1 : 0
|
|
315
|
+
when 'list-reports'
|
|
316
|
+
# The first value of args is the project ID. The following values
|
|
317
|
+
# could be either report IDs or TJI file # names ('.' or '*.tji').
|
|
318
|
+
projectId = args.shift
|
|
319
|
+
# Ask the ProjectServer to launch a new ReportServer process and
|
|
320
|
+
# provide a DRbObject reference to it.
|
|
321
|
+
connectToReportServer(projectId)
|
|
322
|
+
|
|
323
|
+
reportIds, tjiFiles = splitIdsAndFiles(args)
|
|
324
|
+
if reportIds.empty?
|
|
325
|
+
# If the user did not provide a report ID we generate a full list.
|
|
326
|
+
reportIds = [ '.*' ]
|
|
327
|
+
@regExpMode = true
|
|
328
|
+
end
|
|
329
|
+
# Send the provided .tji files to the ReportServer.
|
|
330
|
+
failed = !addFiles(tjiFiles)
|
|
331
|
+
# Ask the ReportServer to generate the reports with the provided IDs.
|
|
332
|
+
unless failed
|
|
333
|
+
reportIds.each do |reportId|
|
|
334
|
+
unless @reportServer.listReports(@rs_authKey, reportId, @regExpMode)
|
|
335
|
+
failed = true
|
|
336
|
+
break
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
# Terminate the ReportServer
|
|
341
|
+
disconnectReportServer
|
|
342
|
+
return failed ? 1 : 0
|
|
343
|
+
when 'check-ts'
|
|
344
|
+
connectToReportServer(args[0])
|
|
345
|
+
begin
|
|
346
|
+
res = @reportServer.checkTimeSheet(@rs_authKey, args[1])
|
|
347
|
+
rescue
|
|
348
|
+
error("Time sheet check failed: #{$!}")
|
|
349
|
+
end
|
|
350
|
+
disconnectReportServer
|
|
351
|
+
return res ? 0 : 1
|
|
352
|
+
when 'check-ss'
|
|
353
|
+
connectToReportServer(args[0])
|
|
354
|
+
begin
|
|
355
|
+
res = @reportServer.checkStatusSheet(@rs_authKey, args[1])
|
|
356
|
+
rescue
|
|
357
|
+
error("Status sheet check failed: #{$!}")
|
|
358
|
+
end
|
|
359
|
+
disconnectReportServer
|
|
360
|
+
return res ? 0 : 1
|
|
361
|
+
else
|
|
362
|
+
raise "Unknown command #{command}"
|
|
363
|
+
end
|
|
364
|
+
0
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def connectToReportServer(projectId)
|
|
368
|
+
@ps_uri, @ps_authKey = callDaemon(:getProject, projectId)
|
|
369
|
+
if @ps_uri.nil?
|
|
370
|
+
error("No project with ID #{projectId} loaded")
|
|
371
|
+
end
|
|
372
|
+
begin
|
|
373
|
+
@projectServer = DRbObject.new(nil, @ps_uri)
|
|
374
|
+
@rs_uri, @rs_authKey = @projectServer.getReportServer(@ps_authKey)
|
|
375
|
+
@reportServer = DRbObject.new(nil, @rs_uri)
|
|
376
|
+
rescue
|
|
377
|
+
error("Cannot get report server")
|
|
378
|
+
end
|
|
379
|
+
begin
|
|
380
|
+
@reportServer.connect(@rs_authKey, $stdout, $stderr, $stdin, @silent)
|
|
381
|
+
rescue
|
|
382
|
+
error("Can't connect IO: #{$!}")
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def disconnectReportServer
|
|
387
|
+
begin
|
|
388
|
+
@reportServer.disconnect(@rs_authKey)
|
|
389
|
+
rescue
|
|
390
|
+
error("Can't disconnect IO: #{$!}")
|
|
391
|
+
end
|
|
392
|
+
begin
|
|
393
|
+
@reportServer.terminate(@rs_authKey)
|
|
394
|
+
rescue
|
|
395
|
+
error("Report server termination failed: #{$!}")
|
|
396
|
+
end
|
|
397
|
+
@reportServer = nil
|
|
398
|
+
@rs_uri = nil
|
|
399
|
+
@rs_authKey = nil
|
|
400
|
+
@projectServer = nil
|
|
401
|
+
@ps_uri = nil
|
|
402
|
+
@ps_authKey = nil
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
# Call the TaskJuggler daemon (ProjectBroker) and execute the provided
|
|
406
|
+
# command with the provided arguments.
|
|
407
|
+
def callDaemon(command, args)
|
|
408
|
+
begin
|
|
409
|
+
return @broker.command(@authKey, command, args)
|
|
410
|
+
rescue
|
|
411
|
+
error("Call to TaskJuggler server on host '#{@host}' " +
|
|
412
|
+
"port #{@port} failed: #{$!}")
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
# Sort the remaining arguments into a report ID and a TJI file list.
|
|
417
|
+
# If .tji files are present, they must be separated from the report ID
|
|
418
|
+
# list by a '='.
|
|
419
|
+
def splitIdsAndFiles(args)
|
|
420
|
+
reportIds = []
|
|
421
|
+
tjiFiles = []
|
|
422
|
+
addToReports = true
|
|
423
|
+
args.each do |arg|
|
|
424
|
+
if arg == '='
|
|
425
|
+
# Switch to tji file list.
|
|
426
|
+
addToReports = false
|
|
427
|
+
elsif addToReports
|
|
428
|
+
reportIds << arg
|
|
429
|
+
else
|
|
430
|
+
tjiFiles << arg
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
[ reportIds, tjiFiles ]
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
# Transfer the _tjiFiles_ to the _reportServer_.
|
|
438
|
+
def addFiles(tjiFiles)
|
|
439
|
+
tjiFiles.each do |file|
|
|
440
|
+
begin
|
|
441
|
+
unless @reportServer.addFile(@rs_authKey, file)
|
|
442
|
+
return false
|
|
443
|
+
end
|
|
444
|
+
rescue
|
|
445
|
+
error("Cannot add file #{file} to ReportServer")
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
true
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def info(message)
|
|
452
|
+
return if @silent
|
|
453
|
+
$stdout.puts "#{message}"
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
def error(message)
|
|
457
|
+
$stderr.puts "ERROR: #{message}"
|
|
458
|
+
# Don't call exit in unsafe mode. We are probably running as a RSpec
|
|
459
|
+
# test.
|
|
460
|
+
exit 1 unless @unsafeMode
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
|