taskjuggler 0.0.3 → 0.0.4
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/benchmarks/UTF-8-Strings.rb +58 -0
- data/data/css/tjmanual.css +52 -0
- data/data/css/tjreport.css +195 -0
- data/data/icons/details.png +0 -0
- data/data/icons/flag-green.png +0 -0
- data/data/icons/flag-red.png +0 -0
- data/data/icons/flag-yellow.png +0 -0
- data/data/icons/resource.png +0 -0
- data/data/icons/resourcegroup.png +0 -0
- data/data/icons/task.png +0 -0
- data/data/icons/taskgroup.png +0 -0
- data/data/icons/trend-down.png +0 -0
- data/data/icons/trend-flat.png +0 -0
- data/data/icons/trend-up.png +0 -0
- data/data/scripts/wz_tooltip.js +1301 -0
- data/doc/classes/AppConfig.html +298 -230
- data/doc/classes/Arguments.html +8 -8
- data/doc/classes/Object.html +7 -7
- data/doc/classes/String.html +89 -89
- data/doc/classes/TaskJuggler.html +396 -264
- data/doc/classes/TaskJuggler/Account.html +18 -18
- data/doc/classes/TaskJuggler/AccountAttribute.html +26 -26
- data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
- data/doc/classes/TaskJuggler/Allocation.html +30 -30
- data/doc/classes/TaskJuggler/AllocationAttribute.html +26 -26
- data/doc/classes/TaskJuggler/AttributeBase.html +227 -115
- data/doc/classes/TaskJuggler/AttributeDefinition.html +6 -6
- data/doc/classes/TaskJuggler/BatchProcessor.html +117 -83
- data/doc/classes/TaskJuggler/Booking.html +18 -18
- data/doc/classes/TaskJuggler/BookingListAttribute.html +26 -26
- data/doc/classes/TaskJuggler/BooleanAttribute.html +26 -26
- data/doc/classes/TaskJuggler/CSVFile.html +24 -24
- data/doc/classes/TaskJuggler/CellSettingPattern.html +201 -0
- data/doc/classes/TaskJuggler/CellSettingPatternList.html +253 -0
- data/doc/classes/TaskJuggler/Charge.html +18 -18
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +20 -20
- data/doc/classes/TaskJuggler/ChargeSet.html +37 -37
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +26 -26
- data/doc/classes/TaskJuggler/ColumnListAttribute.html +20 -20
- data/doc/classes/TaskJuggler/ColumnTable.html +40 -40
- data/doc/classes/TaskJuggler/DateAttribute.html +54 -15
- data/doc/classes/TaskJuggler/DefinitionListAttribute.html +10 -10
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
- data/doc/classes/TaskJuggler/FlagListAttribute.html +43 -43
- data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FormatListAttribute.html +21 -21
- data/doc/classes/TaskJuggler/GanttChart.html +48 -48
- data/doc/classes/TaskJuggler/GanttContainer.html +42 -42
- data/doc/classes/TaskJuggler/GanttHeader.html +12 -12
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +12 -12
- data/doc/classes/TaskJuggler/GanttLine.html +24 -24
- data/doc/classes/TaskJuggler/GanttLoadStack.html +18 -18
- data/doc/classes/TaskJuggler/GanttMilestone.html +42 -42
- data/doc/classes/TaskJuggler/GanttRouter.html +24 -24
- data/doc/classes/TaskJuggler/GanttTaskBar.html +42 -42
- data/doc/classes/TaskJuggler/HTMLDocument.html +13 -13
- data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
- data/doc/classes/TaskJuggler/Interval.html +57 -57
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/JobInfo.html +68 -12
- data/doc/classes/TaskJuggler/Journal.html +266 -20
- data/doc/classes/TaskJuggler/JournalEntry.html +79 -23
- data/doc/classes/TaskJuggler/JournalEntryList.html +454 -0
- data/doc/classes/TaskJuggler/KeywordArray.html +10 -10
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +171 -170
- data/doc/classes/TaskJuggler/Limits.html +36 -36
- data/doc/classes/TaskJuggler/Limits/Limit.html +30 -30
- data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ListAttributeBase.html +20 -20
- data/doc/classes/TaskJuggler/Log.html +145 -107
- data/doc/classes/TaskJuggler/LogicalAttribute.html +65 -36
- data/doc/classes/TaskJuggler/LogicalExpression.html +61 -24
- data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +20 -20
- data/doc/classes/TaskJuggler/LogicalFlag.html +31 -51
- data/doc/classes/TaskJuggler/LogicalFunction.html +64 -53
- data/doc/classes/TaskJuggler/LogicalOperation.html +103 -55
- data/doc/classes/TaskJuggler/Macro.html +6 -6
- data/doc/classes/TaskJuggler/MacroParser.html +36 -36
- data/doc/classes/TaskJuggler/MacroTable.html +37 -37
- data/doc/classes/TaskJuggler/Message.html +12 -12
- data/doc/classes/TaskJuggler/MessageHandler.html +32 -20
- data/doc/classes/TaskJuggler/Navigator.html +110 -46
- data/doc/classes/TaskJuggler/NavigatorElement.html +449 -0
- data/doc/classes/TaskJuggler/OnShiftCache.html +24 -24
- data/doc/classes/TaskJuggler/Project.html +1158 -893
- data/doc/classes/TaskJuggler/ProjectFileParser.html +94 -91
- data/doc/classes/TaskJuggler/PropertyAttribute.html +20 -20
- data/doc/classes/TaskJuggler/PropertyList.html +225 -155
- data/doc/classes/TaskJuggler/PropertySet.html +375 -332
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +750 -510
- data/doc/classes/TaskJuggler/Query.html +404 -139
- data/doc/classes/TaskJuggler/{RTPNavigator.html → RTFNavigator.html} +57 -56
- data/doc/classes/TaskJuggler/RTFQuery.html +343 -0
- data/doc/classes/TaskJuggler/{RTPReport.html → RTFReport.html} +70 -67
- data/doc/classes/TaskJuggler/RealFormat.html +18 -18
- data/doc/classes/TaskJuggler/RealFormatAttribute.html +10 -10
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +107 -40
- data/doc/classes/TaskJuggler/RemoteServiceManager.html +335 -0
- data/doc/classes/TaskJuggler/Report.html +66 -64
- data/doc/classes/TaskJuggler/ReportBase.html +112 -123
- data/doc/classes/TaskJuggler/ReportContext.html +43 -38
- data/doc/classes/TaskJuggler/ReportServer.html +320 -0
- data/doc/classes/TaskJuggler/ReportTable.html +42 -42
- data/doc/classes/TaskJuggler/ReportTableCell.html +221 -129
- data/doc/classes/TaskJuggler/ReportTableColumn.html +27 -27
- data/doc/classes/TaskJuggler/ReportTableLegend.html +24 -24
- data/doc/classes/TaskJuggler/ReportTableLine.html +126 -80
- data/doc/classes/TaskJuggler/Resource.html +12 -12
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +82 -47
- data/doc/classes/TaskJuggler/ResourceListRE.html +43 -39
- data/doc/classes/TaskJuggler/ResourceScenario.html +413 -321
- data/doc/classes/TaskJuggler/RichText.html +64 -248
- data/doc/classes/TaskJuggler/RichTextAttribute.html +94 -30
- data/doc/classes/TaskJuggler/RichTextDocument.html +87 -85
- data/doc/classes/TaskJuggler/RichTextElement.html +456 -363
- data/doc/classes/TaskJuggler/RichTextException.html +13 -13
- data/doc/classes/TaskJuggler/{RichTextProtocolExample.html → RichTextFunctionExample.html} +64 -63
- data/doc/classes/TaskJuggler/{RichTextProtocolHandler.html → RichTextFunctionHandler.html} +42 -36
- data/doc/classes/TaskJuggler/RichTextIntermediate.html +563 -0
- data/doc/classes/TaskJuggler/RichTextParser.html +54 -51
- data/doc/classes/TaskJuggler/RichTextScanner.html +94 -92
- data/doc/classes/TaskJuggler/RichTextSnip.html +96 -60
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +369 -227
- data/doc/classes/TaskJuggler/Scenario.html +6 -6
- data/doc/classes/TaskJuggler/ScenarioData.html +37 -37
- data/doc/classes/TaskJuggler/ScenarioListAttribute.html +31 -31
- data/doc/classes/TaskJuggler/Scoreboard.html +66 -66
- data/doc/classes/TaskJuggler/Shift.html +18 -18
- data/doc/classes/TaskJuggler/ShiftAssignment.html +54 -54
- data/doc/classes/TaskJuggler/ShiftAssignments.html +78 -78
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
- data/doc/classes/TaskJuggler/SortListAttribute.html +22 -22
- data/doc/classes/TaskJuggler/SourceFileInfo.html +12 -12
- data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
- data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
- data/doc/classes/TaskJuggler/SyntaxReference.html +42 -42
- data/doc/classes/TaskJuggler/TOCEntry.html +12 -12
- data/doc/classes/TaskJuggler/TSResourceRecord.html +197 -0
- data/doc/classes/TaskJuggler/TSTaskRecord.html +215 -0
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +64 -43
- data/doc/classes/TaskJuggler/TableOfContents.html +18 -18
- data/doc/classes/TaskJuggler/TableReport.html +447 -468
- data/doc/classes/TaskJuggler/Task.html +12 -12
- data/doc/classes/TaskJuggler/TaskDependency.html +12 -12
- data/doc/classes/TaskJuggler/TaskListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/TaskListRE.html +43 -39
- data/doc/classes/TaskJuggler/TaskScenario.html +529 -282
- data/doc/classes/TaskJuggler/TextParser.html +215 -194
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +97 -97
- data/doc/classes/TaskJuggler/TextParser/Rule.html +84 -84
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -15
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +6 -6
- data/doc/classes/TaskJuggler/TextReport.html +77 -74
- data/doc/classes/TaskJuggler/TextScanner.html +294 -281
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +59 -60
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +12 -12
- data/doc/classes/TaskJuggler/TimeSheetReport.html +406 -0
- data/doc/classes/TaskJuggler/TjException.html +6 -6
- data/doc/classes/TaskJuggler/TjTime.html +522 -513
- data/doc/classes/TaskJuggler/TjpExample.html +25 -25
- data/doc/classes/TaskJuggler/TjpExportRE.html +21 -24
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +6177 -4318
- data/doc/classes/TaskJuggler/UserManual.html +212 -213
- data/doc/classes/TaskJuggler/WorkingHours.html +49 -49
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -53
- data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
- data/doc/classes/TaskJuggler/XMLComment.html +21 -21
- data/doc/classes/TaskJuggler/XMLDocument.html +27 -26
- data/doc/classes/TaskJuggler/XMLElement.html +86 -50
- data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
- data/doc/classes/TaskJuggler/XMLText.html +36 -36
- data/doc/files/COPYING.html +1 -1
- data/doc/files/README.html +1 -1
- data/doc/files/lib/AccountScenario_rb.html +3 -2
- data/doc/files/lib/Account_rb.html +3 -2
- data/doc/files/lib/Allocation_rb.html +3 -2
- data/doc/files/lib/AppConfig_rb.html +5 -2
- data/doc/files/lib/AttributeBase_rb.html +3 -2
- data/doc/files/lib/AttributeDefinition_rb.html +3 -2
- data/doc/files/lib/Attributes_rb.html +3 -2
- data/doc/files/lib/BatchProcessor_rb.html +4 -3
- data/doc/files/lib/Booking_rb.html +3 -2
- data/doc/files/lib/ChargeSet_rb.html +3 -2
- data/doc/files/lib/Charge_rb.html +3 -2
- data/doc/files/lib/HTMLDocument_rb.html +3 -2
- data/doc/files/lib/Interval_rb.html +3 -2
- data/doc/files/lib/Journal_rb.html +4 -3
- data/doc/files/lib/KeywordArray_rb.html +3 -2
- data/doc/files/lib/KeywordDocumentation_rb.html +3 -2
- data/doc/files/lib/Limits_rb.html +3 -2
- data/doc/files/lib/Log_rb.html +3 -2
- data/doc/files/lib/LogicalExpression_rb.html +3 -2
- data/doc/files/lib/LogicalFunction_rb.html +3 -2
- data/doc/files/lib/LogicalOperation_rb.html +3 -2
- data/doc/files/lib/MacroParser_rb.html +3 -2
- data/doc/files/lib/MacroTable_rb.html +3 -2
- data/doc/files/lib/MessageHandler_rb.html +3 -2
- data/doc/files/lib/Message_rb.html +3 -2
- data/doc/files/lib/ProjectFileParser_rb.html +7 -4
- data/doc/files/lib/Project_rb.html +3 -2
- data/doc/files/lib/PropertyList_rb.html +3 -2
- data/doc/files/lib/PropertySet_rb.html +3 -2
- data/doc/files/lib/PropertyTreeNode_rb.html +3 -2
- data/doc/files/lib/Query_rb.html +3 -2
- data/doc/files/lib/{RTPNavigator_rb.html → RTFNavigator_rb.html} +8 -7
- data/doc/files/lib/RTFQuery_rb.html +121 -0
- data/doc/files/lib/{RTPReport_rb.html → RTFReport_rb.html} +8 -7
- data/doc/files/lib/RealFormat_rb.html +3 -2
- data/doc/files/lib/RemoteServiceManager_rb.html +117 -0
- data/doc/files/lib/ReportServer_rb.html +107 -0
- data/doc/files/lib/ResourceScenario_rb.html +3 -2
- data/doc/files/lib/Resource_rb.html +3 -2
- data/doc/files/lib/RichTextDocument_rb.html +4 -3
- data/doc/files/lib/RichTextElement_rb.html +3 -2
- data/doc/files/lib/{RichTextProtocolExample_rb.html → RichTextFunctionExample_rb.html} +8 -7
- data/doc/files/lib/{RichTextProtocolHandler_rb.html → RichTextFunctionHandler_rb.html} +7 -6
- data/doc/files/lib/RichTextParser_rb.html +3 -2
- data/doc/files/lib/RichTextScanner_rb.html +3 -2
- data/doc/files/lib/RichTextSnip_rb.html +3 -2
- data/doc/files/lib/RichTextSyntaxRules_rb.html +3 -2
- data/doc/files/lib/RichText_rb.html +3 -2
- data/doc/files/lib/ScenarioData_rb.html +3 -2
- data/doc/files/lib/Scenario_rb.html +3 -2
- data/doc/files/lib/Scoreboard_rb.html +3 -2
- data/doc/files/lib/ShiftAssignments_rb.html +3 -2
- data/doc/files/lib/ShiftScenario_rb.html +3 -2
- data/doc/files/lib/Shift_rb.html +3 -2
- data/doc/files/lib/SourceFileInfo_rb.html +3 -2
- data/doc/files/lib/SyntaxReference_rb.html +3 -2
- data/doc/files/lib/TOCEntry_rb.html +3 -2
- data/doc/files/lib/TableColumnDefinition_rb.html +3 -2
- data/doc/files/lib/TableOfContents_rb.html +3 -2
- data/doc/files/lib/TaskDependency_rb.html +3 -2
- data/doc/files/lib/TaskJuggler_rb.html +7 -2
- data/doc/files/lib/TaskScenario_rb.html +3 -2
- data/doc/files/lib/Task_rb.html +3 -2
- data/doc/files/lib/TextParser/Pattern_rb.html +4 -3
- data/doc/files/lib/TextParser/Rule_rb.html +4 -3
- data/doc/files/lib/TextParser/StackElement_rb.html +4 -3
- data/doc/files/lib/TextParser/TokenDoc_rb.html +4 -3
- data/doc/files/lib/TextParser_rb.html +3 -2
- data/doc/files/lib/TextScanner_rb.html +3 -2
- data/doc/files/lib/Tj3Config_rb.html +3 -2
- data/doc/files/lib/TjException_rb.html +3 -2
- data/doc/files/lib/TjTime_rb.html +3 -2
- data/doc/files/lib/TjpExample_rb.html +3 -2
- data/doc/files/lib/TjpSyntaxRules_rb.html +3 -2
- data/doc/files/lib/UTF8String_rb.html +14 -6
- data/doc/files/lib/UserManual_rb.html +6 -3
- data/doc/files/lib/WorkingHours_rb.html +3 -2
- data/doc/files/lib/XMLDocument_rb.html +3 -2
- data/doc/files/lib/XMLElement_rb.html +3 -2
- data/doc/files/lib/deep_copy_rb.html +3 -2
- data/doc/files/lib/reports/CSVFile_rb.html +3 -2
- data/doc/files/lib/reports/ColumnTable_rb.html +3 -2
- data/doc/files/lib/reports/GanttChart_rb.html +3 -2
- data/doc/files/lib/reports/GanttContainer_rb.html +3 -2
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +3 -2
- data/doc/files/lib/reports/GanttHeader_rb.html +3 -2
- data/doc/files/lib/reports/GanttLine_rb.html +3 -2
- data/doc/files/lib/reports/GanttLoadStack_rb.html +3 -2
- data/doc/files/lib/reports/GanttMilestone_rb.html +3 -2
- data/doc/files/lib/reports/GanttRouter_rb.html +3 -2
- data/doc/files/lib/reports/GanttTaskBar_rb.html +3 -2
- data/doc/files/lib/reports/HTMLGraphics_rb.html +3 -2
- data/doc/files/lib/reports/Navigator_rb.html +3 -2
- data/doc/files/lib/reports/ReportBase_rb.html +3 -2
- data/doc/files/lib/reports/ReportContext_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableCell_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableColumn_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableLegend_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableLine_rb.html +3 -2
- data/doc/files/lib/reports/ReportTable_rb.html +3 -2
- data/doc/files/lib/reports/Report_rb.html +7 -2
- data/doc/files/lib/reports/ResourceListRE_rb.html +3 -2
- data/doc/files/lib/reports/TableReport_rb.html +3 -2
- data/doc/files/lib/reports/TaskListRE_rb.html +3 -2
- data/doc/files/lib/reports/TextReport_rb.html +4 -3
- data/doc/files/lib/reports/TimeSheetReport_rb.html +117 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +3 -2
- data/doc/files/lib/taskjuggler3_rb.html +94 -77
- data/doc/files/lib/tj3client_rb.html +280 -0
- data/doc/files/lib/tj3man_rb.html +10 -9
- data/doc/fr_class_index.html +27 -5
- data/doc/fr_file_index.html +15 -7
- data/doc/fr_method_index.html +1312 -1020
- data/examples/tutorial.tjp +113 -14
- data/gem_spec.rb +2 -1
- data/lib/Account.rb +1 -1
- data/lib/AccountScenario.rb +1 -1
- data/lib/Allocation.rb +1 -1
- data/lib/AppConfig.rb +23 -10
- data/lib/AttributeBase.rb +34 -6
- data/lib/AttributeDefinition.rb +1 -1
- data/lib/Attributes.rb +51 -16
- data/lib/BatchProcessor.rb +204 -77
- data/lib/Booking.rb +1 -1
- data/lib/Charge.rb +1 -1
- data/lib/ChargeSet.rb +1 -1
- data/lib/HTMLDocument.rb +2 -2
- data/lib/Interval.rb +1 -1
- data/lib/Journal.rb +231 -9
- data/lib/KeywordArray.rb +1 -1
- data/lib/KeywordDocumentation.rb +6 -4
- data/lib/Limits.rb +1 -1
- data/lib/Log.rb +8 -1
- data/lib/LogicalExpression.rb +14 -13
- data/lib/LogicalFunction.rb +88 -14
- data/lib/LogicalOperation.rb +124 -53
- data/lib/MacroParser.rb +1 -1
- data/lib/MacroTable.rb +2 -2
- data/lib/Message.rb +1 -1
- data/lib/MessageHandler.rb +7 -3
- data/lib/Project.rb +93 -14
- data/lib/ProjectFileParser.rb +30 -15
- data/lib/PropertyList.rb +103 -36
- data/lib/PropertySet.rb +22 -10
- data/lib/PropertyTreeNode.rb +120 -15
- data/lib/Query.rb +119 -48
- data/lib/{RTPNavigator.rb → RTFNavigator.rb} +11 -10
- data/lib/RTFQuery.rb +166 -0
- data/lib/{RTPReport.rb → RTFReport.rb} +11 -8
- data/lib/RealFormat.rb +1 -1
- data/lib/RemoteServiceManager.rb +80 -0
- data/lib/ReportServer.rb +66 -0
- data/lib/Resource.rb +1 -1
- data/lib/ResourceScenario.rb +48 -19
- data/lib/RichText.rb +98 -41
- data/lib/RichTextDocument.rb +10 -8
- data/lib/RichTextElement.rb +72 -28
- data/lib/{RichTextProtocolExample.rb → RichTextFunctionExample.rb} +8 -7
- data/lib/{RichTextProtocolHandler.rb → RichTextFunctionHandler.rb} +12 -14
- data/lib/RichTextParser.rb +6 -3
- data/lib/RichTextScanner.rb +91 -19
- data/lib/RichTextSnip.rb +8 -3
- data/lib/RichTextSyntaxRules.rb +103 -45
- data/lib/Scenario.rb +1 -1
- data/lib/ScenarioData.rb +2 -2
- data/lib/Scoreboard.rb +1 -1
- data/lib/Shift.rb +1 -1
- data/lib/ShiftAssignments.rb +1 -1
- data/lib/ShiftScenario.rb +1 -1
- data/lib/SourceFileInfo.rb +1 -1
- data/lib/SyntaxReference.rb +2 -2
- data/lib/TOCEntry.rb +1 -1
- data/lib/TableColumnDefinition.rb +59 -16
- data/lib/TableOfContents.rb +1 -1
- data/lib/Task.rb +1 -1
- data/lib/TaskDependency.rb +1 -1
- data/lib/TaskJuggler.rb +31 -8
- data/lib/TaskScenario.rb +165 -16
- data/lib/TextParser.rb +36 -22
- data/lib/TextParser/Pattern.rb +3 -3
- data/lib/TextParser/Rule.rb +2 -2
- data/lib/TextParser/StackElement.rb +4 -3
- data/lib/TextParser/TokenDoc.rb +2 -2
- data/lib/TextScanner.rb +52 -37
- data/lib/Tj3Config.rb +6 -5
- data/lib/TjException.rb +1 -1
- data/lib/TjTime.rb +12 -3
- data/lib/TjpExample.rb +1 -1
- data/lib/TjpSyntaxRules.rb +1044 -150
- data/lib/UTF8String.rb +2 -1
- data/lib/UserManual.rb +18 -70
- data/lib/WorkingHours.rb +3 -3
- data/lib/XMLDocument.rb +3 -2
- data/lib/XMLElement.rb +6 -1
- data/lib/deep_copy.rb +1 -1
- data/lib/reports/CSVFile.rb +1 -1
- data/lib/reports/ColumnTable.rb +9 -9
- data/lib/reports/GanttChart.rb +1 -1
- data/lib/reports/GanttContainer.rb +1 -1
- data/lib/reports/GanttHeader.rb +1 -1
- data/lib/reports/GanttHeaderScaleItem.rb +1 -1
- data/lib/reports/GanttLine.rb +40 -40
- data/lib/reports/GanttLoadStack.rb +1 -1
- data/lib/reports/GanttMilestone.rb +1 -1
- data/lib/reports/GanttRouter.rb +1 -1
- data/lib/reports/GanttTaskBar.rb +1 -1
- data/lib/reports/HTMLGraphics.rb +1 -1
- data/lib/reports/Navigator.rb +149 -22
- data/lib/reports/Report.rb +115 -172
- data/lib/reports/ReportBase.rb +22 -27
- data/lib/reports/ReportContext.rb +29 -15
- data/lib/reports/ReportTable.rb +1 -1
- data/lib/reports/ReportTableCell.rb +120 -27
- data/lib/reports/ReportTableColumn.rb +3 -3
- data/lib/reports/ReportTableLegend.rb +1 -1
- data/lib/reports/ReportTableLine.rb +10 -2
- data/lib/reports/ResourceListRE.rb +5 -1
- data/lib/reports/TableReport.rb +237 -287
- data/lib/reports/TaskListRE.rb +5 -1
- data/lib/reports/TextReport.rb +7 -4
- data/lib/reports/TimeSheetReport.rb +233 -0
- data/lib/reports/TjpExportRE.rb +2 -2
- data/lib/taskjuggler3.rb +27 -11
- data/lib/tj3client.rb +110 -0
- data/lib/tj3man.rb +4 -4
- data/manual/Getting_Started +0 -50
- data/manual/How_To_Contribute +6 -13
- data/manual/Installation +102 -28
- data/manual/Intro +11 -1
- data/manual/Reporting_Bugs +23 -7
- data/manual/Rich_Text_Attributes +59 -6
- data/manual/TaskJuggler_2x_Migration +27 -0
- data/manual/The_TaskJuggler_Syntax +104 -0
- data/manual/Tutorial +10 -9
- data/prj_cfg.rb +8 -2
- data/tasks/csts.rake +1 -1
- data/tasks/manual.rake +5 -3
- data/test/MessageChecker.rb +1 -1
- data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
- data/test/TestSuite/HTML-Reports/Alerts.tjp +77 -0
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/CellText.tjp +75 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.tjp +44 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.tjp +34 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +80 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.tjp +20 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/Query.tjp +28 -0
- data/test/TestSuite/HTML-Reports/Sorting.tjp +68 -0
- data/test/TestSuite/HTML-Reports/TimeSheet.tjp +69 -0
- data/test/TestSuite/HTML-Reports/UDAQuery.tjp +27 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +52 -0
- data/test/TestSuite/HTML-Reports/css/tjreport.css +195 -0
- data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
- data/test/TestSuite/HTML-Reports/icons/details.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-green.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-red.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-yellow.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resource.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resourcegroup.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/task.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/taskgroup.png +0 -0
- data/test/TestSuite/HTML-Reports/reference.tjp +7 -8
- data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Scheduler/Correct/Mandatory.tjp +34 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Journal.tjp +2 -2
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/LogicalFunction.tjp +20 -0
- data/test/TestSuite/Syntax/Correct/Query.tjp +18 -0
- data/test/TestSuite/Syntax/Correct/StatusSheet.tjp +45 -0
- data/test/TestSuite/Syntax/Correct/TimeSheet.tjp +49 -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/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +113 -14
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +28 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +12 -0
- data/test/all.rb +2 -2
- data/test/test_BatchProcessor.rb +42 -13
- data/test/test_CSV-Reports.rb +1 -1
- data/test/test_Journal.rb +176 -0
- data/test/test_Limits.rb +1 -1
- data/test/test_LogicalExpression.rb +14 -5
- data/test/test_MacroTable.rb +1 -1
- data/test/test_Project.rb +1 -1
- data/test/test_PropertySet.rb +1 -1
- data/test/test_Query.rb +1 -1
- data/test/test_RealFormat.rb +1 -1
- data/test/test_RichText.rb +30 -20
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +2 -2
- data/test/test_Syntax.rb +1 -1
- data/test/test_TextScanner.rb +1 -1
- data/test/test_TjTime.rb +1 -1
- data/test/test_TjpExample.rb +1 -1
- data/test/test_UTF8String.rb +1 -1
- data/test/test_WorkingHours.rb +1 -1
- data/test/test_deep_copy.rb +2 -2
- metadata +610 -532
- data/doc/files/lib/ms_test_rb.html +0 -90
- data/examples/ContactList.html +0 -1467
- data/examples/Deliveries.html +0 -485
- data/examples/Development.html +0 -2525
- data/examples/Overview.html +0 -747
- data/examples/Resource Graph.html +0 -616
- data/lib/ms_test.rb +0 -27
- data/test/TestSuite/HTML-Reports/reference-export.html +0 -187
data/lib/MacroParser.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = MacroParser.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/MacroTable.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = MacroTable.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -62,7 +62,7 @@ class TaskJuggler
|
|
|
62
62
|
# unchanged. No error is generated.
|
|
63
63
|
def resolve(args, sourceFileInfo)
|
|
64
64
|
name = args[0]
|
|
65
|
-
resolved = @macros[name].value.
|
|
65
|
+
resolved = @macros[name].value.dup
|
|
66
66
|
i = 0
|
|
67
67
|
args.each do |arg|
|
|
68
68
|
resolved.gsub!("${#{i}}", arg)
|
data/lib/Message.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Message.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/MessageHandler.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = MessageHandler.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -14,17 +14,21 @@ class TaskJuggler
|
|
|
14
14
|
|
|
15
15
|
class MessageHandler
|
|
16
16
|
|
|
17
|
-
attr_reader :messages
|
|
17
|
+
attr_reader :messages, :errors
|
|
18
18
|
|
|
19
19
|
def initialize(console = false)
|
|
20
20
|
@messages = []
|
|
21
21
|
@console = console
|
|
22
|
+
|
|
23
|
+
@errors = 0
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
def send(message)
|
|
27
|
+
@errors += 1 if message.level == 'error' || message.level == 'fatal'
|
|
25
28
|
@messages << message
|
|
26
29
|
if @console
|
|
27
|
-
|
|
30
|
+
# The to_s call is necessary to support remote prints via DRb.
|
|
31
|
+
$stderr.puts message.to_s
|
|
28
32
|
end
|
|
29
33
|
end
|
|
30
34
|
|
data/lib/Project.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Project.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -56,12 +56,17 @@ class TaskJuggler
|
|
|
56
56
|
def initialize(id, name, version, messageHandler)
|
|
57
57
|
@messageHandler = messageHandler
|
|
58
58
|
@attributes = {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
# This nested Array defines the supported alert levels. The lowest
|
|
60
|
+
# level comes first at index 0 and the level rises from there on.
|
|
61
|
+
# Currently, these levels are hardcoded. Each level entry has 3
|
|
62
|
+
# members: the tjp syntax token, the user visible name and the
|
|
63
|
+
# associated color as RGB byte array.
|
|
64
|
+
'alertLevels' => [
|
|
65
|
+
[ 'green', 'Green', '#008000' ],
|
|
66
|
+
[ 'yellow', 'Yellow', '#BEA800' ],
|
|
67
|
+
[ 'red', 'Red', '#C00000' ] ],
|
|
64
68
|
'copyright' => nil,
|
|
69
|
+
'costAccount' => nil,
|
|
65
70
|
'currency' => "EUR",
|
|
66
71
|
'currencyFormat' => RealFormat.new([ '-', '', '', ',', 2 ]),
|
|
67
72
|
'dailyworkinghours' => 8.0,
|
|
@@ -70,10 +75,13 @@ class TaskJuggler
|
|
|
70
75
|
'journal' => Journal.new,
|
|
71
76
|
'limits' => nil,
|
|
72
77
|
'loadUnit' => :shortauto,
|
|
78
|
+
'name' => name,
|
|
73
79
|
'navigators' => {},
|
|
74
80
|
'now' => TjTime.now.align(3600),
|
|
75
81
|
'numberFormat' => RealFormat.new([ '-', '', '', '.', 1]),
|
|
76
82
|
'priority' => 500,
|
|
83
|
+
'projectid' => id || "prj",
|
|
84
|
+
'projectids' => [ id ],
|
|
77
85
|
'rate' => 0.0,
|
|
78
86
|
'revenueAccount' => nil,
|
|
79
87
|
'scheduleGranularity' => Project.maxScheduleGranularity,
|
|
@@ -81,7 +89,9 @@ class TaskJuggler
|
|
|
81
89
|
'start' => nil,
|
|
82
90
|
'timeFormat' => "%Y-%m-%d",
|
|
83
91
|
'timezone' => nil,
|
|
92
|
+
'trackingScenarioIdx' => 0,
|
|
84
93
|
'vacations' => [],
|
|
94
|
+
'version' => version || "1.0",
|
|
85
95
|
'weekStartsMonday' => true,
|
|
86
96
|
'workinghours' => WorkingHours.new,
|
|
87
97
|
'yearlyworkingdays' => 260.714
|
|
@@ -137,6 +147,8 @@ class TaskJuggler
|
|
|
137
147
|
# Inh. Inh.Prj Scen. Default
|
|
138
148
|
[ 'index', 'Index', FixnumAttribute,
|
|
139
149
|
false, false, false, -1 ],
|
|
150
|
+
[ 'flags', 'Flags', FlagListAttribute,
|
|
151
|
+
true, false, true, [] ],
|
|
140
152
|
[ 'tree', 'Tree Index', StringAttribute,
|
|
141
153
|
false, false, false, "" ],
|
|
142
154
|
[ 'wbs', 'WBS', StringAttribute,
|
|
@@ -259,6 +271,8 @@ class TaskJuggler
|
|
|
259
271
|
false, false, true, [] ],
|
|
260
272
|
[ 'startsuccs', 'Start Succs.', TaskListAttribute,
|
|
261
273
|
false, false, true, [] ],
|
|
274
|
+
[ 'status', 'Task Status', StringAttribute,
|
|
275
|
+
false, false, true, "" ],
|
|
262
276
|
[ 'tree', 'Tree Index', StringAttribute,
|
|
263
277
|
false, false, false, "" ],
|
|
264
278
|
[ 'wbs', 'WBS', StringAttribute,
|
|
@@ -286,6 +300,8 @@ class TaskJuggler
|
|
|
286
300
|
true, true, false, nil ],
|
|
287
301
|
[ 'epilog', 'Epilog', RichTextAttribute,
|
|
288
302
|
false, false, false, nil ],
|
|
303
|
+
[ 'flags', 'Flags', FlagListAttribute,
|
|
304
|
+
true, false, true, [] ],
|
|
289
305
|
[ 'footer', 'Footer', RichTextAttribute,
|
|
290
306
|
true, false, false, nil ],
|
|
291
307
|
[ 'formats', 'Formats', FormatListAttribute,
|
|
@@ -294,8 +310,8 @@ class TaskJuggler
|
|
|
294
310
|
true, false, false, true ],
|
|
295
311
|
[ 'header', 'Header', RichTextAttribute,
|
|
296
312
|
true, false, false, nil ],
|
|
297
|
-
[ 'headline', 'Headline',
|
|
298
|
-
false, false, false,
|
|
313
|
+
[ 'headline', 'Headline', RichTextAttribute,
|
|
314
|
+
false, false, false, nil ],
|
|
299
315
|
[ 'hideResource', 'Hide Resource', LogicalExpressionAttribute,
|
|
300
316
|
true, false, false, nil ],
|
|
301
317
|
[ 'hideTask', 'Hide Task', LogicalExpressionAttribute,
|
|
@@ -326,6 +342,8 @@ class TaskJuggler
|
|
|
326
342
|
true, false, false, nil ],
|
|
327
343
|
[ 'scenarios', 'Scenarios', ScenarioListAttribute,
|
|
328
344
|
true, false, false, [ 0 ] ],
|
|
345
|
+
[ 'selfcontained', 'Selfcontained', BooleanAttribute,
|
|
346
|
+
true, false, false, false ],
|
|
329
347
|
[ 'shortTimeFormat', 'Short Time Format', StringAttribute,
|
|
330
348
|
true, true, false, nil ],
|
|
331
349
|
[ 'sortResources', 'Sort Resources', SortListAttribute,
|
|
@@ -342,6 +360,8 @@ class TaskJuggler
|
|
|
342
360
|
true, true, false, nil ],
|
|
343
361
|
[ 'timezone', 'Time Zone', StringAttribute,
|
|
344
362
|
true, true, false, nil ],
|
|
363
|
+
[ 'title', 'Title', StringAttribute,
|
|
364
|
+
false, false, false, nil ],
|
|
345
365
|
[ 'tree', 'Tree Index', StringAttribute,
|
|
346
366
|
false, false, false, "" ],
|
|
347
367
|
[ 'wbs', 'WBS', StringAttribute,
|
|
@@ -353,6 +373,7 @@ class TaskJuggler
|
|
|
353
373
|
|
|
354
374
|
Scenario.new(self, 'plan', 'Plan Scenario', nil)
|
|
355
375
|
|
|
376
|
+
# This holds a reference to the ReportContext for each Thread.
|
|
356
377
|
@reportContext = nil
|
|
357
378
|
@outputDir = ''
|
|
358
379
|
end
|
|
@@ -390,6 +411,39 @@ class TaskJuggler
|
|
|
390
411
|
@scenarios.items
|
|
391
412
|
end
|
|
392
413
|
|
|
414
|
+
# Try to match _levelName_ to a defined alert level name and return the
|
|
415
|
+
# index of it. If no level is found, nil is returned.
|
|
416
|
+
def alertLevelIndex(levelName)
|
|
417
|
+
0.upto(@attributes['alertLevels'].length - 1) do |i|
|
|
418
|
+
if @attributes['alertLevels'][i][0] == levelName
|
|
419
|
+
return i
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
nil
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
# Return the ID or keyword of the alert level with the given _levelIndex_.
|
|
426
|
+
# Or nil if the level does not exist.
|
|
427
|
+
def alertLevelId(levelIndex)
|
|
428
|
+
return 'unknown' unless @attributes['alertLevels'][levelIndex]
|
|
429
|
+
@attributes['alertLevels'][levelIndex][0]
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
# Return the user readable name of the alert level with the given
|
|
433
|
+
# _levelIndex_. Or nil if the level does not exist.
|
|
434
|
+
def alertLevelName(levelIndex)
|
|
435
|
+
return 'unknown' unless @attributes['alertLevels'][levelIndex]
|
|
436
|
+
@attributes['alertLevels'][levelIndex][1]
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
# Return the color of the alert level with the given _levelIndex_. Or nil
|
|
440
|
+
# if the level does not exist. The color is an RGB encoded byte array,
|
|
441
|
+
# stored as hexadecimal String, prefixed with a pound sign.
|
|
442
|
+
def alertLevelColor(levelIndex)
|
|
443
|
+
return 'unknown' unless @attributes['alertLevels'][levelIndex]
|
|
444
|
+
@attributes['alertLevels'][levelIndex][2]
|
|
445
|
+
end
|
|
446
|
+
|
|
393
447
|
# Return the average number of working hours per day. This defaults to 8 but
|
|
394
448
|
# can be set to other values by the user.
|
|
395
449
|
def dailyWorkingHours
|
|
@@ -537,14 +591,23 @@ class TaskJuggler
|
|
|
537
591
|
end
|
|
538
592
|
else
|
|
539
593
|
bp = BatchProcessor.new(maxCpuCores)
|
|
540
|
-
@reports.
|
|
594
|
+
@reports.each do |report|
|
|
541
595
|
next if report.get('formats').empty?
|
|
542
|
-
bp.queue(report) {
|
|
596
|
+
bp.queue(report) {
|
|
597
|
+
@reportContext = ReportContext.new(self, report)
|
|
598
|
+
report.generate
|
|
599
|
+
}
|
|
543
600
|
end
|
|
544
601
|
bp.wait do |report|
|
|
602
|
+
Log.startProgressMeter("Report #{report.tag.name}")
|
|
545
603
|
$stdout.print(report.stdout)
|
|
546
604
|
$stderr.print(report.stderr)
|
|
547
|
-
|
|
605
|
+
if report.retVal.signaled?
|
|
606
|
+
raise TjException.new, "Signal raised"
|
|
607
|
+
end
|
|
608
|
+
unless report.retVal.success?
|
|
609
|
+
raise TjException.new, "Process aborted"
|
|
610
|
+
end
|
|
548
611
|
Log.stopProgressMeter
|
|
549
612
|
end
|
|
550
613
|
end
|
|
@@ -556,6 +619,17 @@ class TaskJuggler
|
|
|
556
619
|
true
|
|
557
620
|
end
|
|
558
621
|
|
|
622
|
+
def generateReport(reportId)
|
|
623
|
+
unless (report = @reports[reportId])
|
|
624
|
+
error('unknown_report_id',
|
|
625
|
+
"Request to generate unknown report #{reportId}")
|
|
626
|
+
end
|
|
627
|
+
Log.startProgressMeter("Report #{report.name}")
|
|
628
|
+
@reportContext = ReportContext.new(self, report)
|
|
629
|
+
report.generate
|
|
630
|
+
Log.stopProgressMeter
|
|
631
|
+
end
|
|
632
|
+
|
|
559
633
|
####################################################################
|
|
560
634
|
# The following functions are not intended to be called from outside
|
|
561
635
|
# the TaskJuggler library. There is no guarantee that these
|
|
@@ -695,10 +769,9 @@ class TaskJuggler
|
|
|
695
769
|
name
|
|
696
770
|
end
|
|
697
771
|
|
|
698
|
-
|
|
699
|
-
|
|
700
772
|
# Print the attribute values. It's used for debugging only.
|
|
701
773
|
def to_s
|
|
774
|
+
raise "STOP!"
|
|
702
775
|
@attributes.each do |attribute, value|
|
|
703
776
|
if value
|
|
704
777
|
puts "#{attribute}: " +
|
|
@@ -707,6 +780,12 @@ class TaskJuggler
|
|
|
707
780
|
end
|
|
708
781
|
end
|
|
709
782
|
|
|
783
|
+
# This function sends an error message to the message handler.
|
|
784
|
+
def error(id, text)
|
|
785
|
+
message = Message.new(id, 'error', text)
|
|
786
|
+
@messageHandler.send(message)
|
|
787
|
+
end
|
|
788
|
+
|
|
710
789
|
protected
|
|
711
790
|
|
|
712
791
|
def prepareScenario(scIdx)
|
|
@@ -814,7 +893,7 @@ class TaskJuggler
|
|
|
814
893
|
loop do
|
|
815
894
|
# The main scheduler loop only needs to look at the first task that is
|
|
816
895
|
# ready to be scheduled.
|
|
817
|
-
workItems =
|
|
896
|
+
workItems = tasks.to_ary
|
|
818
897
|
|
|
819
898
|
# Count the already completed tasks.
|
|
820
899
|
completedTasks = 0
|
data/lib/ProjectFileParser.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = ProjectFileParser.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -14,8 +14,9 @@ require 'TextParser'
|
|
|
14
14
|
require 'TextScanner'
|
|
15
15
|
require 'TjpSyntaxRules'
|
|
16
16
|
require 'RichText'
|
|
17
|
-
require '
|
|
18
|
-
require '
|
|
17
|
+
require 'RTFNavigator'
|
|
18
|
+
require 'RTFQuery'
|
|
19
|
+
require 'RTFReport'
|
|
19
20
|
|
|
20
21
|
class TaskJuggler
|
|
21
22
|
|
|
@@ -49,20 +50,20 @@ class TaskJuggler
|
|
|
49
50
|
|
|
50
51
|
# Call this function with the master file to start processing a TJP file or
|
|
51
52
|
# a set of TJP files.
|
|
52
|
-
def open(file, master)
|
|
53
|
+
def open(file, master, fileNameIsBuffer = false)
|
|
53
54
|
begin
|
|
54
55
|
@scanner = TextScanner.new(file, @messageHandler)
|
|
55
56
|
# We need the TextScanner object for error reporting.
|
|
56
|
-
if master && file != '.' && file[-4, 4] != '.tjp'
|
|
57
|
+
if master && !fileNameIsBuffer && file != '.' && file[-4, 4] != '.tjp'
|
|
57
58
|
error('illegal_extension', "Project file name must end with " +
|
|
58
59
|
'\'.tjp\' extension')
|
|
59
60
|
end
|
|
60
|
-
@scanner.open
|
|
61
|
+
@scanner.open(fileNameIsBuffer)
|
|
61
62
|
rescue StandardError
|
|
62
63
|
error('file_open', $!.message)
|
|
63
64
|
end
|
|
64
65
|
|
|
65
|
-
@property =
|
|
66
|
+
@property = nil
|
|
66
67
|
@scenarioIdx = 0
|
|
67
68
|
initFileStack
|
|
68
69
|
end
|
|
@@ -99,6 +100,9 @@ class TaskJuggler
|
|
|
99
100
|
@scanner.sourceFileInfo))
|
|
100
101
|
@scanner.addMacro(Macro.new('now', @project['now'].to_s,
|
|
101
102
|
@scanner.sourceFileInfo))
|
|
103
|
+
@scanner.addMacro(Macro.new('today', @project['now'].
|
|
104
|
+
to_s(@project['timeFormat']),
|
|
105
|
+
@scanner.sourceFileInfo))
|
|
102
106
|
end
|
|
103
107
|
|
|
104
108
|
private
|
|
@@ -130,11 +134,13 @@ class TaskJuggler
|
|
|
130
134
|
# Make sure the interval is within the project time frame.
|
|
131
135
|
if iv.start < @project['start'] || iv.start >= @project['end']
|
|
132
136
|
error('interval_start_in_range',
|
|
133
|
-
|
|
137
|
+
"Start date #{iv.start} must be within the project time frame " +
|
|
138
|
+
"(#{@project['start']} - #{@project['end']})")
|
|
134
139
|
end
|
|
135
140
|
if iv.end <= @project['start'] || iv.end > @project['end']
|
|
136
141
|
error('interval_end_in_range',
|
|
137
|
-
|
|
142
|
+
"End date #{iv.end} must be within the project time frame " +
|
|
143
|
+
"(#{@project['start']} - #{@project['end']})")
|
|
138
144
|
end
|
|
139
145
|
end
|
|
140
146
|
|
|
@@ -194,20 +200,29 @@ class TaskJuggler
|
|
|
194
200
|
# This is necessary, because the RichText parser knows nothing about the
|
|
195
201
|
# actual input file. So we have to map the error location in the RichText
|
|
196
202
|
# input stream back to the position in the project file.
|
|
197
|
-
|
|
203
|
+
# To limit the supported set of variable tokens, a subset can be provided
|
|
204
|
+
# by _tokenSet_.
|
|
205
|
+
def newRichText(text, tokenSet = nil)
|
|
198
206
|
sfi = sourceFileInfo
|
|
199
207
|
begin
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
208
|
+
handlers = [
|
|
209
|
+
RTFNavigator.new(@project, sfi),
|
|
210
|
+
RTFQuery.new(@project, sfi),
|
|
211
|
+
RTFReport.new(@project, sfi)
|
|
212
|
+
]
|
|
213
|
+
rText = RichText.new(text, handlers)
|
|
214
|
+
rti = rText.generateIntermediateFormat( [ 0, 0, 0], tokenSet)
|
|
215
|
+
rti.sectionNumbers = false
|
|
203
216
|
rescue RichTextException => msg
|
|
204
217
|
sfi = SourceFileInfo.new(sfi.fileName, sfi.lineNo + msg.lineNo - 1, 0)
|
|
205
218
|
message = Message.new(msg.id, 'error', msg.text + "\n" + msg.line,
|
|
206
219
|
@property, nil, sfi)
|
|
207
220
|
@messageHandler.send(message)
|
|
208
221
|
|
|
222
|
+
# An empty strings signals an already reported error
|
|
223
|
+
raise TjException.new, ''
|
|
209
224
|
end
|
|
210
|
-
|
|
225
|
+
rti
|
|
211
226
|
end
|
|
212
227
|
|
|
213
228
|
# This method is a convenience wrapper around Project.new. It checks if
|
|
@@ -224,7 +239,7 @@ class TaskJuggler
|
|
|
224
239
|
name, nil)
|
|
225
240
|
@property.typeSpec = type
|
|
226
241
|
@property.sourceFileInfo = sourceFileInfo
|
|
227
|
-
@property.set('formats', [
|
|
242
|
+
@property.set('formats', [ :tjp ])
|
|
228
243
|
@property.inheritAttributes
|
|
229
244
|
@property
|
|
230
245
|
end
|
data/lib/PropertyList.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = PropertyList.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
|
7
7
|
#
|
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -19,7 +19,7 @@ class TaskJuggler
|
|
|
19
19
|
# be used for sorting, a scenario index if necessary and the sorting
|
|
20
20
|
# direction (up/down). All nodes in the PropertyList must belong to the same
|
|
21
21
|
# PropertySet.
|
|
22
|
-
class PropertyList
|
|
22
|
+
class PropertyList
|
|
23
23
|
|
|
24
24
|
attr_writer :query
|
|
25
25
|
attr_reader :propertySet, :query, :sortingLevels, :sortingCriteria,
|
|
@@ -27,8 +27,8 @@ class TaskJuggler
|
|
|
27
27
|
|
|
28
28
|
# A PropertyList is always bound to a certain PropertySet. All properties
|
|
29
29
|
# in the list must be of that set.
|
|
30
|
-
def initialize(arg)
|
|
31
|
-
|
|
30
|
+
def initialize(arg, copyItems = true)
|
|
31
|
+
@items = copyItems ? arg.to_ary : []
|
|
32
32
|
if arg.is_a?(PropertySet)
|
|
33
33
|
# Create a PropertyList from the given PropertySet.
|
|
34
34
|
@propertySet = arg
|
|
@@ -40,7 +40,7 @@ class TaskJuggler
|
|
|
40
40
|
@query = nil
|
|
41
41
|
resetSorting
|
|
42
42
|
addSortingCriteria('seqno', true, -1)
|
|
43
|
-
|
|
43
|
+
sort!
|
|
44
44
|
else
|
|
45
45
|
# Create a PropertyList from a given other PropertyList.
|
|
46
46
|
@propertySet = arg.propertySet
|
|
@@ -52,6 +52,17 @@ class TaskJuggler
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# This class should be a derived class of Array. But since it re-defines
|
|
56
|
+
# sort!() and still needs to call Array::sort!() I took a different route.
|
|
57
|
+
# All missing methods will be propagated to the @items Array.
|
|
58
|
+
def method_missing(func, *args, &block)
|
|
59
|
+
@items.method(func).call(*args, &block)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def to_ary
|
|
63
|
+
@items.dup
|
|
64
|
+
end
|
|
65
|
+
|
|
55
66
|
# Set all sorting levels as Array of triplets.
|
|
56
67
|
def setSorting(modes)
|
|
57
68
|
resetSorting
|
|
@@ -68,8 +79,8 @@ class TaskJuggler
|
|
|
68
79
|
@scenarioIdx = []
|
|
69
80
|
end
|
|
70
81
|
|
|
71
|
-
# Append another Array of
|
|
72
|
-
# sorted again.
|
|
82
|
+
# Append another Array of PropertyTreeNodes or a PropertyList to this. The
|
|
83
|
+
# list will be sorted again.
|
|
73
84
|
def append(list)
|
|
74
85
|
if $DEBUG
|
|
75
86
|
list.each do |node|
|
|
@@ -79,13 +90,14 @@ class TaskJuggler
|
|
|
79
90
|
end
|
|
80
91
|
end
|
|
81
92
|
|
|
82
|
-
concat(list)
|
|
83
|
-
|
|
93
|
+
@items.concat(list)
|
|
94
|
+
sort!
|
|
84
95
|
end
|
|
85
96
|
|
|
86
97
|
# Append a new sorting level to the existing levels.
|
|
87
98
|
def addSortingCriteria(criteria, up, scIdx)
|
|
88
|
-
unless @propertySet.knownAttribute?(criteria)
|
|
99
|
+
unless @propertySet.knownAttribute?(criteria) ||
|
|
100
|
+
@propertySet.hasQuery?(criteria, scIdx)
|
|
89
101
|
raise TjException.new, "Unknown attribute #{criteria} used for " +
|
|
90
102
|
'sorting criterium'
|
|
91
103
|
end
|
|
@@ -95,6 +107,9 @@ class TaskJuggler
|
|
|
95
107
|
"You must specify a scenario id."
|
|
96
108
|
end
|
|
97
109
|
else
|
|
110
|
+
if @propertySet.project.scenario(scIdx).nil?
|
|
111
|
+
raise TjException.new, "Unknown scenario index #{scIdx} used."
|
|
112
|
+
end
|
|
98
113
|
if !@propertySet.scenarioSpecific?(criteria)
|
|
99
114
|
raise TjException.new, "Attribute #{criteria} is not scenario specific"
|
|
100
115
|
end
|
|
@@ -114,7 +129,82 @@ class TaskJuggler
|
|
|
114
129
|
|
|
115
130
|
# Sort the properties according to the currently defined sorting criteria.
|
|
116
131
|
def sort!
|
|
117
|
-
|
|
132
|
+
if treeMode?
|
|
133
|
+
# Tree sorting is somewhat complex. It will be based on the 'tree'
|
|
134
|
+
# attribute of the PropertyTreeNodes but we have to update them first
|
|
135
|
+
# based on the other sorting criteria.
|
|
136
|
+
|
|
137
|
+
# Remove the tree sorting mode first.
|
|
138
|
+
sc = @sortingCriteria.delete_at(0)
|
|
139
|
+
su = @sortingUp.delete_at(0)
|
|
140
|
+
si = @scenarioIdx.delete_at(0)
|
|
141
|
+
@sortingLevels -= 1
|
|
142
|
+
|
|
143
|
+
# Sort the list based on the rest of the modes.
|
|
144
|
+
sortInternal
|
|
145
|
+
# The update the 'index' attributes of the PropertyTreeNodes.
|
|
146
|
+
index
|
|
147
|
+
# An then the 'tree' attributes.
|
|
148
|
+
indexTree
|
|
149
|
+
|
|
150
|
+
# Restore the 'tree' sorting mode again.
|
|
151
|
+
@sortingCriteria.insert(0, sc)
|
|
152
|
+
@sortingUp.insert(0, su)
|
|
153
|
+
@scenarioIdx.insert(0, si)
|
|
154
|
+
@sortingLevels += 1
|
|
155
|
+
|
|
156
|
+
# Sort again, now based on the updated 'tree' attributes.
|
|
157
|
+
sortInternal
|
|
158
|
+
else
|
|
159
|
+
sortInternal
|
|
160
|
+
end
|
|
161
|
+
# Update indexes.
|
|
162
|
+
index
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# This function sets the index attribute of all the properties in the list.
|
|
166
|
+
# The index starts with 0 and increases for each property.
|
|
167
|
+
def index
|
|
168
|
+
i = 0
|
|
169
|
+
@items.each do |p|
|
|
170
|
+
p.set('index', i += 1)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Turn the list into a String. This is only used for debugging.
|
|
175
|
+
def to_s # :nodoc:
|
|
176
|
+
res = "Sorting: "
|
|
177
|
+
@sortingLevels.times do |i|
|
|
178
|
+
res += "#{@sortingCriteria[i]}/#{@sortingUp[i] ? 'up' : 'down'}/" +
|
|
179
|
+
"#{@scenarioIdx[i]}, "
|
|
180
|
+
end
|
|
181
|
+
res += "\n#{@items.length} properties:"
|
|
182
|
+
@items.each { |i| res += "#{i.get('id')}: #{i.get('name')}\n" }
|
|
183
|
+
res
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
private
|
|
187
|
+
|
|
188
|
+
# Update the 'tree' indicies that are needed for the 'tree' sorting mode.
|
|
189
|
+
def indexTree
|
|
190
|
+
@items.each do |property|
|
|
191
|
+
# The indicies are an Array if the 'index' attributes for this
|
|
192
|
+
# property and all its parents.
|
|
193
|
+
treeIdcs = property.getIndicies
|
|
194
|
+
# Now convert them to a String.
|
|
195
|
+
tree = ''
|
|
196
|
+
treeIdcs.each do |idx|
|
|
197
|
+
# Prefix the level index with zeros so that we always have a 6
|
|
198
|
+
# digit long String. 6 digits should be large enough for all
|
|
199
|
+
# real-world projects.
|
|
200
|
+
tree += idx.to_s.rjust(6, '0')
|
|
201
|
+
end
|
|
202
|
+
property.set('tree', tree)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def sortInternal
|
|
207
|
+
@items.sort! do |a, b|
|
|
118
208
|
res = 0
|
|
119
209
|
@sortingLevels.times do |i|
|
|
120
210
|
if @query
|
|
@@ -125,11 +215,11 @@ class TaskJuggler
|
|
|
125
215
|
|
|
126
216
|
@query.property = a
|
|
127
217
|
@query.process
|
|
128
|
-
aVal = @query.
|
|
218
|
+
aVal = @query.to_sort
|
|
129
219
|
|
|
130
220
|
@query.property = b
|
|
131
221
|
@query.process
|
|
132
|
-
bVal = @query.
|
|
222
|
+
bVal = @query.to_sort
|
|
133
223
|
else
|
|
134
224
|
# In case we don't have a query, we use the static mechanism.
|
|
135
225
|
# If the scenario index is negative we have a non-scenario-specific
|
|
@@ -151,29 +241,6 @@ class TaskJuggler
|
|
|
151
241
|
end
|
|
152
242
|
res
|
|
153
243
|
end
|
|
154
|
-
# Update indexes.
|
|
155
|
-
index
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# This function sets the index attribute of all the properties in the list.
|
|
159
|
-
# The index starts with 0 and increases for each property.
|
|
160
|
-
def index
|
|
161
|
-
i = 0
|
|
162
|
-
each do |p|
|
|
163
|
-
p.set('index', i += 1)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Turn the list into a String. This is only used for debugging.
|
|
168
|
-
def to_s # :nodoc:
|
|
169
|
-
res = "Sorting: "
|
|
170
|
-
@sortingLevels.times do |i|
|
|
171
|
-
res += "#{@sortingCriteria[i]}/#{@sortingUp[i] ? 'up' : 'down'}/" +
|
|
172
|
-
"#{@scenarioIdx[i]}, "
|
|
173
|
-
end
|
|
174
|
-
res += "\n"
|
|
175
|
-
each { |i| res += "#{i.get('id')}: #{i.get('name')}\n" }
|
|
176
|
-
res
|
|
177
244
|
end
|
|
178
245
|
|
|
179
246
|
end
|