taskjuggler 0.0.2 → 0.0.3
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/Rakefile +1 -0
- data/benchmarks/depends.tjp +2 -1
- data/benchmarks/htmltaskreport.tjp +2 -1
- data/doc/classes/AppConfig.html +124 -120
- data/doc/classes/Arguments.html +10 -6
- data/doc/classes/Object.html +229 -0
- data/doc/classes/String.html +35 -31
- data/doc/classes/TaskJuggler/Account.html +18 -18
- data/doc/classes/TaskJuggler/AccountAttribute.html +261 -0
- data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
- data/doc/classes/TaskJuggler/Allocation.html +34 -30
- data/doc/classes/TaskJuggler/AllocationAttribute.html +70 -70
- data/doc/classes/TaskJuggler/AttributeBase.html +131 -147
- data/doc/classes/TaskJuggler/AttributeDefinition.html +38 -21
- data/doc/classes/TaskJuggler/BatchProcessor.html +313 -0
- data/doc/classes/TaskJuggler/Booking.html +22 -18
- data/doc/classes/TaskJuggler/BookingListAttribute.html +42 -42
- data/doc/classes/TaskJuggler/BooleanAttribute.html +40 -40
- data/doc/classes/TaskJuggler/CSVFile.html +28 -24
- data/doc/classes/TaskJuggler/Charge.html +22 -18
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +30 -30
- data/doc/classes/TaskJuggler/ChargeSet.html +41 -37
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/ColumnListAttribute.html +231 -0
- data/doc/classes/TaskJuggler/ColumnTable.html +23 -21
- data/doc/classes/TaskJuggler/DateAttribute.html +20 -20
- data/doc/classes/TaskJuggler/DefinitionListAttribute.html +162 -0
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
- data/doc/classes/TaskJuggler/FlagListAttribute.html +42 -42
- data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FormatListAttribute.html +197 -0
- data/doc/classes/TaskJuggler/GanttChart.html +236 -207
- data/doc/classes/TaskJuggler/GanttContainer.html +46 -42
- data/doc/classes/TaskJuggler/GanttHeader.html +16 -12
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +16 -12
- data/doc/classes/TaskJuggler/GanttLine.html +28 -24
- data/doc/classes/TaskJuggler/GanttLoadStack.html +22 -18
- data/doc/classes/TaskJuggler/GanttMilestone.html +46 -42
- data/doc/classes/TaskJuggler/GanttRouter.html +104 -98
- data/doc/classes/TaskJuggler/GanttTaskBar.html +46 -42
- data/doc/classes/TaskJuggler/HTMLDocument.html +12 -12
- data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
- data/doc/classes/TaskJuggler/Interval.html +126 -120
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/JobInfo.html +284 -0
- data/doc/classes/TaskJuggler/Journal.html +197 -0
- data/doc/classes/TaskJuggler/JournalEntry.html +218 -0
- data/doc/classes/TaskJuggler/KeywordArray.html +179 -0
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +445 -396
- data/doc/classes/TaskJuggler/Limits/Limit.html +34 -30
- data/doc/classes/TaskJuggler/Limits.html +68 -62
- data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ListAttributeBase.html +207 -0
- data/doc/classes/TaskJuggler/Log.html +72 -68
- data/doc/classes/TaskJuggler/LogicalAttribute.html +38 -34
- data/doc/classes/TaskJuggler/LogicalExpression.html +16 -12
- data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +194 -0
- data/doc/classes/TaskJuggler/LogicalFlag.html +32 -32
- data/doc/classes/TaskJuggler/LogicalFunction.html +28 -24
- data/doc/classes/TaskJuggler/LogicalOperation.html +17 -13
- data/doc/classes/TaskJuggler/Macro.html +10 -6
- data/doc/classes/TaskJuggler/MacroParser.html +36 -36
- data/doc/classes/TaskJuggler/MacroTable.html +40 -36
- data/doc/classes/TaskJuggler/Message.html +16 -12
- data/doc/classes/TaskJuggler/MessageHandler.html +16 -12
- data/doc/classes/TaskJuggler/Navigator.html +249 -0
- data/doc/classes/TaskJuggler/OnShiftCache.html +316 -0
- data/doc/classes/TaskJuggler/Project.html +1064 -678
- data/doc/classes/TaskJuggler/ProjectFileParser.html +90 -85
- data/doc/classes/TaskJuggler/PropertyAttribute.html +194 -0
- data/doc/classes/TaskJuggler/PropertyList.html +114 -113
- data/doc/classes/TaskJuggler/PropertySet.html +355 -312
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +527 -474
- data/doc/classes/TaskJuggler/Query.html +90 -85
- data/doc/classes/TaskJuggler/RTPNavigator.html +292 -0
- data/doc/classes/TaskJuggler/RTPReport.html +301 -0
- data/doc/classes/TaskJuggler/RealFormat.html +114 -57
- data/doc/classes/TaskJuggler/RealFormatAttribute.html +162 -0
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +87 -20
- data/doc/classes/TaskJuggler/Report.html +82 -291
- data/doc/classes/TaskJuggler/ReportBase.html +448 -0
- data/doc/classes/TaskJuggler/ReportContext.html +243 -0
- data/doc/classes/TaskJuggler/ReportTable.html +158 -129
- data/doc/classes/TaskJuggler/ReportTableCell.html +30 -26
- data/doc/classes/TaskJuggler/ReportTableColumn.html +29 -25
- data/doc/classes/TaskJuggler/ReportTableLegend.html +28 -24
- data/doc/classes/TaskJuggler/ReportTableLine.html +34 -30
- data/doc/classes/TaskJuggler/Resource.html +12 -12
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/ResourceListRE.html +49 -57
- data/doc/classes/TaskJuggler/ResourceScenario.html +126 -126
- data/doc/classes/TaskJuggler/RichText.html +52 -48
- data/doc/classes/TaskJuggler/RichTextAttribute.html +30 -30
- data/doc/classes/TaskJuggler/RichTextDocument.html +41 -37
- data/doc/classes/TaskJuggler/RichTextElement.html +274 -264
- data/doc/classes/TaskJuggler/RichTextException.html +13 -13
- data/doc/classes/TaskJuggler/RichTextParser.html +48 -47
- data/doc/classes/TaskJuggler/RichTextProtocolExample.html +52 -55
- data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +55 -10
- data/doc/classes/TaskJuggler/RichTextScanner.html +106 -245
- data/doc/classes/TaskJuggler/RichTextSnip.html +28 -24
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +381 -301
- data/doc/classes/TaskJuggler/Scenario.html +6 -6
- data/doc/classes/TaskJuggler/ScenarioData.html +40 -36
- data/doc/classes/TaskJuggler/ScenarioListAttribute.html +229 -0
- data/doc/classes/TaskJuggler/Scoreboard.html +70 -66
- data/doc/classes/TaskJuggler/Shift.html +18 -18
- data/doc/classes/TaskJuggler/ShiftAssignment.html +58 -54
- data/doc/classes/TaskJuggler/ShiftAssignments.html +82 -78
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
- data/doc/classes/TaskJuggler/SortListAttribute.html +196 -0
- data/doc/classes/TaskJuggler/SourceFileInfo.html +16 -12
- data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
- data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
- data/doc/classes/TaskJuggler/SyntaxReference.html +46 -42
- data/doc/classes/TaskJuggler/TOCEntry.html +16 -12
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +48 -33
- data/doc/classes/TaskJuggler/TableOfContents.html +22 -18
- data/doc/classes/TaskJuggler/TableReport.html +1036 -0
- data/doc/classes/TaskJuggler/Task.html +12 -12
- data/doc/classes/TaskJuggler/TaskDependency.html +16 -12
- data/doc/classes/TaskJuggler/TaskListAttribute.html +46 -46
- data/doc/classes/TaskJuggler/TaskListRE.html +49 -58
- data/doc/classes/TaskJuggler/TaskScenario.html +1270 -1180
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +100 -96
- data/doc/classes/TaskJuggler/TextParser/Rule.html +88 -84
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -12
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +10 -6
- data/doc/classes/TaskJuggler/TextParser.html +203 -140
- data/doc/classes/TaskJuggler/TextReport.html +364 -0
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +50 -42
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +16 -12
- data/doc/classes/TaskJuggler/TextScanner.html +334 -240
- data/doc/classes/TaskJuggler/TjException.html +6 -6
- data/doc/classes/TaskJuggler/TjTime.html +547 -497
- data/doc/classes/TaskJuggler/TjpExample.html +29 -25
- data/doc/classes/TaskJuggler/TjpExportRE.html +77 -97
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +3911 -3886
- data/doc/classes/TaskJuggler/UserManual.html +54 -54
- data/doc/classes/TaskJuggler/WorkingHours.html +53 -49
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -85
- data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
- data/doc/classes/TaskJuggler/XMLComment.html +21 -21
- data/doc/classes/TaskJuggler/XMLDocument.html +28 -24
- data/doc/classes/TaskJuggler/XMLElement.html +70 -58
- data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
- data/doc/classes/TaskJuggler/XMLText.html +36 -36
- data/doc/classes/TaskJuggler.html +266 -183
- data/doc/files/COPYING.html +1 -1
- data/doc/files/README.html +1 -1
- data/doc/files/lib/AccountScenario_rb.html +1 -1
- data/doc/files/lib/Account_rb.html +1 -1
- data/doc/files/lib/Allocation_rb.html +1 -1
- data/doc/files/lib/AppConfig_rb.html +1 -1
- data/doc/files/lib/AttributeBase_rb.html +11 -1
- data/doc/files/lib/AttributeDefinition_rb.html +1 -1
- data/doc/files/lib/Attributes_rb.html +1 -1
- data/doc/files/lib/{LogicalFlag_rb.html → BatchProcessor_rb.html} +8 -6
- data/doc/files/lib/Booking_rb.html +1 -1
- data/doc/files/lib/ChargeSet_rb.html +1 -1
- data/doc/files/lib/Charge_rb.html +1 -1
- data/doc/files/lib/HTMLDocument_rb.html +1 -1
- data/doc/files/lib/Interval_rb.html +1 -1
- data/doc/files/lib/Journal_rb.html +106 -0
- data/doc/files/lib/KeywordArray_rb.html +106 -0
- data/doc/files/lib/KeywordDocumentation_rb.html +1 -1
- data/doc/files/lib/Limits_rb.html +1 -1
- data/doc/files/lib/Log_rb.html +1 -1
- data/doc/files/lib/LogicalExpression_rb.html +1 -3
- data/doc/files/lib/LogicalFunction_rb.html +1 -1
- data/doc/files/lib/LogicalOperation_rb.html +1 -1
- data/doc/files/lib/MacroParser_rb.html +1 -1
- data/doc/files/lib/MacroTable_rb.html +1 -1
- data/doc/files/lib/MessageHandler_rb.html +1 -1
- data/doc/files/lib/Message_rb.html +1 -1
- data/doc/files/lib/ProjectFileParser_rb.html +5 -1
- data/doc/files/lib/Project_rb.html +5 -1
- data/doc/files/lib/PropertyList_rb.html +1 -1
- data/doc/files/lib/PropertySet_rb.html +1 -1
- data/doc/files/lib/PropertyTreeNode_rb.html +1 -1
- data/doc/files/lib/Query_rb.html +1 -1
- data/doc/files/lib/RTPNavigator_rb.html +120 -0
- data/doc/files/lib/RTPReport_rb.html +118 -0
- data/doc/files/lib/RealFormat_rb.html +1 -1
- data/doc/files/lib/ResourceScenario_rb.html +1 -1
- data/doc/files/lib/Resource_rb.html +1 -1
- data/doc/files/lib/RichTextDocument_rb.html +1 -1
- data/doc/files/lib/RichTextElement_rb.html +1 -1
- data/doc/files/lib/RichTextParser_rb.html +1 -1
- data/doc/files/lib/RichTextProtocolExample_rb.html +1 -1
- data/doc/files/lib/RichTextProtocolHandler_rb.html +1 -1
- data/doc/files/lib/RichTextScanner_rb.html +1 -1
- data/doc/files/lib/RichTextSnip_rb.html +1 -1
- data/doc/files/lib/RichTextSyntaxRules_rb.html +1 -1
- data/doc/files/lib/RichText_rb.html +1 -1
- data/doc/files/lib/ScenarioData_rb.html +1 -1
- data/doc/files/lib/Scenario_rb.html +1 -1
- data/doc/files/lib/Scoreboard_rb.html +1 -1
- data/doc/files/lib/ShiftAssignments_rb.html +1 -1
- data/doc/files/lib/ShiftScenario_rb.html +1 -1
- data/doc/files/lib/Shift_rb.html +1 -1
- data/doc/files/lib/SourceFileInfo_rb.html +1 -1
- data/doc/files/lib/SyntaxReference_rb.html +1 -1
- data/doc/files/lib/TOCEntry_rb.html +1 -1
- data/doc/files/lib/TableColumnDefinition_rb.html +1 -1
- data/doc/files/lib/TableOfContents_rb.html +1 -1
- data/doc/files/lib/TaskDependency_rb.html +1 -1
- data/doc/files/lib/TaskJuggler_rb.html +1 -1
- data/doc/files/lib/TaskScenario_rb.html +1 -1
- data/doc/files/lib/Task_rb.html +1 -1
- data/doc/files/lib/TextParser/Pattern_rb.html +1 -1
- data/doc/files/lib/TextParser/Rule_rb.html +1 -1
- data/doc/files/lib/TextParser/StackElement_rb.html +1 -1
- data/doc/files/lib/TextParser/TokenDoc_rb.html +1 -1
- data/doc/files/lib/TextParser_rb.html +1 -1
- data/doc/files/lib/TextScanner_rb.html +1 -1
- data/doc/files/lib/Tj3Config_rb.html +1 -1
- data/doc/files/lib/TjException_rb.html +1 -1
- data/doc/files/lib/TjTime_rb.html +1 -1
- data/doc/files/lib/TjpExample_rb.html +1 -1
- data/doc/files/lib/TjpSyntaxRules_rb.html +1 -1
- data/doc/files/lib/UTF8String_rb.html +1 -1
- data/doc/files/lib/UserManual_rb.html +1 -1
- data/doc/files/lib/WorkingHours_rb.html +1 -1
- data/doc/files/lib/XMLDocument_rb.html +1 -1
- data/doc/files/lib/XMLElement_rb.html +1 -1
- data/doc/files/lib/deep_copy_rb.html +106 -0
- data/doc/files/lib/ms_test_rb.html +90 -0
- data/doc/files/lib/reports/CSVFile_rb.html +1 -1
- data/doc/files/lib/reports/ColumnTable_rb.html +1 -1
- data/doc/files/lib/reports/GanttChart_rb.html +1 -1
- data/doc/files/lib/reports/GanttContainer_rb.html +1 -1
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
- data/doc/files/lib/reports/GanttHeader_rb.html +1 -1
- data/doc/files/lib/reports/GanttLine_rb.html +1 -1
- data/doc/files/lib/reports/GanttLoadStack_rb.html +1 -1
- data/doc/files/lib/reports/GanttMilestone_rb.html +1 -1
- data/doc/files/lib/reports/GanttRouter_rb.html +1 -1
- data/doc/files/lib/reports/GanttTaskBar_rb.html +1 -1
- data/doc/files/lib/reports/HTMLGraphics_rb.html +1 -1
- data/doc/files/lib/reports/{ReportElement_rb.html → Navigator_rb.html} +6 -8
- data/doc/files/lib/reports/ReportBase_rb.html +106 -0
- data/doc/files/lib/reports/ReportContext_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableCell_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableColumn_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableLegend_rb.html +1 -1
- data/doc/files/lib/reports/ReportTableLine_rb.html +1 -1
- data/doc/files/lib/reports/ReportTable_rb.html +1 -1
- data/doc/files/lib/reports/Report_rb.html +8 -2
- data/doc/files/lib/reports/ResourceListRE_rb.html +2 -2
- data/doc/files/lib/reports/{ReportTableElement_rb.html → TableReport_rb.html} +7 -5
- data/doc/files/lib/reports/TaskListRE_rb.html +2 -2
- data/doc/files/lib/reports/TextReport_rb.html +116 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +2 -2
- data/doc/files/lib/taskjuggler3_rb.html +61 -56
- data/doc/files/lib/tj3man_rb.html +1 -1
- data/doc/fr_class_index.html +41 -3
- data/doc/fr_file_index.html +21 -5
- data/doc/fr_method_index.html +1069 -959
- data/examples/ContactList.html +1467 -0
- data/examples/Deliveries.html +485 -0
- data/examples/Development.html +2525 -0
- data/examples/Overview.html +747 -0
- data/examples/Resource Graph.html +616 -0
- data/examples/tutorial.tjp +63 -67
- data/lib/AttributeBase.rb +27 -31
- data/lib/AttributeDefinition.rb +12 -7
- data/lib/Attributes.rb +134 -34
- data/lib/Interval.rb +2 -0
- data/lib/Journal.rb +44 -0
- data/lib/{LogicalFlag.rb → KeywordArray.rb} +5 -13
- data/lib/KeywordDocumentation.rb +84 -47
- data/lib/Limits.rb +7 -5
- data/lib/LogicalExpression.rb +1 -1
- data/lib/LogicalOperation.rb +33 -0
- data/lib/Project.rb +313 -99
- data/lib/ProjectFileParser.rb +88 -11
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +13 -4
- data/lib/PropertyTreeNode.rb +34 -15
- data/lib/Query.rb +2 -1
- data/lib/RTPNavigator.rb +53 -0
- data/lib/RTPReport.rb +62 -0
- data/lib/RealFormat.rb +28 -10
- data/lib/RichTextElement.rb +18 -12
- data/lib/RichTextParser.rb +1 -0
- data/lib/RichTextProtocolExample.rb +8 -11
- data/lib/RichTextProtocolHandler.rb +11 -1
- data/lib/RichTextScanner.rb +308 -164
- data/lib/RichTextSyntaxRules.rb +24 -0
- data/lib/TableColumnDefinition.rb +5 -1
- data/lib/TaskJuggler.rb +3 -2
- data/lib/TaskScenario.rb +123 -31
- data/lib/TextParser.rb +14 -3
- data/lib/TextScanner.rb +210 -34
- data/lib/Tj3Config.rb +1 -1
- data/lib/TjTime.rb +15 -0
- data/lib/TjpExample.rb +1 -1
- data/lib/TjpSyntaxRules.rb +674 -473
- data/lib/WorkingHours.rb +1 -1
- data/lib/XMLElement.rb +11 -3
- data/lib/deep_copy.rb +72 -0
- data/lib/ms_test.rb +27 -0
- data/lib/reports/ColumnTable.rb +7 -5
- data/lib/reports/GanttChart.rb +60 -34
- data/lib/reports/GanttHeader.rb +1 -1
- data/lib/reports/GanttRouter.rb +7 -5
- data/lib/reports/Navigator.rb +72 -0
- data/lib/reports/Report.rb +58 -73
- data/lib/reports/ReportBase.rb +241 -0
- data/lib/reports/ReportContext.rb +41 -0
- data/lib/reports/ReportTable.rb +7 -2
- data/lib/reports/ReportTableCell.rb +3 -3
- data/lib/reports/ResourceListRE.rb +19 -26
- data/lib/reports/{ReportTableElement.rb → TableReport.rb} +297 -97
- data/lib/reports/TaskListRE.rb +16 -24
- data/lib/reports/TextReport.rb +87 -0
- data/lib/reports/TjpExportRE.rb +55 -50
- data/lib/taskjuggler3.rb +6 -1
- data/manual/Getting_Started +57 -6
- data/manual/How_To_Contribute +2 -4
- data/manual/Intro +2 -2
- data/manual/Reporting_Bugs +9 -2
- data/manual/Rich_Text_Attributes +41 -0
- data/manual/Tutorial +219 -173
- data/tasks/test.rake +3 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +2 -1
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +2 -1
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +2 -1
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +2 -1
- data/test/TestSuite/CSV-Reports/taskreport.tjp +2 -1
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +2 -1
- data/test/TestSuite/HTML-Reports/depArrows.tjp +72 -0
- data/test/TestSuite/HTML-Reports/reference-export.html +187 -0
- data/test/TestSuite/HTML-Reports/reference.tjp +21 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -1
- data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +3 -3
- data/test/TestSuite/Scheduler/Correct/Container-2.tjp +37 -0
- data/test/TestSuite/Scheduler/Correct/Container.tjp +40 -0
- data/test/TestSuite/Scheduler/Correct/Depends.tjp +9 -14
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +2 -1
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +20 -29
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -13
- data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +6 -5
- data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +10 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +9 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +9 -6
- data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +13 -10
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +9 -14
- data/test/TestSuite/Scheduler/Correct/Shift.tjp +9 -8
- data/test/TestSuite/Scheduler/Correct/checks.tji +4 -0
- data/test/TestSuite/Scheduler/Errors/weak_end_dep.tjp +16 -0
- data/test/TestSuite/Scheduler/Errors/weak_start_dep.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Account.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/AutoID.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Caption.tjp +7 -6
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +7 -4
- data/test/TestSuite/Syntax/Correct/Comments.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji +11 -19
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +4 -3
- data/test/TestSuite/Syntax/Correct/Export.tjp +3 -1
- data/test/TestSuite/Syntax/Correct/Flags.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Journal.tjp +18 -0
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Period.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/RawHTML.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -2
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.tji +2 -0
- data/test/TestSuite/Syntax/Correct/ResourcePrefix.tjp +23 -0
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Simple.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/String.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +92 -70
- data/test/TestSuite/Syntax/Errors/bad_comment.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/bad_include.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/bad_time_zone.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/bad_timing_res.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/container_attribute.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +3 -2
- data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/eof_in_istring1.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring2.tjp +5 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring3.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring4.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/eof_in_istring5.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/include_recursion.tji +1 -0
- data/test/TestSuite/Syntax/Errors/include_recursion.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/junk_after_cut.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/navigator_exists.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/report_end.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/report_exists.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_start.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sort_direction.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/too_large_timing_res.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +1 -1
- data/test/TestSuite/Syntax/Errors/unknown_task.tjp +1 -1
- data/test/all.rb +1 -16
- data/test/test_CSV-Reports.rb +8 -5
- data/test/test_Query.rb +2 -2
- data/test/test_RichText.rb +95 -0
- data/test/test_Scheduler.rb +8 -4
- data/test/test_Syntax.rb +8 -4
- data/test/test_deep_copy.rb +83 -0
- metadata +549 -487
- data/benchmarks/UTF-8-Strings.rb +0 -58
- data/doc/classes/TaskJuggler/ReportElement.html +0 -1070
- data/doc/classes/TaskJuggler/ReportTableElement.html +0 -644
- data/lib/reports/ReportElement.rb +0 -427
- data/test/TestSuite/Syntax/Correct/csvtest +0 -16
- data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +0 -10
- data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +0 -10
- data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +0 -10
data/lib/TextScanner.rb
CHANGED
|
@@ -71,13 +71,21 @@ class TaskJuggler
|
|
|
71
71
|
def getc19
|
|
72
72
|
Log.activity if @bytes & 0x3FFF == 0
|
|
73
73
|
@bytes += 1
|
|
74
|
-
|
|
74
|
+
begin
|
|
75
|
+
@file.getc
|
|
76
|
+
rescue
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
75
79
|
end
|
|
76
80
|
|
|
77
81
|
def getc18
|
|
78
82
|
Log.activity if @bytes & 0x3FFF == 0
|
|
79
83
|
@bytes += 1
|
|
80
|
-
|
|
84
|
+
begin
|
|
85
|
+
c = @file.getc
|
|
86
|
+
rescue
|
|
87
|
+
return nil
|
|
88
|
+
end
|
|
81
89
|
return nil if c.nil?
|
|
82
90
|
'' << c
|
|
83
91
|
end
|
|
@@ -165,7 +173,7 @@ class TaskJuggler
|
|
|
165
173
|
end
|
|
166
174
|
end
|
|
167
175
|
@masterPath = @cf.dirname + '/'
|
|
168
|
-
@tokenBuffer = @pos = nil
|
|
176
|
+
@tokenBuffer = @pos = @lastPos = nil
|
|
169
177
|
end
|
|
170
178
|
|
|
171
179
|
# Finish processing and reset all data structures.
|
|
@@ -173,27 +181,39 @@ class TaskJuggler
|
|
|
173
181
|
Log.startProgressMeter("Reading file #{@masterFile}")
|
|
174
182
|
Log.stopProgressMeter
|
|
175
183
|
@fileStack = []
|
|
176
|
-
@cf = @tokenBuffer =
|
|
184
|
+
@cf = @tokenBuffer = nil
|
|
177
185
|
end
|
|
178
186
|
|
|
179
187
|
# Continue processing with a new file specified by _fileName_. When this
|
|
180
188
|
# file is finished, we will continue in the old file after the location
|
|
181
189
|
# where we started with the new file.
|
|
182
190
|
def include(fileName)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
191
|
+
if @fileStack.empty?
|
|
192
|
+
path = @masterPath
|
|
193
|
+
else
|
|
194
|
+
path = @fileStack.last[0].dirname + '/'
|
|
195
|
+
@fileStack.last[1, 2] = [ @tokenBuffer, @pos ]
|
|
196
|
+
end
|
|
197
|
+
if fileName[0] != '/'
|
|
198
|
+
# If the included file is not an absolute name, we interpret the file
|
|
199
|
+
# name relative to the including file.
|
|
200
|
+
fileName = path + fileName
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
@tokenBuffer = nil
|
|
195
204
|
|
|
196
|
-
|
|
205
|
+
# Check the current file stack to find recusions.
|
|
206
|
+
if @pos && fileName == @pos.fileName
|
|
207
|
+
error('include_recursion', "Recursive inclusion of #{fileName} detected")
|
|
208
|
+
else
|
|
209
|
+
@fileStack.each do |entry|
|
|
210
|
+
if fileName == entry[0].fileName
|
|
211
|
+
error('include_recursion', "Recursive inclusion of #{fileName} " +
|
|
212
|
+
"detected")
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
begin
|
|
197
217
|
@fileStack << [ (@cf = FileStreamHandle.new(fileName)), nil, nil ]
|
|
198
218
|
rescue StandardError
|
|
199
219
|
error('bad_include', "Cannot open include file #{fileName}")
|
|
@@ -229,11 +249,13 @@ class TaskJuggler
|
|
|
229
249
|
# If we have a pushed-back token, return that first.
|
|
230
250
|
unless @tokenBuffer.nil?
|
|
231
251
|
res = @tokenBuffer
|
|
232
|
-
@tokenBuffer =
|
|
252
|
+
@tokenBuffer = nil
|
|
253
|
+
@pos = @tokenBufferPos
|
|
233
254
|
return res
|
|
234
255
|
end
|
|
235
256
|
|
|
236
257
|
# Start processing characters from the input.
|
|
258
|
+
startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
|
|
237
259
|
token = [ '.', '<END>' ]
|
|
238
260
|
while c = nextChar
|
|
239
261
|
case c
|
|
@@ -242,10 +264,13 @@ class TaskJuggler
|
|
|
242
264
|
token = tok
|
|
243
265
|
break
|
|
244
266
|
end
|
|
267
|
+
startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
|
|
245
268
|
when '#'
|
|
246
269
|
skipComment
|
|
270
|
+
startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
|
|
247
271
|
when '/'
|
|
248
272
|
skipCPlusPlusComments
|
|
273
|
+
startOfToken = SourceFileInfo.new(fileName, lineNo, columnNo)
|
|
249
274
|
when '0'..'9'
|
|
250
275
|
token = readNumber(c)
|
|
251
276
|
break
|
|
@@ -255,12 +280,18 @@ class TaskJuggler
|
|
|
255
280
|
when '"'
|
|
256
281
|
token = readString(c)
|
|
257
282
|
break
|
|
283
|
+
when '-'
|
|
284
|
+
token = handleDash
|
|
285
|
+
break
|
|
258
286
|
when '!'
|
|
259
287
|
token = readRelativeId(c)
|
|
260
288
|
break
|
|
261
289
|
when 'a'..'z', 'A'..'Z', '_'
|
|
262
290
|
token = readId(c)
|
|
263
291
|
break
|
|
292
|
+
when '<', '>', '='
|
|
293
|
+
token = readOperator(c)
|
|
294
|
+
break
|
|
264
295
|
when '['
|
|
265
296
|
token = readMacro
|
|
266
297
|
break
|
|
@@ -274,8 +305,7 @@ class TaskJuggler
|
|
|
274
305
|
break
|
|
275
306
|
end
|
|
276
307
|
end
|
|
277
|
-
@
|
|
278
|
-
@pos = SourceFileInfo.new(fileName, lineNo, columnNo)
|
|
308
|
+
@pos = startOfToken
|
|
279
309
|
return token
|
|
280
310
|
end
|
|
281
311
|
|
|
@@ -287,6 +317,7 @@ class TaskJuggler
|
|
|
287
317
|
raise "Fatal Error: Cannot return more than 1 token in a row"
|
|
288
318
|
end
|
|
289
319
|
@tokenBuffer = token
|
|
320
|
+
@tokenBufferPos = @pos
|
|
290
321
|
@pos = @lastPos
|
|
291
322
|
end
|
|
292
323
|
|
|
@@ -315,20 +346,31 @@ class TaskJuggler
|
|
|
315
346
|
|
|
316
347
|
# Call this function to report any errors related to the parsed input.
|
|
317
348
|
def error(id, text, property = nil)
|
|
318
|
-
message
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
349
|
+
message('error', id, text, property)
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
def warning(id, text, property = nil)
|
|
353
|
+
message('warning', id, text, property)
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def message(type, id, text, property)
|
|
357
|
+
unless text.empty?
|
|
358
|
+
message = Message.new(id, type, text + "\n" + line.to_s,
|
|
359
|
+
property, nil, sourceFileInfo)
|
|
328
360
|
@messageHandler.send(message)
|
|
361
|
+
|
|
362
|
+
until @macroStack.empty?
|
|
363
|
+
macro, args = @macroStack.pop
|
|
364
|
+
args.collect! { |a| '"' + a + '"' }
|
|
365
|
+
message = Message.new('macro_stack', 'info',
|
|
366
|
+
" #{macro.name} #{args.join(' ')}", nil, nil,
|
|
367
|
+
macro.sourceFileInfo)
|
|
368
|
+
@messageHandler.send(message)
|
|
369
|
+
end
|
|
329
370
|
end
|
|
330
371
|
|
|
331
|
-
|
|
372
|
+
# An empty strings signals an already reported error
|
|
373
|
+
raise TjException.new, '' if type == 'error'
|
|
332
374
|
end
|
|
333
375
|
|
|
334
376
|
private
|
|
@@ -337,6 +379,14 @@ class TaskJuggler
|
|
|
337
379
|
# features a FIFO buffer that can hold any amount of returned characters.
|
|
338
380
|
# When it has reached the end of the master file it returns nil.
|
|
339
381
|
def nextChar
|
|
382
|
+
# We've started to find the next token. @pos no longer marks the
|
|
383
|
+
# position of the current token. Since we also store the EOF position in
|
|
384
|
+
# @pos, don't reset it if we have processed all files completely.
|
|
385
|
+
if @pos && @cf
|
|
386
|
+
@lastPos = @pos
|
|
387
|
+
@pos = nil
|
|
388
|
+
end
|
|
389
|
+
|
|
340
390
|
if (c = nextCharI) == '$' && !@ignoreMacros
|
|
341
391
|
# Double $ are reduced to a single $.
|
|
342
392
|
return c if (c = nextCharI) == '$'
|
|
@@ -351,7 +401,7 @@ class TaskJuggler
|
|
|
351
401
|
returnChar(c)
|
|
352
402
|
macroParser = MacroParser.new(self, @messageHandler)
|
|
353
403
|
begin
|
|
354
|
-
macroParser.parse('macroCall'
|
|
404
|
+
macroParser.parse('macroCall')
|
|
355
405
|
rescue TjException
|
|
356
406
|
end
|
|
357
407
|
@ignoreMacros = false
|
|
@@ -379,13 +429,17 @@ class TaskJuggler
|
|
|
379
429
|
# If EOF has been reached, try the parent file until even the master
|
|
380
430
|
# file has been processed completely.
|
|
381
431
|
if (c = @cf.getc).nil?
|
|
432
|
+
# Safe current position so an EOF related error can be properly
|
|
433
|
+
# reported.
|
|
434
|
+
@pos = sourceFileInfo
|
|
435
|
+
|
|
382
436
|
@cf.close
|
|
383
437
|
@fileStack.pop
|
|
384
438
|
if @fileStack.empty?
|
|
385
439
|
# We are done with the top-level file now.
|
|
386
|
-
@cf = @tokenBuffer =
|
|
440
|
+
@cf = @tokenBuffer = nil
|
|
387
441
|
else
|
|
388
|
-
@cf, @tokenBuffer, @
|
|
442
|
+
@cf, @tokenBuffer, @lastPos = @fileStack.last
|
|
389
443
|
Log << "Parsing file #{@cf.fileName} ..."
|
|
390
444
|
# We have been called by nextToken() already, so we can't just
|
|
391
445
|
# restore @tokenBuffer and be done. We need to feed the token text
|
|
@@ -442,6 +496,26 @@ class TaskJuggler
|
|
|
442
496
|
end
|
|
443
497
|
end
|
|
444
498
|
|
|
499
|
+
def handleDash
|
|
500
|
+
if (c1 = nextChar) == '8'
|
|
501
|
+
if (c2 = nextChar) == '<'
|
|
502
|
+
if (c3 = nextChar) == '-'
|
|
503
|
+
return readIndentedString
|
|
504
|
+
else
|
|
505
|
+
returnChar(c3)
|
|
506
|
+
returnChar(c2)
|
|
507
|
+
returnChar(c1)
|
|
508
|
+
end
|
|
509
|
+
else
|
|
510
|
+
returnChar(c2)
|
|
511
|
+
returnChar(c1)
|
|
512
|
+
end
|
|
513
|
+
else
|
|
514
|
+
returnChar(c1)
|
|
515
|
+
end
|
|
516
|
+
return [ 'LITERAL', ' - ']
|
|
517
|
+
end
|
|
518
|
+
|
|
445
519
|
def readBlanks(c)
|
|
446
520
|
loop do
|
|
447
521
|
if c == ' '
|
|
@@ -611,6 +685,90 @@ class TaskJuggler
|
|
|
611
685
|
[ 'STRING', token ]
|
|
612
686
|
end
|
|
613
687
|
|
|
688
|
+
def readIndentedString
|
|
689
|
+
state = 0
|
|
690
|
+
indent = ''
|
|
691
|
+
token = ''
|
|
692
|
+
while true
|
|
693
|
+
case state
|
|
694
|
+
when 0 # Determining indent
|
|
695
|
+
if nextChar != "\n"
|
|
696
|
+
error('junk_after_cut',
|
|
697
|
+
'The cut mark -8<- must be immediately followed by a ' +
|
|
698
|
+
'line break.')
|
|
699
|
+
end
|
|
700
|
+
while (c = nextChar) == ' ' || c == "\t"
|
|
701
|
+
indent << c
|
|
702
|
+
end
|
|
703
|
+
returnChar(c)
|
|
704
|
+
state = 1
|
|
705
|
+
when 1 # reading '-' or first content line character
|
|
706
|
+
if (c = nextChar) == '-'
|
|
707
|
+
state = 3
|
|
708
|
+
elsif c.nil?
|
|
709
|
+
error('eof_in_istring1', 'Unexpected end of file in string')
|
|
710
|
+
elsif c == "\n"
|
|
711
|
+
token << c
|
|
712
|
+
state = 6
|
|
713
|
+
else
|
|
714
|
+
token << c
|
|
715
|
+
state = 2
|
|
716
|
+
end
|
|
717
|
+
when 2 # reading content line
|
|
718
|
+
while (c = nextChar) != "\n"
|
|
719
|
+
error('eof_in_istring2',
|
|
720
|
+
'Unexpected end of file in string') if c.nil?
|
|
721
|
+
token << c
|
|
722
|
+
end
|
|
723
|
+
token << c
|
|
724
|
+
state = 6
|
|
725
|
+
when 3 # reading '>' of '->8-'
|
|
726
|
+
if (c = nextChar) == '>'
|
|
727
|
+
state = 4
|
|
728
|
+
else
|
|
729
|
+
error('eof_in_istring3',
|
|
730
|
+
'Unexpected end of file in string') if c.nil?
|
|
731
|
+
token << '-'
|
|
732
|
+
token << c
|
|
733
|
+
state = 2
|
|
734
|
+
end
|
|
735
|
+
when 4 # reading '8' of '->8-'
|
|
736
|
+
if (c = nextChar) == '8'
|
|
737
|
+
state = 5
|
|
738
|
+
else
|
|
739
|
+
error('eof_in_istring4',
|
|
740
|
+
'Unexpected end of file in string') if c.nil?
|
|
741
|
+
token << c
|
|
742
|
+
state = 2
|
|
743
|
+
end
|
|
744
|
+
when 5 # reading '-' of '->8-'
|
|
745
|
+
if (c = nextChar) == '-'
|
|
746
|
+
return [ 'STRING', token ]
|
|
747
|
+
else
|
|
748
|
+
error('eof_in_istring5',
|
|
749
|
+
'Unexpected end of file in string') if c.nil?
|
|
750
|
+
token << c
|
|
751
|
+
state = 2
|
|
752
|
+
end
|
|
753
|
+
when 6 # reading indentation
|
|
754
|
+
state = 1
|
|
755
|
+
indent.each_utf8_char do |ci|
|
|
756
|
+
if ci != (c = nextChar)
|
|
757
|
+
if c == '-'
|
|
758
|
+
state = 3
|
|
759
|
+
break
|
|
760
|
+
else
|
|
761
|
+
error('bad_indent',
|
|
762
|
+
'All string lines must have the exact same indentation.')
|
|
763
|
+
end
|
|
764
|
+
end
|
|
765
|
+
end
|
|
766
|
+
else
|
|
767
|
+
raise "State machine error"
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
end
|
|
771
|
+
|
|
614
772
|
def readId(c)
|
|
615
773
|
token = ""
|
|
616
774
|
token << c
|
|
@@ -646,6 +804,24 @@ class TaskJuggler
|
|
|
646
804
|
return [ 'MACRO', token ]
|
|
647
805
|
end
|
|
648
806
|
|
|
807
|
+
# Read operators of logical expressions.
|
|
808
|
+
def readOperator(c)
|
|
809
|
+
case c
|
|
810
|
+
when '='
|
|
811
|
+
return [ 'LITERAL', '=' ]
|
|
812
|
+
when '>'
|
|
813
|
+
return [ 'LITERAL', '>=' ] if (c = nextChar) == '='
|
|
814
|
+
returnChar(c)
|
|
815
|
+
return [ 'LITERAL', '>' ]
|
|
816
|
+
when '<'
|
|
817
|
+
return [ 'LITERAL', '<=' ] if (c = nextChar) == '='
|
|
818
|
+
returnChar(c)
|
|
819
|
+
return [ 'LITERAL', '<' ]
|
|
820
|
+
else
|
|
821
|
+
raise "Unsupported operator #{c}"
|
|
822
|
+
end
|
|
823
|
+
end
|
|
824
|
+
|
|
649
825
|
# Read only decimal digits and return the result als Fixnum.
|
|
650
826
|
def readDigits
|
|
651
827
|
token = ""
|
data/lib/Tj3Config.rb
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
require 'UTF8String'
|
|
14
14
|
require 'AppConfig'
|
|
15
15
|
|
|
16
|
-
AppConfig.version = '0.0.
|
|
16
|
+
AppConfig.version = '0.0.3'
|
|
17
17
|
AppConfig.packageName = 'TaskJuggler III'
|
|
18
18
|
AppConfig.packageInfo = 'A Project Mangement Software'
|
|
19
19
|
AppConfig.copyright = [ (2006..2009).to_a ]
|
data/lib/TjTime.rb
CHANGED
|
@@ -60,6 +60,21 @@ class TaskJuggler
|
|
|
60
60
|
TjTime.new(Time.local(*args).gmtime)
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
+
# Check if +zone+ is a valid time zone.
|
|
64
|
+
def TjTime.checkTimeZone(zone)
|
|
65
|
+
return true if zone == 'UTC'
|
|
66
|
+
|
|
67
|
+
tz = ENV['TZ']
|
|
68
|
+
ENV['TZ'] = zone
|
|
69
|
+
newZone = Time.new.zone
|
|
70
|
+
# If the time zone is valid, the OS can convert a zone like
|
|
71
|
+
# 'America/Denver' into 'MST'. Unknown time zones are either not
|
|
72
|
+
# converted or cause a fallback to UTC.
|
|
73
|
+
res = (newZone != zone && newZone != 'UTC')
|
|
74
|
+
ENV['TZ'] = tz if tz
|
|
75
|
+
res
|
|
76
|
+
end
|
|
77
|
+
|
|
63
78
|
# Align the date to a time grid. The grid distance is determined by _clock_.
|
|
64
79
|
def align(clock)
|
|
65
80
|
TjTime.new((@time.to_i / clock) * clock)
|
data/lib/TjpExample.rb
CHANGED