taskjuggler 0.0.7 → 0.0.8
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 +119 -0
- data/benchmarks/allocatedSlots.tjp +1602 -0
- data/benchmarks/booking.tjp +40 -30
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/css/tjmanual.css +0 -0
- data/{test/TestSuite/Scheduler/Correct → benchmarks}/css/tjreport.css +1 -0
- data/benchmarks/gantt.tjp +57 -0
- data/benchmarks/htmltaskreport.tjp +26 -1
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/details.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-green.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-red.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/flag-yellow.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resource.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/resourcegroup.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/task.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/taskgroup.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-down.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-flat.png +0 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/icons/trend-up.png +0 -0
- data/benchmarks/profile.clt +36082 -0
- data/benchmarks/profile.html +58182 -0
- data/benchmarks/runbench.rb +6 -0
- data/{test/TestSuite/ReportGenerator/Errors → benchmarks}/scripts/wz_tooltip.js +0 -0
- data/doc/AppConfig.html +85 -37
- data/doc/Arguments.html +11 -1
- data/doc/CHANGELOG.html +131 -2
- data/doc/COPYING.html +11 -1
- data/doc/Object.html +12 -3
- data/doc/README.html +11 -1
- data/doc/RuntimeConfig.html +11 -1
- data/doc/String.html +11 -1
- data/doc/StringIO.html +11 -1
- data/doc/TaskJuggler.html +250 -219
- data/doc/TaskJuggler/Account.html +11 -1
- data/doc/TaskJuggler/AccountAttribute.html +11 -1
- data/doc/TaskJuggler/AccountScenario.html +11 -1
- data/doc/TaskJuggler/Allocation.html +11 -1
- data/doc/TaskJuggler/AllocationAttribute.html +11 -1
- data/doc/TaskJuggler/AttributeBase.html +11 -1
- data/doc/TaskJuggler/AttributeDefinition.html +11 -1
- data/doc/TaskJuggler/BatchProcessor.html +11 -1
- data/doc/TaskJuggler/Booking.html +11 -1
- data/doc/TaskJuggler/BookingListAttribute.html +11 -1
- data/doc/TaskJuggler/BooleanAttribute.html +11 -1
- data/doc/TaskJuggler/CSVFile.html +12 -2
- data/doc/TaskJuggler/CellSettingPattern.html +11 -1
- data/doc/TaskJuggler/CellSettingPatternList.html +11 -1
- data/doc/TaskJuggler/Charge.html +11 -1
- data/doc/TaskJuggler/ChargeListAttribute.html +11 -1
- data/doc/TaskJuggler/ChargeSet.html +11 -1
- data/doc/TaskJuggler/ChargeSetListAttribute.html +11 -1
- data/doc/TaskJuggler/CollisionDetector.html +1063 -0
- data/doc/TaskJuggler/ColumnListAttribute.html +11 -1
- data/doc/TaskJuggler/ColumnTable.html +11 -1
- data/doc/TaskJuggler/Daemon.html +11 -1
- data/doc/TaskJuggler/{OnShiftCache.html → DataCache.html} +127 -139
- data/doc/TaskJuggler/DataCacheEntry.html +711 -0
- data/doc/TaskJuggler/DateAttribute.html +11 -1
- data/doc/TaskJuggler/DefinitionListAttribute.html +11 -1
- data/doc/TaskJuggler/DependencyListAttribute.html +11 -1
- data/doc/TaskJuggler/DurationAttribute.html +16 -5
- data/doc/TaskJuggler/FileList.html +11 -1
- data/doc/TaskJuggler/FileRecord.html +11 -1
- data/doc/TaskJuggler/FixnumAttribute.html +19 -9
- data/doc/TaskJuggler/FlagListAttribute.html +29 -19
- data/doc/TaskJuggler/FloatAttribute.html +23 -13
- data/doc/TaskJuggler/FormatListAttribute.html +19 -9
- data/doc/TaskJuggler/GanttChart.html +94 -133
- data/doc/TaskJuggler/GanttContainer.html +11 -1
- data/doc/TaskJuggler/GanttHeader.html +11 -1
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +11 -1
- data/doc/TaskJuggler/GanttLine.html +11 -1
- data/doc/TaskJuggler/GanttLoadStack.html +11 -1
- data/doc/TaskJuggler/GanttMilestone.html +11 -1
- data/doc/TaskJuggler/GanttRouter.html +247 -596
- data/doc/TaskJuggler/GanttTaskBar.html +11 -1
- data/doc/TaskJuggler/HTMLDocument.html +11 -1
- data/doc/TaskJuggler/HTMLGraphics.html +11 -1
- data/doc/TaskJuggler/Interval.html +11 -1
- data/doc/TaskJuggler/IntervalListAttribute.html +33 -23
- data/doc/TaskJuggler/JobInfo.html +11 -1
- data/doc/TaskJuggler/Journal.html +11 -1
- data/doc/TaskJuggler/JournalEntry.html +11 -1
- data/doc/TaskJuggler/JournalEntryList.html +11 -1
- data/doc/TaskJuggler/KeywordArray.html +11 -1
- data/doc/TaskJuggler/KeywordDocumentation.html +16 -6
- data/doc/TaskJuggler/Limits.html +11 -1
- data/doc/TaskJuggler/Limits/Limit.html +11 -1
- data/doc/TaskJuggler/LimitsAttribute.html +24 -14
- data/doc/TaskJuggler/ListAttributeBase.html +11 -1
- data/doc/TaskJuggler/Log.html +11 -1
- data/doc/TaskJuggler/LogFile.html +11 -1
- data/doc/TaskJuggler/LogicalAttribute.html +11 -1
- data/doc/TaskJuggler/LogicalExpression.html +11 -1
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +19 -9
- data/doc/TaskJuggler/LogicalFlag.html +11 -1
- data/doc/TaskJuggler/LogicalFunction.html +11 -1
- data/doc/TaskJuggler/LogicalOperation.html +11 -1
- data/doc/TaskJuggler/Macro.html +11 -1
- data/doc/TaskJuggler/MacroTable.html +11 -1
- data/doc/TaskJuggler/ManagerResponsibilities.html +11 -1
- data/doc/TaskJuggler/ManagerStatusRecord.html +11 -1
- data/doc/TaskJuggler/Message.html +11 -1
- data/doc/TaskJuggler/MessageHandler.html +11 -1
- data/doc/TaskJuggler/Navigator.html +12 -2
- data/doc/TaskJuggler/NavigatorElement.html +11 -1
- data/doc/TaskJuggler/NikuProject.html +11 -1
- data/doc/TaskJuggler/NikuReport.html +11 -1
- data/doc/TaskJuggler/NikuResource.html +11 -1
- data/doc/TaskJuggler/NodeListAttribute.html +17 -7
- data/doc/TaskJuggler/PlaceHolderCell.html +722 -0
- data/doc/TaskJuggler/ProcessIntercom.html +11 -1
- data/doc/TaskJuggler/ProcessIntercomIface.html +11 -1
- data/doc/TaskJuggler/Project.html +587 -500
- data/doc/TaskJuggler/ProjectBroker.html +11 -1
- data/doc/TaskJuggler/ProjectBrokerIface.html +11 -1
- data/doc/TaskJuggler/ProjectFileParser.html +205 -192
- data/doc/TaskJuggler/ProjectFileScanner.html +230 -207
- data/doc/TaskJuggler/ProjectRecord.html +11 -1
- data/doc/TaskJuggler/ProjectServer.html +11 -1
- data/doc/TaskJuggler/ProjectServerIface.html +11 -1
- data/doc/TaskJuggler/PropertyAttribute.html +19 -9
- data/doc/TaskJuggler/PropertyList.html +95 -83
- data/doc/TaskJuggler/PropertySet.html +11 -1
- data/doc/TaskJuggler/PropertyTreeNode.html +11 -1
- data/doc/TaskJuggler/Query.html +234 -232
- data/doc/TaskJuggler/RTFHandlers.html +11 -1
- data/doc/TaskJuggler/RTFNavigator.html +11 -1
- data/doc/TaskJuggler/RTFQuery.html +11 -1
- data/doc/TaskJuggler/RTFReport.html +11 -1
- data/doc/TaskJuggler/RTFReportLink.html +11 -1
- data/doc/TaskJuggler/RTFWithQuerySupport.html +11 -1
- data/doc/TaskJuggler/RealFormat.html +12 -2
- data/doc/TaskJuggler/RealFormatAttribute.html +15 -5
- data/doc/TaskJuggler/ReferenceAttribute.html +38 -28
- data/doc/TaskJuggler/Report.html +96 -113
- data/doc/TaskJuggler/ReportBase.html +161 -152
- data/doc/TaskJuggler/ReportContext.html +11 -1
- data/doc/TaskJuggler/ReportServer.html +59 -48
- data/doc/TaskJuggler/ReportServerIface.html +51 -41
- data/doc/TaskJuggler/ReportServerRecord.html +11 -1
- data/doc/TaskJuggler/ReportServlet.html +11 -1
- data/doc/TaskJuggler/ReportTable.html +46 -25
- data/doc/TaskJuggler/ReportTableCell.html +296 -275
- data/doc/TaskJuggler/ReportTableColumn.html +14 -4
- data/doc/TaskJuggler/ReportTableLegend.html +11 -1
- data/doc/TaskJuggler/ReportTableLine.html +19 -7
- data/doc/TaskJuggler/Resource.html +12 -2
- data/doc/TaskJuggler/ResourceListAttribute.html +40 -30
- data/doc/TaskJuggler/ResourceListRE.html +11 -1
- data/doc/TaskJuggler/ResourceScenario.html +708 -565
- data/doc/TaskJuggler/RichText.html +54 -36
- data/doc/TaskJuggler/RichTextAttribute.html +31 -21
- data/doc/TaskJuggler/RichTextDocument.html +11 -1
- data/doc/TaskJuggler/RichTextElement.html +11 -1
- data/doc/TaskJuggler/RichTextFunctionExample.html +11 -1
- data/doc/TaskJuggler/RichTextFunctionHandler.html +11 -1
- data/doc/TaskJuggler/RichTextImage.html +11 -1
- data/doc/TaskJuggler/RichTextIntermediate.html +81 -71
- data/doc/TaskJuggler/RichTextParser.html +88 -33
- data/doc/TaskJuggler/RichTextScanner.html +45 -35
- data/doc/TaskJuggler/RichTextSnip.html +11 -1
- data/doc/TaskJuggler/RichTextSyntaxRules.html +436 -389
- data/doc/TaskJuggler/Scenario.html +11 -1
- data/doc/TaskJuggler/ScenarioData.html +11 -1
- data/doc/TaskJuggler/ScenarioListAttribute.html +23 -13
- data/doc/TaskJuggler/Scoreboard.html +92 -73
- data/doc/TaskJuggler/SheetHandlerBase.html +11 -1
- data/doc/TaskJuggler/SheetReceiver.html +11 -1
- data/doc/TaskJuggler/SheetSender.html +11 -1
- data/doc/TaskJuggler/Shift.html +11 -1
- data/doc/TaskJuggler/ShiftAssignment.html +11 -1
- data/doc/TaskJuggler/ShiftAssignments.html +11 -1
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +24 -14
- data/doc/TaskJuggler/ShiftScenario.html +11 -1
- data/doc/TaskJuggler/SimpleQueryExpander.html +11 -1
- data/doc/TaskJuggler/SortListAttribute.html +21 -11
- data/doc/TaskJuggler/SourceFileInfo.html +11 -1
- data/doc/TaskJuggler/StatusSheetReceiver.html +11 -1
- data/doc/TaskJuggler/StatusSheetReport.html +11 -1
- data/doc/TaskJuggler/StatusSheetSender.html +112 -11
- data/doc/TaskJuggler/StringAttribute.html +23 -13
- data/doc/TaskJuggler/SymbolAttribute.html +19 -9
- data/doc/TaskJuggler/SyntaxReference.html +80 -71
- data/doc/TaskJuggler/TOCEntry.html +11 -1
- data/doc/TaskJuggler/TSResourceRecord.html +11 -1
- data/doc/TaskJuggler/TSTaskRecord.html +11 -1
- data/doc/TaskJuggler/TableColumnDefinition.html +11 -1
- data/doc/TaskJuggler/TableOfContents.html +11 -1
- data/doc/TaskJuggler/TableReport.html +422 -411
- data/doc/TaskJuggler/Task.html +11 -1
- data/doc/TaskJuggler/TaskDependency.html +11 -1
- data/doc/TaskJuggler/TaskListAttribute.html +33 -23
- data/doc/TaskJuggler/TaskListRE.html +11 -1
- data/doc/TaskJuggler/TaskScenario.html +2007 -1919
- data/doc/TaskJuggler/TextFormatter.html +11 -1
- data/doc/TaskJuggler/TextParser.html +421 -612
- data/doc/TaskJuggler/TextParser/Pattern.html +410 -211
- data/doc/TaskJuggler/TextParser/Rule.html +224 -152
- data/doc/TaskJuggler/TextParser/StackElement.html +190 -28
- data/doc/TaskJuggler/TextParser/State.html +989 -0
- data/doc/TaskJuggler/TextParser/StateTransition.html +782 -0
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +25 -14
- data/doc/TaskJuggler/TextParser/TokenDoc.html +11 -1
- data/doc/TaskJuggler/TextReport.html +11 -1
- data/doc/TaskJuggler/TextScanner.html +285 -273
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +17 -7
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +24 -14
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +11 -1
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +64 -52
- data/doc/TaskJuggler/TimeSheet.html +11 -1
- data/doc/TaskJuggler/TimeSheetReceiver.html +11 -1
- data/doc/TaskJuggler/TimeSheetRecord.html +11 -1
- data/doc/TaskJuggler/TimeSheetReport.html +11 -1
- data/doc/TaskJuggler/TimeSheetSender.html +11 -1
- data/doc/TaskJuggler/TimeSheetSummary.html +11 -1
- data/doc/TaskJuggler/TimeSheets.html +11 -1
- data/doc/TaskJuggler/Tj3AppBase.html +11 -1
- data/doc/TaskJuggler/Tj3Client.html +11 -1
- data/doc/TaskJuggler/Tj3Daemon.html +11 -1
- data/doc/TaskJuggler/Tj3SheetAppBase.html +11 -1
- data/doc/TaskJuggler/Tj3SsReceiver.html +11 -1
- data/doc/TaskJuggler/Tj3SsSender.html +11 -1
- data/doc/TaskJuggler/Tj3TsReceiver.html +11 -1
- data/doc/TaskJuggler/Tj3TsSender.html +11 -1
- data/doc/TaskJuggler/Tj3TsSummary.html +11 -1
- data/doc/TaskJuggler/TjException.html +11 -1
- data/doc/TaskJuggler/TjTime.html +474 -324
- data/doc/TaskJuggler/TjpExample.html +11 -1
- data/doc/TaskJuggler/TjpExportRE.html +11 -1
- data/doc/TaskJuggler/TjpSyntaxRules.html +3731 -3662
- data/doc/TaskJuggler/URLParameter.html +11 -1
- data/doc/TaskJuggler/UserManual.html +11 -1
- data/doc/TaskJuggler/VimSyntax.html +11 -1
- data/doc/TaskJuggler/WebServer.html +11 -1
- data/doc/TaskJuggler/WorkingHours.html +295 -221
- data/doc/TaskJuggler/WorkingHoursAttribute.html +11 -1
- data/doc/TaskJuggler/XMLBlob.html +11 -1
- data/doc/TaskJuggler/XMLComment.html +11 -1
- data/doc/TaskJuggler/XMLDocument.html +11 -1
- data/doc/TaskJuggler/XMLElement.html +11 -1
- data/doc/TaskJuggler/XMLNamedText.html +11 -1
- data/doc/TaskJuggler/XMLText.html +11 -1
- data/doc/index.html +694 -624
- data/doc/lib/AppConfig_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +1 -1
- data/doc/lib/Booking_rb.html +1 -1
- data/doc/lib/DataCache_rb.html +69 -0
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +1 -1
- data/doc/lib/ProjectFileScanner_rb.html +1 -1
- data/doc/lib/Project_rb.html +1 -1
- data/doc/lib/PropertyList_rb.html +1 -1
- data/doc/lib/Query_rb.html +1 -1
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +1 -1
- data/doc/lib/Resource_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +1 -1
- data/doc/lib/RichTextScanner_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
- data/doc/lib/RichText_rb.html +1 -1
- data/doc/lib/Scoreboard_rb.html +1 -1
- data/doc/lib/StatusSheetSender_rb.html +1 -1
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +1 -1
- data/doc/lib/TaskScenario_rb.html +3 -1
- data/doc/lib/TextParser/Pattern_rb.html +3 -1
- data/doc/lib/TextParser/Rule_rb.html +3 -1
- data/doc/lib/TextParser/StackElement_rb.html +3 -1
- data/doc/lib/TextParser/State_rb.html +65 -0
- data/doc/lib/TextParser_rb.html +1 -1
- data/doc/lib/TextScanner_rb.html +1 -1
- data/doc/lib/Tj3Config_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +1 -1
- data/doc/lib/WorkingHours_rb.html +3 -1
- data/doc/lib/daemon/ReportServer_rb.html +1 -1
- data/doc/lib/reports/CSVFile_rb.html +1 -1
- data/doc/lib/reports/CollisionDetector_rb.html +67 -0
- data/doc/lib/reports/GanttChart_rb.html +1 -1
- data/doc/lib/reports/GanttRouter_rb.html +3 -1
- data/doc/lib/reports/Navigator_rb.html +1 -1
- data/doc/lib/reports/ReportBase_rb.html +1 -1
- data/doc/lib/reports/ReportTableCell_rb.html +1 -1
- data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/reports/ReportTable_rb.html +1 -1
- data/doc/lib/reports/Report_rb.html +1 -1
- data/doc/lib/reports/TableReport_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +1 -1
- data/examples/tutorial.tjp +1 -2
- data/lib/AppConfig.rb +10 -4
- data/lib/Attributes.rb +4 -4
- data/lib/DataCache.rb +124 -0
- data/lib/KeywordDocumentation.rb +5 -5
- data/lib/Project.rb +54 -10
- data/lib/ProjectFileParser.rb +10 -9
- data/lib/ProjectFileScanner.rb +38 -25
- data/lib/PropertyList.rb +6 -4
- data/lib/Query.rb +0 -8
- data/lib/RealFormat.rb +1 -1
- data/lib/Resource.rb +1 -1
- data/lib/ResourceScenario.rb +96 -31
- data/lib/RichText.rb +17 -5
- data/lib/RichTextParser.rb +22 -9
- data/lib/RichTextScanner.rb +34 -34
- data/lib/RichTextSyntaxRules.rb +41 -36
- data/lib/Scoreboard.rb +16 -7
- data/lib/StatusSheetSender.rb +63 -0
- data/lib/SyntaxReference.rb +9 -10
- data/lib/TaskJuggler.rb +28 -4
- data/lib/TaskScenario.rb +66 -19
- data/lib/TextParser.rb +219 -384
- data/lib/TextParser/Pattern.rb +168 -49
- data/lib/TextParser/Rule.rb +33 -17
- data/lib/TextParser/StackElement.rb +42 -2
- data/lib/TextParser/State.rb +175 -0
- data/lib/TextScanner.rb +19 -15
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +111 -3
- data/lib/TjpSyntaxRules.rb +122 -66
- data/lib/WorkingHours.rb +91 -186
- data/lib/daemon/ReportServer.rb +3 -2
- data/lib/reports/CSVFile.rb +1 -1
- data/lib/reports/CollisionDetector.rb +177 -0
- data/lib/reports/GanttChart.rb +25 -41
- data/lib/reports/GanttRouter.rb +104 -233
- data/lib/reports/Navigator.rb +1 -1
- data/lib/reports/Report.rb +9 -33
- data/lib/reports/ReportBase.rb +0 -1
- data/lib/reports/ReportTable.rb +19 -8
- data/lib/reports/ReportTableCell.rb +61 -25
- data/lib/reports/ReportTableColumn.rb +2 -2
- data/lib/reports/ReportTableLine.rb +4 -2
- data/lib/reports/TableReport.rb +1 -0
- data/lib/taskjuggler3.rb +0 -1
- data/manual/Installation +7 -3
- data/manual/Intro +12 -10
- data/manual/The_TaskJuggler_Syntax +4 -4
- data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/genrefs +1 -1
- data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -4
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -22
- data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -14
- data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +32 -24
- data/test/TestSuite/CSV-Reports/weekly-Reference.csv +13 -0
- data/test/TestSuite/CSV-Reports/weekly.tjp +9 -0
- data/test/TestSuite/HTML-Reports/css/tjreport.css +7 -2
- data/test/TestSuite/HTML-Reports/depArrows.html +839 -830
- data/test/TestSuite/HTML-Reports/depArrows.tjp +12 -12
- data/test/TestSuite/HTML-Reports/profile.html +37581 -0
- data/test/TestSuite/ReportGenerator/Errors/no_report_defined.tjp +7 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +1 -1
- data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/missing-reports +2 -0
- data/test/TestSuite/StatusSheets/run +2 -0
- data/test/TestSuite/Syntax/Correct/Booking.tjp +13 -5
- data/test/TestSuite/Syntax/Correct/ResourceRoot.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/RollupResource.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/include_before_project.tjp +2 -0
- data/test/TestSuite/Syntax/Errors/no_reduce.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
- data/test/TestSuite/TimeSheets/run +1 -1
- data/test/test_CSV-Reports.rb +2 -4
- data/test/test_CollisionDetector.rb +85 -0
- data/test/test_Project.rb +2 -2
- data/test/test_ProjectFileScanner.rb +73 -31
- data/test/test_Query.rb +2 -2
- data/test/test_ReportGenerator.rb +1 -1
- data/test/test_RichText.rb +4 -4
- data/test/test_WorkingHours.rb +150 -11
- metadata +75 -67
- data/test/TestSuite/ReportGenerator/Errors/css/tjreport.css +0 -407
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +0 -26
- data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -3210
- data/test/TestSuite/Scheduler/Correct/Container.html +0 -349
- data/test/TestSuite/Scheduler/Correct/Limits.html +0 -4964
- data/test/TestSuite/Scheduler/Correct/Shift.html +0 -1719
- data/test/TestSuite/Scheduler/Correct/Shift2.html +0 -476
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -66
- data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +0 -66
- data/test/TestSuite/Scheduler/Errors/css/tjreport.css +0 -407
- data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
- data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
- data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +0 -1301
- data/test/TestSuite/StatusSheets/resrep.tji +0 -7
- data/test/TestSuite/StatusSheets/tj3d.log +0 -312
- data/test/TestSuite/Syntax/Correct/Managers.html +0 -263
- data/test/TestSuite/TimeSheets/acceptable_intervals +0 -1
- data/test/TestSuite/TimeSheets/statussheets.log +0 -1
data/lib/RichText.rb
CHANGED
|
@@ -73,6 +73,10 @@ class TaskJuggler
|
|
|
73
73
|
|
|
74
74
|
attr_reader :inputText, :messageHandler
|
|
75
75
|
|
|
76
|
+
# The Parser uses complex to setup data structures that are identical for
|
|
77
|
+
# all RichText instances. So, we'll share them across the instances.
|
|
78
|
+
@@parser = nil
|
|
79
|
+
|
|
76
80
|
# Create a rich text object by passing a String with markup elements to it.
|
|
77
81
|
# _text_ must be plain text with MediaWiki compatible markup elements. In
|
|
78
82
|
# case an error occurs, an exception of type TjException will be raised.
|
|
@@ -94,12 +98,20 @@ class TaskJuggler
|
|
|
94
98
|
@functionHandlers.each do |h|
|
|
95
99
|
rti.registerFunctionHandler(h)
|
|
96
100
|
end
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
|
|
102
|
+
# We'll setup the RichTextParser once and share it across all instances.
|
|
103
|
+
if @@parser
|
|
104
|
+
# We already have a RichTextParser that we can reuse.
|
|
105
|
+
@@parser.reuse(@messageHandler, rti, sectionCounter, tokenSet)
|
|
106
|
+
else
|
|
107
|
+
# There is no RichTextParser yet, create one.
|
|
108
|
+
@@parser = RichTextParser.new(@messageHandler, rti, sectionCounter,
|
|
109
|
+
tokenSet)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
@@parser.open(@inputText)
|
|
101
113
|
# Parse the input text and convert it to the intermediate representation.
|
|
102
|
-
return nil if (tree = parser.parse(
|
|
114
|
+
return nil if (tree = @@parser.parse(:richtext)) == false
|
|
103
115
|
|
|
104
116
|
# In case the result is empty, use an empty RichTextElement as result
|
|
105
117
|
tree = RichTextElement.new(rti, :richtext, nil) unless tree
|
data/lib/RichTextParser.rb
CHANGED
|
@@ -32,24 +32,37 @@ class TaskJuggler
|
|
|
32
32
|
super(messageHandler)
|
|
33
33
|
@richTextI = rti
|
|
34
34
|
# These are the tokens that can be returned by the RichTextScanner.
|
|
35
|
-
@variables =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
@variables = [ :LINEBREAK, :SPACE, :WORD,
|
|
36
|
+
:BOLD, :ITALIC, :CODE, :BOLDITALIC, :PRE,
|
|
37
|
+
:HREF, :HREFEND, :REF, :REFEND, :HLINE,
|
|
38
|
+
:QUERY,
|
|
39
|
+
:INLINEFUNCSTART, :INLINEFUNCEND,
|
|
40
|
+
:BLOCKFUNCSTART, :BLOCKFUNCEND, :ID, :STRING,
|
|
41
|
+
:TITLE1, :TITLE2, :TITLE3, :TITLE4,
|
|
42
|
+
:TITLE1END, :TITLE2END, :TITLE3END, :TITLE4END,
|
|
43
|
+
:BULLET1, :BULLET2, :BULLET3, :BULLET4,
|
|
44
|
+
:NUMBER1, :NUMBER2, :NUMBER3, :NUMBER4
|
|
45
|
+
]
|
|
44
46
|
limitTokenSet(tokenSet)
|
|
45
47
|
# Load the rule set into the parser.
|
|
46
48
|
initRules
|
|
49
|
+
updateParserTables
|
|
47
50
|
# The sections and numbered list can each nest 3 levels deep. We use these
|
|
48
51
|
# counter Arrays to generate proper 1.2.3 type labels.
|
|
49
52
|
@sectionCounter = sectionCounter
|
|
50
53
|
@numberListCounter = [ 0, 0, 0, 0 ]
|
|
51
54
|
end
|
|
52
55
|
|
|
56
|
+
def reuse(messageHandler, rti, sectionCounter = [ 0, 0, 0, 0],
|
|
57
|
+
tokenSet = nil)
|
|
58
|
+
@blockedVariables = {}
|
|
59
|
+
@stack = nil
|
|
60
|
+
@richTextI = rti
|
|
61
|
+
@messageHandler = messageHandler
|
|
62
|
+
@sectionCounter = sectionCounter
|
|
63
|
+
limitTokenSet(tokenSet)
|
|
64
|
+
end
|
|
65
|
+
|
|
53
66
|
# Construct the parser and get ready to read.
|
|
54
67
|
def open(text)
|
|
55
68
|
# Make sure that the last line is properly terminated with a newline.
|
data/lib/RichTextScanner.rb
CHANGED
|
@@ -32,61 +32,61 @@ class TaskJuggler
|
|
|
32
32
|
def initialize(masterFile, messageHandler)
|
|
33
33
|
tokenPatterns = [
|
|
34
34
|
# :bol mode rules
|
|
35
|
-
[
|
|
35
|
+
[ :LINEBREAK, /\s*\n/, :bol, method('linebreak') ],
|
|
36
36
|
[ nil, /\s+/, :bol, method('inlineMode') ],
|
|
37
37
|
|
|
38
38
|
# :bop mode rules
|
|
39
|
-
[
|
|
39
|
+
[ :PRE, / [^\n]+\n?/, :bop, method('pre') ],
|
|
40
40
|
[ nil, /\s*\n/, :bop, method('linebreak') ],
|
|
41
41
|
|
|
42
42
|
# :inline mode rules
|
|
43
|
-
[
|
|
43
|
+
[ :SPACE, /[ \t\n]+/, :inline, method('space') ],
|
|
44
44
|
|
|
45
45
|
# :bop and :bol mode rules
|
|
46
|
-
[
|
|
46
|
+
[ :INLINEFUNCSTART, /<-/, [ :bop, :bol, :inline ],
|
|
47
47
|
method('functionStart') ],
|
|
48
|
-
[
|
|
49
|
-
[ 'TITLE*', /={2,5}/, [ :bop, :bol ], method('titleStart') ],
|
|
48
|
+
[ :BLOCKFUNCSTART, /<\[/, [ :bop, :bol ], method('functionStart') ],
|
|
49
|
+
[ ':TITLE*', /={2,5}/, [ :bop, :bol ], method('titleStart') ],
|
|
50
50
|
[ 'TITLE*END', /={2,5}/, :inline, method('titleEnd') ],
|
|
51
51
|
[ 'BULLET*', /\*{1,4} /, [ :bop, :bol ], method('bullet') ],
|
|
52
52
|
[ 'NUMBER*', /\#{1,4} /, [ :bop, :bol ], method('number') ],
|
|
53
|
-
[
|
|
53
|
+
[ :HLINE, /----/, [ :bop, :bol ], method('inlineMode') ],
|
|
54
54
|
|
|
55
55
|
# :bop, :bol and :inline mode rules
|
|
56
56
|
# The <nowiki> token puts the scanner into :nowiki mode.
|
|
57
57
|
[ nil, /<nowiki>/, [ :bop, :bol, :inline ], method('nowikiStart') ],
|
|
58
|
-
[
|
|
59
|
-
[
|
|
60
|
-
[
|
|
61
|
-
[
|
|
58
|
+
[ :QUOTES, /'{2,5}/, [ :bop, :bol, :inline ], method('quotes') ],
|
|
59
|
+
[ :REF, /\[\[/, [ :bop, :bol, :inline ], method('refStart') ],
|
|
60
|
+
[ :HREF, /\[/, [ :bop, :bol, :inline], method('hrefStart') ],
|
|
61
|
+
[ :WORD, /.[^ \n\t\[<']*/, [ :bop, :bol, :inline ],
|
|
62
62
|
method('inlineMode') ],
|
|
63
63
|
|
|
64
64
|
# :nowiki mode rules
|
|
65
65
|
[ nil, /<\/nowiki>/, :nowiki, method('nowikiEnd') ],
|
|
66
|
-
[
|
|
67
|
-
[
|
|
68
|
-
[
|
|
66
|
+
[ :WORD, /(<(?!\/nowiki>)|[^ \t\n<])+/, :nowiki ],
|
|
67
|
+
[ :SPACE, /[ \t]+/, :nowiki ],
|
|
68
|
+
[ :LINEBREAK, /\s*\n/, :nowiki ],
|
|
69
69
|
|
|
70
70
|
# :ref mode rules
|
|
71
|
-
[
|
|
72
|
-
[
|
|
73
|
-
[
|
|
74
|
-
[
|
|
71
|
+
[ :REFEND, /\]\]/, :ref, method('refEnd') ],
|
|
72
|
+
[ :WORD, /(<(?!-)|(\](?!\])|[^|<\]]))+/, :ref ],
|
|
73
|
+
[ :QUERY, /<-\w+->/, :ref, method('query') ],
|
|
74
|
+
[ :LITERAL, /./, :ref ],
|
|
75
75
|
|
|
76
76
|
# :href mode rules
|
|
77
|
-
[
|
|
78
|
-
[
|
|
79
|
-
[
|
|
80
|
-
[
|
|
77
|
+
[ :HREFEND, /\]/, :href, method('hrefEnd') ],
|
|
78
|
+
[ :WORD, /(<(?!-)|[^ \t\n\]<])+/, :href ],
|
|
79
|
+
[ :QUERY, /<-\w+->/, :href, method('query') ],
|
|
80
|
+
[ :SPACE, /[ \t\n]+/, :href ],
|
|
81
81
|
|
|
82
82
|
# :func mode rules
|
|
83
|
-
[
|
|
84
|
-
[
|
|
85
|
-
[
|
|
86
|
-
[
|
|
87
|
-
[
|
|
83
|
+
[ :INLINEFUNCEND, /->/ , :func, method('functionEnd') ],
|
|
84
|
+
[ :BLOCKFUNCEND, /\]>/, :func, method('functionEnd') ],
|
|
85
|
+
[ :ID, /[a-zA-Z_]\w*/, :func ],
|
|
86
|
+
[ :STRING, /"(\\"|[^"])*"/, :func, method('dqString') ],
|
|
87
|
+
[ :STRING, /'(\\'|[^'])*'/, :func, method('sqString') ],
|
|
88
88
|
[ nil, /[ \t\n]+/, :func ],
|
|
89
|
-
[
|
|
89
|
+
[ :LITERAL, /./, :func ]
|
|
90
90
|
]
|
|
91
91
|
super(masterFile, messageHandler, tokenPatterns, :bop)
|
|
92
92
|
end
|
|
@@ -100,7 +100,7 @@ class TaskJuggler
|
|
|
100
100
|
# And return an empty string.
|
|
101
101
|
match = ''
|
|
102
102
|
end
|
|
103
|
-
[type, match ]
|
|
103
|
+
[ type, match ]
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def linebreak(type, match)
|
|
@@ -115,26 +115,26 @@ class TaskJuggler
|
|
|
115
115
|
|
|
116
116
|
def titleStart(type, match)
|
|
117
117
|
self.mode = :inline
|
|
118
|
-
[ "TITLE#{match.length - 1}", match ]
|
|
118
|
+
[ "TITLE#{match.length - 1}".intern, match ]
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
def titleEnd(type, match)
|
|
122
|
-
[ "TITLE#{match.length - 1}END", match ]
|
|
122
|
+
[ "TITLE#{match.length - 1}END".intern, match ]
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
def bullet(type, match)
|
|
126
126
|
self.mode = :inline
|
|
127
|
-
[ "BULLET#{match.length - 1}", match ]
|
|
127
|
+
[ "BULLET#{match.length - 1}".intern, match ]
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def number(type, match)
|
|
131
131
|
self.mode = :inline
|
|
132
|
-
[ "NUMBER#{match.length - 1}", match ]
|
|
132
|
+
[ "NUMBER#{match.length - 1}".intern, match ]
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def quotes(type, match)
|
|
136
136
|
self.mode = :inline
|
|
137
|
-
types = [ nil, nil,
|
|
137
|
+
types = [ nil, nil, :ITALIC, :BOLD , :CODE, :BOLDITALIC ]
|
|
138
138
|
[ types[match.length], match ]
|
|
139
139
|
end
|
|
140
140
|
|
data/lib/RichTextSyntaxRules.rb
CHANGED
|
@@ -35,32 +35,38 @@ class TaskJuggler
|
|
|
35
35
|
})
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
# The following syntax elements are all block elements that can span
|
|
39
|
-
# multiple lines.
|
|
40
38
|
def rule_sections
|
|
41
39
|
optional
|
|
42
40
|
repeatable
|
|
43
|
-
pattern(%w( !
|
|
41
|
+
pattern(%w( !section !blankLines ), lambda {
|
|
44
42
|
@val[0]
|
|
45
43
|
})
|
|
46
|
-
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# The following syntax elements are all block elements that can span
|
|
47
|
+
# multiple lines.
|
|
48
|
+
def rule_section
|
|
49
|
+
pattern(%w( !headlines ), lambda {
|
|
50
|
+
@val[0]
|
|
51
|
+
})
|
|
52
|
+
pattern(%w( $HLINE ), lambda {
|
|
47
53
|
RichTextElement.new(@richTextI, :hline, @val[0])
|
|
48
54
|
})
|
|
49
|
-
pattern(%w( !paragraph
|
|
55
|
+
pattern(%w( !paragraph ), lambda {
|
|
50
56
|
@val[0]
|
|
51
57
|
})
|
|
52
|
-
pattern(%w( !pre
|
|
58
|
+
pattern(%w( !pre ), lambda {
|
|
53
59
|
RichTextElement.new(@richTextI, :pre, @val[0].join)
|
|
54
60
|
})
|
|
55
|
-
pattern(%w( !bulletList1
|
|
61
|
+
pattern(%w( !bulletList1 ), lambda {
|
|
56
62
|
|
|
57
63
|
RichTextElement.new(@richTextI, :bulletlist1, @val[0])
|
|
58
64
|
})
|
|
59
|
-
pattern(%w( !numberList1
|
|
65
|
+
pattern(%w( !numberList1 ), lambda {
|
|
60
66
|
@numberListCounter = [ 0, 0, 0, 0 ]
|
|
61
67
|
RichTextElement.new(@richTextI, :numberlist1, @val[0])
|
|
62
68
|
})
|
|
63
|
-
pattern(%w( !blockFunction
|
|
69
|
+
pattern(%w( !blockFunction ), lambda {
|
|
64
70
|
@val[0]
|
|
65
71
|
})
|
|
66
72
|
end
|
|
@@ -242,19 +248,19 @@ class TaskJuggler
|
|
|
242
248
|
# Since the italic end marker will disappear we need to make sure
|
|
243
249
|
# there was no space before it.
|
|
244
250
|
@val[2].last.appendSpace = false if @val[2].last
|
|
245
|
-
el.appendSpace = !@val[4].
|
|
251
|
+
el.appendSpace = !@val[4].nil?
|
|
246
252
|
el
|
|
247
253
|
})
|
|
248
254
|
pattern(%w( $BOLD !space !plainTextWithLinks $BOLD !space ), lambda {
|
|
249
255
|
el = RichTextElement.new(@richTextI, :bold, @val[2])
|
|
250
256
|
@val[2].last.appendSpace = false if @val[2].last
|
|
251
|
-
el.appendSpace = !@val[4].
|
|
257
|
+
el.appendSpace = !@val[4].nil?
|
|
252
258
|
el
|
|
253
259
|
})
|
|
254
260
|
pattern(%w( $CODE !space !plainTextWithLinks $CODE !space ), lambda {
|
|
255
261
|
el = RichTextElement.new(@richTextI, :code, @val[2])
|
|
256
262
|
@val[2].last.appendSpace = false if @val[2].last
|
|
257
|
-
el.appendSpace = !@val[4].
|
|
263
|
+
el.appendSpace = !@val[4].nil?
|
|
258
264
|
el
|
|
259
265
|
})
|
|
260
266
|
pattern(%w( $BOLDITALIC !space !plainTextWithLinks $BOLDITALIC !space ),
|
|
@@ -263,13 +269,12 @@ class TaskJuggler
|
|
|
263
269
|
:bold, RichTextElement.new(@richTextI,
|
|
264
270
|
:italic, @val[2]))
|
|
265
271
|
@val[2].last.appendSpace = false if @val[2].last
|
|
266
|
-
el.appendSpace = !@val[4].
|
|
272
|
+
el.appendSpace = !@val[4].nil?
|
|
267
273
|
el
|
|
268
274
|
})
|
|
269
275
|
end
|
|
270
276
|
|
|
271
277
|
def rule_plainTextWithLinks
|
|
272
|
-
repeatable
|
|
273
278
|
pattern(%w( !plainText ), lambda {
|
|
274
279
|
@val[0]
|
|
275
280
|
})
|
|
@@ -291,34 +296,34 @@ class TaskJuggler
|
|
|
291
296
|
error('rt_file_bad_ext', "Unsupported file type: #{extension}")
|
|
292
297
|
end
|
|
293
298
|
el.data = img = RichTextImage.new(locator)
|
|
294
|
-
@val[2]
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
299
|
+
if @val[2]
|
|
300
|
+
@val[2].each do |token|
|
|
301
|
+
if token[0, 4] == 'alt='
|
|
302
|
+
img.altText = token[4..-1]
|
|
303
|
+
elsif %w( top middle bottom baseline sub super text-top
|
|
304
|
+
text-bottom ).include?(token)
|
|
305
|
+
img.verticalAlign = token
|
|
306
|
+
else
|
|
307
|
+
error('rt_bad_file_option',
|
|
308
|
+
"Unknown option '#{token}' for file reference " +
|
|
309
|
+
"#{v1}.")
|
|
310
|
+
end
|
|
304
311
|
end
|
|
305
312
|
end
|
|
306
313
|
else
|
|
314
|
+
val = @val[2] || v1
|
|
307
315
|
el = RichTextElement.new(@richTextI, :ref,
|
|
308
|
-
RichTextElement.new(@richTextI,
|
|
309
|
-
:text, @val[2].empty? ?
|
|
310
|
-
v1 : @val[2]))
|
|
316
|
+
RichTextElement.new(@richTextI, :text, val))
|
|
311
317
|
el.data = v1
|
|
312
|
-
el.appendSpace = !@val[4].
|
|
318
|
+
el.appendSpace = !@val[4].nil?
|
|
313
319
|
end
|
|
314
320
|
el
|
|
315
321
|
})
|
|
316
322
|
pattern(%w( $HREF !wordWithQueries !space !plainTextWithQueries
|
|
317
323
|
$HREFEND !space ), lambda {
|
|
318
|
-
el = RichTextElement.new(@richTextI, :href, @val[3]
|
|
319
|
-
@val[1] : @val[3])
|
|
324
|
+
el = RichTextElement.new(@richTextI, :href, @val[3] || @val[1])
|
|
320
325
|
el.data = RichTextElement.new(@richTextI, :richtext, @val[1])
|
|
321
|
-
el.appendSpace = !@val[5].
|
|
326
|
+
el.appendSpace = !@val[5].nil?
|
|
322
327
|
el
|
|
323
328
|
})
|
|
324
329
|
end
|
|
@@ -361,7 +366,7 @@ class TaskJuggler
|
|
|
361
366
|
optional
|
|
362
367
|
pattern(%w( $WORD !space ), lambda {
|
|
363
368
|
el = RichTextElement.new(@richTextI, :text, @val[0])
|
|
364
|
-
el.appendSpace = !@val[1].
|
|
369
|
+
el.appendSpace = !@val[1].nil?
|
|
365
370
|
el
|
|
366
371
|
})
|
|
367
372
|
end
|
|
@@ -370,7 +375,7 @@ class TaskJuggler
|
|
|
370
375
|
repeatable
|
|
371
376
|
optional
|
|
372
377
|
pattern(%w( !wordWithQueries !space ), lambda {
|
|
373
|
-
@val[0][-1].appendSpace = true if
|
|
378
|
+
@val[0][-1].appendSpace = true if @val[1]
|
|
374
379
|
@val[0]
|
|
375
380
|
})
|
|
376
381
|
end
|
|
@@ -394,7 +399,7 @@ class TaskJuggler
|
|
|
394
399
|
pattern(%w( $BLOCKFUNCSTART $ID !functionArguments $BLOCKFUNCEND ),
|
|
395
400
|
lambda {
|
|
396
401
|
args = {}
|
|
397
|
-
@val[2].each { |arg| args[arg[0]] = arg[1] }
|
|
402
|
+
@val[2].each { |arg| args[arg[0]] = arg[1] } if @val[2]
|
|
398
403
|
el = RichTextElement.new(@richTextI, :blockfunc)
|
|
399
404
|
# Data is a 2 element Array with the function name and a Hash for the
|
|
400
405
|
# arguments.
|
|
@@ -412,7 +417,7 @@ class TaskJuggler
|
|
|
412
417
|
!space ),
|
|
413
418
|
lambda {
|
|
414
419
|
args = {}
|
|
415
|
-
@val[2].each { |arg| args[arg[0]] = arg[1] }
|
|
420
|
+
@val[2].each { |arg| args[arg[0]] = arg[1] } if @val[2]
|
|
416
421
|
el = RichTextElement.new(@richTextI, :inlinefunc)
|
|
417
422
|
# Data is a 2 element Array with the function name and a Hash for the
|
|
418
423
|
# arguments.
|
|
@@ -421,7 +426,7 @@ class TaskJuggler
|
|
|
421
426
|
"Unsupported inline function #{@val[1]}")
|
|
422
427
|
end
|
|
423
428
|
el.data = [@val[1], args ]
|
|
424
|
-
el.appendSpace = !@val[4].
|
|
429
|
+
el.appendSpace = !@val[4].nil?
|
|
425
430
|
el
|
|
426
431
|
})
|
|
427
432
|
end
|
data/lib/Scoreboard.rb
CHANGED
|
@@ -52,20 +52,29 @@ class TaskJuggler
|
|
|
52
52
|
# Converts a date to the corresponding scoreboard index. You can optionally
|
|
53
53
|
# sanitize the _date_ by forcing it into the project time span.
|
|
54
54
|
def dateToIdx(date, forceIntoProject = false)
|
|
55
|
+
idx = ((date - @startDate) / @resolution).to_i
|
|
56
|
+
|
|
55
57
|
if forceIntoProject
|
|
56
|
-
return 0 if
|
|
57
|
-
return @size - 1 if
|
|
58
|
-
elsif
|
|
58
|
+
return 0 if idx < 0
|
|
59
|
+
return @size - 1 if idx >= @size
|
|
60
|
+
elsif (idx < 0 || idx >= @size)
|
|
59
61
|
raise "Date #{date} is out of project time range " +
|
|
60
62
|
"(#{@startDate} - #{@endDate})"
|
|
61
63
|
end
|
|
62
|
-
|
|
64
|
+
|
|
65
|
+
idx
|
|
63
66
|
end
|
|
64
67
|
|
|
65
68
|
# Iterate over all scoreboard entries.
|
|
66
|
-
def each
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
def each(startIdx = 0, endIdx = @size)
|
|
70
|
+
if startIdx != 0 || endIdx != @size
|
|
71
|
+
startIdx.upto(endIdx - 1) do |i|
|
|
72
|
+
yield @sb[i]
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
@sb.each do |entry|
|
|
76
|
+
yield entry
|
|
77
|
+
end
|
|
69
78
|
end
|
|
70
79
|
end
|
|
71
80
|
|
data/lib/StatusSheetSender.rb
CHANGED
|
@@ -30,6 +30,8 @@ class TaskJuggler
|
|
|
30
30
|
@hideResource = '0'
|
|
31
31
|
# The base directory of the status sheet templates.
|
|
32
32
|
@templateDir = 'StatusSheetTemplates'
|
|
33
|
+
# The base directory of the received time sheets.
|
|
34
|
+
@timeSheetDir = 'TimeSheets'
|
|
33
35
|
# This file contains the time intervals that the StatusSheetReceiver will
|
|
34
36
|
# accept as a valid interval.
|
|
35
37
|
@signatureFile = "#{@templateDir}/acceptable_intervals"
|
|
@@ -46,9 +48,70 @@ text, UTF-8 encoded and the status sheet header from 'statussheet' to the period
|
|
|
46
48
|
end date must be in a single line that starts at the beginning of the line.
|
|
47
49
|
|
|
48
50
|
EOT
|
|
51
|
+
# tj3ts_summary generates a list of resources that have not submitted
|
|
52
|
+
# their reports yet. If you want to generate the warning below, make
|
|
53
|
+
# sure you run tj3ts_summary immediately before you sent the status sheet
|
|
54
|
+
# templates.
|
|
55
|
+
defaulters = defaulterList
|
|
56
|
+
unless defaulters.empty?
|
|
57
|
+
@introText += <<"EOT"
|
|
58
|
+
=============================== W A R N I N G ==============================
|
|
59
|
+
|
|
60
|
+
The following people have not submitted their report yet. The status reports
|
|
61
|
+
for the work they have done is not included in this template! You can either
|
|
62
|
+
manually add their status to the tasks or asked them to send their time sheet
|
|
63
|
+
immediately and re-request this template.
|
|
64
|
+
|
|
65
|
+
#{defaulters.join}
|
|
66
|
+
|
|
67
|
+
EOT
|
|
68
|
+
end
|
|
69
|
+
|
|
49
70
|
@mailSubject = "Your weekly status report template for %s"
|
|
50
71
|
end
|
|
51
72
|
|
|
73
|
+
def defaulterList
|
|
74
|
+
dirs = Dir.glob("#{@timeSheetDir}/????-??-??").sort
|
|
75
|
+
tsDir = nil
|
|
76
|
+
# The status sheet intervals and the time sheet intervals are not
|
|
77
|
+
# identical. The status sheet interval can be smaller and is somewhat
|
|
78
|
+
# later. But it always includes the end date of the corresponding time
|
|
79
|
+
# sheet period. To get the file with the IDs of the resources that have
|
|
80
|
+
# not submitted their report, we need to find the time sheet directory
|
|
81
|
+
# that is within the status sheet period.
|
|
82
|
+
repDate = Time.local(*@date.split('-'))
|
|
83
|
+
dirs.each do |dir|
|
|
84
|
+
dirDate = Time.local(*dir[-10..-1].split('-'))
|
|
85
|
+
if dirDate < repDate
|
|
86
|
+
tsDir = dir
|
|
87
|
+
else
|
|
88
|
+
break
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
# Check if there is a time sheet directory.
|
|
92
|
+
return [] unless tsDir
|
|
93
|
+
|
|
94
|
+
missingFile = "#{tsDir}/missing-reports"
|
|
95
|
+
# Check if it's got a missing-reports file.
|
|
96
|
+
return [] if !File.exists?(missingFile)
|
|
97
|
+
|
|
98
|
+
# The sheet could have been submitted after tj3ts_summary was run. We
|
|
99
|
+
# ignore the entry if a time sheet file now exists. There is a race
|
|
100
|
+
# condition here. The file may exist, but it may not yet be loaded for
|
|
101
|
+
# the current project that is used to generate the status report. There
|
|
102
|
+
# is a race condition here. The file may exist, but it may not yet be
|
|
103
|
+
# loaded for the current project that is used to generate the status
|
|
104
|
+
# report.
|
|
105
|
+
list = File.readlines(missingFile)
|
|
106
|
+
list.delete_if do |resource|
|
|
107
|
+
tsDate = tsDir[-10..-1]
|
|
108
|
+
File.exists?("#{tsDir}/#{resource.chomp}_#{tsDate}.tji")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Return the content of the file.
|
|
112
|
+
list
|
|
113
|
+
end
|
|
114
|
+
|
|
52
115
|
end
|
|
53
116
|
|
|
54
117
|
end
|