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
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = Rule.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
class TaskJuggler::TextParser
|
|
14
|
+
|
|
15
|
+
# A StateTransition maps a token type to the next state to be
|
|
16
|
+
# processed. A token descriptor is either a Symbol that maps to a RegExp in
|
|
17
|
+
# the TextScanner or an expected String. The transition may also have a
|
|
18
|
+
# list of State objects that are being activated by the transition.
|
|
19
|
+
class StateTransition
|
|
20
|
+
|
|
21
|
+
attr_reader :tokenType, :state, :stateStack, :loopBack
|
|
22
|
+
|
|
23
|
+
# Create a new StateTransition object. _descriptor_ is a [ token type,
|
|
24
|
+
# token value ] touple. _state_ is the State objects this transition
|
|
25
|
+
# originates at. _stateStack_ is the list of State objects that have been
|
|
26
|
+
# activated by this transition. _loopBack_ is a boolean flag that
|
|
27
|
+
# specifies whether the transition describes a loop back to the start of
|
|
28
|
+
# the Rule or not.
|
|
29
|
+
def initialize(descriptor, state, stateStack, loopBack)
|
|
30
|
+
if !descriptor.respond_to?(:length) || descriptor.length != 2
|
|
31
|
+
raise "Bad parameter descriptor: #{descriptor} " +
|
|
32
|
+
"of type #{descriptor.class}"
|
|
33
|
+
end
|
|
34
|
+
@tokenType = descriptor[0] == :eof ? :eof : descriptor[1]
|
|
35
|
+
|
|
36
|
+
if !state.is_a?(State)
|
|
37
|
+
raise "Bad parameter state: #{state} of type #{state.class}"
|
|
38
|
+
end
|
|
39
|
+
@state = state
|
|
40
|
+
|
|
41
|
+
if !stateStack.is_a?(Array)
|
|
42
|
+
raise "Bad parameter stateStack: #{stateStack} " +
|
|
43
|
+
"of type #{stateStack.class}"
|
|
44
|
+
end
|
|
45
|
+
@stateStack = stateStack.dup
|
|
46
|
+
@loopBack = loopBack
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Generate a human readable form of the TransitionState date. It's only
|
|
50
|
+
# used for debugging.
|
|
51
|
+
def to_s
|
|
52
|
+
str = "#{@state.rule.name}, " +
|
|
53
|
+
"#{@state.rule.patterns.index(@state.pattern)}, #{@state.index} "
|
|
54
|
+
unless @stateStack.empty?
|
|
55
|
+
str += "("
|
|
56
|
+
@stateStack.each do |s|
|
|
57
|
+
str += "#{s.rule.name} "
|
|
58
|
+
end
|
|
59
|
+
str += ")"
|
|
60
|
+
end
|
|
61
|
+
str += '(loop)' if @loopBack
|
|
62
|
+
str
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# This State objects describes a state of the TextParser FSM. A State
|
|
68
|
+
# captures the position in the syntax description that the parser is
|
|
69
|
+
# currently at. A position is defined by the Rule, the Pattern and the index
|
|
70
|
+
# of the current token of that Pattern. An index of 0 means, we've just read
|
|
71
|
+
# the 1st token of the pattern. States which have no Pattern describe the
|
|
72
|
+
# start of rule. The parser has not yet identified the first token, so it
|
|
73
|
+
# doesn't know the Pattern yet.
|
|
74
|
+
#
|
|
75
|
+
# The actual data of a State is the list of possible StateTransitions to
|
|
76
|
+
# other states and a boolean flag that specifies if Reduce operations are
|
|
77
|
+
# valid for this State or not. The transitions are hashed by the token that
|
|
78
|
+
# would trigger this transition.
|
|
79
|
+
class State
|
|
80
|
+
|
|
81
|
+
attr_reader :rule, :pattern, :index, :transitions
|
|
82
|
+
attr_accessor :noReduce
|
|
83
|
+
|
|
84
|
+
def initialize(rule, pattern = nil, index = 0)
|
|
85
|
+
@rule = rule
|
|
86
|
+
@pattern = pattern
|
|
87
|
+
@index = index
|
|
88
|
+
# Starting states are always reduceable. Other states may or may not be
|
|
89
|
+
# reduceable. For now, we assume they are not.
|
|
90
|
+
@noReduce = !pattern.nil?
|
|
91
|
+
|
|
92
|
+
@transitions = {}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Completed the StateTransition list. We can only call this function after
|
|
96
|
+
# all State objects for the syntax have been created. So we can't make
|
|
97
|
+
# this part of the constructor.
|
|
98
|
+
def addTransitions(states, rules)
|
|
99
|
+
if @pattern
|
|
100
|
+
# This is an normal state node.
|
|
101
|
+
@pattern.addTransitionsToState(states, rules, [], self,
|
|
102
|
+
@rule, @index + 1, false)
|
|
103
|
+
else
|
|
104
|
+
# This is a start node.
|
|
105
|
+
@rule.addTransitionsToState(states, rules, [], self, false)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# This method adds the actual StateTransition to this State.
|
|
110
|
+
def addTransition(token, nextState, stateStack, loopBack)
|
|
111
|
+
tr = StateTransition.new(token, nextState, stateStack, loopBack)
|
|
112
|
+
if @transitions.include?(tr.tokenType)
|
|
113
|
+
raise "Ambiguous transition for #{tr.tokenType} in \n#{self}\n" +
|
|
114
|
+
"The following transition both match:\n" +
|
|
115
|
+
" #{tr}\n #{@transitions[tr.tokenType]}"
|
|
116
|
+
end
|
|
117
|
+
@transitions[tr.tokenType] = tr
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Find the transition that matches _token_.
|
|
121
|
+
def transition(token)
|
|
122
|
+
if token[0] == :ID
|
|
123
|
+
# The scanner cannot differentiate between IDs and literals that look
|
|
124
|
+
# like IDs. So we look for literals first and then for IDs.
|
|
125
|
+
@transitions[token[1]] || @transitions[:ID]
|
|
126
|
+
elsif token[0] == :LITERAL
|
|
127
|
+
@transitions[token[1]]
|
|
128
|
+
else
|
|
129
|
+
@transitions[token[0]]
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Return a comma separated list of token strings that would trigger
|
|
134
|
+
# transitions for this State.
|
|
135
|
+
def expectedTokens
|
|
136
|
+
tokens = []
|
|
137
|
+
@transitions.each_key do |t|
|
|
138
|
+
tokens << "#{t.is_a?(String) ? "'#{t}'" : ":#{t}"}"
|
|
139
|
+
end
|
|
140
|
+
tokens
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Convert the State data into a human readable form. Used for debugging
|
|
144
|
+
# only.
|
|
145
|
+
def to_s(short = false)
|
|
146
|
+
if short
|
|
147
|
+
if @pattern
|
|
148
|
+
str = "#{rule.name} " +
|
|
149
|
+
"#{rule.patterns.index(@pattern)} #{@index}"
|
|
150
|
+
else
|
|
151
|
+
str = "#{rule.name} (Starting Node)"
|
|
152
|
+
end
|
|
153
|
+
else
|
|
154
|
+
if @pattern
|
|
155
|
+
str = "=== State: #{rule.name} " +
|
|
156
|
+
"#{rule.patterns.index(@pattern)} #{@index}" +
|
|
157
|
+
" #{@noReduce ? '' : '(R)'}" +
|
|
158
|
+
" #{'=' * 40}\nPattern: #{@pattern}\n"
|
|
159
|
+
else
|
|
160
|
+
str = "=== State: #{rule.name} (Starting Node) #{'=' * 30}\n"
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
@transitions.each do |type, target|
|
|
164
|
+
targetStr = target ? target.to_s : "<EOF>"
|
|
165
|
+
str += " #{type.is_a?(String) ? "'#{type}'" : ":#{type}"}" +
|
|
166
|
+
" => #{targetStr}\n"
|
|
167
|
+
end
|
|
168
|
+
str += "#{'=' * 76}\n"
|
|
169
|
+
end
|
|
170
|
+
str
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
end
|
data/lib/TextScanner.rb
CHANGED
|
@@ -57,7 +57,6 @@ class TaskJuggler
|
|
|
57
57
|
@fileName = nil
|
|
58
58
|
@stream = nil
|
|
59
59
|
@line = nil
|
|
60
|
-
@pos = 0
|
|
61
60
|
@endPos = 1
|
|
62
61
|
@scanner = nil
|
|
63
62
|
@wrapped = false
|
|
@@ -70,10 +69,11 @@ class TaskJuggler
|
|
|
70
69
|
end
|
|
71
70
|
|
|
72
71
|
def injectMacro(macro, args, text)
|
|
73
|
-
|
|
74
|
-
@
|
|
72
|
+
pos = @scanner.pos
|
|
73
|
+
@nextMacroEnd = pos + text.length
|
|
74
|
+
@line = @line[0, pos] + text + @line[pos..-1]
|
|
75
75
|
@scanner = StringScanner.new(@line)
|
|
76
|
-
@scanner.pos =
|
|
76
|
+
@scanner.pos = pos
|
|
77
77
|
|
|
78
78
|
# Simple detection for recursive macro calls.
|
|
79
79
|
return false if @macroStack.length > 20
|
|
@@ -109,10 +109,12 @@ class TaskJuggler
|
|
|
109
109
|
return nil if (token = @scanner.scan(re)).nil?
|
|
110
110
|
#puts "#{re.to_s[0..20]}: [#{token}]"
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@
|
|
115
|
-
|
|
112
|
+
if @nextMacroEnd
|
|
113
|
+
pos = @scanner.pos
|
|
114
|
+
while @nextMacroEnd && @nextMacroEnd < pos
|
|
115
|
+
@macroStack.pop
|
|
116
|
+
@nextMacroEnd = @macroStack.empty? ? nil : @macroStack.last.endPos
|
|
117
|
+
end
|
|
116
118
|
end
|
|
117
119
|
|
|
118
120
|
token
|
|
@@ -246,7 +248,7 @@ class TaskJuggler
|
|
|
246
248
|
end
|
|
247
249
|
|
|
248
250
|
# Switch the parser to another mode. The scanner will then only detect
|
|
249
|
-
#
|
|
251
|
+
# patterns of that _newMode_.
|
|
250
252
|
def mode=(newMode)
|
|
251
253
|
#puts "**** New mode: #{newMode}"
|
|
252
254
|
@activePatterns = @patternsByMode[newMode]
|
|
@@ -362,21 +364,24 @@ class TaskJuggler
|
|
|
362
364
|
# @fileStack.
|
|
363
365
|
@finishLastFile = false
|
|
364
366
|
#Log << "Completed file #{@cf.fileName}"
|
|
365
|
-
@cf.close
|
|
367
|
+
@cf.close if @cf
|
|
366
368
|
@fileStack.pop
|
|
367
369
|
|
|
368
370
|
if @fileStack.empty?
|
|
369
371
|
# We are done with the top-level file now.
|
|
370
372
|
@cf = @tokenBuffer = nil
|
|
371
373
|
@finishLastFile = true
|
|
372
|
-
return [
|
|
374
|
+
return [ :endOfText, '<EOT>', @startOfToken ]
|
|
373
375
|
else
|
|
374
376
|
# Continue parsing the file that included the current file.
|
|
375
377
|
@cf, tokenBuffer = @fileStack.last
|
|
376
378
|
Log << "Parsing file #{@cf.fileName} ..."
|
|
377
379
|
# If we have a left over token from previously processing this file,
|
|
378
380
|
# return it now.
|
|
379
|
-
|
|
381
|
+
if tokenBuffer
|
|
382
|
+
@finishLastFile = true if tokenBuffer[0] == :eof
|
|
383
|
+
return tokenBuffer
|
|
384
|
+
end
|
|
380
385
|
end
|
|
381
386
|
end
|
|
382
387
|
|
|
@@ -391,7 +396,7 @@ class TaskJuggler
|
|
|
391
396
|
# We've found the end of an input file. Return a special token
|
|
392
397
|
# that describes the end of a file.
|
|
393
398
|
@finishLastFile = true
|
|
394
|
-
return [
|
|
399
|
+
return [ :eof, '<END>', @startOfToken ]
|
|
395
400
|
end
|
|
396
401
|
|
|
397
402
|
raise "#{re} matches empty string" if match.empty?
|
|
@@ -401,7 +406,6 @@ class TaskJuggler
|
|
|
401
406
|
|
|
402
407
|
break if type.nil? # Ignore certain tokens with nil type.
|
|
403
408
|
|
|
404
|
-
#puts "type: #{type} match: [#{match}]"
|
|
405
409
|
return [ type, match, @startOfToken ]
|
|
406
410
|
end
|
|
407
411
|
end
|
|
@@ -467,7 +471,7 @@ class TaskJuggler
|
|
|
467
471
|
end
|
|
468
472
|
|
|
469
473
|
def warning(id, text, sfi = nil, data = nil)
|
|
470
|
-
message(:warning, id, text, sfi,
|
|
474
|
+
message(:warning, id, text, sfi, data)
|
|
471
475
|
end
|
|
472
476
|
|
|
473
477
|
private
|
data/lib/Tj3Config.rb
CHANGED
data/lib/TjTime.rb
CHANGED
|
@@ -36,8 +36,7 @@ class TaskJuggler
|
|
|
36
36
|
if t.is_a?(Time)
|
|
37
37
|
@time = t
|
|
38
38
|
elsif t.is_a?(String)
|
|
39
|
-
|
|
40
|
-
@time = Time.mktime(d.year, d.mon, d.day, d.hour, d.min, d.sec)
|
|
39
|
+
@time = TjTime.parse(t).time
|
|
41
40
|
else
|
|
42
41
|
@time = Time.at(t)
|
|
43
42
|
end
|
|
@@ -60,6 +59,111 @@ class TaskJuggler
|
|
|
60
59
|
TjTime.new(Time.local(*args).gmtime)
|
|
61
60
|
end
|
|
62
61
|
|
|
62
|
+
def TjTime.parse(t)
|
|
63
|
+
year, month, day, time, zone = t.split('-', 5)
|
|
64
|
+
|
|
65
|
+
# Check the year
|
|
66
|
+
if year
|
|
67
|
+
year = year.to_i
|
|
68
|
+
if year < 1970 || year > 2035
|
|
69
|
+
raise TjException.new, "Year #{year} out of range (1970 - 2035)"
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
raise TjException.new, "Year not specified"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Check the month
|
|
76
|
+
if month
|
|
77
|
+
month = month.to_i
|
|
78
|
+
if month < 1 || month > 12
|
|
79
|
+
raise TjException.new, "Month #{month} out of range (1 - 12)"
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
raise TjException.new, "Month not specified"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Check the day
|
|
86
|
+
if day
|
|
87
|
+
day = day.to_i
|
|
88
|
+
maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
|
|
89
|
+
30, 31, 31, 30, 31, 30, 31 ]
|
|
90
|
+
if month < 1 || month > maxDay[month]
|
|
91
|
+
raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
|
|
92
|
+
end
|
|
93
|
+
else
|
|
94
|
+
raise TjException.new, "Day not specified"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# The time is optional. Will be expanded to 00:00:00.
|
|
98
|
+
if time
|
|
99
|
+
hour, minute, second = time.split(':')
|
|
100
|
+
|
|
101
|
+
# Check hour
|
|
102
|
+
if hour
|
|
103
|
+
hour = hour.to_i
|
|
104
|
+
if hour < 0 || hour > 23
|
|
105
|
+
raise TjException.new, "Hour #{hour} out of range (0 - 23)"
|
|
106
|
+
end
|
|
107
|
+
else
|
|
108
|
+
raise TjException.new, "Hour not specified"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
if minute
|
|
112
|
+
minute = minute.to_i
|
|
113
|
+
if minute < 0 || minute > 59
|
|
114
|
+
raise TjException.new, "Minute #{minute} out of range (0 - 59)"
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
raise TjException.new, "Minute not specified"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Check sencond. This value is optional and defaults to 0.
|
|
121
|
+
if second
|
|
122
|
+
second = second.to_i
|
|
123
|
+
if second < 0 || second > 59
|
|
124
|
+
raise TjException.new, "Second #{second} out of range (0 - 59)"
|
|
125
|
+
end
|
|
126
|
+
else
|
|
127
|
+
second = 0
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
hour = minute = second = 0
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# The zone is optional and defaults to the current time zone.
|
|
134
|
+
if zone
|
|
135
|
+
if zone[0] != ?- && zone[0] != ?+
|
|
136
|
+
raise TjException.new, "Time zone adjustment must be prefixed by " +
|
|
137
|
+
"+ or -, not #{zone[0]}"
|
|
138
|
+
end
|
|
139
|
+
if zone.length != 5
|
|
140
|
+
raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
date = Time.utc(year, month, day, hour, minute, second)
|
|
144
|
+
sign = zone[0] == ?- ? 1 : -1
|
|
145
|
+
tzHour = zone[1..2].to_i
|
|
146
|
+
if tzHour < 0 || tzHour > 12
|
|
147
|
+
raise TjException.new, "Time zone adjustment hour out of range " +
|
|
148
|
+
"(0 - 12) but is #{tzHour}"
|
|
149
|
+
end
|
|
150
|
+
tzMinute = zone[3..4].to_i
|
|
151
|
+
if tzMinute < 0 || tzMinute > 59
|
|
152
|
+
raise TjException.new, "Time zone adjustment minute out of range " +
|
|
153
|
+
"(0 - 59) but is #{tzMinute}"
|
|
154
|
+
end
|
|
155
|
+
date += sign * (tzHour * 3600 + tzMinute * 60)
|
|
156
|
+
else
|
|
157
|
+
date = Time.mktime(year, month, day, hour, minute, second)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
#puts "--> #{t}"
|
|
161
|
+
#puts(">>> #{year}-#{month}-#{day}-#{hour}:#{minute}:#{second}" +
|
|
162
|
+
# "#{zone ? "-#{tzHour}:#{tzMinute}" : ""}")
|
|
163
|
+
#puts "=== #{date}"
|
|
164
|
+
TjTime.new(date)
|
|
165
|
+
end
|
|
166
|
+
|
|
63
167
|
# Check if +zone+ is a valid time zone.
|
|
64
168
|
def TjTime.checkTimeZone(zone)
|
|
65
169
|
return true if zone == 'UTC'
|
|
@@ -80,7 +184,11 @@ class TaskJuggler
|
|
|
80
184
|
region = zone[0..zone.index('/') - 1]
|
|
81
185
|
res = (newZone != zone && newZone != region && newZone != 'UTC')
|
|
82
186
|
# Restore TZ if it was set earlier.
|
|
83
|
-
|
|
187
|
+
if tz
|
|
188
|
+
ENV['TZ'] = tz
|
|
189
|
+
else
|
|
190
|
+
ENV.delete('TZ')
|
|
191
|
+
end
|
|
84
192
|
res
|
|
85
193
|
end
|
|
86
194
|
|
data/lib/TjpSyntaxRules.rb
CHANGED
|
@@ -155,7 +155,7 @@ EOT
|
|
|
155
155
|
repeatable
|
|
156
156
|
|
|
157
157
|
pattern(%w( _alternative !resourceId !moreAlternatives ), lambda {
|
|
158
|
-
([ @val[1] ] + @val[2]).each do |candidate|
|
|
158
|
+
([ @val[1] ] + (@val[2] ? @val[2] : [])).each do |candidate|
|
|
159
159
|
@allocate.addCandidate(candidate)
|
|
160
160
|
end
|
|
161
161
|
})
|
|
@@ -558,7 +558,8 @@ EOT
|
|
|
558
558
|
|
|
559
559
|
pattern(%w( _celltext !logicalExpression $STRING ), lambda {
|
|
560
560
|
@column.cellText.addPattern(
|
|
561
|
-
CellSettingPattern.new(newRichText(@val[2]
|
|
561
|
+
CellSettingPattern.new(newRichText(@val[2], @sourceFileInfo[2]),
|
|
562
|
+
@val[1]))
|
|
562
563
|
})
|
|
563
564
|
doc('celltext.column', <<'EOT'
|
|
564
565
|
Specifies an alternative content that is used for the cells of the column.
|
|
@@ -660,7 +661,8 @@ EOT
|
|
|
660
661
|
|
|
661
662
|
pattern(%w( _tooltip !logicalExpression $STRING ), lambda {
|
|
662
663
|
@column.tooltip.addPattern(
|
|
663
|
-
CellSettingPattern.new(newRichText(@val[2]
|
|
664
|
+
CellSettingPattern.new(newRichText(@val[2], @sourceFileInfo[2]),
|
|
665
|
+
@val[1]))
|
|
664
666
|
})
|
|
665
667
|
doc('tooltip.column', <<'EOT'
|
|
666
668
|
Specifies an alternative content for the tooltip. This will replace the
|
|
@@ -742,15 +744,18 @@ EOT
|
|
|
742
744
|
return if @val[1].empty?
|
|
743
745
|
|
|
744
746
|
rtTokenSetMore =
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
747
|
+
[ :LINEBREAK, :SPACE, :WORD, :BOLD, :ITALIC, :CODE, :BOLDITALIC,
|
|
748
|
+
:PRE, :HREF, :HREFEND, :REF, :REFEND, :HLINE, :TITLE2, :TITLE3,
|
|
749
|
+
:TITLE4, :TITLE2END, :TITLE3END, :TITLE4END,
|
|
750
|
+
:BULLET1, :BULLET2, :BULLET3, :BULLET4, :NUMBER1, :NUMBER2, :NUMBER3,
|
|
751
|
+
:NUMBER4 ]
|
|
748
752
|
if @val[1] == "Some more details\n"
|
|
749
753
|
error('ts_default_details',
|
|
750
754
|
"'Some more details' is not a valid value",
|
|
751
755
|
@sourceFileInfo[1])
|
|
752
756
|
end
|
|
753
|
-
@journalEntry.details = newRichText(@val[1],
|
|
757
|
+
@journalEntry.details = newRichText(@val[1], @sourceFileInfo[1],
|
|
758
|
+
rtTokenSetMore)
|
|
754
759
|
})
|
|
755
760
|
doc('details', <<'EOT'
|
|
756
761
|
This is a continuation of the [[summary]] of the journal or status entry. It
|
|
@@ -1012,12 +1017,12 @@ EOT
|
|
|
1012
1017
|
pattern(%w( !extendPropertyId ), lambda {
|
|
1013
1018
|
case @val[0]
|
|
1014
1019
|
when 'task'
|
|
1015
|
-
@ruleToExtend = @rules[
|
|
1016
|
-
@ruleToExtendWithScenario = @rules[
|
|
1020
|
+
@ruleToExtend = @rules[:taskAttributes]
|
|
1021
|
+
@ruleToExtendWithScenario = @rules[:taskScenarioAttributes]
|
|
1017
1022
|
@propertySet = @project.tasks
|
|
1018
1023
|
when 'resource'
|
|
1019
|
-
@ruleToExtend = @rules[
|
|
1020
|
-
@ruleToExtendWithScenario = @rules[
|
|
1024
|
+
@ruleToExtend = @rules[:resourceAttributes]
|
|
1025
|
+
@ruleToExtendWithScenario = @rules[:resourceScenarioAttributes]
|
|
1021
1026
|
@propertySet = @project.resources
|
|
1022
1027
|
end
|
|
1023
1028
|
})
|
|
@@ -1218,7 +1223,7 @@ EOT
|
|
|
1218
1223
|
|
|
1219
1224
|
def rule_headline
|
|
1220
1225
|
pattern(%w( _headline $STRING ), lambda {
|
|
1221
|
-
@property.set('headline', newRichText(@val[1]))
|
|
1226
|
+
@property.set('headline', newRichText(@val[1], @sourceFileInfo[1]))
|
|
1222
1227
|
})
|
|
1223
1228
|
doc('headline', <<'EOT'
|
|
1224
1229
|
Specifies the headline for a report.
|
|
@@ -1316,6 +1321,11 @@ EOT
|
|
|
1316
1321
|
|
|
1317
1322
|
def rule_includeFile
|
|
1318
1323
|
pattern(%w( !includeFileName ), lambda {
|
|
1324
|
+
unless @project
|
|
1325
|
+
error('include_before_project',
|
|
1326
|
+
"You must declare the project header before you include other " +
|
|
1327
|
+
"files.")
|
|
1328
|
+
end
|
|
1319
1329
|
@project.inputFiles << @scanner.include(@val[0], @sourceFileInfo[0])
|
|
1320
1330
|
})
|
|
1321
1331
|
end
|
|
@@ -1690,7 +1700,7 @@ EOT
|
|
|
1690
1700
|
def rule_listOfDays
|
|
1691
1701
|
pattern(%w( !weekDayInterval !moreListOfDays), lambda {
|
|
1692
1702
|
weekDays = Array.new(7, false)
|
|
1693
|
-
([ @val[0] ] + @val[1]).each do |dayList|
|
|
1703
|
+
([ @val[0] ] + (@val[1] ? @val[1] : [])).each do |dayList|
|
|
1694
1704
|
7.times { |i| weekDays[i] = true if dayList[i] }
|
|
1695
1705
|
end
|
|
1696
1706
|
weekDays
|
|
@@ -1702,7 +1712,7 @@ EOT
|
|
|
1702
1712
|
[ ]
|
|
1703
1713
|
})
|
|
1704
1714
|
pattern(%w( !timeInterval !moreTimeIntervals ), lambda {
|
|
1705
|
-
[ @val[0] ] + @val[1]
|
|
1715
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
1706
1716
|
})
|
|
1707
1717
|
end
|
|
1708
1718
|
|
|
@@ -2059,15 +2069,11 @@ EOT
|
|
|
2059
2069
|
end
|
|
2060
2070
|
|
|
2061
2071
|
def rule_operation
|
|
2062
|
-
pattern(%w( !operand !
|
|
2072
|
+
pattern(%w( !operand !operationChain ), lambda {
|
|
2063
2073
|
operation = LogicalOperation.new(@val[0])
|
|
2064
|
-
|
|
2065
|
-
operation.operator = @val[1][0]
|
|
2066
|
-
operation.operand2 = @val[1][1]
|
|
2067
|
-
end
|
|
2068
|
-
if @val[2]
|
|
2074
|
+
if @val[1]
|
|
2069
2075
|
# Further operators/operands create an operation tree.
|
|
2070
|
-
@val[
|
|
2076
|
+
@val[1].each do |ops|
|
|
2071
2077
|
operation = LogicalOperation.new(operation)
|
|
2072
2078
|
operation.operator = ops[0]
|
|
2073
2079
|
operation.operand2 = ops[1]
|
|
@@ -2098,7 +2104,6 @@ EOT
|
|
|
2098
2104
|
end
|
|
2099
2105
|
|
|
2100
2106
|
def rule_operatorAndOperand
|
|
2101
|
-
optional
|
|
2102
2107
|
pattern(%w( !operator !operand), lambda{
|
|
2103
2108
|
[ @val[0], @val[1] ]
|
|
2104
2109
|
})
|
|
@@ -2193,7 +2198,7 @@ EOT
|
|
|
2193
2198
|
|
|
2194
2199
|
def rule_outputFormats
|
|
2195
2200
|
pattern(%w( !outputFormat !moreOutputFormats ), lambda {
|
|
2196
|
-
[ @val[0] ] + @val[1]
|
|
2201
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
2197
2202
|
})
|
|
2198
2203
|
end
|
|
2199
2204
|
|
|
@@ -2341,8 +2346,11 @@ impact on memory usage and scheduling performance. You should set this value
|
|
|
2341
2346
|
to the minimum required resolution. Make sure that all values that you specify
|
|
2342
2347
|
are aligned with the resolution.
|
|
2343
2348
|
|
|
2344
|
-
|
|
2345
|
-
|
|
2349
|
+
Changing the timing resolution will reset the [[workinghours.project|working
|
|
2350
|
+
hours]] to the default times. It's recommended that this is the very first
|
|
2351
|
+
option in the project header section.
|
|
2352
|
+
|
|
2353
|
+
Do not use this option after you've set the time zone!
|
|
2346
2354
|
EOT
|
|
2347
2355
|
)
|
|
2348
2356
|
|
|
@@ -2394,8 +2402,7 @@ EOT
|
|
|
2394
2402
|
|
|
2395
2403
|
def rule_projectHeader
|
|
2396
2404
|
pattern(%w( _project !optionalID $STRING !optionalVersion !interval ), lambda {
|
|
2397
|
-
@project = Project.new(@val[1], @val[2], @val[3],
|
|
2398
|
-
@messageHandler)
|
|
2405
|
+
@project = Project.new(@val[1], @val[2], @val[3], @messageHandler)
|
|
2399
2406
|
@project['start'] = @val[4].start
|
|
2400
2407
|
@project['end'] = @val[4].end
|
|
2401
2408
|
@projectId = @val[1]
|
|
@@ -2409,7 +2416,7 @@ EOT
|
|
|
2409
2416
|
|
|
2410
2417
|
def rule_projectIDs
|
|
2411
2418
|
pattern(%w( $ID !moreProjectIDs ), lambda {
|
|
2412
|
-
[ @val[0] ] + @val[1]
|
|
2419
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
2413
2420
|
})
|
|
2414
2421
|
end
|
|
2415
2422
|
|
|
@@ -2499,8 +2506,7 @@ EOT
|
|
|
2499
2506
|
end
|
|
2500
2507
|
|
|
2501
2508
|
def rule_properties
|
|
2502
|
-
pattern(%w( !propertiesBody
|
|
2503
|
-
lastSyntaxToken(1)
|
|
2509
|
+
pattern(%w( !propertiesBody ))
|
|
2504
2510
|
end
|
|
2505
2511
|
|
|
2506
2512
|
def rule_propertiesBody
|
|
@@ -2628,8 +2634,12 @@ EOT
|
|
|
2628
2634
|
example('TimeSheet1', '2')
|
|
2629
2635
|
end
|
|
2630
2636
|
|
|
2637
|
+
def rule_propertiesFile
|
|
2638
|
+
pattern(%w( !propertiesBody . ))
|
|
2639
|
+
end
|
|
2640
|
+
|
|
2631
2641
|
def rule_propertiesInclude
|
|
2632
|
-
pattern(%w( _include !includeProperties !properties ), lambda {
|
|
2642
|
+
pattern(%w( _include !includeProperties !properties . ), lambda {
|
|
2633
2643
|
})
|
|
2634
2644
|
doc('include.properties', <<'EOT'
|
|
2635
2645
|
Includes the specified file name as if its contents would be written
|
|
@@ -2696,7 +2706,9 @@ EOT
|
|
|
2696
2706
|
def rule_relativeId
|
|
2697
2707
|
pattern(%w( _! !moreBangs !idOrAbsoluteId ), lambda {
|
|
2698
2708
|
str = '!'
|
|
2699
|
-
@val[1]
|
|
2709
|
+
if @val[1]
|
|
2710
|
+
@val[1].each { |bang| str += bang }
|
|
2711
|
+
end
|
|
2700
2712
|
str += @val[2]
|
|
2701
2713
|
str
|
|
2702
2714
|
})
|
|
@@ -3019,7 +3031,7 @@ EOT
|
|
|
3019
3031
|
})
|
|
3020
3032
|
|
|
3021
3033
|
pattern(%w( _caption $STRING ), lambda {
|
|
3022
|
-
@property.set('caption', newRichText(@val[1]))
|
|
3034
|
+
@property.set('caption', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3023
3035
|
})
|
|
3024
3036
|
doc('caption', <<'EOT'
|
|
3025
3037
|
The caption will be embedded in the footer of the table or data segment. The
|
|
@@ -3030,7 +3042,7 @@ EOT
|
|
|
3030
3042
|
example('Caption', '1')
|
|
3031
3043
|
|
|
3032
3044
|
pattern(%w( _center $STRING ), lambda {
|
|
3033
|
-
@property.set('center', newRichText(@val[1]))
|
|
3045
|
+
@property.set('center', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3034
3046
|
})
|
|
3035
3047
|
doc('center', <<'EOT'
|
|
3036
3048
|
This attribute defines the center section of the [[textreport]]. The text will
|
|
@@ -3055,7 +3067,7 @@ EOT
|
|
|
3055
3067
|
pattern(%w( !reportEnd ))
|
|
3056
3068
|
|
|
3057
3069
|
pattern(%w( _epilog $STRING ), lambda {
|
|
3058
|
-
@property.set('epilog', newRichText(@val[1]))
|
|
3070
|
+
@property.set('epilog', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3059
3071
|
})
|
|
3060
3072
|
doc('epilog', <<'EOT'
|
|
3061
3073
|
Define a text section that is printed right after the actual report data. The
|
|
@@ -3072,7 +3084,7 @@ EOT
|
|
|
3072
3084
|
)
|
|
3073
3085
|
|
|
3074
3086
|
pattern(%w( _footer $STRING ), lambda {
|
|
3075
|
-
@property.set('footer', newRichText(@val[1]))
|
|
3087
|
+
@property.set('footer', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3076
3088
|
})
|
|
3077
3089
|
doc('footer', <<'EOT'
|
|
3078
3090
|
Define a text section that is put at the bottom of the report. The
|
|
@@ -3084,7 +3096,7 @@ EOT
|
|
|
3084
3096
|
pattern(%w( !formats ))
|
|
3085
3097
|
|
|
3086
3098
|
pattern(%w( _header $STRING ), lambda {
|
|
3087
|
-
@property.set('header', newRichText(@val[1]))
|
|
3099
|
+
@property.set('header', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3088
3100
|
})
|
|
3089
3101
|
doc('header', <<'EOT'
|
|
3090
3102
|
Define a text section that is put at the top of the report. The
|
|
@@ -3099,7 +3111,7 @@ EOT
|
|
|
3099
3111
|
pattern(%w( !hidetask ))
|
|
3100
3112
|
|
|
3101
3113
|
pattern(%w( _left $STRING ), lambda {
|
|
3102
|
-
@property.set('left', newRichText(@val[1]))
|
|
3114
|
+
@property.set('left', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3103
3115
|
})
|
|
3104
3116
|
doc('left', <<'EOT'
|
|
3105
3117
|
This attribute defines the left margin section of the [[textreport]]. The text
|
|
@@ -3119,7 +3131,7 @@ EOT
|
|
|
3119
3131
|
pattern(%w( !reportPeriod ))
|
|
3120
3132
|
|
|
3121
3133
|
pattern(%w( _prolog $STRING ), lambda {
|
|
3122
|
-
@property.set('prolog', newRichText(@val[1]))
|
|
3134
|
+
@property.set('prolog', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3123
3135
|
})
|
|
3124
3136
|
doc('prolog', <<'EOT'
|
|
3125
3137
|
Define a text section that is printed right before the actual report data. The
|
|
@@ -3136,7 +3148,7 @@ EOT
|
|
|
3136
3148
|
pattern(%w( !report ))
|
|
3137
3149
|
|
|
3138
3150
|
pattern(%w( _right $STRING ), lambda {
|
|
3139
|
-
@property.set('right', newRichText(@val[1]))
|
|
3151
|
+
@property.set('right', newRichText(@val[1], @sourceFileInfo[1]))
|
|
3140
3152
|
})
|
|
3141
3153
|
doc('right', <<'EOT'
|
|
3142
3154
|
This attribute defines the right margin section of the [[textreport]]. The text
|
|
@@ -3145,6 +3157,16 @@ span the [[header]] or [[footer]] sections.
|
|
|
3145
3157
|
EOT
|
|
3146
3158
|
)
|
|
3147
3159
|
|
|
3160
|
+
pattern(%w( _rollupresource !logicalExpression ), lambda {
|
|
3161
|
+
@property.set('rollupResource', @val[1])
|
|
3162
|
+
})
|
|
3163
|
+
doc('rollupresource', <<'EOT'
|
|
3164
|
+
Do not show sub-resources of resources that match the specified logical
|
|
3165
|
+
expression.
|
|
3166
|
+
EOT
|
|
3167
|
+
)
|
|
3168
|
+
example('RollupResource')
|
|
3169
|
+
|
|
3148
3170
|
pattern(%w( _rolluptask !logicalExpression ), lambda {
|
|
3149
3171
|
@property.set('rollupTask', @val[1])
|
|
3150
3172
|
})
|
|
@@ -3178,16 +3200,29 @@ EOT
|
|
|
3178
3200
|
|
|
3179
3201
|
pattern(%w( !reportStart ))
|
|
3180
3202
|
|
|
3203
|
+
pattern(%w( _resourceroot !resourceId), lambda {
|
|
3204
|
+
@property.set('resourceRoot', @val[1])
|
|
3205
|
+
})
|
|
3206
|
+
doc('resourceroot', <<'EOT'
|
|
3207
|
+
Only resources below the specified root-level resources are exported. The
|
|
3208
|
+
exported resources will have the ID of the root-level resource stripped from
|
|
3209
|
+
their ID, so that the sub-resourcess of the root-level resource become
|
|
3210
|
+
top-level resources in the report file.
|
|
3211
|
+
EOT
|
|
3212
|
+
)
|
|
3213
|
+
example('ResourceRoot')
|
|
3214
|
+
|
|
3181
3215
|
pattern(%w( _taskroot !taskId), lambda {
|
|
3182
3216
|
@property.set('taskRoot', @val[1])
|
|
3183
3217
|
})
|
|
3184
3218
|
doc('taskroot', <<'EOT'
|
|
3185
3219
|
Only tasks below the specified root-level tasks are exported. The exported
|
|
3186
|
-
tasks will have the
|
|
3187
|
-
the sub-tasks of the root-level task become top-level tasks in the
|
|
3220
|
+
tasks will have the ID of the root-level task stripped from their ID, so that
|
|
3221
|
+
the sub-tasks of the root-level task become top-level tasks in the report
|
|
3188
3222
|
file.
|
|
3189
3223
|
EOT
|
|
3190
3224
|
)
|
|
3225
|
+
example('TaskRoot')
|
|
3191
3226
|
|
|
3192
3227
|
pattern(%w( !timeformat ), lambda {
|
|
3193
3228
|
@property.set('timeFormat', @val[0])
|
|
@@ -3365,14 +3400,21 @@ EOT
|
|
|
3365
3400
|
)
|
|
3366
3401
|
end
|
|
3367
3402
|
|
|
3368
|
-
|
|
3369
|
-
|
|
3370
3403
|
def rule_reportType
|
|
3371
3404
|
singlePattern('_resourcereport')
|
|
3372
3405
|
doc('resourcereport', <<'EOT'
|
|
3373
3406
|
The report lists resources and their respective values in a table. The task
|
|
3374
|
-
that are the resources are allocated to can be listed as well.
|
|
3375
|
-
|
|
3407
|
+
that are the resources are allocated to can be listed as well. To reduce the
|
|
3408
|
+
list of included resources, you can use the [[hideresource]],
|
|
3409
|
+
[[rollupresource]] or [[resourceroot]] attributes. The order of the task can
|
|
3410
|
+
be controlled with [[sortresources]]. If the first sorting criteria is tree
|
|
3411
|
+
sorting, the parent resources will always be included to form the tree.
|
|
3412
|
+
Tree sorting is the default. You need to change it if you do not want certain
|
|
3413
|
+
parent resources to be included in the report.
|
|
3414
|
+
|
|
3415
|
+
The tasks that the resources are allocated to can be included as well. Use the
|
|
3416
|
+
[[hidetask]] attribute for this. See [[report]] for a complete list of
|
|
3417
|
+
attributes and the full syntax for this keyword.
|
|
3376
3418
|
EOT
|
|
3377
3419
|
)
|
|
3378
3420
|
singlePattern('_taskreport')
|
|
@@ -3381,12 +3423,13 @@ The report lists tasks and their respective values in a table. To reduce the
|
|
|
3381
3423
|
list of included tasks, you can use the [[hidetask]], [[rolluptask]] or
|
|
3382
3424
|
[[taskroot]] attributes. The order of the task can be controlled with
|
|
3383
3425
|
[[sorttasks]]. If the first sorting criteria is tree sorting, the parent tasks
|
|
3384
|
-
will
|
|
3385
|
-
|
|
3386
|
-
|
|
3426
|
+
will always be included to form the tree. Tree sorting is the default. You
|
|
3427
|
+
need to change it if you do not want certain parent tasks to be included in
|
|
3428
|
+
the report.
|
|
3387
3429
|
|
|
3388
|
-
The resources that are allocated to each task can be listed as well.
|
|
3389
|
-
[[report]] for
|
|
3430
|
+
The resources that are allocated to each task can be listed as well. Use the
|
|
3431
|
+
[[hideresource]] attribute for this. See [[report]] for a complete list of
|
|
3432
|
+
attributes and the full syntax for this keyword.
|
|
3390
3433
|
EOT
|
|
3391
3434
|
)
|
|
3392
3435
|
singlePattern('_textreport')
|
|
@@ -3504,7 +3547,7 @@ EOT
|
|
|
3504
3547
|
|
|
3505
3548
|
def rule_resourceLeafList
|
|
3506
3549
|
pattern(%w( !leafResourceId !moreLeafResources ), lambda {
|
|
3507
|
-
[ @val[0] ] + @val[1]
|
|
3550
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
3508
3551
|
})
|
|
3509
3552
|
end
|
|
3510
3553
|
|
|
@@ -3542,7 +3585,7 @@ The booking attribute can be used to report completed work. This can be part
|
|
|
3542
3585
|
of the necessary effort or the whole effort. When the scenario is scheduled in
|
|
3543
3586
|
projection mode, TaskJuggler assumes that only the work reported with bookings
|
|
3544
3587
|
has been done up to now. It then schedules a plan for the still missing
|
|
3545
|
-
effort.
|
|
3588
|
+
effort. All task with bookings must be scheduled in ''''asap'''' mode.
|
|
3546
3589
|
|
|
3547
3590
|
This attribute is also used within export reports to describe the details of a
|
|
3548
3591
|
scheduled project.
|
|
@@ -3550,6 +3593,12 @@ scheduled project.
|
|
|
3550
3593
|
The sloppy attribute can be used when you want to skip non-working time or
|
|
3551
3594
|
other allocations automatically. If it's not given, all bookings must only
|
|
3552
3595
|
cover working time for the resource.
|
|
3596
|
+
|
|
3597
|
+
The booking attributes is intended to capture the exact amount of completed
|
|
3598
|
+
work. This attribute is not really intended to specify completed effort by
|
|
3599
|
+
hand. Usually, booking statements are generated by [[export]] reports. The
|
|
3600
|
+
[[sloppy.booking|sloppy]] and [[overtime.booking|overtime]] attributes are
|
|
3601
|
+
only kludge for users who want to write them manually.
|
|
3553
3602
|
EOT
|
|
3554
3603
|
)
|
|
3555
3604
|
also(%w( scheduling ))
|
|
@@ -4192,8 +4241,10 @@ EOT
|
|
|
4192
4241
|
@sourceFileInfo[1])
|
|
4193
4242
|
end
|
|
4194
4243
|
rtTokenSetIntro =
|
|
4195
|
-
|
|
4196
|
-
|
|
4244
|
+
[ :LINEBREAK, :SPACE, :WORD, :BOLD, :ITALIC, :CODE, :BOLDITALIC,
|
|
4245
|
+
:HREF, :HREFEND ]
|
|
4246
|
+
@journalEntry.summary = newRichText(@val[1], @sourceFileInfo[1],
|
|
4247
|
+
rtTokenSetIntro)
|
|
4197
4248
|
})
|
|
4198
4249
|
doc('summary', <<'EOT'
|
|
4199
4250
|
This is the introductory part of the journal or status entry. It should
|
|
@@ -4277,7 +4328,7 @@ EOT
|
|
|
4277
4328
|
pattern(%w( !journalEntry ))
|
|
4278
4329
|
|
|
4279
4330
|
pattern(%w( _note $STRING ), lambda {
|
|
4280
|
-
@property.set('note', newRichText(@val[1]))
|
|
4331
|
+
@property.set('note', newRichText(@val[1], @sourceFileInfo[1]))
|
|
4281
4332
|
})
|
|
4282
4333
|
doc('note.task', <<'EOT'
|
|
4283
4334
|
Attach a note to the task. This is usually a more detailed specification of
|
|
@@ -4426,7 +4477,7 @@ EOT
|
|
|
4426
4477
|
|
|
4427
4478
|
def rule_taskDepList
|
|
4428
4479
|
pattern(%w( !taskDep !moreDepTasks ), lambda {
|
|
4429
|
-
[ @val[0] ] + @val[1]
|
|
4480
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
4430
4481
|
})
|
|
4431
4482
|
end
|
|
4432
4483
|
|
|
@@ -4439,7 +4490,7 @@ EOT
|
|
|
4439
4490
|
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
|
4440
4491
|
if @project.task(id)
|
|
4441
4492
|
error('task_exists', "Task #{id} has already been defined.",
|
|
4442
|
-
@sourceFileInfo[
|
|
4493
|
+
@sourceFileInfo[0])
|
|
4443
4494
|
end
|
|
4444
4495
|
end
|
|
4445
4496
|
@property = Task.new(@project, @val[1], @val[2], @property)
|
|
@@ -4498,7 +4549,7 @@ EOT
|
|
|
4498
4549
|
|
|
4499
4550
|
def rule_taskPredList
|
|
4500
4551
|
pattern(%w( !taskPred !morePredTasks ), lambda {
|
|
4501
|
-
[ @val[0] ] + @val[1]
|
|
4552
|
+
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
|
4502
4553
|
})
|
|
4503
4554
|
end
|
|
4504
4555
|
|
|
@@ -5240,12 +5291,15 @@ possible values.
|
|
|
5240
5291
|
The project start and end time are not affected by this setting. You
|
|
5241
5292
|
have to explicitly state the time zone for those dates or the system defaults
|
|
5242
5293
|
are assumed. Using the TZ environment variable is the recommended way to
|
|
5243
|
-
specify the time zone for your project.
|
|
5244
|
-
project, it should be the very first thing you set. It must be set before you
|
|
5245
|
-
set the [[timingresolution]] or any attribute with a time or date.
|
|
5294
|
+
specify the time zone for your project.
|
|
5246
5295
|
|
|
5247
5296
|
In case the specified time zone is not hour-aligned with UTC, the
|
|
5248
|
-
[[timingresolution]] will automatically be decreased.
|
|
5297
|
+
[[timingresolution]] will automatically be decreased accordingly. Do not
|
|
5298
|
+
change the timingresolution after you've set the time zone!
|
|
5299
|
+
|
|
5300
|
+
Changing the time zone will reset the [[workinghours.project|working hours]]
|
|
5301
|
+
to the default times. It's recommended that you declare your working hours
|
|
5302
|
+
after the time zone.
|
|
5249
5303
|
EOT
|
|
5250
5304
|
)
|
|
5251
5305
|
arg(1, 'zone', <<'EOT'
|
|
@@ -5664,15 +5718,17 @@ EOT
|
|
|
5664
5718
|
def rule_workinghoursProject
|
|
5665
5719
|
pattern(%w( !workinghours ))
|
|
5666
5720
|
doc('workinghours.project', <<'EOT'
|
|
5667
|
-
Set the default working hours for all subsequent resource definitions.
|
|
5668
|
-
|
|
5669
|
-
|
|
5721
|
+
Set the default working hours for all subsequent resource definitions. The
|
|
5722
|
+
standard working hours are 9:00am - 12:00am, 1:00pm - 18:00pm, Monday to
|
|
5723
|
+
Friday. The working hours specification limits the availability of resources
|
|
5724
|
+
to certain time slots of week days.
|
|
5670
5725
|
|
|
5671
5726
|
These default working hours can be replaced with other working hours for
|
|
5672
5727
|
individual resources.
|
|
5673
5728
|
EOT
|
|
5674
5729
|
)
|
|
5675
5730
|
also(%w( dailyworkinghours workinghours.resource workinghours.shift ))
|
|
5731
|
+
example('Project')
|
|
5676
5732
|
end
|
|
5677
5733
|
|
|
5678
5734
|
def rule_workinghoursResource
|