taskjuggler 0.0.2
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/COPYING +280 -0
- data/README +31 -0
- data/Rakefile +20 -0
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/allocate.tjp +30 -0
- data/benchmarks/booking.tjp +62 -0
- data/benchmarks/depends.tjp +112 -0
- data/benchmarks/htmltaskreport.tjp +45 -0
- data/benchmarks/runbench.rb +24 -0
- data/bin/tj3 +3 -0
- data/bin/tj3man +3 -0
- data/doc/classes/AppConfig.html +808 -0
- data/doc/classes/Arguments.html +226 -0
- data/doc/classes/String.html +395 -0
- data/doc/classes/TaskJuggler.html +1358 -0
- data/doc/classes/TaskJuggler/Account.html +257 -0
- data/doc/classes/TaskJuggler/AccountScenario.html +218 -0
- data/doc/classes/TaskJuggler/Allocation.html +419 -0
- data/doc/classes/TaskJuggler/AllocationAttribute.html +291 -0
- data/doc/classes/TaskJuggler/AttributeBase.html +608 -0
- data/doc/classes/TaskJuggler/AttributeDefinition.html +259 -0
- data/doc/classes/TaskJuggler/Booking.html +307 -0
- data/doc/classes/TaskJuggler/BookingListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/BooleanAttribute.html +261 -0
- data/doc/classes/TaskJuggler/CSVFile.html +325 -0
- data/doc/classes/TaskJuggler/Charge.html +279 -0
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +229 -0
- data/doc/classes/TaskJuggler/ChargeSet.html +440 -0
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +276 -0
- data/doc/classes/TaskJuggler/ColumnTable.html +260 -0
- data/doc/classes/TaskJuggler/DateAttribute.html +194 -0
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/DurationAttribute.html +229 -0
- data/doc/classes/TaskJuggler/FixnumAttribute.html +194 -0
- data/doc/classes/TaskJuggler/FlagListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/FloatAttribute.html +229 -0
- data/doc/classes/TaskJuggler/GanttChart.html +667 -0
- data/doc/classes/TaskJuggler/GanttContainer.html +441 -0
- data/doc/classes/TaskJuggler/GanttHeader.html +280 -0
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +245 -0
- data/doc/classes/TaskJuggler/GanttLine.html +398 -0
- data/doc/classes/TaskJuggler/GanttLoadStack.html +327 -0
- data/doc/classes/TaskJuggler/GanttMilestone.html +415 -0
- data/doc/classes/TaskJuggler/GanttRouter.html +425 -0
- data/doc/classes/TaskJuggler/GanttTaskBar.html +429 -0
- data/doc/classes/TaskJuggler/HTMLDocument.html +240 -0
- data/doc/classes/TaskJuggler/HTMLGraphics.html +231 -0
- data/doc/classes/TaskJuggler/Interval.html +552 -0
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +796 -0
- data/doc/classes/TaskJuggler/Limits.html +416 -0
- data/doc/classes/TaskJuggler/Limits/Limit.html +381 -0
- data/doc/classes/TaskJuggler/LimitsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/Log.html +613 -0
- data/doc/classes/TaskJuggler/LogicalAttribute.html +226 -0
- data/doc/classes/TaskJuggler/LogicalExpression.html +251 -0
- data/doc/classes/TaskJuggler/LogicalFlag.html +229 -0
- data/doc/classes/TaskJuggler/LogicalFunction.html +324 -0
- data/doc/classes/TaskJuggler/LogicalOperation.html +299 -0
- data/doc/classes/TaskJuggler/Macro.html +194 -0
- data/doc/classes/TaskJuggler/MacroParser.html +360 -0
- data/doc/classes/TaskJuggler/MacroTable.html +366 -0
- data/doc/classes/TaskJuggler/Message.html +281 -0
- data/doc/classes/TaskJuggler/MessageHandler.html +215 -0
- data/doc/classes/TaskJuggler/Project.html +1606 -0
- data/doc/classes/TaskJuggler/ProjectFileParser.html +412 -0
- data/doc/classes/TaskJuggler/PropertyList.html +597 -0
- data/doc/classes/TaskJuggler/PropertySet.html +1200 -0
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +1449 -0
- data/doc/classes/TaskJuggler/Query.html +600 -0
- data/doc/classes/TaskJuggler/RealFormat.html +252 -0
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +194 -0
- data/doc/classes/TaskJuggler/Report.html +528 -0
- data/doc/classes/TaskJuggler/ReportElement.html +1070 -0
- data/doc/classes/TaskJuggler/ReportTable.html +497 -0
- data/doc/classes/TaskJuggler/ReportTableCell.html +518 -0
- data/doc/classes/TaskJuggler/ReportTableColumn.html +364 -0
- data/doc/classes/TaskJuggler/ReportTableElement.html +644 -0
- data/doc/classes/TaskJuggler/ReportTableLegend.html +343 -0
- data/doc/classes/TaskJuggler/ReportTableLine.html +431 -0
- data/doc/classes/TaskJuggler/Resource.html +211 -0
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/ResourceListRE.html +249 -0
- data/doc/classes/TaskJuggler/ResourceScenario.html +1137 -0
- data/doc/classes/TaskJuggler/RichText.html +537 -0
- data/doc/classes/TaskJuggler/RichTextAttribute.html +229 -0
- data/doc/classes/TaskJuggler/RichTextDocument.html +418 -0
- data/doc/classes/TaskJuggler/RichTextElement.html +829 -0
- data/doc/classes/TaskJuggler/RichTextException.html +212 -0
- data/doc/classes/TaskJuggler/RichTextParser.html +317 -0
- data/doc/classes/TaskJuggler/RichTextProtocolExample.html +303 -0
- data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +194 -0
- data/doc/classes/TaskJuggler/RichTextScanner.html +561 -0
- data/doc/classes/TaskJuggler/RichTextSnip.html +364 -0
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +883 -0
- data/doc/classes/TaskJuggler/Scenario.html +163 -0
- data/doc/classes/TaskJuggler/ScenarioData.html +354 -0
- data/doc/classes/TaskJuggler/Scoreboard.html +638 -0
- data/doc/classes/TaskJuggler/Shift.html +255 -0
- data/doc/classes/TaskJuggler/ShiftAssignment.html +488 -0
- data/doc/classes/TaskJuggler/ShiftAssignments.html +715 -0
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/ShiftScenario.html +282 -0
- data/doc/classes/TaskJuggler/SourceFileInfo.html +247 -0
- data/doc/classes/TaskJuggler/StringAttribute.html +229 -0
- data/doc/classes/TaskJuggler/SymbolAttribute.html +194 -0
- data/doc/classes/TaskJuggler/SyntaxReference.html +516 -0
- data/doc/classes/TaskJuggler/TOCEntry.html +242 -0
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +273 -0
- data/doc/classes/TaskJuggler/TableOfContents.html +256 -0
- data/doc/classes/TaskJuggler/Task.html +203 -0
- data/doc/classes/TaskJuggler/TaskDependency.html +251 -0
- data/doc/classes/TaskJuggler/TaskListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/TaskListRE.html +250 -0
- data/doc/classes/TaskJuggler/TaskScenario.html +2206 -0
- data/doc/classes/TaskJuggler/TextParser.html +670 -0
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +923 -0
- data/doc/classes/TaskJuggler/TextParser/Rule.html +779 -0
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +267 -0
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +212 -0
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +221 -0
- data/doc/classes/TaskJuggler/TextScanner.html +708 -0
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +355 -0
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +341 -0
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +260 -0
- data/doc/classes/TaskJuggler/TjException.html +185 -0
- data/doc/classes/TaskJuggler/TjTime.html +1845 -0
- data/doc/classes/TaskJuggler/TjpExample.html +310 -0
- data/doc/classes/TaskJuggler/TjpExportRE.html +329 -0
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +8928 -0
- data/doc/classes/TaskJuggler/UserManual.html +606 -0
- data/doc/classes/TaskJuggler/WorkingHours.html +582 -0
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +284 -0
- data/doc/classes/TaskJuggler/XMLBlob.html +207 -0
- data/doc/classes/TaskJuggler/XMLComment.html +206 -0
- data/doc/classes/TaskJuggler/XMLDocument.html +293 -0
- data/doc/classes/TaskJuggler/XMLElement.html +341 -0
- data/doc/classes/TaskJuggler/XMLNamedText.html +174 -0
- data/doc/classes/TaskJuggler/XMLText.html +221 -0
- data/doc/files/COPYING.html +448 -0
- data/doc/files/README.html +134 -0
- data/doc/files/lib/AccountScenario_rb.html +116 -0
- data/doc/files/lib/Account_rb.html +118 -0
- data/doc/files/lib/Allocation_rb.html +118 -0
- data/doc/files/lib/AppConfig_rb.html +116 -0
- data/doc/files/lib/AttributeBase_rb.html +106 -0
- data/doc/files/lib/AttributeDefinition_rb.html +106 -0
- data/doc/files/lib/Attributes_rb.html +130 -0
- data/doc/files/lib/Booking_rb.html +106 -0
- data/doc/files/lib/ChargeSet_rb.html +116 -0
- data/doc/files/lib/Charge_rb.html +116 -0
- data/doc/files/lib/HTMLDocument_rb.html +116 -0
- data/doc/files/lib/Interval_rb.html +116 -0
- data/doc/files/lib/KeywordDocumentation_rb.html +122 -0
- data/doc/files/lib/Limits_rb.html +116 -0
- data/doc/files/lib/Log_rb.html +116 -0
- data/doc/files/lib/LogicalExpression_rb.html +122 -0
- data/doc/files/lib/LogicalFlag_rb.html +116 -0
- data/doc/files/lib/LogicalFunction_rb.html +116 -0
- data/doc/files/lib/LogicalOperation_rb.html +116 -0
- data/doc/files/lib/MacroParser_rb.html +118 -0
- data/doc/files/lib/MacroTable_rb.html +122 -0
- data/doc/files/lib/MessageHandler_rb.html +106 -0
- data/doc/files/lib/Message_rb.html +116 -0
- data/doc/files/lib/ProjectFileParser_rb.html +122 -0
- data/doc/files/lib/Project_rb.html +148 -0
- data/doc/files/lib/PropertyList_rb.html +106 -0
- data/doc/files/lib/PropertySet_rb.html +118 -0
- data/doc/files/lib/PropertyTreeNode_rb.html +106 -0
- data/doc/files/lib/Query_rb.html +116 -0
- data/doc/files/lib/RealFormat_rb.html +106 -0
- data/doc/files/lib/ResourceScenario_rb.html +116 -0
- data/doc/files/lib/Resource_rb.html +118 -0
- data/doc/files/lib/RichTextDocument_rb.html +120 -0
- data/doc/files/lib/RichTextElement_rb.html +120 -0
- data/doc/files/lib/RichTextParser_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolExample_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolHandler_rb.html +106 -0
- data/doc/files/lib/RichTextScanner_rb.html +116 -0
- data/doc/files/lib/RichTextSnip_rb.html +118 -0
- data/doc/files/lib/RichTextSyntaxRules_rb.html +106 -0
- data/doc/files/lib/RichText_rb.html +118 -0
- data/doc/files/lib/ScenarioData_rb.html +118 -0
- data/doc/files/lib/Scenario_rb.html +116 -0
- data/doc/files/lib/Scoreboard_rb.html +106 -0
- data/doc/files/lib/ShiftAssignments_rb.html +116 -0
- data/doc/files/lib/ShiftScenario_rb.html +116 -0
- data/doc/files/lib/Shift_rb.html +118 -0
- data/doc/files/lib/SourceFileInfo_rb.html +106 -0
- data/doc/files/lib/SyntaxReference_rb.html +122 -0
- data/doc/files/lib/TOCEntry_rb.html +118 -0
- data/doc/files/lib/TableColumnDefinition_rb.html +106 -0
- data/doc/files/lib/TableOfContents_rb.html +118 -0
- data/doc/files/lib/TaskDependency_rb.html +106 -0
- data/doc/files/lib/TaskJuggler_rb.html +120 -0
- data/doc/files/lib/TaskScenario_rb.html +116 -0
- data/doc/files/lib/Task_rb.html +118 -0
- data/doc/files/lib/TextParser/Pattern_rb.html +116 -0
- data/doc/files/lib/TextParser/Rule_rb.html +106 -0
- data/doc/files/lib/TextParser/StackElement_rb.html +106 -0
- data/doc/files/lib/TextParser/TokenDoc_rb.html +106 -0
- data/doc/files/lib/TextParser_rb.html +124 -0
- data/doc/files/lib/TextScanner_rb.html +128 -0
- data/doc/files/lib/Tj3Config_rb.html +118 -0
- data/doc/files/lib/TjException_rb.html +106 -0
- data/doc/files/lib/TjTime_rb.html +118 -0
- data/doc/files/lib/TjpExample_rb.html +116 -0
- data/doc/files/lib/TjpSyntaxRules_rb.html +106 -0
- data/doc/files/lib/UTF8String_rb.html +132 -0
- data/doc/files/lib/UserManual_rb.html +124 -0
- data/doc/files/lib/WorkingHours_rb.html +116 -0
- data/doc/files/lib/XMLDocument_rb.html +116 -0
- data/doc/files/lib/XMLElement_rb.html +116 -0
- data/doc/files/lib/reports/CSVFile_rb.html +116 -0
- data/doc/files/lib/reports/ColumnTable_rb.html +116 -0
- data/doc/files/lib/reports/GanttChart_rb.html +122 -0
- data/doc/files/lib/reports/GanttContainer_rb.html +116 -0
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +106 -0
- data/doc/files/lib/reports/GanttHeader_rb.html +116 -0
- data/doc/files/lib/reports/GanttLine_rb.html +126 -0
- data/doc/files/lib/reports/GanttLoadStack_rb.html +116 -0
- data/doc/files/lib/reports/GanttMilestone_rb.html +116 -0
- data/doc/files/lib/reports/GanttRouter_rb.html +106 -0
- data/doc/files/lib/reports/GanttTaskBar_rb.html +116 -0
- data/doc/files/lib/reports/HTMLGraphics_rb.html +106 -0
- data/doc/files/lib/reports/ReportElement_rb.html +118 -0
- data/doc/files/lib/reports/ReportTableCell_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableColumn_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableElement_rb.html +122 -0
- data/doc/files/lib/reports/ReportTableLegend_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableLine_rb.html +116 -0
- data/doc/files/lib/reports/ReportTable_rb.html +118 -0
- data/doc/files/lib/reports/Report_rb.html +126 -0
- data/doc/files/lib/reports/ResourceListRE_rb.html +122 -0
- data/doc/files/lib/reports/TaskListRE_rb.html +122 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +116 -0
- data/doc/files/lib/taskjuggler3_rb.html +276 -0
- data/doc/files/lib/tj3man_rb.html +189 -0
- data/doc/fr_class_index.html +285 -0
- data/doc/fr_file_index.html +223 -0
- data/doc/fr_method_index.html +1953 -0
- data/doc/index.html +21 -0
- data/doc/rdoc-style.css +299 -0
- data/examples/tutorial.tjp +361 -0
- data/gem_spec.rb +30 -0
- data/lib/Account.rb +50 -0
- data/lib/AccountScenario.rb +39 -0
- data/lib/Allocation.rb +102 -0
- data/lib/AppConfig.rb +134 -0
- data/lib/AttributeBase.rb +131 -0
- data/lib/AttributeDefinition.rb +47 -0
- data/lib/Attributes.rb +478 -0
- data/lib/BatchProcessor.rb +209 -0
- data/lib/Booking.rb +59 -0
- data/lib/Charge.rb +71 -0
- data/lib/ChargeSet.rb +126 -0
- data/lib/HTMLDocument.rb +59 -0
- data/lib/Interval.rb +127 -0
- data/lib/KeywordDocumentation.rb +560 -0
- data/lib/Limits.rb +219 -0
- data/lib/Log.rb +160 -0
- data/lib/LogicalExpression.rb +71 -0
- data/lib/LogicalFlag.rb +34 -0
- data/lib/LogicalFunction.rb +102 -0
- data/lib/LogicalOperation.rb +118 -0
- data/lib/MacroParser.rb +77 -0
- data/lib/MacroTable.rb +84 -0
- data/lib/Message.rb +56 -0
- data/lib/MessageHandler.rb +34 -0
- data/lib/Project.rb +662 -0
- data/lib/ProjectFileParser.rb +333 -0
- data/lib/PropertyList.rb +181 -0
- data/lib/PropertySet.rb +304 -0
- data/lib/PropertyTreeNode.rb +461 -0
- data/lib/Query.rb +227 -0
- data/lib/RealFormat.rb +73 -0
- data/lib/Resource.rb +42 -0
- data/lib/ResourceScenario.rb +511 -0
- data/lib/RichText.rb +147 -0
- data/lib/RichTextDocument.rb +139 -0
- data/lib/RichTextElement.rb +391 -0
- data/lib/RichTextParser.rb +66 -0
- data/lib/RichTextProtocolExample.rb +65 -0
- data/lib/RichTextProtocolHandler.rb +35 -0
- data/lib/RichTextScanner.rb +390 -0
- data/lib/RichTextSnip.rb +104 -0
- data/lib/RichTextSyntaxRules.rb +265 -0
- data/lib/Scenario.rb +27 -0
- data/lib/ScenarioData.rb +65 -0
- data/lib/Scoreboard.rb +141 -0
- data/lib/Shift.rb +48 -0
- data/lib/ShiftAssignments.rb +291 -0
- data/lib/ShiftScenario.rb +46 -0
- data/lib/SourceFileInfo.rb +37 -0
- data/lib/SyntaxReference.rb +284 -0
- data/lib/TOCEntry.rb +76 -0
- data/lib/TableColumnDefinition.rb +54 -0
- data/lib/TableOfContents.rb +46 -0
- data/lib/Task.rb +37 -0
- data/lib/TaskDependency.rb +39 -0
- data/lib/TaskJuggler.rb +84 -0
- data/lib/TaskScenario.rb +1622 -0
- data/lib/TextParser.rb +416 -0
- data/lib/TextParser/Pattern.rb +263 -0
- data/lib/TextParser/Rule.rb +171 -0
- data/lib/TextParser/StackElement.rb +45 -0
- data/lib/TextParser/TokenDoc.rb +38 -0
- data/lib/TextScanner.rb +682 -0
- data/lib/Tj3Config.rb +27 -0
- data/lib/TjException.rb +27 -0
- data/lib/TjTime.rb +395 -0
- data/lib/TjpExample.rb +119 -0
- data/lib/TjpSyntaxRules.rb +4022 -0
- data/lib/UTF8String.rb +100 -0
- data/lib/UserManual.rb +282 -0
- data/lib/WorkingHours.rb +323 -0
- data/lib/XMLDocument.rb +54 -0
- data/lib/XMLElement.rb +175 -0
- data/lib/reports/CSVFile.rb +146 -0
- data/lib/reports/ColumnTable.rb +66 -0
- data/lib/reports/GanttChart.rb +308 -0
- data/lib/reports/GanttContainer.rb +107 -0
- data/lib/reports/GanttHeader.rb +141 -0
- data/lib/reports/GanttHeaderScaleItem.rb +42 -0
- data/lib/reports/GanttLine.rb +329 -0
- data/lib/reports/GanttLoadStack.rb +113 -0
- data/lib/reports/GanttMilestone.rb +80 -0
- data/lib/reports/GanttRouter.rb +375 -0
- data/lib/reports/GanttTaskBar.rb +95 -0
- data/lib/reports/HTMLGraphics.rb +65 -0
- data/lib/reports/Report.rb +344 -0
- data/lib/reports/ReportElement.rb +427 -0
- data/lib/reports/ReportTable.rb +144 -0
- data/lib/reports/ReportTableCell.rb +142 -0
- data/lib/reports/ReportTableColumn.rb +82 -0
- data/lib/reports/ReportTableElement.rb +852 -0
- data/lib/reports/ReportTableLegend.rb +167 -0
- data/lib/reports/ReportTableLine.rb +87 -0
- data/lib/reports/ResourceListRE.rb +72 -0
- data/lib/reports/TaskListRE.rb +73 -0
- data/lib/reports/TjpExportRE.rb +394 -0
- data/lib/taskjuggler3.rb +106 -0
- data/lib/tj3man.rb +88 -0
- data/manual/Day_To_Day_Juggling +168 -0
- data/manual/Getting_Started +61 -0
- data/manual/How_To_Contribute +185 -0
- data/manual/Installation +68 -0
- data/manual/Intro +102 -0
- data/manual/Reporting_Bugs +26 -0
- data/manual/Rich_Text_Attributes +90 -0
- data/manual/TaskJuggler_2x_Migration +40 -0
- data/manual/Tutorial +579 -0
- data/manual/fdl +450 -0
- data/prj_cfg.rb +43 -0
- data/setup.rb +1585 -0
- data/tasks/csts.rake +72 -0
- data/tasks/gem.rake +14 -0
- data/tasks/manual.rake +10 -0
- data/tasks/missing.rake +21 -0
- data/tasks/rcov.rake +14 -0
- data/tasks/rdoc.rake +17 -0
- data/tasks/rexml_fix.rb +16 -0
- data/tasks/rexml_fix_19.rb +49 -0
- data/tasks/show.rake +21 -0
- data/tasks/stats.rake +25 -0
- data/tasks/test.rake +11 -0
- data/test/MessageChecker.rb +53 -0
- data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +7 -0
- data/test/TestSuite/CSV-Reports/genrefs +6 -0
- data/test/TestSuite/CSV-Reports/project-1.tji +57 -0
- data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -0
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +11 -0
- data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +8 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/taskreport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +24 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +11 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +86 -0
- data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +63 -0
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +161 -0
- data/test/TestSuite/Scheduler/Correct/Depends.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +129 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +81 -0
- data/test/TestSuite/Scheduler/Correct/MultipleMandatories.tjp +43 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +28 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +62 -0
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Shift.tjp +102 -0
- data/test/TestSuite/Scheduler/Errors/account_no_leaf.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/booking_conflict.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/booking_no_duty.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/booking_on_vacation.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/container_booking.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/container_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/effort_no_allocations.tjp +7 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +19 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +26 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +24 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +18 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +37 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +35 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +46 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +51 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/maxend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/maxstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_booking.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/milestone_duration.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_start_end.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/no_tasks.tjp +6 -0
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_child.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_parent.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_self.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_unknown.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_1.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_2.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_3.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_1.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_3.tjp +9 -0
- data/test/TestSuite/Syntax/Correct/Account.tjp +53 -0
- data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/Alternative.tjp +13 -0
- data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Booking.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Caption.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Comments.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Complete.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji +20 -0
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Depends1.tjp +22 -0
- data/test/TestSuite/Syntax/Correct/Durations.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Efficiency.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Export.tjp +40 -0
- data/test/TestSuite/Syntax/Correct/Flags.tjp +32 -0
- data/test/TestSuite/Syntax/Correct/Freeze.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Gap.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Limits-1.tjp +71 -0
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Mandatory.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Milestone.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/MinMax.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Numberformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Period.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Persistent.tjp +11 -0
- data/test/TestSuite/Syntax/Correct/Precedes1.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Priority.tjp +30 -0
- data/test/TestSuite/Syntax/Correct/Project.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +23 -0
- data/test/TestSuite/Syntax/Correct/RawHTML.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Reports.tjp +54 -0
- data/test/TestSuite/Syntax/Correct/Resource.tjp +20 -0
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Scenario.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/Scheduling.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Select.tjp +27 -0
- data/test/TestSuite/Syntax/Correct/Shift.tjp +55 -0
- data/test/TestSuite/Syntax/Correct/Simple.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/String.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Supplement.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +34 -0
- data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Timezone.tjp +8 -0
- data/test/TestSuite/Syntax/Correct/Vacation.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/csvtest +16 -0
- data/test/TestSuite/Syntax/Correct/manual2example.rb +24 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +485 -0
- data/test/TestSuite/Syntax/Errors/bad_include.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/booking_group.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/booking_milestone.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/booking_no_leaf.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/chargeset.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/container_attribute.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/date_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/effort_zero.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/extend_id_cap.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_end_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_start_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/leaf_resource_id_expected.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/misaligned_date.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/operand_attribute.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/overtime_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/purge_unknown_id.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/report_end.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_start.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/resource_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/resource_id_expected.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/scenario_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_assignment_overlap.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/shift_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_id_expected.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/sloppy_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/sort_direction.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/start_before_end1.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/start_before_end2.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/task_complete.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/task_priority.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_without_chargeset.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/time_interval.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/too_many_bangs.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/undecl_flag.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_projectid.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_id.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/unknown_task.tjp +10 -0
- data/test/all.rb +31 -0
- data/test/test_BatchProcessor.rb +54 -0
- data/test/test_CSV-Reports.rb +101 -0
- data/test/test_Limits.rb +104 -0
- data/test/test_LogicalExpression.rb +110 -0
- data/test/test_MacroTable.rb +51 -0
- data/test/test_Project.rb +57 -0
- data/test/test_PropertySet.rb +71 -0
- data/test/test_Query.rb +83 -0
- data/test/test_RealFormat.rb +83 -0
- data/test/test_RichText.rb +869 -0
- data/test/test_Scheduler.rb +42 -0
- data/test/test_ShiftAssignments.rb +77 -0
- data/test/test_Syntax.rb +41 -0
- data/test/test_TextScanner.rb +95 -0
- data/test/test_TjTime.rb +114 -0
- data/test/test_TjpExample.rb +169 -0
- data/test/test_UTF8String.rb +84 -0
- data/test/test_WorkingHours.rb +56 -0
- metadata +649 -0
data/lib/UTF8String.rb
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
#
|
|
3
|
+
# = UTF8String.rb -- The TaskJuggler III Project Management Software
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
6
|
+
#
|
|
7
|
+
# This program is free software; you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
9
|
+
# published by the Free Software Foundation.
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
KCODE='u'
|
|
13
|
+
|
|
14
|
+
# This is an extension and modification of the standard String class. We do a
|
|
15
|
+
# lot of UTF-8 character processing in the parser. Ruby 1.8 does not have good
|
|
16
|
+
# enough UTF-8 support and Ruby 1.9 only handles UTF-8 characters as Strings.
|
|
17
|
+
# This is very inefficient compared to representing them as Fixnum objects.
|
|
18
|
+
# Some of these hacks can be removed once we have switched to 1.9 support
|
|
19
|
+
# only.
|
|
20
|
+
class String
|
|
21
|
+
|
|
22
|
+
if RUBY_VERSION < '1.9.0'
|
|
23
|
+
|
|
24
|
+
# Iterate over the String calling the block for each UTF-8 character in
|
|
25
|
+
# the String. This implementation looks more awkward but is noticeably
|
|
26
|
+
# faster than the often propagated regexp based implementations.
|
|
27
|
+
def each_utf8_char
|
|
28
|
+
c = ''
|
|
29
|
+
length = 0
|
|
30
|
+
each_byte do |b|
|
|
31
|
+
c << b
|
|
32
|
+
if length > 0
|
|
33
|
+
# subsequent unicode byte
|
|
34
|
+
if (length -= 1) == 0
|
|
35
|
+
# end of unicode character reached
|
|
36
|
+
yield c
|
|
37
|
+
c = ''
|
|
38
|
+
end
|
|
39
|
+
elsif (b & 0xC0) == 0xC0
|
|
40
|
+
# first unicode byte
|
|
41
|
+
length = -1
|
|
42
|
+
while (b & 0x80) != 0
|
|
43
|
+
length += 1
|
|
44
|
+
b = b << 1
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
# ASCII character
|
|
48
|
+
yield c
|
|
49
|
+
c = ''
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
alias old_double_left_angle <<
|
|
55
|
+
|
|
56
|
+
# Replacement for the existing << operator that also works for characters
|
|
57
|
+
# above Fixnum 255 (UTF-8 characters).
|
|
58
|
+
def << (obj)
|
|
59
|
+
if obj.is_a?(String) || (obj < 256)
|
|
60
|
+
# In this case we can use the built-in concat.
|
|
61
|
+
concat(obj)
|
|
62
|
+
else
|
|
63
|
+
# UTF-8 characters have a maximum length of 4 byte and no byte is 0.
|
|
64
|
+
mask = 0xFF000000
|
|
65
|
+
pos = 3
|
|
66
|
+
while pos >= 0
|
|
67
|
+
# Use the built-in concat operator for each byte.
|
|
68
|
+
concat((obj & mask) >> (8 * pos)) if (obj & mask) != 0
|
|
69
|
+
# Move mask and position to the next byte.
|
|
70
|
+
mask = mask >> 8
|
|
71
|
+
pos -= 1
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Return the number of UTF8 characters in the String. We don't override
|
|
77
|
+
# the built-in length() function here as we don't know who else uses it
|
|
78
|
+
# for what purpose.
|
|
79
|
+
def length_utf8
|
|
80
|
+
len = 0
|
|
81
|
+
each_utf8_char { |c| len += 1 }
|
|
82
|
+
len
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
alias old_reverse reverse
|
|
86
|
+
|
|
87
|
+
# UTF-8 aware version of reverse that replaces the built-in one.
|
|
88
|
+
def reverse
|
|
89
|
+
a = []
|
|
90
|
+
each_utf8_char { |c| a << c }
|
|
91
|
+
s = ''
|
|
92
|
+
a.reverse.join
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
else
|
|
96
|
+
alias each_utf8_char each_char
|
|
97
|
+
alias length_utf8 length
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
data/lib/UserManual.rb
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = UserManual.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'Tj3Config'
|
|
14
|
+
require 'RichTextDocument'
|
|
15
|
+
require 'SyntaxReference'
|
|
16
|
+
require 'TjTime'
|
|
17
|
+
require 'RichTextProtocolExample'
|
|
18
|
+
|
|
19
|
+
class TaskJuggler
|
|
20
|
+
|
|
21
|
+
# This class specializes the RichTextDocument class for the TaskJuggler user
|
|
22
|
+
# manual. This manual is not only generated from a set of RichTextSnip files,
|
|
23
|
+
# but also contains the SyntaxReference for the TJP syntax.
|
|
24
|
+
class UserManual < RichTextDocument
|
|
25
|
+
|
|
26
|
+
# Create a UserManual object and gather the TJP syntax information.
|
|
27
|
+
def initialize
|
|
28
|
+
super
|
|
29
|
+
# Don't confuse this with RichTextDocument#references
|
|
30
|
+
@reference = SyntaxReference.new(self)
|
|
31
|
+
registerProtocolHandler(RichTextProtocolExample.new)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def generate(directory)
|
|
35
|
+
# Directory where to find the manual RichText sources. Must be relative
|
|
36
|
+
# to lib directory.
|
|
37
|
+
srcDir = AppConfig.dataDirs('manual')[0]
|
|
38
|
+
# Directory where to put the generated HTML files. Must be relative to lib
|
|
39
|
+
# directory.
|
|
40
|
+
destDir = directory + (directory[-1] == '/' ? '' : '/')
|
|
41
|
+
# A list of all source files. The order is important.
|
|
42
|
+
%w(
|
|
43
|
+
Intro
|
|
44
|
+
TaskJuggler_2x_Migration
|
|
45
|
+
How_To_Contribute
|
|
46
|
+
Reporting_Bugs
|
|
47
|
+
Installation
|
|
48
|
+
Getting_Started
|
|
49
|
+
Rich_Text_Attributes
|
|
50
|
+
Tutorial
|
|
51
|
+
Day_To_Day_Juggling
|
|
52
|
+
fdl
|
|
53
|
+
).each do |file|
|
|
54
|
+
addSnip(srcDir + file)
|
|
55
|
+
end
|
|
56
|
+
# Generate the table of contense
|
|
57
|
+
tableOfContents
|
|
58
|
+
# Generate the HTML files.
|
|
59
|
+
generateHTML(destDir)
|
|
60
|
+
checkInternalReferences
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Generate the manual in HTML format. _directory_ specifies a directory
|
|
64
|
+
# where the HTML files should be put.
|
|
65
|
+
def generateHTML(directory)
|
|
66
|
+
generateHTMLindex(directory)
|
|
67
|
+
generateHTMLReference(directory)
|
|
68
|
+
# The SyntaxReference only generates the reference list when the HTML is
|
|
69
|
+
# generated. So we have to collect it after the HTML generation.
|
|
70
|
+
@references.merge!(@reference.internalReferences)
|
|
71
|
+
|
|
72
|
+
super
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Callback function used by the RichTextDocument and KeywordDocumentation
|
|
76
|
+
# classes to generate the HTML style sheet for the manual pages.
|
|
77
|
+
def generateStyleSheet
|
|
78
|
+
html = []
|
|
79
|
+
html << (style = XMLElement.new('style', 'type' => 'text/css'))
|
|
80
|
+
style << XMLBlob.new(<<'EOT'
|
|
81
|
+
pre {
|
|
82
|
+
font-size:16px;
|
|
83
|
+
font-family: Courier;
|
|
84
|
+
padding-left:8px;
|
|
85
|
+
padding-right:8px;
|
|
86
|
+
padding-top:0px;
|
|
87
|
+
padding-bottom:0px;
|
|
88
|
+
}
|
|
89
|
+
p {
|
|
90
|
+
margin-top:8px;
|
|
91
|
+
margin-bottom:8px;
|
|
92
|
+
}
|
|
93
|
+
code {
|
|
94
|
+
font-size:16px;
|
|
95
|
+
font-family: Courier;
|
|
96
|
+
}
|
|
97
|
+
.table {
|
|
98
|
+
background-color:#ABABAB;
|
|
99
|
+
width:100%;
|
|
100
|
+
}
|
|
101
|
+
.tag {
|
|
102
|
+
background-color:#E0E0F0;
|
|
103
|
+
font-size:16px;
|
|
104
|
+
font-weight:bold;
|
|
105
|
+
padding-left:8px;
|
|
106
|
+
padding-right:8px;
|
|
107
|
+
padding-top:5px;
|
|
108
|
+
padding-bottom:5px;
|
|
109
|
+
}
|
|
110
|
+
.descr {
|
|
111
|
+
background-color:#F0F0F0;
|
|
112
|
+
font-size:16px;
|
|
113
|
+
padding-left:8px;
|
|
114
|
+
padding-right:8px;
|
|
115
|
+
padding-top:5px;
|
|
116
|
+
padding-bottom:5px;
|
|
117
|
+
}
|
|
118
|
+
.codeframe{
|
|
119
|
+
border-width:2px;
|
|
120
|
+
border-color:#ABABAB;
|
|
121
|
+
border-style:solid;
|
|
122
|
+
background-color:#F0F0F0;
|
|
123
|
+
margin-top:8px;
|
|
124
|
+
margin-bottom:8px;
|
|
125
|
+
}
|
|
126
|
+
.code {
|
|
127
|
+
padding-left:15px;
|
|
128
|
+
padding-right:15px;
|
|
129
|
+
padding-top:0px;
|
|
130
|
+
padding-bottom:0px;
|
|
131
|
+
}
|
|
132
|
+
EOT
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
html
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Callback function used by the RichTextDocument class to generate the cover
|
|
139
|
+
# page for the manual.
|
|
140
|
+
def generateHTMLCover
|
|
141
|
+
html = []
|
|
142
|
+
html << (div = XMLElement.new('div', 'align' => 'center',
|
|
143
|
+
'style' => 'margin-top:40px; margin-botton:40px'))
|
|
144
|
+
div << XMLNamedText.new("The #{AppConfig.packageName} User Manual",
|
|
145
|
+
'h1')
|
|
146
|
+
div << XMLNamedText.new('Project Management beyond Gantt Chart drawing',
|
|
147
|
+
'em')
|
|
148
|
+
div << XMLElement.new('br')
|
|
149
|
+
div << XMLNamedText.new(
|
|
150
|
+
"Copyright (c) #{AppConfig.copyright.join(', ')} " +
|
|
151
|
+
"by #{AppConfig.authors.join(', ')}", 'b')
|
|
152
|
+
div << XMLElement.new('br')
|
|
153
|
+
div << XMLText.new("Generated on #{TjTime.now.strftime('%Y-%m-%d')}")
|
|
154
|
+
div << XMLElement.new('br')
|
|
155
|
+
div << XMLNamedText.new("This manual covers #{AppConfig.packageName} " +
|
|
156
|
+
"version #{AppConfig.version}.", 'h3')
|
|
157
|
+
html << XMLElement.new('br')
|
|
158
|
+
html << XMLElement.new('hr')
|
|
159
|
+
html << XMLElement.new('br')
|
|
160
|
+
|
|
161
|
+
html
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Callback function used by the RichTextDocument class to generate the
|
|
165
|
+
# header for the manual pages.
|
|
166
|
+
def generateHTMLHeader
|
|
167
|
+
html = []
|
|
168
|
+
html << (headline = XMLElement.new('div', 'align' => 'center'))
|
|
169
|
+
headline << XMLNamedText.new(
|
|
170
|
+
"The #{AppConfig.packageName} User Manual", 'h3',
|
|
171
|
+
'align' => 'center')
|
|
172
|
+
headline << XMLNamedText.new(
|
|
173
|
+
'Project Management beyond Gantt Chart Drawing', 'em',
|
|
174
|
+
'align' => 'center')
|
|
175
|
+
|
|
176
|
+
html
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Callback function used by the RichTextDocument class to generate the
|
|
180
|
+
# footer for the manual pages.
|
|
181
|
+
def generateHTMLFooter
|
|
182
|
+
html = []
|
|
183
|
+
html << (div = XMLElement.new('div', 'align' => 'center',
|
|
184
|
+
'style' => 'font-size:10px;'))
|
|
185
|
+
div << XMLText.new("Copyright (c) #{AppConfig.copyright.join(', ')} by " +
|
|
186
|
+
"#{AppConfig.authors.join(', ')}.")
|
|
187
|
+
div << XMLNamedText.new('TaskJuggler', 'a', 'href' => AppConfig.contact)
|
|
188
|
+
div << XMLText.new(' is a trademark of Chris Schlaeger.')
|
|
189
|
+
|
|
190
|
+
html
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Callback function used by the RichTextDocument and KeywordDocumentation
|
|
194
|
+
# classes to generate the navigation bars for the manual pages.
|
|
195
|
+
# _predLabel_: Text for the reference to the previous page. May be nil.
|
|
196
|
+
# _predURL: URL to the previous page.
|
|
197
|
+
# _succLabel_: Text for the reference to the next page. May be nil.
|
|
198
|
+
# _succURL: URL to the next page.
|
|
199
|
+
def generateHTMLNavigationBar(predLabel, predURL, succLabel, succURL)
|
|
200
|
+
html = []
|
|
201
|
+
html << XMLElement.new('br')
|
|
202
|
+
html << XMLElement.new('hr')
|
|
203
|
+
if predLabel || succLabel
|
|
204
|
+
# We use a tabel to get the desired layout.
|
|
205
|
+
html << (tab = XMLElement.new('table',
|
|
206
|
+
'style' => 'width:90%; margin-left:5%; margin-right:5%'))
|
|
207
|
+
tab << (tr = XMLElement.new('tr'))
|
|
208
|
+
tr << (td = XMLElement.new('td',
|
|
209
|
+
'style' => 'text-align:left; width:35%;'))
|
|
210
|
+
if predLabel
|
|
211
|
+
# Link to previous page.
|
|
212
|
+
td << XMLText.new('<< ')
|
|
213
|
+
td << XMLNamedText.new(predLabel, 'a', 'href' => predURL)
|
|
214
|
+
td << XMLText.new(' <<')
|
|
215
|
+
end
|
|
216
|
+
# Link to table of contents
|
|
217
|
+
tr << (td = XMLElement.new('td',
|
|
218
|
+
'style' => 'text-align:center; width:30%;'))
|
|
219
|
+
td << XMLNamedText.new('Table Of Contents', 'a', 'href' => 'toc.html')
|
|
220
|
+
tr << (td = XMLElement.new('td',
|
|
221
|
+
'style' => 'text-align:right; width:35%;'))
|
|
222
|
+
if succLabel
|
|
223
|
+
# Link to next page.
|
|
224
|
+
td << XMLText.new('>> ')
|
|
225
|
+
td << XMLNamedText.new(succLabel, 'a', 'href' => succURL)
|
|
226
|
+
td << XMLText.new(' >>')
|
|
227
|
+
end
|
|
228
|
+
html << XMLElement.new('hr')
|
|
229
|
+
end
|
|
230
|
+
html << XMLElement.new('br')
|
|
231
|
+
|
|
232
|
+
html
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Generate the top-level file for the HTML user manual.
|
|
236
|
+
def generateHTMLindex(directory)
|
|
237
|
+
html = HTMLDocument.new(:frameset)
|
|
238
|
+
html << (head = XMLElement.new('head'))
|
|
239
|
+
head << (e = XMLNamedText.new("The #{AppConfig.packageName} User Manual",
|
|
240
|
+
'title'))
|
|
241
|
+
head << XMLElement.new('meta', 'http-equiv' => 'Content-Type',
|
|
242
|
+
'content' => 'text/html; charset=utf-8')
|
|
243
|
+
|
|
244
|
+
html << (frameset = XMLElement.new('frameset', 'cols' => '15%, 85%'))
|
|
245
|
+
frameset << (navFrames = XMLElement.new('frameset', 'rows' => '15%, 85%'))
|
|
246
|
+
navFrames << XMLElement.new('frame', 'src' => 'alphabet.html',
|
|
247
|
+
'name' => 'alphabet')
|
|
248
|
+
navFrames << XMLElement.new('frame', 'src' => 'navbar.html',
|
|
249
|
+
'name' => 'navigator')
|
|
250
|
+
frameset << XMLElement.new('frame', 'src' => 'toc.html',
|
|
251
|
+
'name' => 'display')
|
|
252
|
+
|
|
253
|
+
html.write(directory + 'index.html')
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
private
|
|
257
|
+
|
|
258
|
+
# Create a table of contents that includes both the sections from the
|
|
259
|
+
# RichText pages as well as the SyntaxReference.
|
|
260
|
+
def tableOfContents
|
|
261
|
+
super
|
|
262
|
+
# Let's call the reference 'Appendix A'
|
|
263
|
+
@reference.tableOfContents(@toc, 'A')
|
|
264
|
+
@snipNames += @reference.all
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Generate the HTML pages for the syntax reference and a navigation page
|
|
268
|
+
# with links to all generated pages.
|
|
269
|
+
def generateHTMLReference(directory)
|
|
270
|
+
keywords = @reference.all
|
|
271
|
+
@reference.generateHTMLnavbar(directory, keywords)
|
|
272
|
+
|
|
273
|
+
keywords.each do |keyword|
|
|
274
|
+
@reference.generateHTMLreference(directory, keyword)
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
|
data/lib/WorkingHours.rb
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = WorkingHours.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'Interval'
|
|
14
|
+
|
|
15
|
+
class TaskJuggler
|
|
16
|
+
|
|
17
|
+
# This cache class is used to speedup accesses to the frequently used
|
|
18
|
+
# WorkingHours::onShift? function. It saves the result the first time the
|
|
19
|
+
# function is called for a particular date and working hour set and returns
|
|
20
|
+
# it on subsequent calls again. Each partucular set of working hours needs
|
|
21
|
+
# its separate cache. The OnShiftCache object is shared amongst all
|
|
22
|
+
# WorkingHours objects so that WorkingHours objects with identical working
|
|
23
|
+
# hours can share the cache.
|
|
24
|
+
class OnShiftCache
|
|
25
|
+
|
|
26
|
+
# Create the OnShiftCache object. There should be only one for the
|
|
27
|
+
# application.
|
|
28
|
+
def initialize
|
|
29
|
+
@caches = []
|
|
30
|
+
@workingHoursTable = []
|
|
31
|
+
# The cache is an array with entries for each date. To minimize the
|
|
32
|
+
# necessary storage space, we need to guess the smallest used date
|
|
33
|
+
# (which gets index 0 then) and the smallest distance between dates.
|
|
34
|
+
@minDate = nil
|
|
35
|
+
# We assume a timing resolution of 1 hour (the TaskJuggler default)
|
|
36
|
+
# first.
|
|
37
|
+
@minDateDelta = 60 * 60
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Register the WorkingHours object with the caches. The function will
|
|
41
|
+
# return the actual cache used for this particular set of working hours.
|
|
42
|
+
# The WorkingHours object may not change its working hours after this
|
|
43
|
+
# call. The returned cache reference is used as a handle for subsequent
|
|
44
|
+
# OnShiftCache::set and OnShiftCache::get calls.
|
|
45
|
+
def register(wh)
|
|
46
|
+
# Search the list of already registered caches for an identical set of
|
|
47
|
+
# WorkingHours. In case one is found, return the reference to this
|
|
48
|
+
# cache.
|
|
49
|
+
@workingHoursTable.length.times do |i|
|
|
50
|
+
if @workingHoursTable[i] == wh
|
|
51
|
+
return @caches[i]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
# If this is a new set of WorkingHours we create a new cache for it.
|
|
55
|
+
@workingHoursTable << WorkingHours.new(wh)
|
|
56
|
+
@caches << []
|
|
57
|
+
@caches.last
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Set the +value+ for a given +cache+ and +date+.
|
|
61
|
+
def set(cache, date, value)
|
|
62
|
+
cache[dateToIndex(date)] = value
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Get the value for a given +cache+ and +date+.
|
|
66
|
+
def get(cache, date)
|
|
67
|
+
cache[dateToIndex(date)]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# When the @minDate or @minDateDelta values need to be changed, we have to
|
|
73
|
+
# clear all the caches again.
|
|
74
|
+
def resetCaches
|
|
75
|
+
@caches.each { |c| c.clear }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Convert a TjTime +date+ to an index in the cache Array. To optimize the
|
|
79
|
+
# size of the cache, we have to guess the smallest used date and the
|
|
80
|
+
# regular distance between the date values. If we have to correct these
|
|
81
|
+
# guessed values, we have to clear the caches.
|
|
82
|
+
def dateToIndex(date)
|
|
83
|
+
if @minDate.nil? || date < @minDate
|
|
84
|
+
@minDate = date
|
|
85
|
+
resetCaches
|
|
86
|
+
end
|
|
87
|
+
startDate = date - @minDate
|
|
88
|
+
div, mod = startDate.divmod(@minDateDelta)
|
|
89
|
+
if mod != 0
|
|
90
|
+
resetCaches
|
|
91
|
+
# We have to guess the timingresolution of the project here. Possible
|
|
92
|
+
# values are 5, 10, 15, 20, 30 or 60 minutes.
|
|
93
|
+
case @minDateDelta / 60
|
|
94
|
+
when 60
|
|
95
|
+
@minDateDelta = 30
|
|
96
|
+
when 30
|
|
97
|
+
@minDateDelta = 20
|
|
98
|
+
when 20
|
|
99
|
+
@minDateDelta = 15
|
|
100
|
+
when 15
|
|
101
|
+
@minDateDelta = 10
|
|
102
|
+
when 10
|
|
103
|
+
@minDateDelta = 5
|
|
104
|
+
else
|
|
105
|
+
raise "Illegal timing resolution!"
|
|
106
|
+
end
|
|
107
|
+
@minDateDelta *= 60
|
|
108
|
+
div = startDate / @minDateDelta
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
div
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Class to store the working hours for each day of the week. The working hours
|
|
117
|
+
# are stored as Arrays of Fixnum intervals for each day of the week. A day off
|
|
118
|
+
# is modelled as empty Array for that week day. The start end end times of
|
|
119
|
+
# each working period are stored as seconds after midnight.
|
|
120
|
+
class WorkingHours
|
|
121
|
+
|
|
122
|
+
attr_reader :days
|
|
123
|
+
attr_accessor :timezone
|
|
124
|
+
|
|
125
|
+
# All WorkingHours objects share the same cache to speedup the onShift?
|
|
126
|
+
# method.
|
|
127
|
+
@@onShiftCache = OnShiftCache.new
|
|
128
|
+
|
|
129
|
+
# Create a new WorkingHours object. The method accepts a reference to an
|
|
130
|
+
# existing WorkingHours object in +wh+. When it's present, the new object
|
|
131
|
+
# will be a deep copy of the given object.
|
|
132
|
+
def initialize(wh = nil)
|
|
133
|
+
# One entry for every day of the week. Sunday === 0.
|
|
134
|
+
@days = Array.new(7, [])
|
|
135
|
+
@cache = nil
|
|
136
|
+
|
|
137
|
+
if wh.nil?
|
|
138
|
+
# Create a new object with default working hours.
|
|
139
|
+
@timezone = nil
|
|
140
|
+
# Set the default working hours. Monday to Friday 9am - 12pm, 1pm - 6pm.
|
|
141
|
+
# Saturday and Sunday are days off.
|
|
142
|
+
1.upto(5) do |day|
|
|
143
|
+
@days[day] = [ [ 9 * 60 * 60, 12 * 60 * 60 ],
|
|
144
|
+
[ 13 * 60 * 60, 18 * 60 * 60 ] ]
|
|
145
|
+
end
|
|
146
|
+
else
|
|
147
|
+
# Copy the values from the given object.
|
|
148
|
+
@timezone = wh.timezone
|
|
149
|
+
7.times do |day|
|
|
150
|
+
hours = []
|
|
151
|
+
wh.days[day].each do |hrs|
|
|
152
|
+
hours << hrs.clone
|
|
153
|
+
end
|
|
154
|
+
setWorkingHours(day, hours)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Return true of the given WorkingHours object +wh+ is identical to this
|
|
160
|
+
# object.
|
|
161
|
+
def ==(wh)
|
|
162
|
+
return false if @timezone != wh.timezone
|
|
163
|
+
|
|
164
|
+
7.times do |d|
|
|
165
|
+
return false if @days[d].length != wh.days[d].length
|
|
166
|
+
# Check all working hour intervals
|
|
167
|
+
@days[d].length.times do |i|
|
|
168
|
+
return false if @days[d][i][0] != wh.days[d][i][0] ||
|
|
169
|
+
@days[d][i][1] != wh.days[d][i][1]
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
true
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Set the working hours for a given week day. +dayOfWeek+ must be 0 for
|
|
176
|
+
# Sunday, 1 for Monday and so on. +intervals+ must be an Array that
|
|
177
|
+
# contains an Array with 2 Fixnums for each working period. Each value
|
|
178
|
+
# specifies the time of day as minutes after midnight. The first value is
|
|
179
|
+
# the start time of the interval, the second the end time.
|
|
180
|
+
def setWorkingHours(dayOfWeek, intervals)
|
|
181
|
+
if @cache
|
|
182
|
+
raise 'You cannot change the working hours after onShift? has been ' +
|
|
183
|
+
'called.'
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Legal values range from 0 Sunday to 6 Saturday.
|
|
187
|
+
if dayOfWeek < 0 || dayOfWeek > 6
|
|
188
|
+
raise "dayOfWeek out of range: #{dayOfWeek}"
|
|
189
|
+
end
|
|
190
|
+
intervals.each do |iv|
|
|
191
|
+
if iv[0] < 0 || iv[0] >= 24 * 60 * 60 ||
|
|
192
|
+
iv[1] < 0 || iv[1] >= 24 * 60 * 60
|
|
193
|
+
raise "Time interval has illegal values: #{iv[0]} - #{iv[1]}"
|
|
194
|
+
end
|
|
195
|
+
if iv[0] >= iv[1]
|
|
196
|
+
raise "Interval end time must be larger than start time"
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
@days[dayOfWeek] = intervals
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Return the working hour intervals for a given day of the week.
|
|
203
|
+
# +dayOfWeek+ must 0 for Sunday, 1 for Monday and so on. The result is an
|
|
204
|
+
# Array that contains Arrays of 2 Fixnums.
|
|
205
|
+
def getWorkingHours(dayOfWeek)
|
|
206
|
+
@days[dayOfWeek]
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Return true if _date_ is within the defined working hours.
|
|
210
|
+
def onShift?(date)
|
|
211
|
+
@cache = @@onShiftCache.register(self) unless @cache
|
|
212
|
+
|
|
213
|
+
# If we have the result cached already, return it.
|
|
214
|
+
unless (os = @@onShiftCache.get(@cache, date)).nil?
|
|
215
|
+
return os
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# The date is in UTC. The weekday needs to be calculated according to the
|
|
219
|
+
# timezone of the project.
|
|
220
|
+
projectDate = toLocaltime(date)
|
|
221
|
+
dow = projectDate.wday
|
|
222
|
+
|
|
223
|
+
# The working hours need to be put into the proper time zone.
|
|
224
|
+
localDate = toLocaltime(date, @timezone)
|
|
225
|
+
secondsOfDay = localDate.secondsOfDay
|
|
226
|
+
|
|
227
|
+
@days[dow].each do |iv|
|
|
228
|
+
# Check the working hours of that day if they overlap with +date+.
|
|
229
|
+
if iv[0] <= secondsOfDay && secondsOfDay < iv[1]
|
|
230
|
+
# Store the result in the cache.
|
|
231
|
+
@@onShiftCache.set(@cache, date, true)
|
|
232
|
+
return true
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Store the result in the cache.
|
|
237
|
+
@@onShiftCache.set(@cache, date, false)
|
|
238
|
+
false
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# This function does not belong here! It should be handled via the
|
|
242
|
+
# ShiftAssignment.
|
|
243
|
+
def timeOff?(interval)
|
|
244
|
+
t = interval.start.midnight
|
|
245
|
+
while t < interval.end
|
|
246
|
+
dow = t.wday
|
|
247
|
+
unless @days[dow].empty?
|
|
248
|
+
dayStart = t < interval.start ? interval.start.secondsOfDay :
|
|
249
|
+
t.secondsOfDay
|
|
250
|
+
dayEnd = t.sameTimeNextDay > interval.end ? interval.end.secondsOfDay :
|
|
251
|
+
60 * 60 * 24;
|
|
252
|
+
@days[dow].each do |iv|
|
|
253
|
+
return false if (dayStart <= iv[0] && iv[0] < dayEnd) ||
|
|
254
|
+
(iv[0] <= dayStart && dayStart < iv[1])
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
t = t.sameTimeNextDay
|
|
258
|
+
end
|
|
259
|
+
true
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# Probably should be put into ShiftAssignment as well.
|
|
263
|
+
def dayOff?(date)
|
|
264
|
+
projectDate = toLocaltime(date)
|
|
265
|
+
dow = projectDate.wday
|
|
266
|
+
@days[dow].empty?
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# Returns the time interval settings for each day in a human readable form.
|
|
270
|
+
def to_s
|
|
271
|
+
dayNames = %w( Sun Mon Tue Wed Thu Fri Sat )
|
|
272
|
+
str = ''
|
|
273
|
+
7.times do |day|
|
|
274
|
+
str += "#{dayNames[day]}: "
|
|
275
|
+
if @days[day].empty?
|
|
276
|
+
str += "off"
|
|
277
|
+
str += "\n" if day < 6
|
|
278
|
+
next
|
|
279
|
+
end
|
|
280
|
+
first = true
|
|
281
|
+
@days[day].each do |iv|
|
|
282
|
+
if first
|
|
283
|
+
first = false
|
|
284
|
+
else
|
|
285
|
+
str += ', '
|
|
286
|
+
end
|
|
287
|
+
str += "#{iv[0] / 3600}:" +
|
|
288
|
+
"#{iv[0] % 3600 == 0 ? '00' : iv[0] % 3600} - " +
|
|
289
|
+
"#{iv[1] / 3600}:#{iv[1] % 3600 == 0 ? '00' : iv[1] % 3600}"
|
|
290
|
+
end
|
|
291
|
+
str += "\n" if day < 6
|
|
292
|
+
end
|
|
293
|
+
str
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
private
|
|
297
|
+
|
|
298
|
+
# Convert a UTC date into the corresponding date in the local time zone.
|
|
299
|
+
# This is either the current system setting or the time zone specified by
|
|
300
|
+
# _tz_.
|
|
301
|
+
def toLocaltime(date, tz = nil)
|
|
302
|
+
oldTimezone = nil
|
|
303
|
+
# Set environment variable TZ to appropriate time zone
|
|
304
|
+
if @timezone
|
|
305
|
+
oldTimezone = ENV['tz']
|
|
306
|
+
ENV['tz'] = @timezone
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
localDate = date.clone
|
|
310
|
+
localDate.localtime
|
|
311
|
+
|
|
312
|
+
# Restore environment
|
|
313
|
+
if oldTimezone
|
|
314
|
+
ENV['tz'] = oldTimezone
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
localDate
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
end
|
|
323
|
+
|