taskjuggler 0.0.5 → 0.0.6
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 +2086 -0
- data/benchmarks/666tasks.tjp +3183 -0
- data/benchmarks/booking.tjp +14 -10
- data/doc/AppConfig.html +95 -73
- data/doc/Arguments.html +22 -2
- data/doc/CHANGELOG.html +2587 -0
- data/doc/COPYING.html +21 -1
- data/doc/Object.html +161 -122
- data/doc/README.html +21 -1
- data/doc/RuntimeConfig.html +26 -6
- data/doc/String.html +38 -18
- data/doc/StringIO.html +579 -0
- data/doc/TaskJuggler.html +251 -143
- data/doc/TaskJuggler/Account.html +26 -6
- data/doc/TaskJuggler/AccountAttribute.html +28 -8
- data/doc/TaskJuggler/AccountScenario.html +24 -4
- data/doc/TaskJuggler/Allocation.html +30 -10
- data/doc/TaskJuggler/AllocationAttribute.html +28 -8
- data/doc/TaskJuggler/AttributeBase.html +46 -26
- data/doc/TaskJuggler/AttributeDefinition.html +22 -2
- data/doc/TaskJuggler/BatchProcessor.html +40 -20
- data/doc/TaskJuggler/Booking.html +26 -6
- data/doc/TaskJuggler/BookingListAttribute.html +28 -8
- data/doc/TaskJuggler/BooleanAttribute.html +28 -8
- data/doc/TaskJuggler/CSVFile.html +308 -146
- data/doc/TaskJuggler/CellSettingPattern.html +22 -2
- data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
- data/doc/TaskJuggler/Charge.html +26 -6
- data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
- data/doc/TaskJuggler/ChargeSet.html +33 -13
- data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
- data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
- data/doc/TaskJuggler/ColumnTable.html +24 -4
- data/doc/TaskJuggler/Daemon.html +26 -6
- data/doc/TaskJuggler/DateAttribute.html +26 -6
- data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
- data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
- data/doc/TaskJuggler/DurationAttribute.html +28 -8
- data/doc/TaskJuggler/FixnumAttribute.html +24 -4
- data/doc/TaskJuggler/FlagListAttribute.html +28 -8
- data/doc/TaskJuggler/FloatAttribute.html +26 -6
- data/doc/TaskJuggler/FormatListAttribute.html +24 -4
- data/doc/TaskJuggler/GanttChart.html +147 -126
- data/doc/TaskJuggler/GanttContainer.html +34 -14
- data/doc/TaskJuggler/GanttHeader.html +28 -8
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
- data/doc/TaskJuggler/GanttLine.html +38 -18
- data/doc/TaskJuggler/GanttLoadStack.html +26 -6
- data/doc/TaskJuggler/GanttMilestone.html +34 -14
- data/doc/TaskJuggler/GanttRouter.html +50 -30
- data/doc/TaskJuggler/GanttTaskBar.html +34 -14
- data/doc/TaskJuggler/HTMLDocument.html +26 -6
- data/doc/TaskJuggler/HTMLGraphics.html +30 -10
- data/doc/TaskJuggler/Interval.html +40 -22
- data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
- data/doc/TaskJuggler/JobInfo.html +24 -4
- data/doc/TaskJuggler/Journal.html +226 -147
- data/doc/TaskJuggler/JournalEntry.html +22 -2
- data/doc/TaskJuggler/JournalEntryList.html +129 -112
- data/doc/TaskJuggler/KeywordArray.html +26 -6
- data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
- data/doc/TaskJuggler/Limits.html +152 -123
- data/doc/TaskJuggler/Limits/Limit.html +149 -70
- data/doc/TaskJuggler/LimitsAttribute.html +36 -51
- data/doc/TaskJuggler/ListAttributeBase.html +24 -4
- data/doc/TaskJuggler/Log.html +50 -32
- data/doc/TaskJuggler/LogFile.html +37 -17
- data/doc/TaskJuggler/LogicalAttribute.html +53 -33
- data/doc/TaskJuggler/LogicalExpression.html +26 -6
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
- data/doc/TaskJuggler/LogicalFlag.html +42 -22
- data/doc/TaskJuggler/LogicalFunction.html +204 -140
- data/doc/TaskJuggler/LogicalOperation.html +135 -111
- data/doc/TaskJuggler/Macro.html +22 -2
- data/doc/TaskJuggler/MacroParser.html +32 -12
- data/doc/TaskJuggler/MacroTable.html +32 -12
- data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
- data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
- data/doc/TaskJuggler/Message.html +24 -4
- data/doc/TaskJuggler/MessageHandler.html +24 -4
- data/doc/TaskJuggler/Navigator.html +104 -71
- data/doc/TaskJuggler/NavigatorElement.html +32 -12
- data/doc/TaskJuggler/NikuProject.html +22 -2
- data/doc/TaskJuggler/NikuReport.html +310 -228
- data/doc/TaskJuggler/NikuResource.html +22 -2
- data/doc/TaskJuggler/NodeListAttribute.html +615 -0
- data/doc/TaskJuggler/OnShiftCache.html +32 -12
- data/doc/TaskJuggler/ProcessIntercom.html +205 -78
- data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
- data/doc/TaskJuggler/Project.html +708 -660
- data/doc/TaskJuggler/ProjectBroker.html +506 -304
- data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
- data/doc/TaskJuggler/ProjectFileParser.html +429 -373
- data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
- data/doc/TaskJuggler/ProjectRecord.html +80 -60
- data/doc/TaskJuggler/ProjectServer.html +312 -237
- data/doc/TaskJuggler/ProjectServerIface.html +101 -43
- data/doc/TaskJuggler/PropertyAttribute.html +32 -12
- data/doc/TaskJuggler/PropertyList.html +166 -145
- data/doc/TaskJuggler/PropertySet.html +254 -224
- data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
- data/doc/TaskJuggler/Query.html +169 -148
- data/doc/TaskJuggler/RTFHandlers.html +622 -0
- data/doc/TaskJuggler/RTFNavigator.html +28 -8
- data/doc/TaskJuggler/RTFQuery.html +40 -20
- data/doc/TaskJuggler/RTFReport.html +62 -25
- data/doc/TaskJuggler/RTFReportLink.html +765 -0
- data/doc/TaskJuggler/RealFormat.html +26 -6
- data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
- data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
- data/doc/TaskJuggler/Report.html +402 -251
- data/doc/TaskJuggler/ReportBase.html +162 -137
- data/doc/TaskJuggler/ReportContext.html +112 -29
- data/doc/TaskJuggler/ReportServer.html +89 -64
- data/doc/TaskJuggler/ReportServerIface.html +75 -55
- data/doc/TaskJuggler/ReportServerRecord.html +54 -31
- data/doc/TaskJuggler/ReportServlet.html +980 -0
- data/doc/TaskJuggler/ReportTable.html +41 -21
- data/doc/TaskJuggler/ReportTableCell.html +214 -170
- data/doc/TaskJuggler/ReportTableColumn.html +30 -10
- data/doc/TaskJuggler/ReportTableLegend.html +36 -16
- data/doc/TaskJuggler/ReportTableLine.html +32 -12
- data/doc/TaskJuggler/Resource.html +99 -87
- data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
- data/doc/TaskJuggler/ResourceListRE.html +47 -26
- data/doc/TaskJuggler/ResourceScenario.html +403 -437
- data/doc/TaskJuggler/RichText.html +26 -6
- data/doc/TaskJuggler/RichTextAttribute.html +50 -30
- data/doc/TaskJuggler/RichTextDocument.html +37 -17
- data/doc/TaskJuggler/RichTextElement.html +475 -413
- data/doc/TaskJuggler/RichTextException.html +22 -2
- data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
- data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
- data/doc/TaskJuggler/RichTextImage.html +22 -2
- data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
- data/doc/TaskJuggler/RichTextParser.html +56 -34
- data/doc/TaskJuggler/RichTextScanner.html +82 -61
- data/doc/TaskJuggler/RichTextSnip.html +34 -14
- data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
- data/doc/TaskJuggler/Scenario.html +22 -2
- data/doc/TaskJuggler/ScenarioData.html +30 -46
- data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
- data/doc/TaskJuggler/Scoreboard.html +42 -22
- data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
- data/doc/TaskJuggler/SheetReceiver.html +333 -295
- data/doc/TaskJuggler/SheetSender.html +253 -230
- data/doc/TaskJuggler/Shift.html +26 -6
- data/doc/TaskJuggler/ShiftAssignment.html +89 -73
- data/doc/TaskJuggler/ShiftAssignments.html +226 -234
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
- data/doc/TaskJuggler/ShiftScenario.html +28 -8
- data/doc/TaskJuggler/SortListAttribute.html +34 -14
- data/doc/TaskJuggler/SourceFileInfo.html +24 -4
- data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
- data/doc/TaskJuggler/StatusSheetReport.html +168 -153
- data/doc/TaskJuggler/StatusSheetSender.html +24 -3
- data/doc/TaskJuggler/StringAttribute.html +38 -18
- data/doc/TaskJuggler/SymbolAttribute.html +32 -12
- data/doc/TaskJuggler/SyntaxReference.html +40 -20
- data/doc/TaskJuggler/TOCEntry.html +26 -6
- data/doc/TaskJuggler/TSResourceRecord.html +22 -2
- data/doc/TaskJuggler/TSTaskRecord.html +22 -2
- data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
- data/doc/TaskJuggler/TableOfContents.html +26 -6
- data/doc/TaskJuggler/TableReport.html +937 -904
- data/doc/TaskJuggler/Task.html +55 -36
- data/doc/TaskJuggler/TaskDependency.html +24 -4
- data/doc/TaskJuggler/TaskListAttribute.html +50 -30
- data/doc/TaskJuggler/TaskListRE.html +27 -7
- data/doc/TaskJuggler/TaskScenario.html +1273 -1153
- data/doc/TaskJuggler/TextFormatter.html +28 -8
- data/doc/TaskJuggler/TextParser.html +585 -338
- data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
- data/doc/TaskJuggler/TextParser/Rule.html +95 -73
- data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
- data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
- data/doc/TaskJuggler/TextReport.html +28 -8
- data/doc/TaskJuggler/TextScanner.html +400 -1404
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
- data/doc/TaskJuggler/TimeSheet.html +48 -28
- data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
- data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
- data/doc/TaskJuggler/TimeSheetReport.html +154 -133
- data/doc/TaskJuggler/TimeSheetSender.html +24 -3
- data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
- data/doc/TaskJuggler/TimeSheets.html +26 -6
- data/doc/TaskJuggler/Tj3AppBase.html +85 -58
- data/doc/TaskJuggler/Tj3Client.html +292 -238
- data/doc/TaskJuggler/Tj3Daemon.html +159 -74
- data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
- data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
- data/doc/TaskJuggler/Tj3SsSender.html +53 -26
- data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
- data/doc/TaskJuggler/Tj3TsSender.html +26 -6
- data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
- data/doc/TaskJuggler/TjException.html +22 -2
- data/doc/TaskJuggler/TjTime.html +216 -160
- data/doc/TaskJuggler/TjpExample.html +34 -14
- data/doc/TaskJuggler/TjpExportRE.html +403 -407
- data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
- data/doc/TaskJuggler/URLParameter.html +649 -0
- data/doc/TaskJuggler/UserManual.html +42 -22
- data/doc/TaskJuggler/WebServer.html +702 -0
- data/doc/TaskJuggler/WorkingHours.html +38 -18
- data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
- data/doc/TaskJuggler/XMLBlob.html +24 -4
- data/doc/TaskJuggler/XMLComment.html +24 -4
- data/doc/TaskJuggler/XMLDocument.html +30 -10
- data/doc/TaskJuggler/XMLElement.html +34 -14
- data/doc/TaskJuggler/XMLNamedText.html +22 -2
- data/doc/TaskJuggler/XMLText.html +24 -4
- data/doc/index.html +1841 -1666
- data/doc/lib/AccountScenario_rb.html +1 -1
- data/doc/lib/Account_rb.html +1 -1
- data/doc/lib/Allocation_rb.html +1 -1
- data/doc/lib/AppConfig_rb.html +2 -2
- data/doc/lib/AttributeBase_rb.html +1 -1
- data/doc/lib/AttributeDefinition_rb.html +1 -1
- data/doc/lib/Attributes_rb.html +2 -2
- data/doc/lib/BatchProcessor_rb.html +1 -1
- data/doc/lib/Booking_rb.html +1 -1
- data/doc/lib/ChargeSet_rb.html +1 -1
- data/doc/lib/Charge_rb.html +1 -1
- data/doc/lib/HTMLDocument_rb.html +1 -1
- data/doc/lib/Interval_rb.html +1 -1
- data/doc/lib/Journal_rb.html +2 -2
- data/doc/lib/KeywordArray_rb.html +1 -1
- data/doc/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/lib/Limits_rb.html +2 -2
- data/doc/lib/LogFile_rb.html +2 -2
- data/doc/lib/Log_rb.html +1 -1
- data/doc/lib/LogicalExpression_rb.html +1 -1
- data/doc/lib/LogicalFunction_rb.html +2 -2
- data/doc/lib/LogicalOperation_rb.html +2 -2
- data/doc/lib/MacroParser_rb.html +1 -1
- data/doc/lib/MacroTable_rb.html +1 -1
- data/doc/lib/MessageHandler_rb.html +1 -1
- data/doc/lib/Message_rb.html +1 -1
- data/doc/lib/ProjectFileParser_rb.html +4 -8
- data/doc/lib/ProjectFileScanner_rb.html +67 -0
- data/doc/lib/Project_rb.html +2 -2
- data/doc/lib/PropertyList_rb.html +2 -2
- data/doc/lib/PropertySet_rb.html +2 -2
- data/doc/lib/PropertyTreeNode_rb.html +2 -2
- data/doc/lib/Query_rb.html +2 -2
- data/doc/lib/RTFHandlers_rb.html +73 -0
- data/doc/lib/RTFNavigator_rb.html +1 -1
- data/doc/lib/RTFQuery_rb.html +1 -1
- data/doc/lib/RTFReportLink_rb.html +71 -0
- data/doc/lib/RTFReport_rb.html +2 -2
- data/doc/lib/RealFormat_rb.html +1 -1
- data/doc/lib/ResourceScenario_rb.html +2 -2
- data/doc/lib/Resource_rb.html +2 -2
- data/doc/lib/RichTextDocument_rb.html +1 -1
- data/doc/lib/RichTextElement_rb.html +2 -2
- data/doc/lib/RichTextFunctionExample_rb.html +1 -1
- data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
- data/doc/lib/RichTextParser_rb.html +2 -2
- data/doc/lib/RichTextScanner_rb.html +2 -2
- data/doc/lib/RichTextSnip_rb.html +1 -1
- data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
- data/doc/lib/RichText_rb.html +1 -1
- data/doc/lib/RuntimeConfig_rb.html +1 -1
- data/doc/lib/ScenarioData_rb.html +2 -2
- data/doc/lib/Scenario_rb.html +1 -1
- data/doc/lib/Scoreboard_rb.html +1 -1
- data/doc/lib/SheetHandlerBase_rb.html +1 -1
- data/doc/lib/SheetReceiver_rb.html +2 -2
- data/doc/lib/SheetSender_rb.html +4 -2
- data/doc/lib/ShiftAssignments_rb.html +4 -2
- data/doc/lib/ShiftScenario_rb.html +1 -1
- data/doc/lib/Shift_rb.html +1 -1
- data/doc/lib/SourceFileInfo_rb.html +1 -1
- data/doc/lib/StatusSheetReceiver_rb.html +2 -2
- data/doc/lib/StatusSheetSender_rb.html +2 -2
- data/doc/lib/SyntaxReference_rb.html +1 -1
- data/doc/lib/TOCEntry_rb.html +1 -1
- data/doc/lib/TableColumnDefinition_rb.html +2 -2
- data/doc/lib/TableOfContents_rb.html +1 -1
- data/doc/lib/TaskDependency_rb.html +1 -1
- data/doc/lib/TaskJuggler_rb.html +2 -2
- data/doc/lib/TaskScenario_rb.html +2 -2
- data/doc/lib/Task_rb.html +2 -2
- data/doc/lib/TextFormatter_rb.html +1 -1
- data/doc/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/lib/TextParser/Rule_rb.html +2 -2
- data/doc/lib/TextParser/StackElement_rb.html +2 -2
- data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/lib/TextParser_rb.html +2 -2
- data/doc/lib/TextScanner_rb.html +6 -2
- data/doc/lib/TimeSheetReceiver_rb.html +2 -2
- data/doc/lib/TimeSheetSender_rb.html +2 -2
- data/doc/lib/TimeSheetSummary_rb.html +2 -2
- data/doc/lib/TimeSheets_rb.html +2 -2
- data/doc/lib/Tj3AppBase_rb.html +2 -2
- data/doc/lib/Tj3Config_rb.html +2 -2
- data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
- data/doc/lib/TjException_rb.html +1 -1
- data/doc/lib/TjTime_rb.html +2 -2
- data/doc/lib/TjpExample_rb.html +1 -1
- data/doc/lib/TjpSyntaxRules_rb.html +2 -2
- data/doc/lib/URLParameter_rb.html +67 -0
- data/doc/lib/UTF8String_rb.html +1 -1
- data/doc/lib/UserManual_rb.html +1 -1
- data/doc/lib/WorkingHours_rb.html +1 -1
- data/doc/lib/XMLDocument_rb.html +2 -2
- data/doc/lib/XMLElement_rb.html +1 -1
- data/doc/lib/daemon/Daemon_rb.html +1 -1
- data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
- data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
- data/doc/lib/daemon/ProjectServer_rb.html +2 -2
- data/doc/lib/daemon/ReportServer_rb.html +2 -2
- data/doc/lib/daemon/WebServer_rb.html +75 -0
- data/doc/lib/deep_copy_rb.html +2 -2
- data/doc/lib/reports/CSVFile_rb.html +2 -2
- data/doc/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/lib/reports/GanttChart_rb.html +2 -2
- data/doc/lib/reports/GanttContainer_rb.html +1 -1
- data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/lib/reports/GanttHeader_rb.html +1 -1
- data/doc/lib/reports/GanttLine_rb.html +1 -1
- data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
- data/doc/lib/reports/GanttMilestone_rb.html +1 -1
- data/doc/lib/reports/GanttRouter_rb.html +1 -1
- data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
- data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
- data/doc/lib/reports/Navigator_rb.html +2 -2
- data/doc/lib/reports/NikuReport_rb.html +2 -2
- data/doc/lib/reports/ReportBase_rb.html +2 -2
- data/doc/lib/reports/ReportContext_rb.html +2 -2
- data/doc/lib/reports/ReportTableCell_rb.html +2 -2
- data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
- data/doc/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/lib/reports/ReportTable_rb.html +2 -2
- data/doc/lib/reports/Report_rb.html +2 -2
- data/doc/lib/reports/ResourceListRE_rb.html +2 -2
- data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
- data/doc/lib/reports/TableReport_rb.html +2 -2
- data/doc/lib/reports/TaskListRE_rb.html +2 -2
- data/doc/lib/reports/TextReport_rb.html +1 -1
- data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
- data/doc/lib/reports/TjpExportRE_rb.html +2 -2
- data/doc/lib/ruby-signal-bug_rb.html +1 -1
- data/doc/lib/taskjuggler3_rb.html +2 -2
- data/doc/lib/tj3client_rb.html +2 -2
- data/doc/lib/tj3d_rb.html +2 -2
- data/doc/lib/tj3man_rb.html +1 -1
- data/doc/lib/tj3ss_receiver_rb.html +1 -1
- data/doc/lib/tj3ss_sender_rb.html +2 -2
- data/doc/lib/tj3ts_receiver_rb.html +2 -2
- data/doc/lib/tj3ts_sender_rb.html +1 -1
- data/doc/lib/tj3ts_summary_rb.html +1 -1
- data/doc/rdoc.css +9 -4
- data/examples/tutorial.tjp +17 -15
- data/gem_spec.rb +3 -0
- data/lib/AppConfig.rb +3 -1
- data/lib/Attributes.rb +10 -8
- data/lib/Journal.rb +55 -20
- data/lib/Limits.rb +72 -46
- data/lib/LogFile.rb +3 -3
- data/lib/LogicalFunction.rb +19 -6
- data/lib/LogicalOperation.rb +5 -1
- data/lib/Project.rb +37 -9
- data/lib/ProjectFileParser.rb +25 -22
- data/lib/ProjectFileScanner.rb +365 -0
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +14 -4
- data/lib/PropertyTreeNode.rb +42 -29
- data/lib/Query.rb +3 -1
- data/lib/RTFHandlers.rb +35 -0
- data/lib/RTFReport.rb +23 -6
- data/lib/RTFReportLink.rb +72 -0
- data/lib/Resource.rb +8 -16
- data/lib/ResourceScenario.rb +1 -22
- data/lib/RichTextElement.rb +42 -0
- data/lib/RichTextParser.rb +6 -4
- data/lib/RichTextScanner.rb +5 -5
- data/lib/RichTextSyntaxRules.rb +48 -10
- data/lib/ScenarioData.rb +5 -3
- data/lib/SheetReceiver.rb +24 -6
- data/lib/SheetSender.rb +17 -13
- data/lib/ShiftAssignments.rb +56 -52
- data/lib/StatusSheetReceiver.rb +1 -0
- data/lib/StatusSheetSender.rb +1 -0
- data/lib/TableColumnDefinition.rb +4 -2
- data/lib/Task.rb +8 -9
- data/lib/TaskJuggler.rb +21 -11
- data/lib/TaskScenario.rb +61 -26
- data/lib/TextParser.rb +268 -106
- data/lib/TextParser/Rule.rb +4 -2
- data/lib/TextParser/StackElement.rb +6 -4
- data/lib/TextScanner.rb +283 -700
- data/lib/TimeSheetReceiver.rb +1 -0
- data/lib/TimeSheetSender.rb +1 -0
- data/lib/TimeSheetSummary.rb +51 -26
- data/lib/TimeSheets.rb +1 -1
- data/lib/Tj3AppBase.rb +8 -1
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +5 -0
- data/lib/TjpSyntaxRules.rb +360 -144
- data/lib/URLParameter.rb +30 -0
- data/lib/XMLDocument.rb +2 -2
- data/lib/daemon/ProcessIntercom.rb +50 -9
- data/lib/daemon/ProjectBroker.rb +63 -10
- data/lib/daemon/ProjectServer.rb +47 -16
- data/lib/daemon/ReportServer.rb +9 -4
- data/lib/daemon/WebServer.rb +204 -0
- data/lib/deep_copy.rb +4 -1
- data/lib/reports/CSVFile.rb +150 -66
- data/lib/reports/GanttChart.rb +2 -1
- data/lib/reports/Navigator.rb +18 -5
- data/lib/reports/NikuReport.rb +32 -2
- data/lib/reports/Report.rb +65 -37
- data/lib/reports/ReportBase.rb +14 -9
- data/lib/reports/ReportContext.rb +19 -4
- data/lib/reports/ReportTable.rb +2 -2
- data/lib/reports/ReportTableCell.rb +54 -30
- data/lib/reports/ResourceListRE.rb +4 -3
- data/lib/reports/StatusSheetReport.rb +8 -13
- data/lib/reports/TableReport.rb +47 -32
- data/lib/reports/TaskListRE.rb +3 -3
- data/lib/reports/TimeSheetReport.rb +14 -5
- data/lib/reports/TjpExportRE.rb +14 -19
- data/lib/taskjuggler3.rb +15 -0
- data/lib/tj3client.rb +9 -7
- data/lib/tj3d.rb +38 -10
- data/lib/tj3ss_sender.rb +7 -0
- data/lib/tj3ts_receiver.rb +1 -0
- data/manual/Day_To_Day_Juggling +1 -1
- data/manual/Rich_Text_Attributes +8 -0
- data/manual/TaskJuggler_2x_Migration +7 -0
- data/manual/The_TaskJuggler_Syntax +20 -6
- data/prj_cfg.rb +3 -2
- data/tasks/changelog.rake +36 -0
- data/tasks/csts.rake +2 -3
- data/tasks/gem.rake +10 -0
- data/tasks/missing.rake +0 -17
- data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
- data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
- data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
- data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
- data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
- data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
- data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
- data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
- data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
- data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
- data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
- data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
- data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
- data/test/TestSuite/StatusSheets/run +3 -2
- data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
- data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
- data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
- data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
- data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
- data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
- data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
- data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
- data/test/TestSuite/TimeSheets/run +5 -5
- data/test/test_CSVFile.rb +75 -0
- data/test/test_Limits.rb +63 -5
- data/test/test_ProjectFileScanner.rb +163 -0
- data/test/test_ReportGenerator.rb +81 -0
- data/test/test_RichText.rb +21 -3
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +4 -4
- data/test/test_Syntax.rb +1 -1
- data/test/test_URLParameter.rb +30 -0
- metadata +126 -32
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
- data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
- data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
- data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
- data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
- data/test/TestSuite/TimeSheets/receiver.log +0 -102
- data/test/TestSuite/TimeSheets/sender.log +0 -794
- data/test/TestSuite/TimeSheets/summary.log +0 -884
- data/test/TestSuite/TimeSheets/timesheets.log +0 -45
- data/test/TestSuite/TimeSheets/tj3d.log +0 -292
- data/test/test_TextScanner.rb +0 -95
data/lib/Limits.rb
CHANGED
|
@@ -25,14 +25,16 @@ class TaskJuggler
|
|
|
25
25
|
class Limit
|
|
26
26
|
|
|
27
27
|
attr_accessor :resource
|
|
28
|
+
attr_reader :name, :interval, :upper
|
|
28
29
|
|
|
29
30
|
# To create a new Limit object, the Interval +interval+ and the
|
|
30
|
-
# period duration (+period+ in seconds) must be specified. This creates
|
|
31
|
-
# counter for each period within the overall interval. +value+ is the
|
|
32
|
-
# of the limit. +upper+ specifies whether the limit is an upper or
|
|
33
|
-
# limit. The limit can also be restricted to certain a Resource
|
|
34
|
-
# by +resource+.
|
|
35
|
-
def initialize(interval, period, value, upper, resource)
|
|
31
|
+
# period duration (+period+ in seconds) must be specified. This creates
|
|
32
|
+
# a counter for each period within the overall interval. +value+ is the
|
|
33
|
+
# value of the limit. +upper+ specifies whether the limit is an upper or
|
|
34
|
+
# lower limit. The limit can also be restricted to certain a Resource
|
|
35
|
+
# specified by +resource+.
|
|
36
|
+
def initialize(name, interval, period, value, upper, resource)
|
|
37
|
+
@name = name
|
|
36
38
|
@interval = interval
|
|
37
39
|
@period = period
|
|
38
40
|
@value = value
|
|
@@ -47,7 +49,7 @@ class TaskJuggler
|
|
|
47
49
|
|
|
48
50
|
# Returns a deep copy of the class instance.
|
|
49
51
|
def copy
|
|
50
|
-
Limit.new(@interval, @period, @value, @upper, @resource)
|
|
52
|
+
Limit.new(@name, @interval, @period, @value, @upper, @resource)
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
# This function can be used to reset the counter for a specific period
|
|
@@ -56,7 +58,8 @@ class TaskJuggler
|
|
|
56
58
|
return unless @dirty
|
|
57
59
|
|
|
58
60
|
if date.nil?
|
|
59
|
-
@scoreboard = Scoreboard.new(@interval.start, @interval.end,
|
|
61
|
+
@scoreboard = Scoreboard.new(@interval.start, @interval.end,
|
|
62
|
+
@period, 0)
|
|
60
63
|
else
|
|
61
64
|
return unless @interval.contains?(date)
|
|
62
65
|
@scoreboard.set(date, 0)
|
|
@@ -64,54 +67,67 @@ class TaskJuggler
|
|
|
64
67
|
@dirty = false
|
|
65
68
|
end
|
|
66
69
|
|
|
67
|
-
# Increase the counter
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
+
# Increase the counter if the _date_ matches the @interval. The
|
|
71
|
+
# relationship between @resource and _resource_ is described below.
|
|
72
|
+
# @r \ _r_ nil y
|
|
73
|
+
# nil inc inc
|
|
74
|
+
# x - if x==y inc else -
|
|
70
75
|
def inc(date, resource)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
if @interval.contains?(date) &&
|
|
77
|
+
(@resource.nil? || @resource == resource)
|
|
78
|
+
# The condition is met, increment the counter for the interval.
|
|
79
|
+
@dirty = true
|
|
80
|
+
@scoreboard.set(date, @scoreboard.get(date) + 1)
|
|
81
|
+
end
|
|
75
82
|
end
|
|
76
83
|
|
|
77
|
-
# Returns true if the counter for the time slot specified by +date+ or
|
|
78
|
-
# counters are within the limit. If +upper+ is true, only upper
|
|
79
|
-
# checked. If not, only lower limits are checked.
|
|
80
|
-
#
|
|
84
|
+
# Returns true if the counter for the time slot specified by +date+ or
|
|
85
|
+
# all counters are within the limit. If +upper+ is true, only upper
|
|
86
|
+
# limits are checked. If not, only lower limits are checked. The
|
|
87
|
+
# dependency between _resource_ and @resource is described in the matrix
|
|
88
|
+
# below:
|
|
89
|
+
# @r \ _r_ nil y
|
|
90
|
+
# nil test true
|
|
91
|
+
# x true if x==y test else true
|
|
81
92
|
def ok?(date, upper, resource)
|
|
82
|
-
if
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
# if @upper does not match or the provided resource does not match,
|
|
94
|
+
# we can ignore this limit.
|
|
95
|
+
return true if @upper != upper ||
|
|
96
|
+
(!@resource.nil? ^ !resource.nil?) ||
|
|
97
|
+
(@resource && resource && @resource != resource)
|
|
85
98
|
|
|
86
|
-
|
|
99
|
+
if date.nil?
|
|
100
|
+
# No date given. We need to check all counters.
|
|
87
101
|
@scoreboard.each do |i|
|
|
88
102
|
return false if @upper ? i >= @value : i < @value
|
|
89
103
|
end
|
|
90
104
|
return true
|
|
91
105
|
else
|
|
92
|
-
# If the date is outside the interval
|
|
93
|
-
#
|
|
94
|
-
return true if !@interval.contains?(date)
|
|
95
|
-
|
|
106
|
+
# If the date is outside the interval we don't have to check
|
|
107
|
+
# anything. Everything is ok.
|
|
108
|
+
return true if !@interval.contains?(date)
|
|
109
|
+
|
|
110
|
+
return @upper ? @scoreboard.get(date) < @value :
|
|
111
|
+
@scoreboard.get(date) >= @value
|
|
96
112
|
end
|
|
97
113
|
end
|
|
98
114
|
|
|
99
115
|
end
|
|
100
116
|
|
|
101
|
-
attr_reader :
|
|
117
|
+
attr_reader :project, :limits
|
|
102
118
|
|
|
103
119
|
# Create a new Limits object. If an argument is passed, it acts as a copy
|
|
104
120
|
# contructor.
|
|
105
121
|
def initialize(limits = nil)
|
|
106
122
|
if limits.nil?
|
|
107
123
|
# Normal initialization
|
|
108
|
-
@limits =
|
|
124
|
+
@limits = []
|
|
109
125
|
@project = nil
|
|
110
126
|
else
|
|
111
127
|
# Deep copy content from other instance.
|
|
112
|
-
@limits =
|
|
128
|
+
@limits = []
|
|
113
129
|
limits.limits.each do |name, limit|
|
|
114
|
-
@limits
|
|
130
|
+
@limits << limit.copy
|
|
115
131
|
end
|
|
116
132
|
@project = limits.project
|
|
117
133
|
end
|
|
@@ -128,32 +144,40 @@ class TaskJuggler
|
|
|
128
144
|
|
|
129
145
|
# Reset all counter for all limits.
|
|
130
146
|
def reset
|
|
131
|
-
@limits.
|
|
147
|
+
@limits.each { |limit| limit.reset }
|
|
132
148
|
end
|
|
133
149
|
|
|
134
|
-
# Call this function to create or change a limit. The limit
|
|
135
|
-
# identified by +name
|
|
136
|
-
# +
|
|
150
|
+
# Call this function to create or change a limit. The limit is uniquely
|
|
151
|
+
# identified by the combination of +name+, +interval+ and +resource+.
|
|
152
|
+
# +value+ is the new limit value (in time slots). In case the interval
|
|
137
153
|
# is nil, the complete project time frame is used.
|
|
138
154
|
def setLimit(name, value, interval = nil, resource = nil)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
155
|
+
iv = interval || Interval.new(@project['start'], @project['end'])
|
|
156
|
+
# If we have already a limit for the name + interval + resource
|
|
157
|
+
# combination, we delete it first.
|
|
158
|
+
@limits.delete_if do |l|
|
|
159
|
+
l.name == name && l.interval.start == iv.start &&
|
|
160
|
+
l.interval.end == iv.end && l.resource == resource
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
newLimit(name, value, iv, resource)
|
|
142
164
|
end
|
|
143
165
|
|
|
144
166
|
# This function increases the counters for all limits for a specific
|
|
145
167
|
# interval identified by _date_.
|
|
146
168
|
def inc(date, resource = nil)
|
|
147
|
-
@limits.
|
|
169
|
+
@limits.each do |limit|
|
|
148
170
|
limit.inc(date, resource)
|
|
149
171
|
end
|
|
150
172
|
end
|
|
151
173
|
|
|
152
|
-
# Check all upper limits and return true if none is exceeded. If a _date_
|
|
153
|
-
# specified only the
|
|
154
|
-
# all periods are tested.
|
|
174
|
+
# Check all upper limits and return true if none is exceeded. If a _date_
|
|
175
|
+
# is specified only the counters for that specific period are tested.
|
|
176
|
+
# Otherwise all periods are tested. If _resource_ is nil, only
|
|
177
|
+
# non-resource-specific counters are checked, otherwise only the ones that
|
|
178
|
+
# match the _resource_.
|
|
155
179
|
def ok?(date = nil, upper = true, resource = nil)
|
|
156
|
-
@limits.
|
|
180
|
+
@limits.each do |limit|
|
|
157
181
|
return false unless limit.ok?(date, upper, resource)
|
|
158
182
|
end
|
|
159
183
|
true
|
|
@@ -176,12 +200,14 @@ class TaskJuggler
|
|
|
176
200
|
period = 60 * 60 * 24
|
|
177
201
|
upper = false
|
|
178
202
|
when 'weeklymax'
|
|
179
|
-
interval.start = interval.start.beginOfWeek(
|
|
203
|
+
interval.start = interval.start.beginOfWeek(
|
|
204
|
+
@project['weekStartsMonday'])
|
|
180
205
|
interval.end = interval.end.beginOfWeek(@project['weekStartsMonday'])
|
|
181
206
|
period = 60 * 60 * 24 * 7
|
|
182
207
|
upper = true
|
|
183
208
|
when 'weeklymin'
|
|
184
|
-
interval.start = interval.start.beginOfWeek(
|
|
209
|
+
interval.start = interval.start.beginOfWeek(
|
|
210
|
+
@project['weekStartsMonday'])
|
|
185
211
|
interval.end = interval.end.beginOfWeek(@project['weekStartsMonday'])
|
|
186
212
|
period = 60 * 60 * 24 * 7
|
|
187
213
|
upper = false
|
|
@@ -212,7 +238,7 @@ class TaskJuggler
|
|
|
212
238
|
end
|
|
213
239
|
endDate = @project['end']
|
|
214
240
|
|
|
215
|
-
@limits
|
|
241
|
+
@limits << Limit.new(name, interval, period, value, upper, resource)
|
|
216
242
|
end
|
|
217
243
|
|
|
218
244
|
end
|
data/lib/LogFile.rb
CHANGED
|
@@ -28,17 +28,17 @@ class TaskJuggler
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def debug(message)
|
|
31
|
-
$
|
|
31
|
+
$stderr.puts message if @outputLevel >= 4
|
|
32
32
|
log('DEBUG', message) if @logLevel >= 4
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def info(message)
|
|
36
|
-
$
|
|
36
|
+
$stderr.puts message if @outputLevel >= 3
|
|
37
37
|
log('INFO', message) if @logLevel >= 3
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def warning(message)
|
|
41
|
-
$
|
|
41
|
+
$stderr.puts message if @outputLevel >= 2
|
|
42
42
|
log('WARN', message) if @logLevel >= 2
|
|
43
43
|
end
|
|
44
44
|
|
data/lib/LogicalFunction.rb
CHANGED
|
@@ -27,6 +27,7 @@ class TaskJuggler
|
|
|
27
27
|
'isactive' => 1,
|
|
28
28
|
'isdependencyof' => 3,
|
|
29
29
|
'isdutyof' => 2,
|
|
30
|
+
'isfeatureof' => 2,
|
|
30
31
|
'isleaf' => 0,
|
|
31
32
|
'isongoing' => 1,
|
|
32
33
|
'isresource' => 0,
|
|
@@ -94,7 +95,7 @@ class TaskJuggler
|
|
|
94
95
|
property, scopeProperty = properties(expr)
|
|
95
96
|
query = expr.query
|
|
96
97
|
project = property.project
|
|
97
|
-
date = project.
|
|
98
|
+
date = project.reportContexts.last.report.get('end')
|
|
98
99
|
!project['journal'].currentEntries(query.end, property,
|
|
99
100
|
args[0], query.start).empty?
|
|
100
101
|
end
|
|
@@ -110,9 +111,8 @@ class TaskJuggler
|
|
|
110
111
|
expr.error("Unknown scenario '#{args[0]}' used for function isactive()")
|
|
111
112
|
end
|
|
112
113
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
project.reportContext.report.get('end'),
|
|
114
|
+
query = expr.query
|
|
115
|
+
property.getAllocatedTime(scenarioIdx, query.start, query.end,
|
|
116
116
|
scopeProperty) > 0.0
|
|
117
117
|
end
|
|
118
118
|
|
|
@@ -144,6 +144,19 @@ class TaskJuggler
|
|
|
144
144
|
task['assignedresources', scenarioIdx].include?(resource)
|
|
145
145
|
end
|
|
146
146
|
|
|
147
|
+
def isfeatureof(expr, args)
|
|
148
|
+
property, scopeProperty = properties(expr)
|
|
149
|
+
# The result can only be true when called for a Task property.
|
|
150
|
+
return false unless property.is_a?(Task)
|
|
151
|
+
project = property.project
|
|
152
|
+
# 1st arg must be a task ID.
|
|
153
|
+
return false if (task = project.task(args[0])).nil?
|
|
154
|
+
# 2nd arg must be a scenario index.
|
|
155
|
+
return false if (scenarioIdx = project.scenarioIdx(args[1])).nil?
|
|
156
|
+
|
|
157
|
+
property.isFeatureOf(scenarioIdx, task)
|
|
158
|
+
end
|
|
159
|
+
|
|
147
160
|
def isleaf(expr, args)
|
|
148
161
|
property, scopeProperty = properties(expr)
|
|
149
162
|
return false unless property
|
|
@@ -160,8 +173,8 @@ class TaskJuggler
|
|
|
160
173
|
expr.error("Unknown scenario '#{args[0]}' used for function isongoing()")
|
|
161
174
|
end
|
|
162
175
|
|
|
163
|
-
|
|
164
|
-
|
|
176
|
+
query = expr.query
|
|
177
|
+
iv1 = Interval.new(query.start, query.end)
|
|
165
178
|
tStart = task['start', scenarioIdx]
|
|
166
179
|
tEnd = task['end', scenarioIdx]
|
|
167
180
|
# This helps to show tasks with scheduling errors.
|
data/lib/LogicalOperation.rb
CHANGED
|
@@ -65,13 +65,17 @@ class TaskJuggler
|
|
|
65
65
|
return evalBinaryOperation(opnd1, operator, opnd2) do |o|
|
|
66
66
|
coerceNumber(o, expr)
|
|
67
67
|
end
|
|
68
|
+
elsif opnd1.is_a?(RichTextIntermediate)
|
|
69
|
+
return evalBinaryOperation(opnd1.to_s, operator, opnd2) do |o|
|
|
70
|
+
coerceString(o, expr)
|
|
71
|
+
end
|
|
68
72
|
elsif opnd1.is_a?(String)
|
|
69
73
|
return evalBinaryOperation(opnd1, operator, opnd2) do |o|
|
|
70
74
|
coerceString(o, expr)
|
|
71
75
|
end
|
|
72
76
|
else
|
|
73
77
|
expr.error("First operand of a binary operation must be a date, " +
|
|
74
|
-
"a number or a string: #{opnd1}")
|
|
78
|
+
"a number or a string: #{opnd1.class}")
|
|
75
79
|
end
|
|
76
80
|
when '&'
|
|
77
81
|
return coerceBoolean(@operand1.eval(expr), expr) &&
|
data/lib/Project.rb
CHANGED
|
@@ -50,7 +50,7 @@ class TaskJuggler
|
|
|
50
50
|
|
|
51
51
|
attr_reader :accounts, :shifts, :tasks, :resources, :scenarios,
|
|
52
52
|
:timeSheets, :reports, :messageHandler
|
|
53
|
-
attr_accessor :
|
|
53
|
+
attr_accessor :reportContexts, :outputDir, :warnTsDeltas
|
|
54
54
|
|
|
55
55
|
# Create a project with the specified +id+, +name+ and +version+.
|
|
56
56
|
# +messageHandler+ is a MessageHandler reference that is used to handle
|
|
@@ -335,6 +335,8 @@ class TaskJuggler
|
|
|
335
335
|
true, false, false, nil ],
|
|
336
336
|
[ 'index', 'Index', FixnumAttribute,
|
|
337
337
|
false, false, false, -1 ],
|
|
338
|
+
[ 'interactive', 'Interactive', BooleanAttribute,
|
|
339
|
+
false, false, false, false ],
|
|
338
340
|
[ 'left', 'Left', RichTextAttribute,
|
|
339
341
|
true, false, false, nil ],
|
|
340
342
|
[ 'loadUnit', 'Load Unit', StringAttribute,
|
|
@@ -343,6 +345,8 @@ class TaskJuggler
|
|
|
343
345
|
true, true, false, nil ],
|
|
344
346
|
[ 'numberFormat', 'Number Format', RealFormatAttribute,
|
|
345
347
|
true, true, false, nil ],
|
|
348
|
+
[ 'openNodes', 'Open Nodes', NodeListAttribute,
|
|
349
|
+
false, false, false, nil ],
|
|
346
350
|
[ 'prolog', 'Prolog', RichTextAttribute,
|
|
347
351
|
false, false, false, nil],
|
|
348
352
|
[ 'resourceAttributes', 'Resource Attributes', FormatListAttribute,
|
|
@@ -392,8 +396,12 @@ class TaskJuggler
|
|
|
392
396
|
|
|
393
397
|
@timeSheets = TimeSheets.new
|
|
394
398
|
|
|
395
|
-
#
|
|
396
|
-
|
|
399
|
+
# The ReportContext provides additional settings to the report that can
|
|
400
|
+
# complement or replace the report attributes. Reports can include other
|
|
401
|
+
# reports. During report generation, only one context is active, but the
|
|
402
|
+
# context of enclosing reports needs to be preserved. Therefor we use a
|
|
403
|
+
# stack to implement this.
|
|
404
|
+
@reportContexts = []
|
|
397
405
|
@outputDir = ''
|
|
398
406
|
@warnTsDeltas = false
|
|
399
407
|
end
|
|
@@ -611,8 +619,9 @@ class TaskJuggler
|
|
|
611
619
|
@reports.each do |report|
|
|
612
620
|
next if report.get('formats').empty?
|
|
613
621
|
Log.startProgressMeter("Report #{report.name}")
|
|
614
|
-
@
|
|
622
|
+
@reportContexts.push(ReportContext.new(self, report))
|
|
615
623
|
report.generate
|
|
624
|
+
@reportContexts.pop
|
|
616
625
|
Log.stopProgressMeter
|
|
617
626
|
end
|
|
618
627
|
else
|
|
@@ -620,8 +629,10 @@ class TaskJuggler
|
|
|
620
629
|
@reports.each do |report|
|
|
621
630
|
next if report.get('formats').empty?
|
|
622
631
|
bp.queue(report) {
|
|
623
|
-
@
|
|
624
|
-
report.generate
|
|
632
|
+
@reportContexts.push(ReportContext.new(self, report))
|
|
633
|
+
res = report.generate
|
|
634
|
+
@reportContexts.pop
|
|
635
|
+
res
|
|
625
636
|
}
|
|
626
637
|
end
|
|
627
638
|
bp.wait do |report|
|
|
@@ -645,7 +656,7 @@ class TaskJuggler
|
|
|
645
656
|
true
|
|
646
657
|
end
|
|
647
658
|
|
|
648
|
-
def generateReport(reportId, regExpMode)
|
|
659
|
+
def generateReport(reportId, regExpMode, dynamicAttributes = nil)
|
|
649
660
|
reportList = regExpMode ? reportList = matchingReports(reportId) :
|
|
650
661
|
[ reportId ]
|
|
651
662
|
reportList.each do |id|
|
|
@@ -654,8 +665,25 @@ class TaskJuggler
|
|
|
654
665
|
"Request to generate unknown report #{id}")
|
|
655
666
|
end
|
|
656
667
|
Log.startProgressMeter("Report #{report.name}")
|
|
657
|
-
@
|
|
668
|
+
@reportContexts.push(context = ReportContext.new(self, report))
|
|
669
|
+
|
|
670
|
+
name = nil
|
|
671
|
+
# If we have dynamic attributes we need to backup the old attributes
|
|
672
|
+
# first, then parse the dynamicAttributes String replacing the
|
|
673
|
+
# original values.
|
|
674
|
+
if dynamicAttributes
|
|
675
|
+
context.attributeBackup = report.backupAttributes
|
|
676
|
+
parser = ProjectFileParser.new(@messageHandler)
|
|
677
|
+
parser.parseReportAttributes(report, dynamicAttributes)
|
|
678
|
+
report.set('interactive', true)
|
|
679
|
+
end
|
|
680
|
+
|
|
658
681
|
report.generate
|
|
682
|
+
|
|
683
|
+
if dynamicAttributes
|
|
684
|
+
report.restoreAttributes(context.attributeBackup)
|
|
685
|
+
end
|
|
686
|
+
@reportContexts.pop
|
|
659
687
|
Log.stopProgressMeter
|
|
660
688
|
end
|
|
661
689
|
end
|
|
@@ -669,7 +697,7 @@ class TaskJuggler
|
|
|
669
697
|
formats = report.get('formats')
|
|
670
698
|
next if formats.empty?
|
|
671
699
|
|
|
672
|
-
puts sprintf("
|
|
700
|
+
puts sprintf("%s\t%s\t%s", id, formats.join(', '), report.name)
|
|
673
701
|
end
|
|
674
702
|
end
|
|
675
703
|
|
data/lib/ProjectFileParser.rb
CHANGED
|
@@ -11,12 +11,10 @@
|
|
|
11
11
|
#
|
|
12
12
|
|
|
13
13
|
require 'TextParser'
|
|
14
|
-
require '
|
|
14
|
+
require 'ProjectFileScanner'
|
|
15
15
|
require 'TjpSyntaxRules'
|
|
16
16
|
require 'RichText'
|
|
17
|
-
require '
|
|
18
|
-
require 'RTFQuery'
|
|
19
|
-
require 'RTFReport'
|
|
17
|
+
require 'RTFHandlers'
|
|
20
18
|
|
|
21
19
|
class TaskJuggler
|
|
22
20
|
|
|
@@ -38,10 +36,10 @@ class TaskJuggler
|
|
|
38
36
|
super()
|
|
39
37
|
|
|
40
38
|
@messageHandler = messageHandler
|
|
41
|
-
# Define the token types that the
|
|
42
|
-
# elements.
|
|
39
|
+
# Define the token types that the ProjectFileScanner may return for
|
|
40
|
+
# variable elements.
|
|
43
41
|
@variables = %w( INTEGER FLOAT DATE TIME STRING LITERAL ID ID_WITH_COLON
|
|
44
|
-
|
|
42
|
+
ABSOLUTE_ID MACRO )
|
|
45
43
|
|
|
46
44
|
initRules
|
|
47
45
|
|
|
@@ -52,8 +50,8 @@ class TaskJuggler
|
|
|
52
50
|
# a set of TJP files.
|
|
53
51
|
def open(file, master, fileNameIsBuffer = false)
|
|
54
52
|
begin
|
|
55
|
-
@scanner =
|
|
56
|
-
# We need the
|
|
53
|
+
@scanner = ProjectFileScanner.new(file, @messageHandler)
|
|
54
|
+
# We need the ProjectFileScanner object for error reporting.
|
|
57
55
|
if master && !fileNameIsBuffer && file != '.' && file[-4, 4] != '.tjp'
|
|
58
56
|
error('illegal_extension', "Project file name must end with " +
|
|
59
57
|
'\'.tjp\' extension')
|
|
@@ -92,7 +90,7 @@ class TaskJuggler
|
|
|
92
90
|
|
|
93
91
|
# A set of standard marcros is defined in all files as soon as the project
|
|
94
92
|
# header has been read. Calling this functions gets the values from @project
|
|
95
|
-
# and inserts the Macro objects into the
|
|
93
|
+
# and inserts the Macro objects into the ProjectFileScanner.
|
|
96
94
|
def setGlobalMacros
|
|
97
95
|
@scanner.addMacro(Macro.new('projectstart', @project['start'].to_s,
|
|
98
96
|
@scanner.sourceFileInfo))
|
|
@@ -105,6 +103,13 @@ class TaskJuggler
|
|
|
105
103
|
@scanner.sourceFileInfo))
|
|
106
104
|
end
|
|
107
105
|
|
|
106
|
+
def parseReportAttributes(report, attributes)
|
|
107
|
+
@property = report
|
|
108
|
+
@project = report.project
|
|
109
|
+
open(attributes, false, true)
|
|
110
|
+
parse('reportAttributes')
|
|
111
|
+
end
|
|
112
|
+
|
|
108
113
|
private
|
|
109
114
|
|
|
110
115
|
# Utility function that convers English weekday names into their index
|
|
@@ -124,7 +129,8 @@ class TaskJuggler
|
|
|
124
129
|
if @property.container?
|
|
125
130
|
error('container_attribute',
|
|
126
131
|
"The attribute #{attribute} may not be used for this property " +
|
|
127
|
-
'after sub properties have been added.'
|
|
132
|
+
'after sub properties have been added.', @property,
|
|
133
|
+
@sourceFileInfo[0])
|
|
128
134
|
end
|
|
129
135
|
end
|
|
130
136
|
|
|
@@ -147,13 +153,16 @@ class TaskJuggler
|
|
|
147
153
|
# Convenience function to check the integrity of a booking statement.
|
|
148
154
|
def checkBooking(task, resource)
|
|
149
155
|
unless task.leaf?
|
|
150
|
-
error('booking_no_leaf', "#{task.fullId} is not a leaf task"
|
|
156
|
+
error('booking_no_leaf', "#{task.fullId} is not a leaf task",
|
|
157
|
+
task, @sourceFileInfo[0])
|
|
151
158
|
end
|
|
152
159
|
if task['milestone', @scenarioIdx]
|
|
153
|
-
error('booking_milestone', "You cannot add bookings to a milestone"
|
|
160
|
+
error('booking_milestone', "You cannot add bookings to a milestone",
|
|
161
|
+
task, @sourceFileInfo[0])
|
|
154
162
|
end
|
|
155
163
|
unless resource.leaf?
|
|
156
|
-
error('booking_group', "You cannot book a group resource"
|
|
164
|
+
error('booking_group', "You cannot book a group resource",
|
|
165
|
+
task, @sourceFileInfo[0])
|
|
157
166
|
end
|
|
158
167
|
end
|
|
159
168
|
|
|
@@ -210,12 +219,7 @@ class TaskJuggler
|
|
|
210
219
|
def newRichText(text, tokenSet = nil)
|
|
211
220
|
sfi = sourceFileInfo
|
|
212
221
|
begin
|
|
213
|
-
|
|
214
|
-
RTFNavigator.new(@project, sfi),
|
|
215
|
-
RTFQuery.new(@project, sfi),
|
|
216
|
-
RTFReport.new(@project, sfi)
|
|
217
|
-
]
|
|
218
|
-
rText = RichText.new(text, handlers)
|
|
222
|
+
rText = RichText.new(text, RTFHandlers.create(@project, sfi))
|
|
219
223
|
rti = rText.generateIntermediateFormat( [ 0, 0, 0], tokenSet)
|
|
220
224
|
rti.sectionNumbers = false
|
|
221
225
|
rescue RichTextException => msg
|
|
@@ -283,7 +287,7 @@ class TaskJuggler
|
|
|
283
287
|
})
|
|
284
288
|
descr('A shortcut for all items')
|
|
285
289
|
# A '-' means the list should be empty.
|
|
286
|
-
pattern([ '_
|
|
290
|
+
pattern([ '_-' ], lambda {
|
|
287
291
|
KeywordArray.new
|
|
288
292
|
})
|
|
289
293
|
descr('No items')
|
|
@@ -429,7 +433,6 @@ class TaskJuggler
|
|
|
429
433
|
stackEntry = @fileStack.last
|
|
430
434
|
instance_variable_set('@' + var, stackEntry[var])
|
|
431
435
|
end
|
|
432
|
-
@property = nil
|
|
433
436
|
end
|
|
434
437
|
|
|
435
438
|
end
|